Sync jumps
This commit is contained in:
parent
704ea006c9
commit
25867a0909
@ -308,6 +308,14 @@ impl Game {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn handle_jump(&mut self, player_id: u16) {
|
||||||
|
if player_id != self.self_id.unwrap_or(0) {
|
||||||
|
if let Some(player) = self.find_player_mut(player_id) {
|
||||||
|
player.apply_jump();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@ -366,6 +374,12 @@ impl Player {
|
|||||||
character.dyn_bind_mut().apply_rotation(rot.into());
|
character.dyn_bind_mut().apply_rotation(rot.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn apply_jump(&mut self) {
|
||||||
|
if let Some(character) = &mut self.character {
|
||||||
|
character.dyn_bind_mut().jump();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
|||||||
@ -222,6 +222,11 @@ impl INode for NetworkManager {
|
|||||||
game.bind_mut().handle_sync(sync_data);
|
game.bind_mut().handle_sync(sync_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Package::Jump(player_id) => {
|
||||||
|
if let Some(game) = &mut Game::singleton() {
|
||||||
|
game.bind_mut().handle_jump(player_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -361,6 +366,18 @@ impl INode for NetworkManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Package::Jump(_) => {
|
||||||
|
if let Some(game) = &mut Game::singleton() {
|
||||||
|
let player = game
|
||||||
|
.bind()
|
||||||
|
.find_player_by_addr(&conn.address)
|
||||||
|
.cloned();
|
||||||
|
if let Some(player) = player {
|
||||||
|
game.bind_mut().handle_jump(player.id);
|
||||||
|
peer.broadcast_reliable(Package::Jump(player.id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -471,19 +488,26 @@ impl NetworkManager {
|
|||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub enum Package {
|
pub enum Package {
|
||||||
Hello,
|
Hello,
|
||||||
|
|
||||||
|
// Meta values
|
||||||
Players(Vec<NetPlayer>, u16),
|
Players(Vec<NetPlayer>, u16),
|
||||||
|
UpdatePings(HashMap<u16, u128>),
|
||||||
SetNick(u16, String),
|
SetNick(u16, String),
|
||||||
SetSelfNick(String),
|
SetSelfNick(String),
|
||||||
UpdatePings(HashMap<u16, u128>),
|
|
||||||
NewPlayer(NetPlayer),
|
NewPlayer(NetPlayer),
|
||||||
PlayerLeft(NetPlayer),
|
PlayerLeft(NetPlayer),
|
||||||
|
|
||||||
|
// Lobby packages
|
||||||
SetReady(u16, bool),
|
SetReady(u16, bool),
|
||||||
SelectMap(u8),
|
SelectMap(u8),
|
||||||
GameStarted,
|
GameStarted,
|
||||||
|
MapLoaded,
|
||||||
|
|
||||||
|
// Game packages
|
||||||
SpawnPlayer(u16, NetPlayerTransform),
|
SpawnPlayer(u16, NetPlayerTransform),
|
||||||
Sync(HashMap<u16, (NetVector3, NetPlayerTransform)>),
|
Sync(HashMap<u16, (NetVector3, NetPlayerTransform)>),
|
||||||
SelfSync(NetVector3, NetVector3),
|
SelfSync(NetVector3, NetVector3),
|
||||||
MapLoaded,
|
Jump(u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum PeerKind {
|
pub enum PeerKind {
|
||||||
|
|||||||
@ -10,7 +10,13 @@ use godot::{
|
|||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{net::util::NetVector3, ui::cli::CommandLinePanel};
|
use crate::{
|
||||||
|
net::{
|
||||||
|
network_manager::{NetworkManager, Package::Jump, PeerKind},
|
||||||
|
util::NetVector3,
|
||||||
|
},
|
||||||
|
ui::cli::CommandLinePanel,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
|
||||||
pub struct NetPlayerTransform {
|
pub struct NetPlayerTransform {
|
||||||
@ -28,11 +34,11 @@ pub trait IPlayer {
|
|||||||
fn apply_transform(&mut self, transform: NetPlayerTransform);
|
fn apply_transform(&mut self, transform: NetPlayerTransform);
|
||||||
fn apply_rotation(&mut self, rot: Vector3);
|
fn apply_rotation(&mut self, rot: Vector3);
|
||||||
fn get_transform(&self) -> NetPlayerTransform;
|
fn get_transform(&self) -> NetPlayerTransform;
|
||||||
|
fn jump(&mut self);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait PlayerMovement {
|
pub trait PlayerMovement {
|
||||||
fn player_update(&mut self, delta: f64);
|
fn player_update(&mut self, delta: f64);
|
||||||
fn jump(&mut self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IPlayer + ICharacterBody3D + WithBaseField> PlayerMovement for T {
|
impl<T: IPlayer + ICharacterBody3D + WithBaseField> PlayerMovement for T {
|
||||||
@ -53,10 +59,6 @@ impl<T: IPlayer + ICharacterBody3D + WithBaseField> PlayerMovement for T {
|
|||||||
self.base_mut().set_velocity(speed);
|
self.base_mut().set_velocity(speed);
|
||||||
self.base_mut().move_and_slide();
|
self.base_mut().move_and_slide();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn jump(&mut self) {
|
|
||||||
self.set_y_speed(5.);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(GodotClass)]
|
#[derive(GodotClass)]
|
||||||
@ -118,6 +120,18 @@ impl IPlayer for LocalPlayer {
|
|||||||
rotation: self.base().get_global_rotation().into(),
|
rotation: self.base().get_global_rotation().into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn jump(&mut self) {
|
||||||
|
self.set_y_speed(5.);
|
||||||
|
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
|
||||||
|
match peer {
|
||||||
|
PeerKind::Client(peer, addr) => peer.send_reliable(&addr, Jump(0)),
|
||||||
|
PeerKind::Server(peer, _) => {
|
||||||
|
peer.broadcast_reliable(Jump(self.player_id.unwrap_or(0)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[godot_api]
|
#[godot_api]
|
||||||
@ -247,6 +261,10 @@ impl IPlayer for RemotePlayer {
|
|||||||
rotation: self.base().get_global_rotation().into(),
|
rotation: self.base().get_global_rotation().into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn jump(&mut self) {
|
||||||
|
self.set_y_speed(5.);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[godot_api]
|
#[godot_api]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user