diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index b81c88b..d4cca40 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -324,23 +324,27 @@ impl Game { .bind_mut() .signals() .on_die() - .connect_other(self, move |s| s.on_death(id)); + .connect_other(self, move |s, spid| s.on_death(spid, id)); local_player .bind_mut() .signals() .on_take_damage() - .connect_other(self, move |s, damage| s.on_take_damage(id, damage)); + .connect_other(self, move |s, spid, damage| { + s.on_take_damage(spid, id, damage) + }); } else if let Ok(mut remote_player) = character.clone().try_cast::() { remote_player .bind_mut() .signals() .on_die() - .connect_other(self, move |s| s.on_death(id)); + .connect_other(self, move |s, spid| s.on_death(spid, id)); remote_player .bind_mut() .signals() .on_take_damage() - .connect_other(self, move |s, damage| s.on_take_damage(id, damage)); + .connect_other(self, move |s, spid, damage| { + s.on_take_damage(spid, id, damage) + }); } } @@ -434,37 +438,39 @@ impl Game { } // Handle taking damage, from server to client - pub fn handle_take_damage(&mut self, player_id: u16, damage: i32) { + pub fn handle_take_damage(&mut self, source_player_id: u16, player_id: u16, damage: i32) { if let Some(player) = self.find_player_mut(player_id) { if let Some(character) = &mut player.character { - character.dyn_bind_mut().take_damage(damage, false); + character + .dyn_bind_mut() + .take_damage(source_player_id, damage, false); } } } // Handle dying, from server to client - pub fn handle_kill(&mut self, player_id: u16) { + pub fn handle_kill(&mut self, source_player_id: u16, 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(); + character.dyn_bind_mut().kill(source_player_id); } } } // Called whenever a player takes damage on the server-side - pub fn on_take_damage(&mut self, player_id: u16, damage: i32) { + pub fn on_take_damage(&mut self, source_player_id: u16, target_player_id: u16, damage: i32) { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { if let PeerKind::Server(peer, _) = peer { - peer.broadcast_reliable(TakeDamage(player_id, damage)); + peer.broadcast_reliable(TakeDamage(source_player_id, target_player_id, damage)); } } } // Called whenever a player dies on the server-side - pub fn on_death(&mut self, player_id: u16) { + pub fn on_death(&mut self, source_player_id: u16, target_player_id: u16) { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { if let PeerKind::Server(peer, _) = peer { - peer.broadcast_reliable(Kill(player_id)); + peer.broadcast_reliable(Kill(source_player_id, target_player_id)); } } } diff --git a/rust/src/net/network_manager.rs b/rust/src/net/network_manager.rs index fbcbdc5..bc111db 100644 --- a/rust/src/net/network_manager.rs +++ b/rust/src/net/network_manager.rs @@ -238,14 +238,23 @@ impl INode for NetworkManager { ); } } - Package::TakeDamage(player_id, damage) => { + Package::TakeDamage( + source_player_id, + target_player_id, + damage, + ) => { if let Some(game) = &mut Game::singleton() { - game.bind_mut().handle_take_damage(player_id, damage); + game.bind_mut().handle_take_damage( + source_player_id, + target_player_id, + damage, + ); } } - Package::Kill(player_id) => { + Package::Kill(source_player_id, target_player_id) => { if let Some(game) = &mut Game::singleton() { - game.bind_mut().handle_kill(player_id); + game.bind_mut() + .handle_kill(source_player_id, target_player_id); } } _ => {} @@ -551,8 +560,8 @@ pub enum Package { SelfSync(SyncPackage), Jump(u16), Shoot(u16, NetVector3, NetPlayerTransform, f32), - TakeDamage(u16, i32), - Kill(u16), + TakeDamage(u16, u16, i32), + Kill(u16, u16), } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/rust/src/player.rs b/rust/src/player.rs index ba7e726..40346a5 100644 --- a/rust/src/player.rs +++ b/rust/src/player.rs @@ -46,9 +46,9 @@ pub trait IPlayer { fn get_transform(&self) -> NetPlayerTransform; fn jump(&mut self); fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool; - fn take_damage(&mut self, damage: i32, kill: bool); + fn take_damage(&mut self, source_player: u16, damage: i32, kill: bool); fn is_dead(&self) -> bool; - fn kill(&mut self); + fn kill(&mut self, source_player: u16); fn dead_for(&self) -> f64; } @@ -185,7 +185,9 @@ impl IPlayer for LocalPlayer { if self.shoot_cd <= 0. { let rid = self.base().get_rid(); if let Some(weapon) = &mut self.weapon { - weapon.dyn_bind_mut().shoot(rid, to, deal_damage); + weapon + .dyn_bind_mut() + .shoot(rid, self.player_id.unwrap_or(0), to, deal_damage); } self.shoot_cd = 0.2; true @@ -194,11 +196,11 @@ impl IPlayer for LocalPlayer { } } - fn take_damage(&mut self, damage: i32, kill: bool) { - self.run_deferred(move |s| s.signals().on_take_damage().emit(damage)); + fn take_damage(&mut self, source_player: u16, damage: i32, kill: bool) { + self.run_deferred(move |s| s.signals().on_take_damage().emit(source_player, damage)); self.health -= damage; if kill && self.health <= 0 { - self.kill(); + self.kill(source_player); } } @@ -210,8 +212,8 @@ impl IPlayer for LocalPlayer { self.dead_for } - fn kill(&mut self) { - self.run_deferred(move |s| s.signals().on_die().emit()); + fn kill(&mut self, source_player: u16) { + self.run_deferred(move |s| s.signals().on_die().emit(source_player)); if let Some(mut mesh) = self.soldier_mesh.take() { mesh.queue_free(); } @@ -369,9 +371,9 @@ impl ICharacterBody3D for LocalPlayer { #[godot_api] impl LocalPlayer { #[signal] - pub fn on_die(); + pub fn on_die(source_player: u16); #[signal] - pub fn on_take_damage(damage: i32); + pub fn on_take_damage(source_player: u16, damage: i32); fn set_lock(&mut self, locked: bool) { self.locked = locked; @@ -476,7 +478,9 @@ impl IPlayer for RemotePlayer { if self.shoot_cd <= 0. { let rid = self.base().get_rid(); if let Some(weapon) = &mut self.weapon { - weapon.dyn_bind_mut().shoot(rid, to, deal_damage); + weapon + .dyn_bind_mut() + .shoot(rid, self.player_id.unwrap_or(0), to, deal_damage); } self.shoot_cd = 0.2; true @@ -485,11 +489,11 @@ impl IPlayer for RemotePlayer { } } - fn take_damage(&mut self, damage: i32, kill: bool) { - self.run_deferred(move |s| s.signals().on_take_damage().emit(damage)); + fn take_damage(&mut self, source_player: u16, damage: i32, kill: bool) { + self.run_deferred(move |s| s.signals().on_take_damage().emit(source_player, damage)); self.health -= damage; if kill && self.health <= 0 { - self.kill(); + self.kill(source_player); } } @@ -501,8 +505,8 @@ impl IPlayer for RemotePlayer { self.dead_for } - fn kill(&mut self) { - self.run_deferred(move |s| s.signals().on_die().emit()); + fn kill(&mut self, source_player: u16) { + self.run_deferred(move |s| s.signals().on_die().emit(source_player)); if let Some(mut mesh) = self.soldier_mesh.take() { mesh.queue_free(); } @@ -548,7 +552,7 @@ impl ICharacterBody3D for RemotePlayer { #[godot_api] impl RemotePlayer { #[signal] - pub fn on_die(); + pub fn on_die(source_player: u16); #[signal] - pub fn on_take_damage(damage: i32); + pub fn on_take_damage(source_player: u16, damage: i32); } diff --git a/rust/src/weapon.rs b/rust/src/weapon.rs index 16c6d7c..85165d9 100644 --- a/rust/src/weapon.rs +++ b/rust/src/weapon.rs @@ -6,7 +6,7 @@ use godot::{ use crate::{net::util::cast_ray, player::IPlayer}; pub trait Weapon { - fn shoot(&mut self, player: Rid, to: Vector3, deal_damage: bool); + fn shoot(&mut self, player_rid: Rid, player_id: u16, to: Vector3, deal_damage: bool); } #[derive(GodotClass)] @@ -24,7 +24,7 @@ pub struct Raygun { #[godot_dyn] impl Weapon for Raygun { - fn shoot(&mut self, player: Rid, to: Vector3, deal_damage: bool) { + fn shoot(&mut self, player: Rid, player_id: u16, to: Vector3, deal_damage: bool) { if let Some(emitter) = &mut self.sound_emitter { emitter.play(); } @@ -56,7 +56,7 @@ impl Weapon for Raygun { if deal_damage && let Some(target) = target { if let Ok(mut player) = target.collider.try_dynify::() { - player.dyn_bind_mut().take_damage(100, true); + player.dyn_bind_mut().take_damage(player_id, 100, true); } } }