From 77a48c61a1b60c61c271d060f43981cfedcf125f Mon Sep 17 00:00:00 2001 From: timokoesters Date: Wed, 28 Aug 2019 14:46:20 +0200 Subject: [PATCH] Fix rolling for the player --- client/src/lib.rs | 13 +++++++++---- common/src/comp/last.rs | 6 ------ server/src/lib.rs | 14 ++++++++++---- voxygen/src/scene/figure.rs | 11 ++++++++--- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 6c2bbf8f3e..faa9cab266 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -286,17 +286,22 @@ impl Client { { let ecs = self.state.ecs_mut(); for (entity, _) in (&ecs.entities(), &ecs.read_storage::()).join() { - let mut last_character_state = + let mut last_character_states = ecs.write_storage::>(); if let Some(client_character_state) = ecs.read_storage::().get(entity) { - if last_character_state + if last_character_states .get(entity) - .map(|&l| l != *client_character_state) + .map(|&l| { + std::mem::discriminant(&l.0.movement) + != std::mem::discriminant(&client_character_state.movement) + || std::mem::discriminant(&l.0.action) + != std::mem::discriminant(&client_character_state.action) + }) .unwrap_or(true) { - let _ = last_character_state + let _ = last_character_states .insert(entity, comp::Last(*client_character_state)); } } diff --git a/common/src/comp/last.rs b/common/src/comp/last.rs index 2ec18b6712..94561f1c5d 100644 --- a/common/src/comp/last.rs +++ b/common/src/comp/last.rs @@ -7,9 +7,3 @@ pub struct Last(pub C); impl Component for Last { type Storage = VecStorage; } - -impl PartialEq for Last { - fn eq(&self, other: &C) -> bool { - self.0 == *other - } -} diff --git a/server/src/lib.rs b/server/src/lib.rs index 52c7fc7cd4..df0be23575 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1105,7 +1105,7 @@ impl Server { if let Some(client_pos) = ecs.read_storage::().get(entity) { if last_pos .get(entity) - .map(|&l| l != *client_pos) + .map(|&l| l.0 != *client_pos) .unwrap_or(true) { let _ = last_pos.insert(entity, comp::Last(*client_pos)); @@ -1123,7 +1123,7 @@ impl Server { if let Some(client_vel) = ecs.read_storage::().get(entity) { if last_vel .get(entity) - .map(|&l| l != *client_vel) + .map(|&l| l.0 != *client_vel) .unwrap_or(true) { let _ = last_vel.insert(entity, comp::Last(*client_vel)); @@ -1141,7 +1141,7 @@ impl Server { if let Some(client_ori) = ecs.read_storage::().get(entity) { if last_ori .get(entity) - .map(|&l| l != *client_ori) + .map(|&l| l.0 != *client_ori) .unwrap_or(true) { let _ = last_ori.insert(entity, comp::Last(*client_ori)); @@ -1161,7 +1161,13 @@ impl Server { { if last_character_state .get(entity) - .map(|&l| l != *client_character_state) + .map(|&l| { + // Check if enum item is the same without looking at the inner data + std::mem::discriminant(&l.0.movement) + != std::mem::discriminant(&client_character_state.movement) + || std::mem::discriminant(&l.0.action) + != std::mem::discriminant(&client_character_state.action) + }) .unwrap_or(true) { let _ = diff --git a/voxygen/src/scene/figure.rs b/voxygen/src/scene/figure.rs index a952209eba..23c99bc015 100644 --- a/voxygen/src/scene/figure.rs +++ b/voxygen/src/scene/figure.rs @@ -691,10 +691,15 @@ impl FigureMgr { _ => continue, }; - if last_character.0.movement != character.movement { + if std::mem::discriminant(&last_character.0.movement) + != std::mem::discriminant(&character.movement) + { state.last_movement_change = Instant::now(); } - if last_character.0.action != character.action { + + if std::mem::discriminant(&last_character.0.action) + != std::mem::discriminant(&character.action) + { state.last_action_change = Instant::now(); } @@ -702,7 +707,7 @@ impl FigureMgr { state.last_movement_change.elapsed().as_secs_f64(); let time_since_action_change = state.last_action_change.elapsed().as_secs_f64(); - let target_base = match dbg!(&character).movement { + let target_base = match &character.movement { Stand => anim::character::StandAnimation::update_skeleton( &CharacterSkeleton::new(), time,