diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index b68372c..fbfe137 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -1061,6 +1061,16 @@ impl Player { pub fn apply_self_sync(&mut self, data: SyncPackage) { if let Some(character) = &mut self.character { + let server_pos = character.get_global_position(); + let client_pos: Vector3 = data.transform.location.into(); + + let max_distance = self.data.ping as f32 * character.dyn_bind().get_move_speed() + + character.dyn_bind().get_y_speed(); + + if client_pos.distance_to(server_pos) <= max_distance { + character.dyn_bind_mut().apply_position(client_pos); + } + character .dyn_bind_mut() .set_movement_dir(data.movement_direction.into()); diff --git a/rust/src/player/local_player.rs b/rust/src/player/local_player.rs index c23bbab..bc2060d 100644 --- a/rust/src/player/local_player.rs +++ b/rust/src/player/local_player.rs @@ -120,6 +120,10 @@ impl IPlayer for LocalPlayer { .set_global_rotation(transform.rotation.into()); } + fn apply_position(&mut self, pos: Vector3) { + self.base_mut().set_global_position(pos); + } + fn apply_rotation(&mut self, _rot: Vector3) {} fn get_transform(&self) -> NetTransform { diff --git a/rust/src/player/mod.rs b/rust/src/player/mod.rs index a0720bc..acd1177 100644 --- a/rust/src/player/mod.rs +++ b/rust/src/player/mod.rs @@ -33,6 +33,7 @@ pub trait IPlayer { fn set_movement_dir(&mut self, dir: Vector3); fn get_move_speed(&self) -> f32; fn apply_transform(&mut self, transform: NetTransform); + fn apply_position(&mut self, pos: Vector3); fn apply_rotation(&mut self, rot: Vector3); fn apply_look_up(&mut self, rot: f32); fn get_look_up(&self) -> f32; diff --git a/rust/src/player/remote_player.rs b/rust/src/player/remote_player.rs index 620fbce..237f1f0 100644 --- a/rust/src/player/remote_player.rs +++ b/rust/src/player/remote_player.rs @@ -88,6 +88,10 @@ impl IPlayer for RemotePlayer { .set_global_rotation(transform.rotation.into()); } + fn apply_position(&mut self, pos: Vector3) { + self.base_mut().set_global_position(pos); + } + fn apply_rotation(&mut self, rot: Vector3) { self.base_mut().set_global_rotation(rot); }