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) { pub fn on_pickup(&mut self, id: u8, player_id: u16) {
self.run_deferred(move |s| { 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) && let Some(pickup) = map.bind_mut().pickups.get_mut(&id)
{ {
pickup.dyn_bind_mut().on_pickup(); 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 if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
&& let PeerKind::Server(peer, _) = 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>) { fn on_collision(&mut self, collider: Gd<Node3D>) {
if !NetworkManager::singleton().bind().is_host() { if !NetworkManager::singleton().bind().is_host() || !self.is_active() {
return; return;
} }
if let Some(game) = &mut Game::singleton() if let Some(game) = &mut Game::singleton()

View File

@ -15,7 +15,7 @@ use crate::{
game_manager::{Game, GameManager, Player}, game_manager::{Game, GameManager, Player},
map::Map, map::Map,
net::{network_manager::BallSync, util::NetVector3}, net::{network_manager::BallSync, util::NetVector3},
pickup::ReplayVisibility, pickup::{PickupKind, ReplayVisibility},
player::{ player::{
DamageSource, IPlayer, NetTransform, ball::Ball, remote_player::RemotePlayer, DamageSource, IPlayer, NetTransform, ball::Ball, remote_player::RemotePlayer,
weapon::WeaponType, weapon::WeaponType,
@ -292,6 +292,11 @@ impl INode for ReplayPlayback {
.take_damage(*damage_source, *damage, false); .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), Jump(u16),
Punch(u16, NetVector3), Punch(u16, NetVector3),
TakeDamage(u16, DamageSource, i32), TakeDamage(u16, DamageSource, i32),
Pickup(PickupKind, u16),
} }
#[derive(Debug, Clone, Default, Serialize, Deserialize)] #[derive(Debug, Clone, Default, Serialize, Deserialize)]