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