Add buffs at player spawn

This commit is contained in:
Sofia 2026-07-29 22:29:58 +03:00
parent a71bc513ac
commit e763db9108
5 changed files with 38 additions and 12 deletions

View File

@ -28,8 +28,13 @@ use crate::{
}, },
pickup::PickupKind, pickup::PickupKind,
player::{ player::{
DamageSource, IPlayer, NetTransform, ball::Ball, local_player::LocalPlayer, DamageSource, IPlayer, NetTransform,
remote_player::RemotePlayer, telegrenade::Telegrenade, weapon::WeaponType, ball::Ball,
buffs::{Buff, BuffKind},
local_player::LocalPlayer,
remote_player::RemotePlayer,
telegrenade::Telegrenade,
weapon::WeaponType,
}, },
replay::{ReplayEvent, ReplayPlayback, ReplayRecorder}, replay::{ReplayEvent, ReplayPlayback, ReplayRecorder},
team_resource::TeamResource, team_resource::TeamResource,
@ -830,6 +835,11 @@ impl Game {
.spawn_player(id, team, id == self.self_id.unwrap_or(0), None, true); .spawn_player(id, team, id == self.self_id.unwrap_or(0), None, true);
if let Some(character) = &mut character { 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() { if self.current_replay_playback.is_some() {
character.set_visible(false); character.set_visible(false);
} }
@ -895,6 +905,11 @@ impl Game {
if let Some(map) = &mut self.current_map { if let Some(map) = &mut self.current_map {
if let Some(player) = self.players.iter_mut().find(|p| p.id() == id) { if let Some(player) = self.players.iter_mut().find(|p| p.id() == id) {
if let Some(mut character) = player.character.clone() { 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 // This is a respawn, delete old character
if let Some(mut recorder) = self.replay_recorder.clone() if let Some(mut recorder) = self.replay_recorder.clone()
&& let Some(state) = player.get_state(player.clone()) && let Some(state) = player.get_state(player.clone())

View File

@ -12,11 +12,7 @@ pub struct Buffs {
impl Default for Buffs { impl Default for Buffs {
fn default() -> Self { fn default() -> Self {
let mut buffs = Vec::new(); let buffs = Vec::new();
buffs.push(Buff {
time_remaining: 5.,
kind: BuffKind::SpawnProtection,
});
Self { buffs } Self { buffs }
} }
@ -50,12 +46,16 @@ impl Buffs {
} }
true true
} }
pub fn new_buff(&mut self, buff: Buff) {
self.buffs.push(buff);
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Buff { pub struct Buff {
time_remaining: f64, pub time_remaining: f64,
kind: BuffKind, pub kind: BuffKind,
} }
impl Buff { impl Buff {

View File

@ -24,7 +24,7 @@ use crate::{
pickup::PickupKind, pickup::PickupKind,
player::{ player::{
DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon, DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon,
buffs::Buffs, buffs::{Buff, Buffs},
effects::PlayerEffects, effects::PlayerEffects,
remote_player::RemotePlayer, remote_player::RemotePlayer,
shootable::Shootable, shootable::Shootable,
@ -374,6 +374,11 @@ impl IPlayer for LocalPlayer {
fn get_buffs_mut(&mut self) -> &mut Buffs { fn get_buffs_mut(&mut self) -> &mut Buffs {
&mut self.buffs &mut self.buffs
} }
fn new_buff(&mut self, buff: Buff) {
self.buffs.new_buff(buff);
self.buffs.clone().update_effects(self);
}
} }
#[godot_api] #[godot_api]

View File

@ -16,7 +16,7 @@ use crate::{
}, },
pickup::PickupKind, pickup::PickupKind,
player::{ player::{
buffs::Buffs, buffs::{Buff, Buffs},
shootable::Shootable, shootable::Shootable,
telegrenade::Telegrenade, telegrenade::Telegrenade,
weapon::{BallWeapon, Weapon, WeaponType}, weapon::{BallWeapon, Weapon, WeaponType},
@ -78,6 +78,7 @@ pub trait IPlayer {
fn set_bubble_color(&mut self, color: Color); fn set_bubble_color(&mut self, color: Color);
fn get_buffs(&self) -> &Buffs; fn get_buffs(&self) -> &Buffs;
fn get_buffs_mut(&mut self) -> &mut Buffs; fn get_buffs_mut(&mut self) -> &mut Buffs;
fn new_buff(&mut self, buff: Buff);
} }
pub trait PlayerCommon { pub trait PlayerCommon {

View File

@ -13,7 +13,7 @@ use crate::{
pickup::PickupKind, pickup::PickupKind,
player::{ player::{
DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon, DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon,
buffs::Buffs, buffs::{Buff, Buffs},
effects::PlayerEffects, effects::PlayerEffects,
shootable::Shootable, shootable::Shootable,
soldier_mesh::SoldierMesh, soldier_mesh::SoldierMesh,
@ -315,6 +315,11 @@ impl IPlayer for RemotePlayer {
fn get_buffs_mut(&mut self) -> &mut Buffs { fn get_buffs_mut(&mut self) -> &mut Buffs {
&mut self.buffs &mut self.buffs
} }
fn new_buff(&mut self, buff: Buff) {
self.buffs.new_buff(buff);
self.buffs.clone().update_effects(self);
}
} }
#[godot_api] #[godot_api]