58 lines
1.5 KiB
Rust
58 lines
1.5 KiB
Rust
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<DynGd<CharacterBody3D, dyn IPlayer>>,
|
|
|
|
base: Base<RigidBody3D>,
|
|
}
|
|
|
|
#[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()
|
|
}
|
|
}
|