From bb3d91b0c88e5fa04e5ca548efd2b4a6907cac2c Mon Sep 17 00:00:00 2001 From: timokoesters Date: Mon, 24 Feb 2020 22:20:50 +0100 Subject: [PATCH] fix: non-humanoid npcs can attack again --- common/src/comp/character_state.rs | 2 +- common/src/states/basic_attack.rs | 18 +++++++++++------- common/src/states/utils.rs | 4 +--- common/src/states/wielding.rs | 10 ++++------ common/src/sys/combat.rs | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs index c3801b7889..589eeaeca0 100644 --- a/common/src/comp/character_state.rs +++ b/common/src/comp/character_state.rs @@ -143,7 +143,7 @@ impl Component for CharacterState { #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] pub struct Attacking { - pub weapon: ToolData, + pub weapon: Option, } impl Component for Attacking { diff --git a/common/src/states/basic_attack.rs b/common/src/states/basic_attack.rs index f142bc7e13..1574abed2e 100644 --- a/common/src/states/basic_attack.rs +++ b/common/src/states/basic_attack.rs @@ -14,14 +14,14 @@ pub struct State { impl StateHandler for State { fn new(ecs_data: &EcsStateData) -> Self { - let tool_data = + let remaining_duration = if let Some(Tool(data)) = ecs_data.stats.equipment.main.as_ref().map(|i| i.kind) { - data + data.attack_duration() } else { - ToolData::default() + Duration::from_millis(300) }; Self { - remaining_duration: tool_data.attack_duration(), + remaining_duration, exhausted: false, } } @@ -43,7 +43,7 @@ impl StateHandler for State { && if let Some(Tool(data)) = tool_kind { (self.remaining_duration < data.attack_recover_duration()) } else { - false + true }; let mut exhausted = self.exhausted; @@ -52,9 +52,13 @@ impl StateHandler for State { if let Some(Tool(data)) = tool_kind { ecs_data .updater - .insert(*ecs_data.entity, Attacking { weapon: data }); - exhausted = true; + .insert(*ecs_data.entity, Attacking { weapon: Some(data) }); + } else { + ecs_data + .updater + .insert(*ecs_data.entity, Attacking { weapon: None }); } + exhausted = true; } else { ecs_data.updater.remove::(*ecs_data.entity); } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 861d2c2d07..14294a3631 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -47,9 +47,7 @@ pub fn handle_move_dir(ecs_data: &EcsStateData, update: &mut StateUpdate) { pub fn handle_wield(ecs_data: &EcsStateData, update: &mut StateUpdate) { if ecs_data.inputs.primary.is_pressed() { - if let Some(Tool(_)) = ecs_data.stats.equipment.main.as_ref().map(|i| &i.kind) { - update.character = CharacterState::Wielding(None); - } + update.character = CharacterState::Wielding(None); } } diff --git a/common/src/states/wielding.rs b/common/src/states/wielding.rs index e3271ee958..58da3c22b0 100644 --- a/common/src/states/wielding.rs +++ b/common/src/states/wielding.rs @@ -14,16 +14,14 @@ pub struct State { impl StateHandler for State { fn new(ecs_data: &EcsStateData) -> Self { - let tool_data = + let equip_delay = if let Some(Tool(data)) = ecs_data.stats.equipment.main.as_ref().map(|i| i.kind) { - data + data.equip_time() } else { - ToolData::default() + Duration::default() }; - Self { - equip_delay: tool_data.equip_time(), - } + Self { equip_delay } } fn handle(&self, ecs_data: &EcsStateData) -> StateUpdate { diff --git a/common/src/sys/combat.rs b/common/src/sys/combat.rs index d8d894a968..0024e639a5 100644 --- a/common/src/sys/combat.rs +++ b/common/src/sys/combat.rs @@ -99,7 +99,7 @@ impl<'a> System<'a> for Sys { && ori2.angle_between(pos_b2 - pos2) < ATTACK_ANGLE.to_radians() / 2.0 + (rad_b / pos2.distance(pos_b2)).atan() { // Weapon gives base damage - let mut dmg = attack.weapon.base_damage as i32; + let mut dmg = attack.weapon.map(|w| w.base_damage as i32).unwrap_or(3); // Block if character_b.is_block()