Move some stats to PlayerStats

This commit is contained in:
Sofia 2026-08-02 21:49:19 +03:00
parent 1a197618e1
commit 7db901c749
3 changed files with 25 additions and 20 deletions

View File

@ -421,8 +421,7 @@ impl Game {
peer.broadcast_reliable(Package::SetReady(player.id(), true)); peer.broadcast_reliable(Package::SetReady(player.id(), true));
} }
for player in &mut self.players { for player in &mut self.players {
player.data.kills = 0; player.stats = Default::default();
player.data.deaths = 0;
} }
self.goals.clear(); self.goals.clear();
} }
@ -569,9 +568,8 @@ impl Game {
ping: 0, ping: 0,
team: 0, team: 0,
ready: false, ready: false,
kills: 0,
deaths: 0,
}, },
stats: Default::default(),
killing_spree: 0, killing_spree: 0,
killing_spree_cd: 0., killing_spree_cd: 0.,
character: None, character: None,
@ -1079,7 +1077,7 @@ impl Game {
.record_event(ReplayEvent::Death(source, player_id)); .record_event(ReplayEvent::Death(source, player_id));
} }
let total_prev_kills: u16 = self.players.iter().map(|p| p.data.kills).sum(); let total_prev_kills: u16 = self.players.iter().map(|p| p.stats.kills).sum();
if let Some(chat) = &mut Chat::singleton() { if let Some(chat) = &mut Chat::singleton() {
chat.bind_mut() chat.bind_mut()
@ -1089,7 +1087,7 @@ impl Game {
let killing_spree = if let DamageSource::Player(source_id) = source let killing_spree = if let DamageSource::Player(source_id) = source
&& let Some(source_player) = self.find_player_mut(source_id) && let Some(source_player) = self.find_player_mut(source_id)
{ {
source_player.data.kills += 1; source_player.stats.kills += 1;
source_player.killing_spree += 1; source_player.killing_spree += 1;
source_player.killing_spree_cd = 10.; source_player.killing_spree_cd = 10.;
source_player.killing_spree source_player.killing_spree
@ -1100,7 +1098,7 @@ impl Game {
if let Some(player) = self.find_player_mut(player_id) { if let Some(player) = self.find_player_mut(player_id) {
player.killing_spree = 0; player.killing_spree = 0;
player.killing_spree_cd = 0.; player.killing_spree_cd = 0.;
player.data.deaths += 1; player.stats.deaths += 1;
} }
self.run_deferred(move |s| { self.run_deferred(move |s| {
s.signals().on_player_killed().emit(player_id); s.signals().on_player_killed().emit(player_id);
@ -1354,6 +1352,7 @@ impl Game {
pub struct Player { pub struct Player {
pub connection_addr: SocketAddr, pub connection_addr: SocketAddr,
pub data: NetPlayer, pub data: NetPlayer,
pub stats: PlayerStats,
pub character: Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>>, pub character: Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>>,
pub killing_spree: u16, pub killing_spree: u16,
pub killing_spree_cd: f64, pub killing_spree_cd: f64,
@ -1495,6 +1494,16 @@ impl Player {
} }
} }
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct PlayerStats {
pub kills: u16,
pub deaths: u16,
pub goals: u16,
pub own_goals: u16,
pub friendly_kills: u16,
pub friendly_deaths: u16,
}
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct NetPlayer { pub struct NetPlayer {
pub id: u16, pub id: u16,
@ -1502,8 +1511,6 @@ pub struct NetPlayer {
pub name: String, pub name: String,
pub ping: u128, pub ping: u128,
pub team: u8, pub team: u8,
pub kills: u16,
pub deaths: u16,
} }
impl From<NetPlayer> for Player { impl From<NetPlayer> for Player {
@ -1511,6 +1518,7 @@ impl From<NetPlayer> for Player {
Player { Player {
connection_addr: SocketAddr::from(([0, 0, 0, 0], 0)), connection_addr: SocketAddr::from(([0, 0, 0, 0], 0)),
data: value, data: value,
stats: Default::default(),
character: None, character: None,
killing_spree: 0, killing_spree: 0,
killing_spree_cd: 0., killing_spree_cd: 0.,

View File

@ -9,7 +9,7 @@ use godot::{
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::{ use crate::{
game::{Game, GameManager, Player}, game::{Game, GameManager, Player, PlayerStats},
game_settings::GameSettingsManager, game_settings::GameSettingsManager,
map::Map, map::Map,
net::{network_manager::BallSync, util::NetVector3}, net::{network_manager::BallSync, util::NetVector3},
@ -514,8 +514,7 @@ impl INode for ReplayRecorder {
name: player.data.name.clone(), name: player.data.name.clone(),
color: team.bind().color.into(), color: team.bind().color.into(),
team: player.data.team, team: player.data.team,
kills: 0, stats: Default::default(),
deaths: 0,
}, },
); );
} }
@ -585,8 +584,7 @@ impl ReplayRecorder {
player_data.insert(player.id(), state); player_data.insert(player.id(), state);
} }
if let Some(replay_player) = self.replay.players.get_mut(&player.id()) { if let Some(replay_player) = self.replay.players.get_mut(&player.id()) {
replay_player.kills = player.data.kills; replay_player.stats = player.stats.clone();
replay_player.deaths = player.data.deaths;
} }
} }
ball_data = if let Some(ball) = &game.bind().world_ball { ball_data = if let Some(ball) = &game.bind().world_ball {
@ -688,8 +686,7 @@ pub struct ReplayPlayer {
pub name: String, pub name: String,
pub color: ReplayColor, pub color: ReplayColor,
pub team: u8, pub team: u8,
pub kills: u16, pub stats: PlayerStats,
pub deaths: u16,
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
@ -778,8 +775,8 @@ impl Player {
.map(|w| w.dyn_bind().get_type()) .map(|w| w.dyn_bind().get_type())
.unwrap_or(WeaponType::Raygun), .unwrap_or(WeaponType::Raygun),
is_dead: character.dyn_bind().is_dead(), is_dead: character.dyn_bind().is_dead(),
kills: player.data.kills, kills: player.stats.kills,
deaths: player.data.deaths, deaths: player.stats.deaths,
health: character.dyn_bind().get_health(), health: character.dyn_bind().get_health(),
buffs: character.dyn_bind().get_buffs().clone(), buffs: character.dyn_bind().get_buffs().clone(),
}) })

View File

@ -70,10 +70,10 @@ impl PlayerListing {
name_label.set_text(&player.data.name); name_label.set_text(&player.data.name);
} }
if let Some(kills_label) = &mut self.kills_label { if let Some(kills_label) = &mut self.kills_label {
kills_label.set_text(&player.data.kills.to_string()); kills_label.set_text(&player.stats.kills.to_string());
} }
if let Some(deaths_label) = &mut self.deaths_label { if let Some(deaths_label) = &mut self.deaths_label {
deaths_label.set_text(&player.data.deaths.to_string()); deaths_label.set_text(&player.stats.deaths.to_string());
} }
if let Some(ping_label) = &mut self.ping_label { if let Some(ping_label) = &mut self.ping_label {
ping_label.set_text(&player.data.ping.to_string()); ping_label.set_text(&player.data.ping.to_string());