diff --git a/rust/src/game/mod.rs b/rust/src/game/mod.rs index 7421b14..0a8fa01 100644 --- a/rust/src/game/mod.rs +++ b/rust/src/game/mod.rs @@ -28,8 +28,13 @@ use crate::{ }, pickup::PickupKind, player::{ - DamageSource, IPlayer, NetTransform, ball::Ball, local_player::LocalPlayer, - remote_player::RemotePlayer, telegrenade::Telegrenade, weapon::WeaponType, + DamageSource, IPlayer, NetTransform, + ball::Ball, + buffs::{Buff, BuffKind}, + local_player::LocalPlayer, + remote_player::RemotePlayer, + telegrenade::Telegrenade, + weapon::WeaponType, }, replay::{ReplayEvent, ReplayPlayback, ReplayRecorder}, team_resource::TeamResource, @@ -830,6 +835,11 @@ impl Game { .spawn_player(id, team, id == self.self_id.unwrap_or(0), None, true); if let Some(character) = &mut character { + character.dyn_bind_mut().new_buff(Buff { + time_remaining: 5., + kind: BuffKind::SpawnProtection, + }); + if self.current_replay_playback.is_some() { character.set_visible(false); } @@ -895,6 +905,11 @@ impl Game { if let Some(map) = &mut self.current_map { if let Some(player) = self.players.iter_mut().find(|p| p.id() == id) { if let Some(mut character) = player.character.clone() { + character.dyn_bind_mut().new_buff(Buff { + time_remaining: 5., + kind: BuffKind::SpawnProtection, + }); + // This is a respawn, delete old character if let Some(mut recorder) = self.replay_recorder.clone() && let Some(state) = player.get_state(player.clone()) diff --git a/rust/src/player/buffs.rs b/rust/src/player/buffs.rs index 3fd598c..6815d90 100644 --- a/rust/src/player/buffs.rs +++ b/rust/src/player/buffs.rs @@ -12,11 +12,7 @@ pub struct Buffs { impl Default for Buffs { fn default() -> Self { - let mut buffs = Vec::new(); - buffs.push(Buff { - time_remaining: 5., - kind: BuffKind::SpawnProtection, - }); + let buffs = Vec::new(); Self { buffs } } @@ -50,12 +46,16 @@ impl Buffs { } true } + + pub fn new_buff(&mut self, buff: Buff) { + self.buffs.push(buff); + } } #[derive(Debug, Clone)] pub struct Buff { - time_remaining: f64, - kind: BuffKind, + pub time_remaining: f64, + pub kind: BuffKind, } impl Buff { diff --git a/rust/src/player/local_player.rs b/rust/src/player/local_player.rs index aabeb94..42a08f9 100644 --- a/rust/src/player/local_player.rs +++ b/rust/src/player/local_player.rs @@ -24,7 +24,7 @@ use crate::{ pickup::PickupKind, player::{ DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon, - buffs::Buffs, + buffs::{Buff, Buffs}, effects::PlayerEffects, remote_player::RemotePlayer, shootable::Shootable, @@ -374,6 +374,11 @@ impl IPlayer for LocalPlayer { fn get_buffs_mut(&mut self) -> &mut Buffs { &mut self.buffs } + + fn new_buff(&mut self, buff: Buff) { + self.buffs.new_buff(buff); + self.buffs.clone().update_effects(self); + } } #[godot_api] diff --git a/rust/src/player/mod.rs b/rust/src/player/mod.rs index bc62f8c..2f0f762 100644 --- a/rust/src/player/mod.rs +++ b/rust/src/player/mod.rs @@ -16,7 +16,7 @@ use crate::{ }, pickup::PickupKind, player::{ - buffs::Buffs, + buffs::{Buff, Buffs}, shootable::Shootable, telegrenade::Telegrenade, weapon::{BallWeapon, Weapon, WeaponType}, @@ -78,6 +78,7 @@ pub trait IPlayer { fn set_bubble_color(&mut self, color: Color); fn get_buffs(&self) -> &Buffs; fn get_buffs_mut(&mut self) -> &mut Buffs; + fn new_buff(&mut self, buff: Buff); } pub trait PlayerCommon { diff --git a/rust/src/player/remote_player.rs b/rust/src/player/remote_player.rs index a13d64e..d87dcd5 100644 --- a/rust/src/player/remote_player.rs +++ b/rust/src/player/remote_player.rs @@ -13,7 +13,7 @@ use crate::{ pickup::PickupKind, player::{ DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon, - buffs::Buffs, + buffs::{Buff, Buffs}, effects::PlayerEffects, shootable::Shootable, soldier_mesh::SoldierMesh, @@ -315,6 +315,11 @@ impl IPlayer for RemotePlayer { fn get_buffs_mut(&mut self) -> &mut Buffs { &mut self.buffs } + + fn new_buff(&mut self, buff: Buff) { + self.buffs.new_buff(buff); + self.buffs.clone().update_effects(self); + } } #[godot_api]