diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/customer/movement.rs | 1 | ||||
-rw-r--r-- | server/src/data.rs | 4 | ||||
-rw-r--r-- | server/src/game.rs | 26 |
3 files changed, 25 insertions, 6 deletions
diff --git a/server/src/customer/movement.rs b/server/src/customer/movement.rs index 6a70a44f..a4b039e2 100644 --- a/server/src/customer/movement.rs +++ b/server/src/customer/movement.rs @@ -4,6 +4,7 @@ use std::collections::HashSet; const PLAYER_SIZE: f32 = 0.4; const PLAYER_SPEED: f32 = 25.; +pub const PLAYER_SPEED_LIMIT: f32 = 8.; pub struct MovementBase { pub position: Vec2, diff --git a/server/src/data.rs b/server/src/data.rs index 17b508ec..5fa1a009 100644 --- a/server/src/data.rs +++ b/server/src/data.rs @@ -132,10 +132,10 @@ pub fn build_gamedata( for (x, tile) in line.trim().char_indices() { let pos = IVec2::new(x as i32, y as i32); if tile == map_in.chef_spawn { - chef_spawn = pos.as_vec2(); + chef_spawn = pos.as_vec2() + Vec2::splat(0.5); } if tile == map_in.customer_spawn { - customer_spawn = pos.as_vec2(); + customer_spawn = pos.as_vec2() + Vec2::splat(0.5); } let tilename = map_in.tiles[&tile].clone(); let itemname = map_in.items.get(&tile).cloned(); diff --git a/server/src/game.rs b/server/src/game.rs index e2245895..8ca3523f 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1,15 +1,17 @@ use crate::{ + customer::movement::PLAYER_SPEED_LIMIT, data::Gamedata, interaction::{interact, tick_tile, InteractEffect, TickEffect}, protocol::{ItemIndex, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex}, }; use anyhow::{anyhow, bail, Result}; use glam::{IVec2, Vec2}; -use log::info; +use log::{info, warn}; use std::{ collections::{HashMap, VecDeque}, ops::Deref, sync::Arc, + time::Instant, }; #[derive(Debug, PartialEq)] @@ -34,6 +36,7 @@ pub struct Player { pub name: String, pub character: i32, pub position: Vec2, + pub last_position_ts: Instant, pub interacting: Option<IVec2>, pub item: Option<Item>, pub communicate: Option<Message>, @@ -131,6 +134,7 @@ impl Game { player, Player { item: None, + last_position_ts: Instant::now(), character, position: if player.0 < 0 { self.data.customer_spawn @@ -170,13 +174,27 @@ impl Game { .push_back(PacketC::RemovePlayer { id: player }) } PacketS::Position { pos, rot } => { - self.packet_out - .push_back(PacketC::Position { player, pos, rot }); + let pid = player; let player = self .players .get_mut(&player) .ok_or(anyhow!("player does not exist"))?; - player.position = pos; + + let dt = player.last_position_ts.elapsed().as_secs_f32(); + let dist = pos.distance(player.position); + let speed = dist / dt; + if speed < PLAYER_SPEED_LIMIT && dist < 1. { + player.position = pos; + player.last_position_ts = Instant::now(); + } else { + warn!("{:?} moved to quickly.", player.name) + } + + self.packet_out.push_back(PacketC::Position { + player: pid, + pos: player.position, + rot, + }); } PacketS::Collide { player, force } => { self.packet_out |