skullball/rust/src/killbox.rs

44 lines
1.0 KiB
Rust

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<Area3D>,
}
#[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<Node3D>) {
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();
}
}
}
}