Record deaths and shoots

This commit is contained in:
Sofia 2026-07-26 19:30:12 +03:00
parent 7a9292242f
commit 9b522f0789
2 changed files with 51 additions and 4 deletions

View File

@ -23,7 +23,7 @@ use crate::{
DamageSource, IPlayer, NetTransform, ball::Ball, local_player::LocalPlayer, DamageSource, IPlayer, NetTransform, ball::Ball, local_player::LocalPlayer,
remote_player::RemotePlayer, weapon::WeaponType, remote_player::RemotePlayer, weapon::WeaponType,
}, },
replay::{ReplayPlayback, ReplayRecorder}, replay::{ReplayEvent, ReplayPlayback, ReplayRecorder},
team_resource::TeamResource, team_resource::TeamResource,
ui::cli::{Command, CommandLinePanel}, ui::cli::{Command, CommandLinePanel},
}; };
@ -920,6 +920,12 @@ impl Game {
look_up: f32, look_up: f32,
deal_damage: bool, deal_damage: bool,
) -> bool { ) -> bool {
if let Some(recorder) = &mut self.replay_recorder {
recorder
.bind_mut()
.record_event(ReplayEvent::Shoot(player_id, to));
}
let self_id = self.self_id.clone().unwrap_or(0); let self_id = self.self_id.clone().unwrap_or(0);
if let Some(player) = self.find_player_mut(player_id) { if let Some(player) = self.find_player_mut(player_id) {
if player.id() != self_id { if player.id() != self_id {
@ -955,6 +961,12 @@ impl Game {
// Handle for when a player is killed, run both on client and server // Handle for when a player is killed, run both on client and server
pub fn on_kill(&mut self, source: DamageSource, player_id: u16) { pub fn on_kill(&mut self, source: DamageSource, player_id: u16) {
if let Some(recorder) = &mut self.replay_recorder {
recorder
.bind_mut()
.record_event(ReplayEvent::Death(source, player_id));
}
if let DamageSource::Player(source_player_id) = source if let DamageSource::Player(source_player_id) = source
&& let Some(player) = self.find_player(source_player_id) && let Some(player) = self.find_player(source_player_id)
&& let Some(character) = player.character.clone() && let Some(character) = player.character.clone()

View File

@ -6,7 +6,9 @@ use crate::{
game_manager::{Game, Player}, game_manager::{Game, Player},
map::Map, map::Map,
net::util::NetVector3, net::util::NetVector3,
player::{IPlayer, NetTransform, remote_player::RemotePlayer, weapon::WeaponType}, player::{
DamageSource, IPlayer, NetTransform, remote_player::RemotePlayer, weapon::WeaponType,
},
}; };
#[derive(GodotClass)] #[derive(GodotClass)]
@ -43,6 +45,21 @@ impl INode for ReplayPlayback {
} }
} }
for event in &frame.events {
match event {
ReplayEvent::Death(damage_source, player_id) => {
if let Some(character) = self.player_characters.get_mut(player_id) {
character.bind_mut().kill(*damage_source);
}
}
ReplayEvent::Shoot(player_id, to) => {
if let Some(character) = self.player_characters.get_mut(player_id) {
character.bind_mut().try_shoot(*to, false);
}
}
}
}
for (id, mut character) in self.player_characters.clone() { for (id, mut character) in self.player_characters.clone() {
if let Some(state) = frame.player_data.get(&id) { if let Some(state) = frame.player_data.get(&id) {
character.bind_mut().apply_transform(state.transform); character.bind_mut().apply_transform(state.transform);
@ -76,6 +93,18 @@ impl INode for ReplayRecorder {
fn ready(&mut self) { fn ready(&mut self) {
self.run_deferred(|s| { self.run_deferred(|s| {
s.current_frame = s.record_frame(); s.current_frame = s.record_frame();
if let Some(game) = &Game::singleton() {
for player in &game.bind().players {
s.replay.players.insert(
player.id(),
ReplayPlayer {
id: player.id(),
name: player.data.name.clone(),
},
);
}
}
}); });
} }
@ -90,6 +119,10 @@ impl INode for ReplayRecorder {
} }
impl ReplayRecorder { impl ReplayRecorder {
pub fn record_event(&mut self, event: ReplayEvent) {
self.current_frame.events.push(event);
}
fn record_frame(&mut self) -> ReplayFrame { fn record_frame(&mut self) -> ReplayFrame {
let mut player_data = HashMap::new(); let mut player_data = HashMap::new();
@ -128,7 +161,6 @@ impl Default for Replay {
pub struct ReplayPlayer { pub struct ReplayPlayer {
id: u16, id: u16,
name: String, name: String,
initial_state: ReplayPlayerState,
} }
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone)]
@ -139,7 +171,10 @@ pub struct ReplayFrame {
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum ReplayEvent {} pub enum ReplayEvent {
Death(DamageSource, u16),
Shoot(u16, Vector3),
}
#[derive(Debug)] #[derive(Debug)]
pub enum ReplayBall { pub enum ReplayBall {