diff --git a/rust/src/player/mod.rs b/rust/src/player/mod.rs index 95d0b38..bc35527 100644 --- a/rust/src/player/mod.rs +++ b/rust/src/player/mod.rs @@ -710,11 +710,16 @@ impl LocalPlayer { } } - fn spawn_weapon(&mut self, weapon: DynGd) { - if let Some(mut weapon) = self.weapon.take() { + fn spawn_weapon(&mut self, mut weapon: DynGd) { + let prev_cd = if let Some(mut weapon) = self.weapon.take() { + let prev_cd = weapon.dyn_bind().get_remaining_cd(); weapon.queue_free(); - } + prev_cd + } else { + 0. + }; if let Some(weapon_node) = &mut self.weapon_node { + weapon.dyn_bind_mut().set_remaining_cd(prev_cd); weapon_node.add_child(&weapon); self.weapon = Some(weapon); } diff --git a/rust/src/player/soldier_mesh.rs b/rust/src/player/soldier_mesh.rs index 3a0ef42..c0fe8d4 100644 --- a/rust/src/player/soldier_mesh.rs +++ b/rust/src/player/soldier_mesh.rs @@ -80,12 +80,17 @@ impl SoldierMesh { fn spawn_weapon( &mut self, - node: DynGd, + mut node: DynGd, ) -> Option> { - if let Some(mut weapon) = self.current_weapon.take() { + let prev_cd = if let Some(mut weapon) = self.current_weapon.take() { + let rem = weapon.dyn_bind().get_remaining_cd(); weapon.queue_free(); - } + rem + } else { + 0. + }; if let Some(hand) = &mut self.hand_attachment { + node.dyn_bind_mut().set_remaining_cd(prev_cd); hand.add_child(&node); self.current_weapon = Some(node.clone()); Some(node) diff --git a/rust/src/player/weapon.rs b/rust/src/player/weapon.rs index 9d23988..4ae8967 100644 --- a/rust/src/player/weapon.rs +++ b/rust/src/player/weapon.rs @@ -23,6 +23,8 @@ pub trait Weapon { deal_damage: bool, ) -> bool; fn get_type(&self) -> WeaponType; + fn get_remaining_cd(&self) -> f64; + fn set_remaining_cd(&mut self, cd: f64); } #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, PartialOrd)] @@ -127,6 +129,14 @@ impl Weapon for Raygun { fn get_type(&self) -> WeaponType { WeaponType::Raygun } + + fn get_remaining_cd(&self) -> f64 { + self.cooldown_remaining + } + + fn set_remaining_cd(&mut self, cd: f64) { + self.cooldown_remaining = cd; + } } #[derive(GodotClass)] @@ -219,6 +229,14 @@ impl Weapon for Shotgun { fn get_type(&self) -> WeaponType { WeaponType::Shotgun } + + fn get_remaining_cd(&self) -> f64 { + self.cooldown_remaining + } + + fn set_remaining_cd(&mut self, cd: f64) { + self.cooldown_remaining = cd; + } } #[derive(GodotClass)] @@ -280,4 +298,10 @@ impl Weapon for BallWeapon { fn get_type(&self) -> WeaponType { WeaponType::Ball } + + fn get_remaining_cd(&self) -> f64 { + 0. + } + + fn set_remaining_cd(&mut self, _: f64) {} }