Add buffs to replay data as well

This commit is contained in:
Sofia 2026-07-29 22:36:31 +03:00
parent e763db9108
commit 1393338839
5 changed files with 19 additions and 4 deletions

View File

@ -2,10 +2,11 @@ use godot::{
classes::{CharacterBody3D, class_macros::private::virtuals::ZipReader::Color},
obj::DynGd,
};
use serde::{Deserialize, Serialize};
use crate::player::IPlayer;
#[derive(Debug, Clone)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Buffs {
buffs: Vec<Buff>,
}
@ -52,7 +53,7 @@ impl Buffs {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Buff {
pub time_remaining: f64,
pub kind: BuffKind,
@ -64,7 +65,7 @@ impl Buff {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BuffKind {
SpawnProtection,
}

View File

@ -379,6 +379,11 @@ impl IPlayer for LocalPlayer {
self.buffs.new_buff(buff);
self.buffs.clone().update_effects(self);
}
fn set_buffs(&mut self, buffs: Buffs) {
self.buffs = buffs.clone();
buffs.update_effects(self);
}
}
#[godot_api]

View File

@ -79,6 +79,7 @@ pub trait IPlayer {
fn get_buffs(&self) -> &Buffs;
fn get_buffs_mut(&mut self) -> &mut Buffs;
fn new_buff(&mut self, buff: Buff);
fn set_buffs(&mut self, buffs: Buffs);
}
pub trait PlayerCommon {

View File

@ -320,6 +320,11 @@ impl IPlayer for RemotePlayer {
self.buffs.new_buff(buff);
self.buffs.clone().update_effects(self);
}
fn set_buffs(&mut self, buffs: Buffs) {
self.buffs = buffs.clone();
buffs.update_effects(self);
}
}
#[godot_api]

View File

@ -15,7 +15,7 @@ use crate::{
net::{network_manager::BallSync, util::NetVector3},
pickup::{PickupKind, ReplayVisibility},
player::{
DamageSource, IPlayer, NetTransform, ball::Ball, remote_player::RemotePlayer,
DamageSource, IPlayer, NetTransform, ball::Ball, buffs::Buffs, remote_player::RemotePlayer,
telegrenade::Telegrenade, weapon::WeaponType,
},
ui::{hud::Hud, replay_hud::ReplayHud},
@ -389,6 +389,7 @@ impl INode for ReplayPlayback {
.bind_mut()
.set_movement_dir(state.movement_dir.into());
character.bind_mut().set_hp(state.health);
character.bind_mut().set_buffs(state.buffs.clone());
let weapon = character.bind().get_weapon().clone();
if let Some(weapon) = weapon
&& weapon.dyn_bind().get_type() != state.current_weapon
@ -754,6 +755,7 @@ pub struct ReplayPlayerState {
pub kills: u16,
pub deaths: u16,
pub health: i32,
pub buffs: Buffs,
}
impl Player {
@ -772,6 +774,7 @@ impl Player {
kills: player.data.kills,
deaths: player.data.deaths,
health: character.dyn_bind().get_health(),
buffs: character.dyn_bind().get_buffs().clone(),
})
} else {
None