Implement picking up on game side

This commit is contained in:
Sofia 2026-07-27 19:32:05 +03:00
parent 9187e6abff
commit f92ddf567d
4 changed files with 44 additions and 0 deletions

View File

@ -1211,6 +1211,21 @@ impl Game {
pub fn recorder(&mut self) -> &mut Option<Gd<ReplayRecorder>> { pub fn recorder(&mut self) -> &mut Option<Gd<ReplayRecorder>> {
&mut self.replay_recorder &mut self.replay_recorder
} }
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 Some(pickup) = map.bind_mut().pickups.get_mut(&id)
{
pickup.dyn_bind_mut().on_pickup();
}
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
&& let PeerKind::Server(peer, _) = peer
{
peer.broadcast_reliable(Package::Pickup(id, player_id));
}
});
}
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

View File

@ -315,6 +315,7 @@ pub enum Package {
SwapWeapon(u16, WeaponType), SwapWeapon(u16, WeaponType),
Goal(Vec<u8>), Goal(Vec<u8>),
Announcement(u16, Announcement), Announcement(u16, Announcement),
Pickup(u8, u16),
// End-of-Game packages // End-of-Game packages
FinishGame, FinishGame,

View File

@ -226,6 +226,11 @@ impl NetworkManager {
game.bind_mut().on_chat_message(source_id, message); game.bind_mut().on_chat_message(source_id, message);
} }
} }
Package::Pickup(pickup_id, player_id) => {
if let Some(game) = &mut Game::singleton() {
game.bind_mut().on_pickup(pickup_id, player_id);
}
}
_ => {} _ => {}
}, },
}, },

View File

@ -22,6 +22,7 @@ pub struct HealthPickup {
time_elapsed: f64, time_elapsed: f64,
pickup_id: Option<u8>, pickup_id: Option<u8>,
respawn: f64,
base: Base<Node3D>, base: Base<Node3D>,
} }
@ -49,7 +50,11 @@ impl INode3D for HealthPickup {
fn process(&mut self, delta: f64) { fn process(&mut self, delta: f64) {
self.time_elapsed += delta; self.time_elapsed += delta;
self.respawn -= delta;
self.update_common(self.time_elapsed); self.update_common(self.time_elapsed);
if let Some(area) = &mut self.pickup_area {
area.set_visible(self.respawn <= 0.);
}
} }
} }
@ -73,11 +78,21 @@ impl Pickup for HealthPickup {
fn kind(&self) -> PickupKind { fn kind(&self) -> PickupKind {
PickupKind::Health PickupKind::Health
} }
fn id(&self) -> Option<u8> {
self.pickup_id
}
fn on_pickup(&mut self) {
self.respawn = 10.;
}
} }
pub trait Pickup { pub trait Pickup {
fn area(&mut self) -> &mut Option<Gd<Area3D>>; fn area(&mut self) -> &mut Option<Gd<Area3D>>;
fn kind(&self) -> PickupKind; fn kind(&self) -> PickupKind;
fn id(&self) -> Option<u8>;
fn on_pickup(&mut self);
} }
pub trait PickupCommon { pub trait PickupCommon {
@ -97,5 +112,13 @@ impl<T: Pickup> PickupCommon for T {
if !NetworkManager::singleton().bind().is_host() { if !NetworkManager::singleton().bind().is_host() {
return; return;
} }
if let Some(game) = &mut Game::singleton()
&& let Ok(player) = collider.try_dynify::<dyn IPlayer>()
{
game.bind_mut().on_pickup(
self.id().unwrap_or(0),
player.dyn_bind().get_player_id().unwrap_or(0),
);
}
} }
} }