Record deaths and shoots
This commit is contained in:
parent
7a9292242f
commit
9b522f0789
@ -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()
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user