diff --git a/common/src/states/glide.rs b/common/src/states/glide.rs index f2c1cc59f8..7932a13f3c 100644 --- a/common/src/states/glide.rs +++ b/common/src/states/glide.rs @@ -22,6 +22,7 @@ pub struct Data { pub ori: Ori, last_vel: Vel, timer: f32, + inputs_disabled: bool, } impl Data { @@ -40,13 +41,19 @@ impl Data { ori, last_vel: Vel::zero(), timer: 0.0, + inputs_disabled: true, } } fn tgt_dir(&self, data: &JoinData) -> Dir { + let move_dir = if self.inputs_disabled { + Vec2::zero() + } else { + data.inputs.move_dir + }; let look_ori = Ori::from(data.inputs.look_dir); look_ori - .yawed_right(PI / 3.0 * look_ori.right().xy().dot(data.inputs.move_dir)) + .yawed_right(PI / 3.0 * look_ori.right().xy().dot(move_dir)) .pitched_up(PI * 0.04) .pitched_down( data.inputs @@ -54,7 +61,7 @@ impl Data { .xy() .try_normalized() .map_or(0.0, |ld| { - PI * 0.1 * ld.dot(data.inputs.move_dir) * self.timer.min(PITCH_SLOW_TIME) + PI * 0.1 * ld.dot(move_dir) * self.timer.min(PITCH_SLOW_TIME) / PITCH_SLOW_TIME }), ) @@ -84,6 +91,8 @@ impl CharacterBehavior for Data { .map(|fluid| fluid.relative_flow(data.vel)) .unwrap_or_default(); + let inputs_disabled = self.inputs_disabled && !data.inputs.move_dir.is_approx_zero(); + let ori = { let slerp_s = { let angle = self.ori.look_dir().angle_between(*data.inputs.look_dir); @@ -178,6 +187,7 @@ impl CharacterBehavior for Data { ori, last_vel: *data.vel, timer: self.timer + data.dt.0, + inputs_disabled, ..*self }); } else { diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 8d4bfecb5c..c66d0cfcb1 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -22,7 +22,7 @@ use common::{ trade::TradeResult, util::{ find_dist::{Cube, Cylinder, FindDist}, - Dir, + Dir, Plane, }, vol::ReadVol, }; @@ -762,19 +762,32 @@ impl PlayState for SessionState { .read_storage::() .get(entity)? .in_fluid?; - let wind = ecs - .read_storage::() + ecs.read_storage::() .get(entity) - .map(|vel| -fluid.relative_flow(vel).0)?; - Dir::from_unnormalized(wind) + .map(|vel| fluid.relative_flow(vel).0) + .map(|rel_flow| { + if !self.free_look { + Plane::from(Dir::new(self.scene.camera().right())).projection( + rel_flow * self.inputs.look_dir.dot(rel_flow).signum(), + ) + } else { + -rel_flow + } + }) + .and_then(Dir::from_unnormalized) }) { self.key_state.auto_walk = false; + self.inputs.move_dir = Vec2::zero(); self.inputs.look_dir = dir; - } else if !self.free_look { - self.walk_forward_dir = self.scene.camera().forward_xy(); - self.walk_right_dir = self.scene.camera().right_xy(); - self.inputs.look_dir = Dir::from_unnormalized(cam_dir + aim_dir_offset).unwrap(); + } else { + self.key_state.auto_walk = self.auto_walk; + if !self.free_look { + self.walk_forward_dir = self.scene.camera().forward_xy(); + self.walk_right_dir = self.scene.camera().right_xy(); + self.inputs.look_dir = + Dir::from_unnormalized(cam_dir + aim_dir_offset).unwrap(); + } } // Get the current state of movement related inputs