Make pickups actually function

This commit is contained in:
Sofia 2026-07-27 19:56:06 +03:00
parent e6793fde61
commit c38526bc48
3 changed files with 25 additions and 3 deletions

View File

@ -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
{

View File

@ -134,7 +134,7 @@ impl<T: Pickup> PickupCommon for T {
}
fn on_collision(&mut self, collider: Gd<Node3D>) {
if !NetworkManager::singleton().bind().is_host() {
if !NetworkManager::singleton().bind().is_host() || !self.is_active() {
return;
}
if let Some(game) = &mut Game::singleton()

View File

@ -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)]