diff --git a/godot/maps/default_map/map0.tscn b/godot/maps/default_map/map0.tscn index 4efd569..42fc2ce 100644 --- a/godot/maps/default_map/map0.tscn +++ b/godot/maps/default_map/map0.tscn @@ -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") diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index 15e1b8f..65ebd4d 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -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> { if let Some(player) = self.find_player_mut(id) && let Some(character) = &mut player.character diff --git a/rust/src/killbox.rs b/rust/src/killbox.rs index 1a54e1e..98e6c0b 100644 --- a/rust/src/killbox.rs +++ b/rust/src/killbox.rs @@ -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) { - if let Ok(mut player) = node.try_dynify::() { + if let Ok(mut player) = node.clone().try_dynify::() { if NetworkManager::singleton().bind().is_host() { player .dyn_bind_mut() .take_damage(DamageSource::Killbox, 1000, true); } + } else if let Ok(_) = node.try_cast::() { + if let Some(game) = &mut Game::singleton() { + game.bind_mut().respawn_ball(); + } } } }