diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index 63658ce..55d89de 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -304,6 +304,8 @@ impl Game { pub fn on_goal(); #[signal] pub fn on_game_finished(); + #[signal] + pub fn on_player_killed(player: u16); pub fn singleton() -> Option> { GameManager::singleton() @@ -330,6 +332,8 @@ impl Game { character.queue_free(); } player.data.ready = false; + player.data.kills = 0; + player.data.deaths = 0; } self.run_deferred(|s| { @@ -351,6 +355,7 @@ impl Game { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer && let PeerKind::Server(peer, _) = peer { + peer.set_accepting_connections(true); peer.broadcast_reliable(Package::FinishGame); } s.signals().on_game_finished().emit() @@ -474,6 +479,8 @@ impl Game { ping: 0, team: 0, ready: false, + kills: 0, + deaths: 0, }, character: None, }); @@ -824,6 +831,19 @@ impl Game { } } + // Handle for when a player is killed, run both on client and server + pub fn on_kill(&mut self, source: DamageSource, player_id: u16) { + if let DamageSource::Player(source_id) = source + && let Some(source_player) = self.find_player_mut(source_id) + { + source_player.data.kills += 1; + } + if let Some(player) = self.find_player_mut(player_id) { + player.data.deaths += 1; + } + self.run_deferred(move |s| s.signals().on_player_killed().emit(player_id)); + } + // Handle taking damage, from server to client pub fn handle_take_damage(&mut self, source: DamageSource, player_id: u16, damage: i32) { if let Some(player) = self.find_player_mut(player_id) { @@ -837,7 +857,8 @@ impl Game { pub fn handle_kill(&mut self, source: DamageSource, player_id: u16) { if let Some(player) = self.find_player_mut(player_id) { if let Some(character) = &mut player.character { - character.dyn_bind_mut().kill(source); + character.dyn_bind_mut().kill(source.clone()); + self.on_kill(source, player_id); } } } @@ -855,7 +876,8 @@ impl Game { pub fn on_death(&mut self, source: DamageSource, target_player_id: u16) { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { if let PeerKind::Server(peer, _) = peer { - peer.broadcast_reliable(Kill(source, target_player_id)); + peer.broadcast_reliable(Kill(source.clone(), target_player_id)); + self.on_kill(source, target_player_id); } } } @@ -971,6 +993,8 @@ pub struct NetPlayer { pub name: String, pub ping: u128, pub team: u8, + pub kills: u16, + pub deaths: u16, } impl From for Player { diff --git a/rust/src/ui/player_listing.rs b/rust/src/ui/player_listing.rs index f7da487..3492574 100644 --- a/rust/src/ui/player_listing.rs +++ b/rust/src/ui/player_listing.rs @@ -30,6 +30,9 @@ impl IHBoxContainer for PlayerListing { game.signals() .on_players_updated() .connect_other(self, |s| s.update()); + game.signals() + .on_player_killed() + .connect_other(self, |s, _| s.update()); } } } @@ -43,6 +46,12 @@ impl PlayerListing { if let Some(name_label) = &mut self.name_label { name_label.set_text(&player.data.name); } + if let Some(kills_label) = &mut self.kills_label { + kills_label.set_text(&player.data.kills.to_string()); + } + if let Some(deaths_label) = &mut self.deaths_label { + deaths_label.set_text(&player.data.deaths.to_string()); + } if let Some(ping_label) = &mut self.ping_label { ping_label.set_text(&player.data.ping.to_string()); }