feat(Core/BattlegroundQueue): remove queue in all group if player leave (#12731)
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user