From ac12f5d27cc2418902c2be1ba2a5a32edcd8399f Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 16 May 2026 20:22:14 -0300 Subject: [PATCH] fix(Core/Battlefield): fire OnBattlefieldPlayerLeaveZone before HasPlayer guard (#25870) Co-authored-by: Claude Sonnet 4.6 --- src/server/game/Battlefield/Battlefield.cpp | 20 ++++++++++--------- .../game/Battlefield/BattlefieldMgr.cpp | 2 ++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index a37534dbb..63dc0e5fd 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -129,17 +129,16 @@ void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/) for (BfCapturePoint* cp : CapturePoints) cp->HandlePlayerLeave(player); - InvitedPlayers[player->GetTeamId()].erase(player->GetGUID()); - PlayersInQueue[player->GetTeamId()].erase(player->GetGUID()); - PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID()); - Players[player->GetTeamId()].erase(player->GetGUID()); + for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i) + { + InvitedPlayers[i].erase(player->GetGUID()); + PlayersInQueue[i].erase(player->GetGUID()); + PlayersWillBeKick[i].erase(player->GetGUID()); + Players[i].erase(player->GetGUID()); + } SendRemoveWorldStates(player); RemovePlayerFromResurrectQueue(player->GetGUID()); OnPlayerLeaveZone(player); - // Scripts must restore player->GetTeamId() here (e.g. ClearFakePlayer). - // All Battlefield data-structure cleanup above has already completed using - // the assigned team, so it is safe to restore the real team now. - sScriptMgr->OnBattlefieldPlayerLeaveZone(this, player); } bool Battlefield::Update(uint32 diff) @@ -379,7 +378,10 @@ void Battlefield::DoPlaySoundToAll(uint32 soundId) bool Battlefield::HasPlayer(Player* player) const { - return Players[player->GetTeamId()].find(player->GetGUID()) != Players[player->GetTeamId()].end(); + for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i) + if (Players[i].count(player->GetGUID())) + return true; + return false; } // Called in WorldSession::HandleBfQueueInviteResponse diff --git a/src/server/game/Battlefield/BattlefieldMgr.cpp b/src/server/game/Battlefield/BattlefieldMgr.cpp index dcf60edb7..152102cb3 100644 --- a/src/server/game/Battlefield/BattlefieldMgr.cpp +++ b/src/server/game/Battlefield/BattlefieldMgr.cpp @@ -17,6 +17,7 @@ #include "BattlefieldMgr.h" #include "Player.h" +#include "ScriptMgr.h" #include "Zones/BattlefieldWG.h" BattlefieldMgr::BattlefieldMgr() : _updateTimer(0) @@ -86,6 +87,7 @@ void BattlefieldMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId) // teleport: remove once in removefromworld, once in updatezone if (!itr->second->HasPlayer(player)) return; + sScriptMgr->OnBattlefieldPlayerLeaveZone(itr->second, player); itr->second->HandlePlayerLeaveZone(player, zoneId); LOG_DEBUG("bg.battlefield", "Player {} left outdoorpvp id {}", player->GetGUID().ToString(), itr->second->GetTypeId()); }