Respawn the ball when it enters a killbox
This commit is contained in:
parent
d117bb2f72
commit
82d27beef8
@ -15,6 +15,9 @@ size = Vector2(100, 100)
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_1cgct"]
|
||||
size = Vector3(100, 0.01, 100)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_3g557"]
|
||||
size = Vector3(1000, 1, 1000)
|
||||
|
||||
[node name="map" type="Map" unique_id=914577955 node_paths=PackedStringArray("spawner", "ball_spawner")]
|
||||
spawner = NodePath("spawner")
|
||||
ball_spawner = NodePath("ball_spawner")
|
||||
@ -50,3 +53,11 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.028572083, 3.9666176, 0.03
|
||||
|
||||
[node name="ball_spawner" type="Node3D" parent="." unique_id=1149426253]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.080344, 4.78083, -9.363691)
|
||||
|
||||
[node name="killbox" type="Killbox" parent="." unique_id=1018578438]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -5.367467, 0)
|
||||
collision_layer = 7
|
||||
collision_mask = 7
|
||||
|
||||
[node name="collision_shape_3d" type="CollisionShape3D" parent="killbox" unique_id=447460010]
|
||||
shape = SubResource("BoxShape3D_3g557")
|
||||
|
||||
@ -341,6 +341,24 @@ impl Game {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn despawn_ball(&mut self) {
|
||||
if let Some(mut ball) = self.world_ball.take() {
|
||||
ball.queue_free();
|
||||
self.run_deferred(|_| {
|
||||
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
|
||||
&& let PeerKind::Server(peer, _) = peer
|
||||
{
|
||||
peer.broadcast_reliable(Package::DespawnBall);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub fn respawn_ball(&mut self) {
|
||||
self.despawn_ball();
|
||||
self.spawn_ball(None, None, None);
|
||||
}
|
||||
|
||||
pub fn handle_ball_pickup(&mut self, player_id: u16) {
|
||||
if NetworkManager::singleton().bind_mut().is_host() {
|
||||
self.despawn_ball();
|
||||
@ -374,19 +392,6 @@ impl Game {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn despawn_ball(&mut self) {
|
||||
if let Some(mut ball) = self.world_ball.take() {
|
||||
ball.queue_free();
|
||||
self.run_deferred(|_| {
|
||||
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
|
||||
&& let PeerKind::Server(peer, _) = peer
|
||||
{
|
||||
peer.broadcast_reliable(Package::DespawnBall);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub fn spawn_player_server(&mut self, id: u16) -> Option<DynGd<CharacterBody3D, dyn IPlayer>> {
|
||||
if let Some(player) = self.find_player_mut(id)
|
||||
&& let Some(character) = &mut player.character
|
||||
|
||||
@ -4,6 +4,8 @@ use godot::{
|
||||
};
|
||||
|
||||
use crate::{
|
||||
ball::Ball,
|
||||
game_manager::Game,
|
||||
net::network_manager::NetworkManager,
|
||||
player::{DamageSource, IPlayer},
|
||||
};
|
||||
@ -26,12 +28,16 @@ impl IArea3D for Killbox {
|
||||
|
||||
impl Killbox {
|
||||
pub fn kill(&mut self, node: Gd<Node3D>) {
|
||||
if let Ok(mut player) = node.try_dynify::<dyn IPlayer>() {
|
||||
if let Ok(mut player) = node.clone().try_dynify::<dyn IPlayer>() {
|
||||
if NetworkManager::singleton().bind().is_host() {
|
||||
player
|
||||
.dyn_bind_mut()
|
||||
.take_damage(DamageSource::Killbox, 1000, true);
|
||||
}
|
||||
} else if let Ok(_) = node.try_cast::<Ball>() {
|
||||
if let Some(game) = &mut Game::singleton() {
|
||||
game.bind_mut().respawn_ball();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user