From c606a246bf9493feff19988b4d23a098dbe12c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Fri, 3 Jul 2026 02:05:23 +0200 Subject: [PATCH] fix(Core/BG): invited count leak when a BG teleport fails + group join checks (#26422) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/server/game/Handlers/BattleGroundHandler.cpp | 2 +- src/server/game/Handlers/MovementHandler.cpp | 10 ++++++++++ src/server/game/World/World.cpp | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index f9cbfac329..414be5d644 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -252,7 +252,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) } }); - if (err) + if (err > 0) { err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 296232a8a1..3bca8bbfcd 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -152,7 +152,17 @@ void WorldSession::HandleMoveWorldportAck() { // but landed on another map, cleanup data if (!mEntry->IsBattlegroundOrArena()) + { + // release the unconsumed invite, otherwise the BG never satisfies its empty + uninvited deletion gate + if (Battleground* bg = _player->GetBattleground(true)) + if (_player->IsInvitedForBattlegroundInstance(bg->GetInstanceID())) + { + bg->DecreaseInvitedCount(_player->GetBgTeamId()); + _player->RemoveBattlegroundQueueId(BattlegroundMgr::BGQueueTypeId(bg->GetBgTypeID(), bg->GetArenaType())); + } + _player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE, PLAYER_MAX_BATTLEGROUND_QUEUES, false, false, TEAM_NEUTRAL); + } // everything ok else if (Battleground* bg = _player->GetBattleground()) { diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index c214656124..9c2147dc20 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1639,7 +1639,7 @@ void World::InitMonthlyQuestResetTime() void World::InitRandomBGResetTime() { Seconds wstime = Seconds(sWorldState->getWorldState(WORLD_STATE_CUSTOM_BG_DAILY_RESET_TIME)); - _nextRandomBGReset = wstime > 0s ? wstime : Seconds(Acore::Time::GetNextTimeWithDayAndHour(-1, 6)); + _nextRandomBGReset = wstime > 0s ? wstime : Seconds(Acore::Time::GetNextTimeWithDayAndHour(-1, getIntConfig(CONFIG_RANDOM_BG_RESET_HOUR))); if (wstime == 0s) { @@ -1772,7 +1772,7 @@ void World::ResetRandomBG() if (itr->second->GetPlayer()) itr->second->GetPlayer()->SetRandomWinner(false); - _nextRandomBGReset = Seconds(Acore::Time::GetNextTimeWithDayAndHour(-1, 6)); + _nextRandomBGReset = Seconds(Acore::Time::GetNextTimeWithDayAndHour(-1, getIntConfig(CONFIG_RANDOM_BG_RESET_HOUR))); sWorldState->setWorldState(WORLD_STATE_CUSTOM_BG_DAILY_RESET_TIME, _nextRandomBGReset.count()); }