Alexander Medvedev 2026-04-04 09:22:20 +02:00
parent 6b5470fafc
commit be2707a4f1
3 changed files with 19 additions and 25 deletions

View File

@ -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]

View File

@ -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());

View File

@ -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<Player>` reference to the player object.
pub fn add_player(&self, player: Arc<Player>) -> Result<(), String> {
pub fn add_player(&self, player: &Arc<Player>) -> 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(())
}