use godot::{ classes::{Area3D, IArea3D}, prelude::*, }; use crate::{ ball::Ball, game_manager::Game, net::network_manager::NetworkManager, player::{DamageSource, IPlayer}, }; #[derive(GodotClass)] #[class(base=Area3D, init)] pub struct Killbox { base: Base, } #[godot_api] impl IArea3D for Killbox { fn ready(&mut self) { self.base() .signals() .body_entered() .connect_other(self, |s, body| s.kill(body)); } } impl Killbox { pub fn kill(&mut self, node: Gd) { 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(); } } } }