diff --git a/common/src/states/basic_aura.rs b/common/src/states/basic_aura.rs index 6f7b9c9dc8..0c2f084c67 100644 --- a/common/src/states/basic_aura.rs +++ b/common/src/states/basic_aura.rs @@ -55,7 +55,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.8); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/basic_beam.rs b/common/src/states/basic_beam.rs index f7f72720be..751cc105ed 100644 --- a/common/src/states/basic_beam.rs +++ b/common/src/states/basic_beam.rs @@ -67,7 +67,7 @@ impl CharacterBehavior for Data { let ori_rate = self.static_data.ori_rate; - handle_orientation(data, &mut update, ori_rate); + handle_orientation(data, &mut update, ori_rate, None); handle_move(data, &mut update, 0.4); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/basic_block.rs b/common/src/states/basic_block.rs index 298fc2206e..aca9b9edec 100644 --- a/common/src/states/basic_block.rs +++ b/common/src/states/basic_block.rs @@ -36,7 +36,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.4); match self.stage_section { diff --git a/common/src/states/basic_melee.rs b/common/src/states/basic_melee.rs index e32ccc5225..3e83562c6e 100644 --- a/common/src/states/basic_melee.rs +++ b/common/src/states/basic_melee.rs @@ -56,10 +56,9 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.7); handle_jump(data, &mut update, 1.0); - handle_orientation(data, &mut update, 0.35); match self.stage_section { StageSection::Buildup => { diff --git a/common/src/states/basic_ranged.rs b/common/src/states/basic_ranged.rs index 7ca246f7c4..cf2bb06523 100644 --- a/common/src/states/basic_ranged.rs +++ b/common/src/states/basic_ranged.rs @@ -48,7 +48,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.3); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/blink.rs b/common/src/states/blink.rs index 66bd9b14c7..fae3bbef76 100644 --- a/common/src/states/blink.rs +++ b/common/src/states/blink.rs @@ -37,7 +37,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); match self.stage_section { StageSection::Buildup => { diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs index 37691a5907..f53e726466 100644 --- a/common/src/states/charged_melee.rs +++ b/common/src/states/charged_melee.rs @@ -72,7 +72,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.7); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/charged_ranged.rs b/common/src/states/charged_ranged.rs index bd9aabd054..9ef1c430ef 100644 --- a/common/src/states/charged_ranged.rs +++ b/common/src/states/charged_ranged.rs @@ -74,7 +74,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, self.static_data.move_speed); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/combo_melee.rs b/common/src/states/combo_melee.rs index affcdfa5e9..1dc7d2f585 100644 --- a/common/src/states/combo_melee.rs +++ b/common/src/states/combo_melee.rs @@ -175,7 +175,12 @@ impl CharacterBehavior for Data { match self.stage_section { StageSection::Buildup => { if self.timer < self.static_data.stage_data[stage_index].base_buildup_duration { - handle_orientation(data, &mut update, 0.4 * self.static_data.ori_modifier); + handle_orientation( + data, + &mut update, + 0.4 * self.static_data.ori_modifier, + None, + ); // Build up update.character = CharacterState::ComboMelee(Data { @@ -289,7 +294,12 @@ impl CharacterBehavior for Data { }); } else if self.timer < self.static_data.stage_data[stage_index].base_swing_duration { - handle_orientation(data, &mut update, 0.4 * self.static_data.ori_modifier); + handle_orientation( + data, + &mut update, + 0.4 * self.static_data.ori_modifier, + None, + ); // Forward movement handle_forced_movement(data, &mut update, ForcedMovement::Forward { @@ -314,7 +324,12 @@ impl CharacterBehavior for Data { }, StageSection::Recover => { if self.timer < self.static_data.stage_data[stage_index].base_recover_duration { - handle_orientation(data, &mut update, 0.8 * self.static_data.ori_modifier); + handle_orientation( + data, + &mut update, + 0.8 * self.static_data.ori_modifier, + None, + ); // Recovers update.character = CharacterState::ComboMelee(Data { static_data: self.static_data.clone(), diff --git a/common/src/states/dash_melee.rs b/common/src/states/dash_melee.rs index fe086ec68e..6deed4ac07 100644 --- a/common/src/states/dash_melee.rs +++ b/common/src/states/dash_melee.rs @@ -82,7 +82,7 @@ impl CharacterBehavior for Data { match self.stage_section { StageSection::Buildup => { if self.timer < self.static_data.buildup_duration { - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); // Build up update.character = CharacterState::DashMelee(Data { timer: tick_attack_or_default(data, self.timer, None), @@ -109,7 +109,7 @@ impl CharacterBehavior for Data { / self.static_data.charge_duration.as_secs_f32()) .min(1.0); - handle_orientation(data, &mut update, self.static_data.ori_modifier); + handle_orientation(data, &mut update, self.static_data.ori_modifier, None); handle_forced_movement(data, &mut update, ForcedMovement::Forward { strength: self.static_data.forward_speed * charge_frac.sqrt(), }); diff --git a/common/src/states/equipping.rs b/common/src/states/equipping.rs index fc531dab62..609acf48ae 100644 --- a/common/src/states/equipping.rs +++ b/common/src/states/equipping.rs @@ -26,7 +26,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 1.0); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/glide_wield.rs b/common/src/states/glide_wield.rs index ade2f71b58..88da23275b 100644 --- a/common/src/states/glide_wield.rs +++ b/common/src/states/glide_wield.rs @@ -35,7 +35,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 1.0); handle_jump(data, &mut update, 1.0); handle_dodge_input(data, &mut update); diff --git a/common/src/states/idle.rs b/common/src/states/idle.rs index 1834677354..d1f02390b1 100644 --- a/common/src/states/idle.rs +++ b/common/src/states/idle.rs @@ -10,7 +10,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 1.0); handle_jump(data, &mut update, 1.0); handle_wield(data, &mut update); diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs index 8125ec4617..dfcdc6ce67 100644 --- a/common/src/states/leap_melee.rs +++ b/common/src/states/leap_melee.rs @@ -60,7 +60,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.3); handle_jump(data, &mut update, 1.0); diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs index de55813305..07471bcd25 100644 --- a/common/src/states/repeater_ranged.rs +++ b/common/src/states/repeater_ranged.rs @@ -54,7 +54,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.3); match self.stage_section { diff --git a/common/src/states/roll.rs b/common/src/states/roll.rs index 802da371e1..d3c593bfd7 100644 --- a/common/src/states/roll.rs +++ b/common/src/states/roll.rs @@ -54,7 +54,7 @@ impl CharacterBehavior for Data { update.should_strafe = false; // Smooth orientation - handle_orientation(data, &mut update, 2.5); + handle_orientation(data, &mut update, 2.5, None); match self.stage_section { StageSection::Buildup => { diff --git a/common/src/states/shockwave.rs b/common/src/states/shockwave.rs index 440fc4f834..70d3eee546 100644 --- a/common/src/states/shockwave.rs +++ b/common/src/states/shockwave.rs @@ -65,7 +65,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, self.static_data.move_efficiency); match self.stage_section { diff --git a/common/src/states/sneak.rs b/common/src/states/sneak.rs index bc4c6566ba..537c7a9836 100644 --- a/common/src/states/sneak.rs +++ b/common/src/states/sneak.rs @@ -10,7 +10,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 0.4); handle_jump(data, &mut update, 1.0); handle_wield(data, &mut update); diff --git a/common/src/states/sprite_interact.rs b/common/src/states/sprite_interact.rs index 2d7570a881..2b2ee9b1f9 100644 --- a/common/src/states/sprite_interact.rs +++ b/common/src/states/sprite_interact.rs @@ -4,6 +4,7 @@ use crate::{ event::ServerEvent, states::behavior::{CharacterBehavior, JoinData}, terrain::SpriteKind, + util::Dir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -43,7 +44,10 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 0.0); + let ori_dir = Dir::from_unnormalized(Vec3::from( + (self.static_data.sprite_pos.map(|x| x as f32) - data.pos.0).xy(), + )); + handle_orientation(data, &mut update, 1.0, ori_dir); handle_move(data, &mut update, 0.0); match self.stage_section { diff --git a/common/src/states/stunned.rs b/common/src/states/stunned.rs index 9d169e01dc..97bd5e7937 100644 --- a/common/src/states/stunned.rs +++ b/common/src/states/stunned.rs @@ -36,7 +36,7 @@ impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { let mut update = StateUpdate::from(data); - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, self.static_data.movement_speed); match self.stage_section { diff --git a/common/src/states/talk.rs b/common/src/states/talk.rs index 21b15dd129..59abfc8e69 100644 --- a/common/src/states/talk.rs +++ b/common/src/states/talk.rs @@ -15,7 +15,7 @@ impl CharacterBehavior for Data { let mut update = StateUpdate::from(data); handle_wield(data, &mut update); - handle_orientation(data, &mut update, TURN_RATE); + handle_orientation(data, &mut update, TURN_RATE, None); update } diff --git a/common/src/states/use_item.rs b/common/src/states/use_item.rs index 0265c5b9f6..10d490eec2 100644 --- a/common/src/states/use_item.rs +++ b/common/src/states/use_item.rs @@ -52,11 +52,11 @@ impl CharacterBehavior for Data { match self.static_data.item_kind { ItemUseKind::Consumable(ConsumableKind::Drink) => { - handle_orientation(data, &mut update, 1.0); + handle_orientation(data, &mut update, 1.0, None); handle_move(data, &mut update, 1.0); }, ItemUseKind::Consumable(ConsumableKind::Food | ConsumableKind::ComplexFood) => { - handle_orientation(data, &mut update, 0.0); + handle_orientation(data, &mut update, 0.0, None); handle_move(data, &mut update, 0.0); }, } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index e060a68d74..c4e8baa05d 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -349,11 +349,18 @@ pub fn handle_forced_movement( } } -pub fn handle_orientation(data: &JoinData<'_>, update: &mut StateUpdate, efficiency: f32) { - let dir = (is_strafing(data, update) || update.character.is_attack()) - .then(|| data.inputs.look_dir.to_horizontal().unwrap_or_default()) - .or_else(|| Dir::from_unnormalized(data.inputs.move_dir.into())) - .unwrap_or_else(|| data.ori.to_horizontal().look_dir()); +pub fn handle_orientation( + data: &JoinData<'_>, + update: &mut StateUpdate, + efficiency: f32, + dir_override: Option