use godot::{ classes::{CharacterBody3D, IRigidBody3D, RigidBody3D}, prelude::*, }; use crate::{ net::{ network_manager::{NetworkManager, Package, PeerKind}, util::NetVector3, }, player::{IPlayer, NetTransform}, }; #[derive(GodotClass)] #[class(base=RigidBody3D, init)] pub struct Telegrenade { pub player: Option>, base: Base, } #[godot_api] impl IRigidBody3D for Telegrenade { fn ready(&mut self) { self.base() .signals() .body_entered() .connect_other(self, |s, _| s.on_collision()); } } impl Telegrenade { pub fn on_collision(&mut self) { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer && let PeerKind::Server(peer, _) = peer && let Some(mut player) = self.player.clone() { let pos = self.base().get_global_position(); player.dyn_bind_mut().telegrenade_teleport(pos); peer.broadcast_reliable(Package::TelegrenadeTeleport( player.dyn_bind().get_player_id().unwrap_or(0), pos.into(), )); } } pub fn get_transform(&self) -> NetTransform { NetTransform { location: self.base().get_global_position().into(), rotation: self.base().get_global_rotation().into(), } } pub fn get_velocity(&self) -> NetVector3 { self.base().get_linear_velocity().into() } }