Implement kills/deaths

This commit is contained in:
Sofia 2026-07-23 23:40:36 +03:00
parent a1205635f0
commit 923c863583
2 changed files with 35 additions and 2 deletions

View File

@ -304,6 +304,8 @@ impl Game {
pub fn on_goal(); pub fn on_goal();
#[signal] #[signal]
pub fn on_game_finished(); pub fn on_game_finished();
#[signal]
pub fn on_player_killed(player: u16);
pub fn singleton() -> Option<Gd<Game>> { pub fn singleton() -> Option<Gd<Game>> {
GameManager::singleton() GameManager::singleton()
@ -330,6 +332,8 @@ impl Game {
character.queue_free(); character.queue_free();
} }
player.data.ready = false; player.data.ready = false;
player.data.kills = 0;
player.data.deaths = 0;
} }
self.run_deferred(|s| { self.run_deferred(|s| {
@ -351,6 +355,7 @@ impl Game {
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
&& let PeerKind::Server(peer, _) = peer && let PeerKind::Server(peer, _) = peer
{ {
peer.set_accepting_connections(true);
peer.broadcast_reliable(Package::FinishGame); peer.broadcast_reliable(Package::FinishGame);
} }
s.signals().on_game_finished().emit() s.signals().on_game_finished().emit()
@ -474,6 +479,8 @@ impl Game {
ping: 0, ping: 0,
team: 0, team: 0,
ready: false, ready: false,
kills: 0,
deaths: 0,
}, },
character: None, 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 // Handle taking damage, from server to client
pub fn handle_take_damage(&mut self, source: DamageSource, player_id: u16, damage: i32) { pub fn handle_take_damage(&mut self, source: DamageSource, player_id: u16, damage: i32) {
if let Some(player) = self.find_player_mut(player_id) { 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) { pub fn handle_kill(&mut self, source: DamageSource, player_id: u16) {
if let Some(player) = self.find_player_mut(player_id) { if let Some(player) = self.find_player_mut(player_id) {
if let Some(character) = &mut player.character { 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) { pub fn on_death(&mut self, source: DamageSource, target_player_id: u16) {
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
if let PeerKind::Server(peer, _) = 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 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 {

View File

@ -30,6 +30,9 @@ impl IHBoxContainer for PlayerListing {
game.signals() game.signals()
.on_players_updated() .on_players_updated()
.connect_other(self, |s| s.update()); .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 { if let Some(name_label) = &mut self.name_label {
name_label.set_text(&player.data.name); 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 { 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());
} }