Add replay events to server too

This commit is contained in:
Sofia 2026-07-26 23:11:58 +03:00
parent e75cb79c86
commit 8093ffb2be
4 changed files with 56 additions and 24 deletions

View File

@ -988,12 +988,12 @@ impl Game {
// Handle a jump, either from the server or from a client // Handle a jump, either from the server or from a client
pub fn handle_jump(&mut self, player_id: u16) { pub fn handle_jump(&mut self, player_id: u16) {
if player_id != self.self_id.unwrap_or(0) {
if let Some(recorder) = &mut self.replay_recorder { if let Some(recorder) = &mut self.replay_recorder {
recorder recorder
.bind_mut() .bind_mut()
.record_event(ReplayEvent::Jump(player_id)); .record_event(ReplayEvent::Jump(player_id));
} }
if player_id != self.self_id.unwrap_or(0) {
if let Some(player) = self.find_player_mut(player_id) { if let Some(player) = self.find_player_mut(player_id) {
player.apply_jump(); player.apply_jump();
} }
@ -1009,15 +1009,14 @@ impl Game {
look_up: f32, look_up: f32,
deal_damage: bool, deal_damage: bool,
) -> bool { ) -> bool {
let self_id = self.self_id.clone().unwrap_or(0);
if player_id != self_id {
if let Some(recorder) = &mut self.replay_recorder { if let Some(recorder) = &mut self.replay_recorder {
recorder recorder
.bind_mut() .bind_mut()
.record_event(ReplayEvent::Shoot(player_id, to.into())); .record_event(ReplayEvent::Shoot(player_id, to.into()));
} }
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 {
player.try_shoot(to, transform, look_up, deal_damage) player.try_shoot(to, transform, look_up, deal_damage)
} else { } else {
false false
@ -1036,15 +1035,14 @@ impl Game {
look_up: f32, look_up: f32,
deal_damage: bool, deal_damage: bool,
) -> bool { ) -> bool {
let self_id = self.self_id.clone().unwrap_or(0);
if player_id != self_id {
if let Some(recorder) = &mut self.replay_recorder { if let Some(recorder) = &mut self.replay_recorder {
recorder recorder
.bind_mut() .bind_mut()
.record_event(ReplayEvent::Punch(player_id, to.into())); .record_event(ReplayEvent::Punch(player_id, to.into()));
} }
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 {
player.try_punch(to, transform, look_up, deal_damage) player.try_punch(to, transform, look_up, deal_damage)
} else { } else {
false false
@ -1201,6 +1199,10 @@ impl Game {
} }
} }
} }
pub fn recorder(&mut self) -> &mut Option<Gd<ReplayRecorder>> {
&mut self.replay_recorder
}
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

View File

@ -29,6 +29,7 @@ use crate::{
soldier_mesh::SoldierMesh, soldier_mesh::SoldierMesh,
weapon::{BallWeapon, Raygun, Shotgun, Weapon, WeaponType}, weapon::{BallWeapon, Raygun, Shotgun, Weapon, WeaponType},
}, },
replay::ReplayEvent,
ui::{chatbox::ChatBox, cli::CommandLinePanel, settings::SettingsPanel}, ui::{chatbox::ChatBox, cli::CommandLinePanel, settings::SettingsPanel},
}; };
@ -142,6 +143,13 @@ impl IPlayer for LocalPlayer {
fn jump(&mut self) { fn jump(&mut self) {
if self.try_jump() { if self.try_jump() {
if let Some(game) = &mut Game::singleton()
&& let Some(recorder) = game.bind_mut().recorder()
{
recorder
.bind_mut()
.record_event(ReplayEvent::Jump(self.player_id.unwrap_or(0)));
}
if let Some(effects) = &mut self.effects { if let Some(effects) = &mut self.effects {
effects.bind_mut().jump(); effects.bind_mut().jump();
} }
@ -163,7 +171,18 @@ impl IPlayer for LocalPlayer {
fn apply_look_up(&mut self, _look: f32) {} fn apply_look_up(&mut self, _look: f32) {}
fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool { fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool {
self.try_shoot_common(to, deal_damage) if self.try_shoot_common(to, deal_damage) {
if let Some(game) = &mut Game::singleton()
&& let Some(recorder) = game.bind_mut().recorder()
{
recorder
.bind_mut()
.record_event(ReplayEvent::Shoot(self.player_id.unwrap_or(0), to.into()));
}
true
} else {
false
}
} }
fn try_punch(&mut self, to: Vector3, deal_damage: bool) -> bool { fn try_punch(&mut self, to: Vector3, deal_damage: bool) -> bool {
@ -173,7 +192,18 @@ impl IPlayer for LocalPlayer {
weapon.set_rotation(Vector3::UP); weapon.set_rotation(Vector3::UP);
} }
self.punch_cd_remaining = self.punch_cooldown; self.punch_cd_remaining = self.punch_cooldown;
self.try_punch_common(to, deal_damage) if self.try_punch_common(to, deal_damage) {
if let Some(game) = &mut Game::singleton()
&& let Some(recorder) = game.bind_mut().recorder()
{
recorder
.bind_mut()
.record_event(ReplayEvent::Punch(self.player_id.unwrap_or(0), to.into()));
}
true
} else {
false
}
} else { } else {
false false
} }

View File

@ -362,6 +362,7 @@ impl ReplayRecorder {
} }
pub fn stop_recording(&mut self) { pub fn stop_recording(&mut self) {
self.replay.frames.push(self.current_frame.clone());
self.recording = false; self.recording = false;
} }

View File

@ -43,7 +43,6 @@ impl ReplayFinishedScreen {
fn produce_title(&mut self) { fn produce_title(&mut self) {
if let Some(playback) = &StandaloneReplayManager::singleton().bind().playback { if let Some(playback) = &StandaloneReplayManager::singleton().bind().playback {
let playback = playback.bind(); let playback = playback.bind();
godot_print!("{:?}", playback.replay.goals);
let max_goals = playback let max_goals = playback
.replay .replay
.goals .goals