diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index 76457bd..b967f17 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -1214,11 +1214,27 @@ impl Game { pub fn on_pickup(&mut self, id: u8, player_id: u16) { self.run_deferred(move |s| { - if let Some(map) = &mut s.current_map + let kind = if let Some(map) = &mut s.current_map && let Some(pickup) = map.bind_mut().pickups.get_mut(&id) { pickup.dyn_bind_mut().on_pickup(); + pickup.dyn_bind().kind() + } else { + PickupKind::Health + }; + + if let Some(player) = s.find_player_mut(player_id) + && let Some(character) = &mut player.character + { + character.dyn_bind_mut().on_pickup(kind); } + + if let Some(recorder) = &mut s.replay_recorder { + recorder + .bind_mut() + .record_event(ReplayEvent::Pickup(kind, player_id)); + } + if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer && let PeerKind::Server(peer, _) = peer { diff --git a/rust/src/pickup.rs b/rust/src/pickup.rs index 7498707..515cdb1 100644 --- a/rust/src/pickup.rs +++ b/rust/src/pickup.rs @@ -134,7 +134,7 @@ impl PickupCommon for T { } fn on_collision(&mut self, collider: Gd) { - if !NetworkManager::singleton().bind().is_host() { + if !NetworkManager::singleton().bind().is_host() || !self.is_active() { return; } if let Some(game) = &mut Game::singleton() diff --git a/rust/src/replay.rs b/rust/src/replay.rs index 171a786..a77119a 100644 --- a/rust/src/replay.rs +++ b/rust/src/replay.rs @@ -15,7 +15,7 @@ use crate::{ game_manager::{Game, GameManager, Player}, map::Map, net::{network_manager::BallSync, util::NetVector3}, - pickup::ReplayVisibility, + pickup::{PickupKind, ReplayVisibility}, player::{ DamageSource, IPlayer, NetTransform, ball::Ball, remote_player::RemotePlayer, weapon::WeaponType, @@ -292,6 +292,11 @@ impl INode for ReplayPlayback { .take_damage(*damage_source, *damage, false); } } + ReplayEvent::Pickup(kind, player_id) => { + if let Some(character) = self.player_characters.get_mut(player_id) { + character.bind_mut().on_pickup(*kind); + } + } } } } @@ -569,6 +574,7 @@ pub enum ReplayEvent { Jump(u16), Punch(u16, NetVector3), TakeDamage(u16, DamageSource, i32), + Pickup(PickupKind, u16), } #[derive(Debug, Clone, Default, Serialize, Deserialize)]