Make sure killer and damage-dealer player id is propagated
This commit is contained in:
parent
c6d59ffb04
commit
82fcfe0ea0
@ -324,23 +324,27 @@ impl Game {
|
|||||||
.bind_mut()
|
.bind_mut()
|
||||||
.signals()
|
.signals()
|
||||||
.on_die()
|
.on_die()
|
||||||
.connect_other(self, move |s| s.on_death(id));
|
.connect_other(self, move |s, spid| s.on_death(spid, id));
|
||||||
local_player
|
local_player
|
||||||
.bind_mut()
|
.bind_mut()
|
||||||
.signals()
|
.signals()
|
||||||
.on_take_damage()
|
.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::<RemotePlayer>() {
|
} else if let Ok(mut remote_player) = character.clone().try_cast::<RemotePlayer>() {
|
||||||
remote_player
|
remote_player
|
||||||
.bind_mut()
|
.bind_mut()
|
||||||
.signals()
|
.signals()
|
||||||
.on_die()
|
.on_die()
|
||||||
.connect_other(self, move |s| s.on_death(id));
|
.connect_other(self, move |s, spid| s.on_death(spid, id));
|
||||||
remote_player
|
remote_player
|
||||||
.bind_mut()
|
.bind_mut()
|
||||||
.signals()
|
.signals()
|
||||||
.on_take_damage()
|
.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
|
// 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(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().take_damage(damage, false);
|
character
|
||||||
|
.dyn_bind_mut()
|
||||||
|
.take_damage(source_player_id, damage, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle dying, from server to client
|
// 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(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();
|
character.dyn_bind_mut().kill(source_player_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called whenever a player takes damage on the server-side
|
// 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 Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
|
||||||
if let PeerKind::Server(peer, _) = 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
|
// 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 Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
|
||||||
if let PeerKind::Server(peer, _) = peer {
|
if let PeerKind::Server(peer, _) = peer {
|
||||||
peer.broadcast_reliable(Kill(player_id));
|
peer.broadcast_reliable(Kill(source_player_id, target_player_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() {
|
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() {
|
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),
|
SelfSync(SyncPackage),
|
||||||
Jump(u16),
|
Jump(u16),
|
||||||
Shoot(u16, NetVector3, NetPlayerTransform, f32),
|
Shoot(u16, NetVector3, NetPlayerTransform, f32),
|
||||||
TakeDamage(u16, i32),
|
TakeDamage(u16, u16, i32),
|
||||||
Kill(u16),
|
Kill(u16, u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
|||||||
@ -46,9 +46,9 @@ pub trait IPlayer {
|
|||||||
fn get_transform(&self) -> NetPlayerTransform;
|
fn get_transform(&self) -> NetPlayerTransform;
|
||||||
fn jump(&mut self);
|
fn jump(&mut self);
|
||||||
fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool;
|
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 is_dead(&self) -> bool;
|
||||||
fn kill(&mut self);
|
fn kill(&mut self, source_player: u16);
|
||||||
fn dead_for(&self) -> f64;
|
fn dead_for(&self) -> f64;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +185,9 @@ impl IPlayer for LocalPlayer {
|
|||||||
if self.shoot_cd <= 0. {
|
if self.shoot_cd <= 0. {
|
||||||
let rid = self.base().get_rid();
|
let rid = self.base().get_rid();
|
||||||
if let Some(weapon) = &mut self.weapon {
|
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;
|
self.shoot_cd = 0.2;
|
||||||
true
|
true
|
||||||
@ -194,11 +196,11 @@ impl IPlayer for LocalPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn take_damage(&mut self, damage: i32, kill: bool) {
|
fn take_damage(&mut self, source_player: u16, damage: i32, kill: bool) {
|
||||||
self.run_deferred(move |s| s.signals().on_take_damage().emit(damage));
|
self.run_deferred(move |s| s.signals().on_take_damage().emit(source_player, damage));
|
||||||
self.health -= damage;
|
self.health -= damage;
|
||||||
if kill && self.health <= 0 {
|
if kill && self.health <= 0 {
|
||||||
self.kill();
|
self.kill(source_player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,8 +212,8 @@ impl IPlayer for LocalPlayer {
|
|||||||
self.dead_for
|
self.dead_for
|
||||||
}
|
}
|
||||||
|
|
||||||
fn kill(&mut self) {
|
fn kill(&mut self, source_player: u16) {
|
||||||
self.run_deferred(move |s| s.signals().on_die().emit());
|
self.run_deferred(move |s| s.signals().on_die().emit(source_player));
|
||||||
if let Some(mut mesh) = self.soldier_mesh.take() {
|
if let Some(mut mesh) = self.soldier_mesh.take() {
|
||||||
mesh.queue_free();
|
mesh.queue_free();
|
||||||
}
|
}
|
||||||
@ -369,9 +371,9 @@ impl ICharacterBody3D for LocalPlayer {
|
|||||||
#[godot_api]
|
#[godot_api]
|
||||||
impl LocalPlayer {
|
impl LocalPlayer {
|
||||||
#[signal]
|
#[signal]
|
||||||
pub fn on_die();
|
pub fn on_die(source_player: u16);
|
||||||
#[signal]
|
#[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) {
|
fn set_lock(&mut self, locked: bool) {
|
||||||
self.locked = locked;
|
self.locked = locked;
|
||||||
@ -476,7 +478,9 @@ impl IPlayer for RemotePlayer {
|
|||||||
if self.shoot_cd <= 0. {
|
if self.shoot_cd <= 0. {
|
||||||
let rid = self.base().get_rid();
|
let rid = self.base().get_rid();
|
||||||
if let Some(weapon) = &mut self.weapon {
|
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;
|
self.shoot_cd = 0.2;
|
||||||
true
|
true
|
||||||
@ -485,11 +489,11 @@ impl IPlayer for RemotePlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn take_damage(&mut self, damage: i32, kill: bool) {
|
fn take_damage(&mut self, source_player: u16, damage: i32, kill: bool) {
|
||||||
self.run_deferred(move |s| s.signals().on_take_damage().emit(damage));
|
self.run_deferred(move |s| s.signals().on_take_damage().emit(source_player, damage));
|
||||||
self.health -= damage;
|
self.health -= damage;
|
||||||
if kill && self.health <= 0 {
|
if kill && self.health <= 0 {
|
||||||
self.kill();
|
self.kill(source_player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -501,8 +505,8 @@ impl IPlayer for RemotePlayer {
|
|||||||
self.dead_for
|
self.dead_for
|
||||||
}
|
}
|
||||||
|
|
||||||
fn kill(&mut self) {
|
fn kill(&mut self, source_player: u16) {
|
||||||
self.run_deferred(move |s| s.signals().on_die().emit());
|
self.run_deferred(move |s| s.signals().on_die().emit(source_player));
|
||||||
if let Some(mut mesh) = self.soldier_mesh.take() {
|
if let Some(mut mesh) = self.soldier_mesh.take() {
|
||||||
mesh.queue_free();
|
mesh.queue_free();
|
||||||
}
|
}
|
||||||
@ -548,7 +552,7 @@ impl ICharacterBody3D for RemotePlayer {
|
|||||||
#[godot_api]
|
#[godot_api]
|
||||||
impl RemotePlayer {
|
impl RemotePlayer {
|
||||||
#[signal]
|
#[signal]
|
||||||
pub fn on_die();
|
pub fn on_die(source_player: u16);
|
||||||
#[signal]
|
#[signal]
|
||||||
pub fn on_take_damage(damage: i32);
|
pub fn on_take_damage(source_player: u16, damage: i32);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ use godot::{
|
|||||||
use crate::{net::util::cast_ray, player::IPlayer};
|
use crate::{net::util::cast_ray, player::IPlayer};
|
||||||
|
|
||||||
pub trait Weapon {
|
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)]
|
#[derive(GodotClass)]
|
||||||
@ -24,7 +24,7 @@ pub struct Raygun {
|
|||||||
|
|
||||||
#[godot_dyn]
|
#[godot_dyn]
|
||||||
impl Weapon for Raygun {
|
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 {
|
if let Some(emitter) = &mut self.sound_emitter {
|
||||||
emitter.play();
|
emitter.play();
|
||||||
}
|
}
|
||||||
@ -56,7 +56,7 @@ impl Weapon for Raygun {
|
|||||||
|
|
||||||
if deal_damage && let Some(target) = target {
|
if deal_damage && let Some(target) = target {
|
||||||
if let Ok(mut player) = target.collider.try_dynify::<dyn IPlayer>() {
|
if let Ok(mut player) = target.collider.try_dynify::<dyn IPlayer>() {
|
||||||
player.dyn_bind_mut().take_damage(100, true);
|
player.dyn_bind_mut().take_damage(player_id, 100, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user