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,
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())

View File

@ -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 {

View File

@ -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]

View File

@ -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 {

View File

@ -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]