diff options
-rw-r--r-- | server/protocol/src/lib.rs | 3 | ||||
-rw-r--r-- | server/src/entity/customers/mod.rs | 2 | ||||
-rw-r--r-- | server/src/game.rs | 17 | ||||
-rw-r--r-- | server/src/state.rs | 5 |
4 files changed, 19 insertions, 8 deletions
diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs index 4ba0f615..cf422761 100644 --- a/server/protocol/src/lib.rs +++ b/server/protocol/src/lib.rs @@ -30,7 +30,7 @@ pub use glam; pub mod movement; -pub const VERSION: (u32, u32) = (2, 1); +pub const VERSION: (u32, u32) = (2, 2); pub const BINCODE_CONFIG: Configuration<LittleEndian, Varint, Limit<4096>> = standard().with_limit(); @@ -206,6 +206,7 @@ pub enum PacketC { Error { message: String, }, + MovementSync, /// For use in replay sessions only ReplayStart, diff --git a/server/src/entity/customers/mod.rs b/server/src/entity/customers/mod.rs index 806a25f9..7a8280bc 100644 --- a/server/src/entity/customers/mod.rs +++ b/server/src/entity/customers/mod.rs @@ -253,7 +253,7 @@ impl EntityT for Customers { self.customers.remove(&c).unwrap(); } for (player, packet) in self.cpackets.drain(..) { - if let Err(err) = game.packet_in(player, packet) { + if let Err(err) = game.packet_in(player, packet, &mut vec![]) { warn!("demand packet {err}"); } } diff --git a/server/src/game.rs b/server/src/game.rs index bb6d5182..9a01e4a3 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -272,7 +272,12 @@ impl Game { demands_completed: self.demands_completed, } } - pub fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<()> { + pub fn packet_in( + &mut self, + player: PlayerID, + packet: PacketS, + replies: &mut Vec<PacketC>, + ) -> Result<()> { let points_before = self.points; match packet { @@ -356,8 +361,12 @@ impl Game { if let Some(pos) = pos { let dt = player.last_position_update.elapsed(); player.last_position_update += dt; - player.movement.position += - (pos - player.movement.position).clamp_length_max(dt.as_secs_f32()); + let diff = pos - player.movement.position; + player.movement.position += diff.clamp_length_max(dt.as_secs_f32()); + + if diff.length() > 1. { + replies.push(PacketC::MovementSync); + } } } PacketS::Collide { player, force } => { @@ -573,7 +582,7 @@ impl Game { } } for pid in players_auto_release.drain(..) { - let _ = self.packet_in(pid, PacketS::Interact { pos: None }); + let _ = self.packet_in(pid, PacketS::Interact { pos: None }, &mut vec![]); } for entity in self.entities.clone().write().unwrap().iter_mut() { diff --git a/server/src/state.rs b/server/src/state.rs index e637b323..61795da4 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -101,6 +101,7 @@ impl State { Ok(()) } pub async fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<Vec<PacketC>> { + let mut replies = Vec::new(); match &packet { PacketS::Communicate { message: Some(Message::Text(text)), @@ -117,7 +118,7 @@ impl State { } _ => (), } - self.game.packet_in(player, packet)?; + self.game.packet_in(player, packet, &mut replies)?; if self.game.players.is_empty() && !self.game.lobby { self.tx .send(PacketC::ServerMessage { @@ -127,7 +128,7 @@ impl State { self.game .load(self.index.generate("lobby-none".to_string()).await?, None); } - Ok(vec![]) + Ok(replies) } async fn handle_command_parse(&mut self, player: PlayerID, command: &str) -> Result<()> { |