Respawn the ball when it enters a killbox

This commit is contained in:
Sofia 2026-07-21 22:20:26 +03:00
parent d117bb2f72
commit 82d27beef8
3 changed files with 36 additions and 14 deletions

View File

@ -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")

View File

@ -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

View File

@ -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();
}
}
}
}