skullball/rust/src/player/telegrenade.rs

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