From 13933388398a4ed1e8252a4c67c12bdb3fb39c39 Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 29 Jul 2026 22:36:31 +0300 Subject: [PATCH] Add buffs to replay data as well --- rust/src/player/buffs.rs | 7 ++++--- rust/src/player/local_player.rs | 5 +++++ rust/src/player/mod.rs | 1 + rust/src/player/remote_player.rs | 5 +++++ rust/src/replay.rs | 5 ++++- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/rust/src/player/buffs.rs b/rust/src/player/buffs.rs index 6815d90..e2e29fc 100644 --- a/rust/src/player/buffs.rs +++ b/rust/src/player/buffs.rs @@ -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, } @@ -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, } diff --git a/rust/src/player/local_player.rs b/rust/src/player/local_player.rs index 42a08f9..3cc4844 100644 --- a/rust/src/player/local_player.rs +++ b/rust/src/player/local_player.rs @@ -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] diff --git a/rust/src/player/mod.rs b/rust/src/player/mod.rs index 2f0f762..b9fbb69 100644 --- a/rust/src/player/mod.rs +++ b/rust/src/player/mod.rs @@ -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 { diff --git a/rust/src/player/remote_player.rs b/rust/src/player/remote_player.rs index d87dcd5..351e5d9 100644 --- a/rust/src/player/remote_player.rs +++ b/rust/src/player/remote_player.rs @@ -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] diff --git a/rust/src/replay.rs b/rust/src/replay.rs index 8cb7c67..2878eac 100644 --- a/rust/src/replay.rs +++ b/rust/src/replay.rs @@ -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