From 018457d1991dd4477bc67d09e24eb84d7730b93d Mon Sep 17 00:00:00 2001 From: Liyan Zhao Date: Tue, 29 Jul 2025 18:40:28 +0800 Subject: [PATCH] Fix client id increment (#1087) * fix: client id increment (passing &mut u64) * clippy --- pumpkin/src/lib.rs | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/pumpkin/src/lib.rs b/pumpkin/src/lib.rs index eca6a6db8..50af7aded 100644 --- a/pumpkin/src/lib.rs +++ b/pumpkin/src/lib.rs @@ -13,6 +13,7 @@ use plugin::PluginManager; use plugin::server::server_command::ServerCommandEvent; use pumpkin_config::{BASIC_CONFIG, advanced_config}; use pumpkin_macros::send_cancellable; +use pumpkin_protocol::ConnectionState::Play; use pumpkin_util::permission::{PermissionManager, PermissionRegistry}; use pumpkin_util::text::TextComponent; use rustyline_async::{Readline, ReadlineEvent}; @@ -270,12 +271,12 @@ impl PumpkinServer { pub async fn start(&self) { let tasks = Arc::new(TaskTracker::new()); - let master_client_id: u64 = 0; + let mut master_client_id: u64 = 0; let bedrock_clients = Arc::new(Mutex::new(HashMap::new())); while !SHOULD_STOP.load(Ordering::Relaxed) { if !self - .unified_listener_task(master_client_id, &tasks, &bedrock_clients) + .unified_listener_task(&mut master_client_id, &tasks, &bedrock_clients) .await { break; @@ -321,10 +322,9 @@ impl PumpkinServer { } } - #[expect(unused_assignments)] pub async fn unified_listener_task( &self, - mut master_client_id_counter: u64, + master_client_id_counter: &mut u64, tasks: &Arc, bedrock_clients: &Arc>>>, ) -> bool { @@ -339,8 +339,8 @@ impl PumpkinServer { log::warn!("Failed to set TCP_NODELAY: {e}"); } - let client_id = master_client_id_counter; - master_client_id_counter += 1; + let client_id = *master_client_id_counter; + *master_client_id_counter += 1; let formatted_address = if BASIC_CONFIG.scrub_ips { scrub_address(&format!("{client_addr}")) @@ -356,24 +356,26 @@ impl PumpkinServer { let server_clone = self.server.clone(); tasks.spawn(async move { - java_client.process_packets(&server_clone).await; - java_client.close(); - java_client.await_tasks().await; + java_client.process_packets(&server_clone).await; + java_client.close(); + java_client.await_tasks().await; - let player = java_client.player.lock().await; - if let Some(player) = player.as_ref() { - log::debug!("Cleaning up player for id {client_id}"); + let player = java_client.player.lock().await; + if let Some(player) = player.as_ref() { + log::debug!("Cleaning up player for id {client_id}"); - if let Err(e) = server_clone.player_data_storage - .handle_player_leave(player) - .await - { - log::error!("Failed to save player data on disconnect: {e}"); - } - - player.remove().await; - server_clone.remove_player(player).await; + if let Err(e) = server_clone.player_data_storage + .handle_player_leave(player) + .await + { + log::error!("Failed to save player data on disconnect: {e}"); } + + player.remove().await; + server_clone.remove_player(player).await; + } else if java_client.connection_state.load() == Play { + log::error!("No player found for id {client_id}. This should not happen!"); + } }); } Err(e) => { @@ -406,7 +408,7 @@ impl PumpkinServer { client.process_packet(&server, reader).await; }); } else if let Ok(packet) = BedrockClient::is_connection_request(&mut Cursor::new(&udp_buf[4..len])) { - master_client_id_counter += 1; + *master_client_id_counter += 1; let mut platform = BedrockClient::new(self.udp_socket.clone(), client_addr, be_clients); platform.handle_connection_request(packet).await;