summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-20 17:31:56 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-20 17:32:25 +0200
commit89ba8a6b62b90ac72547e2ca9ea5eeae7bbc6500 (patch)
tree3c55c94857e42353376c8377d3fe2632e757cb0d
parent8290f420bee04702751ae6e4453c8b140e227e19 (diff)
downloadhurrycurry-89ba8a6b62b90ac72547e2ca9ea5eeae7bbc6500.tar
hurrycurry-89ba8a6b62b90ac72547e2ca9ea5eeae7bbc6500.tar.bz2
hurrycurry-89ba8a6b62b90ac72547e2ca9ea5eeae7bbc6500.tar.zst
syncronize player movement if the diverge
-rw-r--r--server/protocol/src/lib.rs3
-rw-r--r--server/src/entity/customers/mod.rs2
-rw-r--r--server/src/game.rs17
-rw-r--r--server/src/state.rs5
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<()> {