From be2707a4f180f7b58b69b06a9ce005946babc547 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Sat, 4 Apr 2026 09:22:20 +0200 Subject: [PATCH] fix: https://github.com/Pumpkin-MC/Pumpkin/issues/1966 --- .../plugin/api/events/player/player_join.rs | 2 +- pumpkin/src/server/mod.rs | 2 +- pumpkin/src/world/mod.rs | 40 ++++++++----------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/pumpkin/src/plugin/api/events/player/player_join.rs b/pumpkin/src/plugin/api/events/player/player_join.rs index 3e9581574..e594c3700 100644 --- a/pumpkin/src/plugin/api/events/player/player_join.rs +++ b/pumpkin/src/plugin/api/events/player/player_join.rs @@ -6,7 +6,7 @@ use crate::entity::player::Player; use super::PlayerEvent; -/// An event that occurs when a player joins the game. +/// An event that occurs when a player is spawned and joined the game. /// /// This event contains information about the player joining and a message to display upon joining. #[cancellable] diff --git a/pumpkin/src/server/mod.rs b/pumpkin/src/server/mod.rs index bdded0a6a..8aa1448ea 100644 --- a/pumpkin/src/server/mod.rs +++ b/pumpkin/src/server/mod.rs @@ -419,7 +419,7 @@ impl Server { 'after: { player.screen_handler_sync_handler.store_player(player.clone()).await; if world - .add_player(player.clone()) + .add_player(&player) .is_ok() { let mut user_cache = self.data.user_cache.write().await; user_cache.upsert(player.gameprofile.id, player.gameprofile.name.clone()); diff --git a/pumpkin/src/world/mod.rs b/pumpkin/src/world/mod.rs index 5ee86b94c..1c28a871a 100644 --- a/pumpkin/src/world/mod.rs +++ b/pumpkin/src/world/mod.rs @@ -2067,6 +2067,22 @@ impl World { player.send_active_effects().await; self.send_player_equipment(player).await; + + let msg_comp = TextComponent::translate( + translation::MULTIPLAYER_PLAYER_JOINED, + [TextComponent::text(player.gameprofile.name.clone())], + ) + .color_named(NamedColor::Yellow); + let event = PlayerJoinEvent::new(player.clone(), msg_comp); + + let event = server.plugin_manager.fire(event).await; + + if !event.cancelled { + self.broadcast_system_message(&event.join_message, false) + .await; + // TODO: Switch to structured logging, e.g. info!(player = %name, "connected") + info!("{}", event.join_message.to_pretty_console()); + } } async fn send_player_equipment(&self, from: &Player) { @@ -2863,35 +2879,13 @@ impl World { /// /// # Arguments /// - /// * `uuid`: The unique UUID of the player to add. /// * `player`: An `Arc` reference to the player object. - pub fn add_player(&self, player: Arc) -> Result<(), String> { + pub fn add_player(&self, player: &Arc) -> Result<(), String> { self.players.rcu(|current_list| { let mut new_list = (**current_list).clone(); new_list.push(player.clone()); new_list }); - - let server = self.server.upgrade().unwrap(); - let current_players = self.players.load(); - player.clone().spawn_task(async move { - let msg_comp = TextComponent::translate( - translation::MULTIPLAYER_PLAYER_JOINED, - [TextComponent::text(player.gameprofile.name.clone())], - ) - .color_named(NamedColor::Yellow); - let event = PlayerJoinEvent::new(player.clone(), msg_comp); - - let event = server.plugin_manager.fire(event).await; - - if !event.cancelled { - for player in current_players.iter() { - player.send_system_message(&event.join_message).await; - } - // TODO: Switch to structured logging, e.g. info!(player = %name, "connected") - info!("{}", event.join_message.to_pretty_console()); - } - }); Ok(()) }