Skip to content

Commit ac12f5d

Browse files
Nyeriahclaude
andauthored
fix(Core/Battlefield): fire OnBattlefieldPlayerLeaveZone before HasPlayer guard (azerothcore#25870)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent d45e01e commit ac12f5d

2 files changed

Lines changed: 13 additions & 9 deletions

File tree

src/server/game/Battlefield/Battlefield.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,16 @@ void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/)
129129
for (BfCapturePoint* cp : CapturePoints)
130130
cp->HandlePlayerLeave(player);
131131

132-
InvitedPlayers[player->GetTeamId()].erase(player->GetGUID());
133-
PlayersInQueue[player->GetTeamId()].erase(player->GetGUID());
134-
PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID());
135-
Players[player->GetTeamId()].erase(player->GetGUID());
132+
for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
133+
{
134+
InvitedPlayers[i].erase(player->GetGUID());
135+
PlayersInQueue[i].erase(player->GetGUID());
136+
PlayersWillBeKick[i].erase(player->GetGUID());
137+
Players[i].erase(player->GetGUID());
138+
}
136139
SendRemoveWorldStates(player);
137140
RemovePlayerFromResurrectQueue(player->GetGUID());
138141
OnPlayerLeaveZone(player);
139-
// Scripts must restore player->GetTeamId() here (e.g. ClearFakePlayer).
140-
// All Battlefield data-structure cleanup above has already completed using
141-
// the assigned team, so it is safe to restore the real team now.
142-
sScriptMgr->OnBattlefieldPlayerLeaveZone(this, player);
143142
}
144143

145144
bool Battlefield::Update(uint32 diff)
@@ -379,7 +378,10 @@ void Battlefield::DoPlaySoundToAll(uint32 soundId)
379378

380379
bool Battlefield::HasPlayer(Player* player) const
381380
{
382-
return Players[player->GetTeamId()].find(player->GetGUID()) != Players[player->GetTeamId()].end();
381+
for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
382+
if (Players[i].count(player->GetGUID()))
383+
return true;
384+
return false;
383385
}
384386

385387
// Called in WorldSession::HandleBfQueueInviteResponse

src/server/game/Battlefield/BattlefieldMgr.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "BattlefieldMgr.h"
1919
#include "Player.h"
20+
#include "ScriptMgr.h"
2021
#include "Zones/BattlefieldWG.h"
2122

2223
BattlefieldMgr::BattlefieldMgr() : _updateTimer(0)
@@ -86,6 +87,7 @@ void BattlefieldMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId)
8687
// teleport: remove once in removefromworld, once in updatezone
8788
if (!itr->second->HasPlayer(player))
8889
return;
90+
sScriptMgr->OnBattlefieldPlayerLeaveZone(itr->second, player);
8991
itr->second->HandlePlayerLeaveZone(player, zoneId);
9092
LOG_DEBUG("bg.battlefield", "Player {} left outdoorpvp id {}", player->GetGUID().ToString(), itr->second->GetTypeId());
9193
}

0 commit comments

Comments
 (0)