Implement picking up on game side
This commit is contained in:
parent
9187e6abff
commit
f92ddf567d
@ -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)]
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user