From 5d14a2675c4490cd6bdad17d3baea9cdb0f1bc71 Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 22 Jul 2026 03:18:07 +0300 Subject: [PATCH] Move jumping code to PlayerMovement --- rust/src/game_manager.rs | 4 ++-- rust/src/net/network_manager.rs | 2 +- rust/src/net/protocol.rs | 5 ++--- rust/src/player.rs | 27 +++++++++++++++++++-------- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index d9d9852..0458781 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -310,7 +310,7 @@ impl Game { self.self_id = Some(id); } - pub fn new_player(&mut self, addr: SocketAddr, name: String, id: Option) -> u16 { + pub fn new_player(&mut self, addr: SocketAddr, name: Option, id: Option) -> u16 { let id = if let Some(id) = id { id } else { @@ -322,7 +322,7 @@ impl Game { connection_addr: addr, data: NetPlayer { id, - name, + name: name.unwrap_or(format!("Player {}", id)), ping: 0, team: 0, }, diff --git a/rust/src/net/network_manager.rs b/rust/src/net/network_manager.rs index 6c12af4..019a39f 100644 --- a/rust/src/net/network_manager.rs +++ b/rust/src/net/network_manager.rs @@ -175,7 +175,7 @@ impl NetworkManager { if let Some(game) = &mut Game::singleton() { let id = game.bind_mut().new_player( SocketAddr::from(([0, 0, 0, 0], 0)), - "Host".to_owned(), + Some("Host".to_owned()), None, ); game.bind_mut().update_player_ready(id, true); diff --git a/rust/src/net/protocol.rs b/rust/src/net/protocol.rs index 0b82644..9cc680a 100644 --- a/rust/src/net/protocol.rs +++ b/rust/src/net/protocol.rs @@ -73,7 +73,7 @@ impl NetworkManager { if player.id != game.bind().self_id.unwrap_or(u16::MAX) { game.bind_mut().new_player( SocketAddr::from(([0, 0, 0, 0], 0)), - player.name, + Some(player.name), Some(player.id), ); } @@ -178,8 +178,7 @@ impl NetworkManager { if let Some(game) = &mut Game::singleton() { let self_id = - game.bind_mut() - .new_player(connection.address, String::new(), None); + game.bind_mut().new_player(connection.address, None, None); peer.send_reliable( &connection.address, Package::Players( diff --git a/rust/src/player.rs b/rust/src/player.rs index 1b2f6d8..9d207f1 100644 --- a/rust/src/player.rs +++ b/rust/src/player.rs @@ -58,6 +58,7 @@ pub trait IPlayer { pub trait PlayerMovement { fn player_update(&mut self, delta: f64); + fn try_jump(&mut self) -> bool; fn drop_ball_common(&mut self, with_velocity: bool) -> bool; fn get_look_dir(&self) -> Vector3; } @@ -85,6 +86,15 @@ impl PlayerMovement for T { } } + fn try_jump(&mut self) -> bool { + if self.base().is_on_floor() { + self.set_y_speed(5.); + true + } else { + false + } + } + fn drop_ball_common(&mut self, with_velocity: bool) -> bool { if let Some(weapon) = self.get_weapon() && let Ok(_) = weapon.try_cast::() @@ -219,12 +229,13 @@ impl IPlayer for LocalPlayer { } 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))) + if self.try_jump() { + 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))) + } } } } @@ -398,7 +409,7 @@ impl ICharacterBody3D for LocalPlayer { let input = Input::singleton(); if self.base().is_on_floor() && input.is_action_just_pressed("jump") { - self.jump(); + self.try_jump(); } Vector3::RIGHT * input.is_action_pressed("right") as u32 as f32 @@ -597,7 +608,7 @@ impl IPlayer for RemotePlayer { } fn jump(&mut self) { - self.set_y_speed(5.); + self.try_jump(); } fn get_look_up(&self) -> f32 {