From 499f2284bdfb702f68d200dc792720e4047da8e2 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 29 Sep 2025 19:23:40 +0200 Subject: [PATCH] Server: Fix Server::Send exception caused by leaving players Leaving players will have PEER_ID_INVALID for database saving purposes. This patch clarifies that, and properly protects the batch send function. Bug introduced by 5f5ea132. --- src/remoteplayer.h | 3 ++- src/server.cpp | 2 +- src/server/player_sao.cpp | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/remoteplayer.h b/src/remoteplayer.h index 1f56bc517a..60bddf40ff 100644 --- a/src/remoteplayer.h +++ b/src/remoteplayer.h @@ -123,7 +123,8 @@ public: bool inventory_formspec_overridden = false; - /// returns PEER_ID_INEXISTENT when PlayerSAO is not ready + /// returns PEER_ID_INEXISTENT when PlayerSAO is either + /// not yet present or about to be removed (e.g. leave). session_t getPeerId() const { return m_peer_id; } void setPeerId(session_t peer_id) { m_peer_id = peer_id; } diff --git a/src/server.cpp b/src/server.cpp index a4328fb5a9..3c03e68a63 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1618,7 +1618,7 @@ void Server::SendSpawnParticles(RemotePlayer *player, const float radius_sq = radius * radius; PlayerSAO *sao = player->getPlayerSAO(); - if (!sao) + if (!sao || sao->isGone()) return; std::ostringstream particle_batch_data(std::ios_base::binary); diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 1334443a17..86f8cfe3d8 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -50,6 +50,8 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p m_armor_groups["immortal"] = 1; } +// PlayerSAO::~PlayerSAO(): eventually deleted by `ActiveObjectMgr::removeObject` + void PlayerSAO::finalize(RemotePlayer *player, const std::set &privs) { assert(player);