feat(Core/BattlegroundQueue): remove queue in all group if player leave (#12731)

This commit is contained in:
Kargatum
2022-08-16 23:21:55 +07:00
committed by GitHub
parent 88eb48297b
commit c3f7c4371d
2 changed files with 23 additions and 15 deletions
@@ -86,28 +86,29 @@ bool BattlegroundQueue::SelectionPool::KickGroup(const uint32 size)
// find last group with proper size or largest // find last group with proper size or largest
bool foundProper = false; bool foundProper = false;
auto groupToKick = SelectedGroups.begin(); GroupQueueInfo* groupToKick{ SelectedGroups.front() };
for (auto& itr = groupToKick; itr != SelectedGroups.end(); ++itr)
for (auto const& gInfo : SelectedGroups)
{ {
// if proper size - overwrite to kick last one // if proper size - overwrite to kick last one
if (std::abs(int32((*itr)->Players.size()) - (int32)size) <= 1) if (std::abs(int32(gInfo->Players.size()) - (int32)size) <= 1)
{ {
groupToKick = itr; groupToKick = gInfo;
foundProper = true; foundProper = true;
} }
else if (!foundProper && (*itr)->Players.size() >= (*groupToKick)->Players.size()) else if (!foundProper && gInfo->Players.size() >= groupToKick->Players.size())
groupToKick = itr; groupToKick = gInfo;
} }
// remove selected from pool // remove selected from pool
GroupQueueInfo* ginfo = (*groupToKick); auto playersCountInGroup{ groupToKick->Players.size() };
SelectedGroups.erase(groupToKick); PlayerCount -= playersCountInGroup;
PlayerCount -= ginfo->Players.size(); std::erase(SelectedGroups, groupToKick);
if (foundProper) if (foundProper)
return false; return false;
return (ginfo->Players.size() > size); return playersCountInGroup > size;
} }
// returns true if added or desired count not yet reached // returns true if added or desired count not yet reached
@@ -533,13 +533,20 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recvData)
} }
else // leave queue else // leave queue
{ {
bgQueue.RemovePlayer(_player->GetGUID(), true); for (auto const& playerGuid : ginfo.Players)
_player->RemoveBattlegroundQueueId(bgQueueTypeId); {
auto player = ObjectAccessor::FindConnectedPlayer(playerGuid);
if (!player)
continue;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0, TEAM_NEUTRAL); bgQueue.RemovePlayer(playerGuid, true);
SendPacket(&data); player->RemoveBattlegroundQueueId(bgQueueTypeId);
LOG_DEBUG("bg.battleground", "Battleground: player {} {} left queue for bgtype {}, queue type {}.", _player->GetName(), _player->GetGUID().ToString(), bg->GetBgTypeID(), bgQueueTypeId); sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0, TEAM_NEUTRAL);
player->SendDirectMessage(&data);
LOG_DEBUG("bg.battleground", "Battleground: player {} {} left queue for bgtype {}, queue type {}.", player->GetName(), playerGuid.ToString(), bg->GetBgTypeID(), bgQueueTypeId);
}
// player left queue, we should update it - do not update Arena Queue // player left queue, we should update it - do not update Arena Queue
if (!ginfo.ArenaType) if (!ginfo.ArenaType)