diff options
Diffstat (limited to 'src/server/game/Battlegrounds/BattlegroundQueue.cpp')
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundQueue.cpp | 834 |
1 files changed, 417 insertions, 417 deletions
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index d6581ac728..387489b685 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -76,22 +76,22 @@ void BattlegroundQueue::SelectionPool::Init() // returns true if we kicked more than requested bool BattlegroundQueue::SelectionPool::KickGroup(const uint32 size) { - if (SelectedGroups.empty()) - return false; + if (SelectedGroups.empty()) + return false; // find last group with proper size or largest - bool foundProper = false; + bool foundProper = false; GroupsQueueType::iterator groupToKick = SelectedGroups.begin(); for (GroupsQueueType::iterator itr = groupToKick; itr != SelectedGroups.end(); ++itr) { - // if proper size - overwrite to kick last one + // if proper size - overwrite to kick last one if (abs(int32((*itr)->Players.size()) - (int32)size) <= 1) { groupToKick = itr; - foundProper = true; + foundProper = true; } - else if (!foundProper && (*itr)->Players.size() >= (*groupToKick)->Players.size()) - groupToKick = itr; + else if (!foundProper && (*itr)->Players.size() >= (*groupToKick)->Players.size()) + groupToKick = itr; } // remove selected from pool @@ -99,8 +99,8 @@ bool BattlegroundQueue::SelectionPool::KickGroup(const uint32 size) SelectedGroups.erase(groupToKick); PlayerCount -= ginfo->Players.size(); - if (foundProper) - return false; + if (foundProper) + return false; return (ginfo->Players.size() > size); } @@ -131,8 +131,8 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PvPDiffi // create new ginfo GroupQueueInfo* ginfo = new GroupQueueInfo; - ginfo->BgTypeId = m_bgTypeId; - ginfo->ArenaType = m_arenaType; + ginfo->BgTypeId = m_bgTypeId; + ginfo->ArenaType = m_arenaType; ginfo->ArenaTeamId = arenateamid; ginfo->IsRated = isRated; ginfo->IsInvitedToBGInstanceGUID = 0; @@ -153,9 +153,9 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PvPDiffi if (ginfo->teamId == TEAM_HORDE) index++; - // pussywizard: store indices at which GroupQueueInfo is in m_QueuedGroups + // pussywizard: store indices at which GroupQueueInfo is in m_QueuedGroups ginfo->_bracketId = bracketId; - ginfo->_groupType = index; + ginfo->_groupType = index; //add players from group to ginfo if (grp) @@ -166,14 +166,14 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PvPDiffi if (!member) continue; - ASSERT(m_QueuedPlayers.count(member->GetGUID()) == 0); + ASSERT(m_QueuedPlayers.count(member->GetGUID()) == 0); m_QueuedPlayers[member->GetGUID()] = ginfo; ginfo->Players.insert(member->GetGUID()); } } else { - ASSERT(m_QueuedPlayers.count(leader->GetGUID()) == 0); + ASSERT(m_QueuedPlayers.count(leader->GetGUID()) == 0); m_QueuedPlayers[leader->GetGUID()] = ginfo; ginfo->Players.insert(leader->GetGUID()); } @@ -199,14 +199,14 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PvPDiffi qHorde += (*itr)->Players.size(); // show queue status to player when joining queue - if (ginfo->BgTypeId == BATTLEGROUND_RB) - ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_80_RANDOM, bgName, q_min_level, q_max_level, qAlliance, qHorde); - else if (bgt->isArena()) - ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_STANDARD, bgName, q_min_level, q_max_level, qAlliance, ((uint32)m_arenaType > qAlliance ? (uint32)m_arenaType - qAlliance : 0), qHorde, ((uint32)m_arenaType > qHorde ? (uint32)m_arenaType - qHorde : 0)); - else if (q_min_level >= 80) - ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_80_SPECIFIC, bgName, q_min_level, q_max_level, qAlliance, bgt->GetMinPlayersPerTeam(), qHorde, bgt->GetMinPlayersPerTeam()); - else - ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_STANDARD, bgName, q_min_level, q_max_level, qAlliance, (bgt->GetMinPlayersPerTeam() > qAlliance ? bgt->GetMinPlayersPerTeam() - qAlliance : 0), qHorde, (bgt->GetMinPlayersPerTeam() > qHorde ? bgt->GetMinPlayersPerTeam() - qHorde : 0)); + if (ginfo->BgTypeId == BATTLEGROUND_RB) + ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_80_RANDOM, bgName, q_min_level, q_max_level, qAlliance, qHorde); + else if (bgt->isArena()) + ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_STANDARD, bgName, q_min_level, q_max_level, qAlliance, ((uint32)m_arenaType > qAlliance ? (uint32)m_arenaType - qAlliance : 0), qHorde, ((uint32)m_arenaType > qHorde ? (uint32)m_arenaType - qHorde : 0)); + else if (q_min_level >= 80) + ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_80_SPECIFIC, bgName, q_min_level, q_max_level, qAlliance, bgt->GetMinPlayersPerTeam(), qHorde, bgt->GetMinPlayersPerTeam()); + else + ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_STANDARD, bgName, q_min_level, q_max_level, qAlliance, (bgt->GetMinPlayersPerTeam() > qAlliance ? bgt->GetMinPlayersPerTeam() - qAlliance : 0), qHorde, (bgt->GetMinPlayersPerTeam() > qHorde ? bgt->GetMinPlayersPerTeam() - qHorde : 0)); } return ginfo; @@ -214,21 +214,21 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PvPDiffi void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo) { - uint32 timeInQueue = std::max<uint32>(1, getMSTimeDiff(ginfo->JoinTime, World::GetGameTimeMS())); + uint32 timeInQueue = std::max<uint32>(1, getMSTimeDiff(ginfo->JoinTime, World::GetGameTimeMS())); - // team_index: bg alliance - TEAM_ALLIANCE, bg horde - TEAM_HORDE, arena skirmish - TEAM_ALLIANCE, arena rated - TEAM_HORDE + // team_index: bg alliance - TEAM_ALLIANCE, bg horde - TEAM_HORDE, arena skirmish - TEAM_ALLIANCE, arena rated - TEAM_HORDE uint8 team_index; if (!ginfo->ArenaType) team_index = ginfo->teamId; else - team_index = (ginfo->IsRated ? TEAM_HORDE : TEAM_ALLIANCE); + team_index = (ginfo->IsRated ? TEAM_HORDE : TEAM_ALLIANCE); - // just to be sure - if (team_index >= TEAM_NEUTRAL) - return; + // just to be sure + if (team_index >= TEAM_NEUTRAL) + return; // pointer to last index - uint32* lastIndex = &m_WaitTimeLastIndex[team_index][ginfo->_bracketId]; + uint32* lastIndex = &m_WaitTimeLastIndex[team_index][ginfo->_bracketId]; // set time at index to new value m_WaitTimes[team_index][ginfo->_bracketId][*lastIndex] = timeInQueue; @@ -240,25 +240,25 @@ void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* g uint32 BattlegroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo) const { - // team_index: bg alliance - TEAM_ALLIANCE, bg horde - TEAM_HORDE, arena skirmish - TEAM_ALLIANCE, arena rated - TEAM_HORDE + // team_index: bg alliance - TEAM_ALLIANCE, bg horde - TEAM_HORDE, arena skirmish - TEAM_ALLIANCE, arena rated - TEAM_HORDE uint8 team_index; if (!ginfo->ArenaType) team_index = ginfo->teamId; else - team_index = (ginfo->IsRated ? TEAM_HORDE : TEAM_ALLIANCE); + team_index = (ginfo->IsRated ? TEAM_HORDE : TEAM_ALLIANCE); - // just to be sure - if (team_index >= TEAM_NEUTRAL) - return 0; + // just to be sure + if (team_index >= TEAM_NEUTRAL) + return 0; // if there are enough values: if (m_WaitTimes[team_index][ginfo->_bracketId][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME - 1]) - { - uint32 sum = 0; - for (uint32 i=0; i<COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; ++i) - sum += m_WaitTimes[team_index][ginfo->_bracketId][i]; - return sum / COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; - } + { + uint32 sum = 0; + for (uint32 i=0; i<COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; ++i) + sum += m_WaitTimes[team_index][ginfo->_bracketId][i]; + return sum / COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; + } else return 0; } @@ -266,29 +266,29 @@ uint32 BattlegroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo) const //remove player from queue and from group info, if group info is empty then remove it too void BattlegroundQueue::RemovePlayer(uint64 guid, bool sentToBg, uint32 playerQueueSlot) { - // pussywizard: leave queue packet - if (playerQueueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) - if (Player* p = ObjectAccessor::FindPlayerInOrOutOfWorld(guid)) - { - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, NULL, playerQueueSlot, STATUS_NONE, 0, 0, 0, TEAM_NEUTRAL); - p->GetSession()->SendPacket(&data); - } + // pussywizard: leave queue packet + if (playerQueueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) + if (Player* p = ObjectAccessor::FindPlayerInOrOutOfWorld(guid)) + { + WorldPacket data; + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, NULL, playerQueueSlot, STATUS_NONE, 0, 0, 0, TEAM_NEUTRAL); + p->GetSession()->SendPacket(&data); + } //remove player from map, if he's there QueuedPlayersMap::iterator itr = m_QueuedPlayers.find(guid); if (itr == m_QueuedPlayers.end()) - { - ASSERT(false); + { + ASSERT(false); return; - } + } GroupQueueInfo* groupInfo = itr->second; - uint32 _bracketId = groupInfo->_bracketId; - uint32 _groupType = groupInfo->_groupType; + uint32 _bracketId = groupInfo->_bracketId; + uint32 _groupType = groupInfo->_groupType; - // find iterator + // find iterator GroupsQueueType::iterator group_itr = m_QueuedGroups[_bracketId][_groupType].end(); for (GroupsQueueType::iterator k = m_QueuedGroups[_bracketId][_groupType].begin(); k != m_QueuedGroups[_bracketId][_groupType].end(); ++k) if ((*k) == groupInfo) @@ -299,22 +299,22 @@ void BattlegroundQueue::RemovePlayer(uint64 guid, bool sentToBg, uint32 playerQu //player can't be in queue without group, but just in case if (group_itr == m_QueuedGroups[_bracketId][_groupType].end()) - { - ASSERT(false); + { + ASSERT(false); return; - } + } // remove player from group queue info std::set<uint64>::iterator pitr = groupInfo->Players.find(guid); - ASSERT(pitr != groupInfo->Players.end()); + ASSERT(pitr != groupInfo->Players.end()); if (pitr != groupInfo->Players.end()) groupInfo->Players.erase(pitr); // if invited to bg, then always decrease invited count when removed from queue - // sending player to bg will increase it again + // sending player to bg will increase it again if (groupInfo->IsInvitedToBGInstanceGUID) if (Battleground* bg = sBattlegroundMgr->GetBattleground(groupInfo->IsInvitedToBGInstanceGUID)) - bg->DecreaseInvitedCount(groupInfo->teamId); + bg->DecreaseInvitedCount(groupInfo->teamId); // remove player queue info m_QueuedPlayers.erase(itr); @@ -336,11 +336,11 @@ void BattlegroundQueue::RemovePlayer(uint64 guid, bool sentToBg, uint32 playerQu return; } - // group isn't yet empty, so not deleted yet - // if it's a rated arena and any member leaves when group not yet invited - everyone from group leaves too! + // group isn't yet empty, so not deleted yet + // if it's a rated arena and any member leaves when group not yet invited - everyone from group leaves too! if (groupInfo->IsRated && !groupInfo->IsInvitedToBGInstanceGUID) { - uint32 queueSlot = PLAYER_MAX_BATTLEGROUND_QUEUES; + uint32 queueSlot = PLAYER_MAX_BATTLEGROUND_QUEUES; if (Player* plr = ObjectAccessor::FindPlayerInOrOutOfWorld(*(groupInfo->Players.begin()))) { @@ -356,7 +356,7 @@ void BattlegroundQueue::RemovePlayer(uint64 guid, bool sentToBg, uint32 playerQu void BattlegroundQueue::AddEvent(BasicEvent* Event, uint64 e_time) { - m_events.AddEvent(Event, m_events.CalculateTime(e_time)); + m_events.AddEvent(Event, m_events.CalculateTime(e_time)); } bool BattlegroundQueue::IsPlayerInvitedToRatedArena(uint64 pl_guid) @@ -384,15 +384,15 @@ bool BattlegroundQueue::GetPlayerGroupInfoData(uint64 guid, GroupQueueInfo* ginf // this function is filling pools given free slots on both sides, result is ballanced void BattlegroundQueue::FillPlayersToBG(const int32 aliFree, const int32 hordeFree, BattlegroundBracketId bracket_id) { - // clear selection pools + // clear selection pools m_SelectionPools[TEAM_ALLIANCE].Init(); m_SelectionPools[TEAM_HORDE].Init(); - // quick check if nothing we can do: - if (!sBattlegroundMgr->isTesting()) - if (aliFree > hordeFree && m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].empty() || - hordeFree > aliFree && m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty()) - return; + // quick check if nothing we can do: + if (!sBattlegroundMgr->isTesting()) + if (aliFree > hordeFree && m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].empty() || + hordeFree > aliFree && m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty()) + return; // ally: at first fill as much as possible GroupsQueueType::const_iterator Ali_itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].begin(); @@ -406,26 +406,26 @@ void BattlegroundQueue::FillPlayersToBG(const int32 aliFree, const int32 hordeFr int32 aliDiff = aliFree - int32(m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount()); int32 hordeDiff = hordeFree - int32(m_SelectionPools[TEAM_HORDE].GetPlayerCount()); - // if free space differs too much, ballance + // if free space differs too much, ballance while (abs(aliDiff - hordeDiff) > 1 && (m_SelectionPools[TEAM_HORDE].GetPlayerCount() > 0 || m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() > 0)) { // if results in more alliance players than horde: if (aliDiff < hordeDiff) { - // no more alliance in pool, invite whatever we can from horde - if (!m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount()) - break; + // no more alliance in pool, invite whatever we can from horde + if (!m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount()) + break; // kick alliance, returns true if kicked more than needed, so then try to fill up if (m_SelectionPools[TEAM_ALLIANCE].KickGroup(hordeDiff - aliDiff)) - for (; Ali_itr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].end() && m_SelectionPools[TEAM_ALLIANCE].AddGroup((*Ali_itr), aliFree >= hordeDiff ? aliFree - hordeDiff : 0); ++Ali_itr); + for (; Ali_itr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].end() && m_SelectionPools[TEAM_ALLIANCE].AddGroup((*Ali_itr), aliFree >= hordeDiff ? aliFree - hordeDiff : 0); ++Ali_itr); } - // if results in more horde players than alliance: + // if results in more horde players than alliance: else { - // no more horde in pool, invite whatever we can from alliance - if (!m_SelectionPools[TEAM_HORDE].GetPlayerCount()) - break; + // no more horde in pool, invite whatever we can from alliance + if (!m_SelectionPools[TEAM_HORDE].GetPlayerCount()) + break; // kick horde, returns true if kicked more than needed, so then try to fill up if (m_SelectionPools[TEAM_HORDE].KickGroup(aliDiff - hordeDiff)) @@ -440,22 +440,22 @@ void BattlegroundQueue::FillPlayersToBG(const int32 aliFree, const int32 hordeFr void BattlegroundQueue::FillPlayersToBGWithSpecific(const int32 aliFree, const int32 hordeFree, BattlegroundBracketId thisBracketId, BattlegroundQueue* specificQueue, BattlegroundBracketId specificBracketId) { - // clear selection pools + // clear selection pools m_SelectionPools[TEAM_ALLIANCE].Init(); m_SelectionPools[TEAM_HORDE].Init(); - // quick check if nothing we can do: - if (!sBattlegroundMgr->isTesting()) - if (m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_ALLIANCE].empty() && specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_ALLIANCE].empty() || - m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_HORDE].empty() && specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_HORDE].empty()) - return; + // quick check if nothing we can do: + if (!sBattlegroundMgr->isTesting()) + if (m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_ALLIANCE].empty() && specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_ALLIANCE].empty() || + m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_HORDE].empty() && specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_HORDE].empty()) + return; - // copy groups from both queues to new joined container - GroupsQueueType m_QueuedBoth[BG_TEAMS_COUNT]; - m_QueuedBoth[TEAM_ALLIANCE].insert(m_QueuedBoth[TEAM_ALLIANCE].end(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_ALLIANCE].end()); - m_QueuedBoth[TEAM_ALLIANCE].insert(m_QueuedBoth[TEAM_ALLIANCE].end(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_ALLIANCE].end()); - m_QueuedBoth[TEAM_HORDE].insert(m_QueuedBoth[TEAM_HORDE].end(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_HORDE].begin(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_HORDE].end()); - m_QueuedBoth[TEAM_HORDE].insert(m_QueuedBoth[TEAM_HORDE].end(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_HORDE].begin(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_HORDE].end()); + // copy groups from both queues to new joined container + GroupsQueueType m_QueuedBoth[BG_TEAMS_COUNT]; + m_QueuedBoth[TEAM_ALLIANCE].insert(m_QueuedBoth[TEAM_ALLIANCE].end(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_ALLIANCE].end()); + m_QueuedBoth[TEAM_ALLIANCE].insert(m_QueuedBoth[TEAM_ALLIANCE].end(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_ALLIANCE].end()); + m_QueuedBoth[TEAM_HORDE].insert(m_QueuedBoth[TEAM_HORDE].end(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_HORDE].begin(), specificQueue->m_QueuedGroups[specificBracketId][BG_QUEUE_NORMAL_HORDE].end()); + m_QueuedBoth[TEAM_HORDE].insert(m_QueuedBoth[TEAM_HORDE].end(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_HORDE].begin(), m_QueuedGroups[thisBracketId][BG_QUEUE_NORMAL_HORDE].end()); // ally: at first fill as much as possible GroupsQueueType::const_iterator Ali_itr = m_QueuedBoth[TEAM_ALLIANCE].begin(); @@ -469,26 +469,26 @@ void BattlegroundQueue::FillPlayersToBGWithSpecific(const int32 aliFree, const i int32 aliDiff = aliFree - int32(m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount()); int32 hordeDiff = hordeFree - int32(m_SelectionPools[TEAM_HORDE].GetPlayerCount()); - // if free space differs too much, ballance + // if free space differs too much, ballance while (abs(aliDiff - hordeDiff) > 1 && (m_SelectionPools[TEAM_HORDE].GetPlayerCount() > 0 || m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() > 0)) { // if results in more alliance players than horde: if (aliDiff < hordeDiff) { - // no more alliance in pool, invite whatever we can from horde - if (!m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount()) - break; + // no more alliance in pool, invite whatever we can from horde + if (!m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount()) + break; // kick alliance, returns true if kicked more than needed, so then try to fill up if (m_SelectionPools[TEAM_ALLIANCE].KickGroup(hordeDiff - aliDiff)) - for (; Ali_itr != m_QueuedBoth[TEAM_ALLIANCE].end() && m_SelectionPools[TEAM_ALLIANCE].AddGroup((*Ali_itr), aliFree >= hordeDiff ? aliFree - hordeDiff : 0); ++Ali_itr); + for (; Ali_itr != m_QueuedBoth[TEAM_ALLIANCE].end() && m_SelectionPools[TEAM_ALLIANCE].AddGroup((*Ali_itr), aliFree >= hordeDiff ? aliFree - hordeDiff : 0); ++Ali_itr); } - // if results in more horde players than alliance: + // if results in more horde players than alliance: else { - // no more horde in pool, invite whatever we can from alliance - if (!m_SelectionPools[TEAM_HORDE].GetPlayerCount()) - break; + // no more horde in pool, invite whatever we can from alliance + if (!m_SelectionPools[TEAM_HORDE].GetPlayerCount()) + break; // kick horde, returns true if kicked more than needed, so then try to fill up if (m_SelectionPools[TEAM_HORDE].KickGroup(aliDiff - hordeDiff)) @@ -505,53 +505,53 @@ void BattlegroundQueue::FillPlayersToBGWithSpecific(const int32 aliFree, const i // then after 30 mins (default) in queue it moves premade group to normal queue bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam) { - // clear selection pools + // clear selection pools m_SelectionPools[TEAM_ALLIANCE].Init(); m_SelectionPools[TEAM_HORDE].Init(); if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() && !m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty()) { - // find premade group for both factions: + // find premade group for both factions: GroupsQueueType::const_iterator ali_group, horde_group; for (ali_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].begin(); ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end(); ++ali_group) - if (!(*ali_group)->IsInvitedToBGInstanceGUID && (*ali_group)->Players.size() >= MinPlayersPerTeam) + if (!(*ali_group)->IsInvitedToBGInstanceGUID && (*ali_group)->Players.size() >= MinPlayersPerTeam) break; for (horde_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].begin(); horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end(); ++horde_group) if (!(*horde_group)->IsInvitedToBGInstanceGUID && (*horde_group)->Players.size() >= MinPlayersPerTeam) break; - // if found both groups + // if found both groups if (ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end() && horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end()) { - // add premade groups to selection pools + // add premade groups to selection pools m_SelectionPools[TEAM_ALLIANCE].AddGroup((*ali_group), MaxPlayersPerTeam); m_SelectionPools[TEAM_HORDE].AddGroup((*horde_group), MaxPlayersPerTeam); - // battleground will be immediately filled (after calling this function and creating new battleground) with more players from normal queue + // battleground will be immediately filled (after calling this function and creating new battleground) with more players from normal queue - return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= MinPlayersPerTeam && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= MinPlayersPerTeam; + return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= MinPlayersPerTeam && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= MinPlayersPerTeam; } } // now check if we can move groups from premade queue to normal queue - // this happens if timer has expired or group size lowered + // this happens if timer has expired or group size lowered - uint32 premade_time = sWorld->getIntConfig(CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH); - uint32 time_before = World::GetGameTimeMS() >= premade_time ? World::GetGameTimeMS() - premade_time : 0; + uint32 premade_time = sWorld->getIntConfig(CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH); + uint32 time_before = World::GetGameTimeMS() >= premade_time ? World::GetGameTimeMS() - premade_time : 0; for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].empty()) - for (GroupsQueueType::iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].end(); ) - { - if (!(*itr)->IsInvitedToBGInstanceGUID && ((*itr)->JoinTime < time_before || (*itr)->Players.size() < MinPlayersPerTeam)) - { - (*itr)->_groupType = BG_QUEUE_NORMAL_ALLIANCE + i; // pussywizard: update GroupQueueInfo internal variable - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].push_front((*itr)); - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].erase(itr++); - continue; - } - ++itr; - } + for (GroupsQueueType::iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].end(); ) + { + if (!(*itr)->IsInvitedToBGInstanceGUID && ((*itr)->JoinTime < time_before || (*itr)->Players.size() < MinPlayersPerTeam)) + { + (*itr)->_groupType = BG_QUEUE_NORMAL_ALLIANCE + i; // pussywizard: update GroupQueueInfo internal variable + m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].push_front((*itr)); + m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].erase(itr++); + continue; + } + ++itr; + } return false; } @@ -559,89 +559,89 @@ bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint // this method tries to create battleground or arena with MinPlayersPerTeam against MinPlayersPerTeam bool BattlegroundQueue::CheckNormalMatch(Battleground* bgTemplate, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers) { - // if current queue is BATTLEGROUND_QUEUE_RB, then we are trying to create bg using players from 2 queues - if (bgTemplate->GetBgTypeID() == BATTLEGROUND_RB) - { - // specific template - Battleground* specificTemplate = sBattlegroundMgr->GetBattlegroundTemplate(sBattlegroundMgr->RandomSystem.GetCurrentRandomBg()); - if (!specificTemplate) - return false; - - // specific bracket id - PvPDifficultyEntry const* specificBracket = GetBattlegroundBracketByLevel(specificTemplate->GetMapId(), sBattlegroundMgr->randomBgDifficultyEntry.minLevel); - if (!specificBracket || specificBracket->maxLevel < sBattlegroundMgr->randomBgDifficultyEntry.maxLevel) - return false; - - // specific queue - BattlegroundQueue& specificQueue = sBattlegroundMgr->GetBattlegroundQueue(BattlegroundMgr::BGQueueTypeId(sBattlegroundMgr->RandomSystem.GetCurrentRandomBg(), 0)); - - FillPlayersToBGWithSpecific(specificTemplate->GetMaxPlayersPerTeam(), specificTemplate->GetMaxPlayersPerTeam(), bracket_id, &specificQueue, BattlegroundBracketId(specificBracket->bracketId)); - - //allow 1v0 if debug bg - if (sBattlegroundMgr->isTesting() && bgTemplate->isBattleground() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) - return true; - - return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= std::min<uint32>(specificTemplate->GetMinPlayersPerTeam(), 15) && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= std::min<uint32>(specificTemplate->GetMinPlayersPerTeam(), 15); - } - // if this is not random bg queue - use players only from this queue - else - { - FillPlayersToBG(maxPlayers, maxPlayers, bracket_id); - - //allow 1v0 if debug bg - if (sBattlegroundMgr->isTesting() && bgTemplate->isBattleground() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) - return true; - - return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= minPlayers; - } + // if current queue is BATTLEGROUND_QUEUE_RB, then we are trying to create bg using players from 2 queues + if (bgTemplate->GetBgTypeID() == BATTLEGROUND_RB) + { + // specific template + Battleground* specificTemplate = sBattlegroundMgr->GetBattlegroundTemplate(sBattlegroundMgr->RandomSystem.GetCurrentRandomBg()); + if (!specificTemplate) + return false; + + // specific bracket id + PvPDifficultyEntry const* specificBracket = GetBattlegroundBracketByLevel(specificTemplate->GetMapId(), sBattlegroundMgr->randomBgDifficultyEntry.minLevel); + if (!specificBracket || specificBracket->maxLevel < sBattlegroundMgr->randomBgDifficultyEntry.maxLevel) + return false; + + // specific queue + BattlegroundQueue& specificQueue = sBattlegroundMgr->GetBattlegroundQueue(BattlegroundMgr::BGQueueTypeId(sBattlegroundMgr->RandomSystem.GetCurrentRandomBg(), 0)); + + FillPlayersToBGWithSpecific(specificTemplate->GetMaxPlayersPerTeam(), specificTemplate->GetMaxPlayersPerTeam(), bracket_id, &specificQueue, BattlegroundBracketId(specificBracket->bracketId)); + + //allow 1v0 if debug bg + if (sBattlegroundMgr->isTesting() && bgTemplate->isBattleground() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) + return true; + + return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= std::min<uint32>(specificTemplate->GetMinPlayersPerTeam(), 15) && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= std::min<uint32>(specificTemplate->GetMinPlayersPerTeam(), 15); + } + // if this is not random bg queue - use players only from this queue + else + { + FillPlayersToBG(maxPlayers, maxPlayers, bracket_id); + + //allow 1v0 if debug bg + if (sBattlegroundMgr->isTesting() && bgTemplate->isBattleground() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) + return true; + + return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= minPlayers; + } } // this method will check if we can invite players to same faction skirmish match bool BattlegroundQueue::CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam) { - for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) - if (!m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].empty()) - { - // clear selection pools - m_SelectionPools[TEAM_ALLIANCE].Init(); - m_SelectionPools[TEAM_HORDE].Init(); - - // fill one queue to both selection pools - for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++itr) - for (uint32 j = 0; j < BG_TEAMS_COUNT; j++) // try to add this group to both pools - if (m_SelectionPools[TEAM_ALLIANCE + j].GetPlayerCount() < minPlayersPerTeam) // if this pool is not full - if (m_SelectionPools[TEAM_ALLIANCE + j].AddGroup((*itr), minPlayersPerTeam)) // successfully added - { - // if both selection pools are full - if (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= minPlayersPerTeam && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= minPlayersPerTeam) - { - // need to move groups from one pool to another queue (for another faction) - TeamId wrongTeamId = (i == 0 ? TEAM_HORDE : TEAM_ALLIANCE); - - for (GroupsQueueType::iterator pitr = m_SelectionPools[wrongTeamId].SelectedGroups.begin(); pitr != m_SelectionPools[wrongTeamId].SelectedGroups.end(); ++pitr) - { - // update internal GroupQueueInfo data - (*pitr)->teamId = wrongTeamId; - (*pitr)->_groupType = BG_QUEUE_NORMAL_ALLIANCE + wrongTeamId; - - // add GroupQueueInfo to new queue - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + wrongTeamId].push_front(*pitr); - - // remove GroupQueueInfo from old queue - for (GroupsQueueType::iterator qitr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].begin(); qitr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++qitr) - if (*qitr == *pitr) - { - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].erase(qitr); - break; - } - } - - return true; - } - - break; // added to one pool, prevent adding it to the second pool - } - } + for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) + if (!m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].empty()) + { + // clear selection pools + m_SelectionPools[TEAM_ALLIANCE].Init(); + m_SelectionPools[TEAM_HORDE].Init(); + + // fill one queue to both selection pools + for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++itr) + for (uint32 j = 0; j < BG_TEAMS_COUNT; j++) // try to add this group to both pools + if (m_SelectionPools[TEAM_ALLIANCE + j].GetPlayerCount() < minPlayersPerTeam) // if this pool is not full + if (m_SelectionPools[TEAM_ALLIANCE + j].AddGroup((*itr), minPlayersPerTeam)) // successfully added + { + // if both selection pools are full + if (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= minPlayersPerTeam && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= minPlayersPerTeam) + { + // need to move groups from one pool to another queue (for another faction) + TeamId wrongTeamId = (i == 0 ? TEAM_HORDE : TEAM_ALLIANCE); + + for (GroupsQueueType::iterator pitr = m_SelectionPools[wrongTeamId].SelectedGroups.begin(); pitr != m_SelectionPools[wrongTeamId].SelectedGroups.end(); ++pitr) + { + // update internal GroupQueueInfo data + (*pitr)->teamId = wrongTeamId; + (*pitr)->_groupType = BG_QUEUE_NORMAL_ALLIANCE + wrongTeamId; + + // add GroupQueueInfo to new queue + m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + wrongTeamId].push_front(*pitr); + + // remove GroupQueueInfo from old queue + for (GroupsQueueType::iterator qitr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].begin(); qitr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++qitr) + if (*qitr == *pitr) + { + m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].erase(qitr); + break; + } + } + + return true; + } + + break; // added to one pool, prevent adding it to the second pool + } + } return false; } @@ -672,39 +672,39 @@ void BattlegroundQueue::BattlegroundQueueUpdate(BattlegroundBracketId bracket_id return; // battlegrounds with free slots should be populated first using players in queue - if ((actionMask & 0x01) && !BattlegroundMgr::IsArenaType(m_bgTypeId)) - { - const BattlegroundContainer& bgList = sBattlegroundMgr->GetBattlegroundList(); - BattlegroundNeedSet bgsToCheck; - - // sort from most needing (most empty) to least needing using a std::set with functor - for (BattlegroundContainer::const_iterator itr = bgList.begin(); itr != bgList.end(); ++itr) - { - Battleground* bg = itr->second; - if (!BattlegroundMgr::IsArenaType(bg->GetBgTypeID()) && (bg->GetBgTypeID() == m_bgTypeId || m_bgTypeId == BATTLEGROUND_RB) && - bg->HasFreeSlots() && bg->GetMinLevel() <= bracketEntry->minLevel && bg->GetMaxLevel() >= bracketEntry->maxLevel) - bgsToCheck.insert(bg); - } - - // now iterate needing battlegrounds - for (BattlegroundNeedSet::iterator itr = bgsToCheck.begin(); itr != bgsToCheck.end(); ++itr) - { - Battleground* bg = *itr; - - // call a function that fills whatever we can from normal queues - FillPlayersToBG(bg->GetFreeSlotsForTeam(TEAM_ALLIANCE), bg->GetFreeSlotsForTeam(TEAM_HORDE), bracket_id); - - // invite players - for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) - for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.end(); ++citr) - BattlegroundMgr::InviteGroupToBG((*citr), bg, (*citr)->teamId); - } - } + if ((actionMask & 0x01) && !BattlegroundMgr::IsArenaType(m_bgTypeId)) + { + const BattlegroundContainer& bgList = sBattlegroundMgr->GetBattlegroundList(); + BattlegroundNeedSet bgsToCheck; + + // sort from most needing (most empty) to least needing using a std::set with functor + for (BattlegroundContainer::const_iterator itr = bgList.begin(); itr != bgList.end(); ++itr) + { + Battleground* bg = itr->second; + if (!BattlegroundMgr::IsArenaType(bg->GetBgTypeID()) && (bg->GetBgTypeID() == m_bgTypeId || m_bgTypeId == BATTLEGROUND_RB) && + bg->HasFreeSlots() && bg->GetMinLevel() <= bracketEntry->minLevel && bg->GetMaxLevel() >= bracketEntry->maxLevel) + bgsToCheck.insert(bg); + } + + // now iterate needing battlegrounds + for (BattlegroundNeedSet::iterator itr = bgsToCheck.begin(); itr != bgsToCheck.end(); ++itr) + { + Battleground* bg = *itr; + + // call a function that fills whatever we can from normal queues + FillPlayersToBG(bg->GetFreeSlotsForTeam(TEAM_ALLIANCE), bg->GetFreeSlotsForTeam(TEAM_HORDE), bracket_id); + + // invite players + for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) + for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.end(); ++citr) + BattlegroundMgr::InviteGroupToBG((*citr), bg, (*citr)->teamId); + } + } // finished iterating through battlegrounds with free slots, maybe we need to create a new bg - if ((actionMask & 0x02) == 0) - return; + if ((actionMask & 0x02) == 0) + return; // get min and max players per team uint32 MinPlayersPerTeam = bg_template->GetMinPlayersPerTeam(); @@ -715,7 +715,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(BattlegroundBracketId bracket_id MaxPlayersPerTeam = m_arenaType; } - // check if can start new premade battleground + // check if can start new premade battleground if (bg_template->isBattleground() && m_bgTypeId != BATTLEGROUND_RB) if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)) { @@ -731,44 +731,44 @@ void BattlegroundQueue::BattlegroundQueueUpdate(BattlegroundBracketId bracket_id bg->StartBattleground(); - // now fill the premade bg if possible (only one team for each side has been invited yet) - if (bg->HasFreeSlots()) - { - // call a function that fills whatever we can from normal queues - FillPlayersToBG(bg->GetFreeSlotsForTeam(TEAM_ALLIANCE), bg->GetFreeSlotsForTeam(TEAM_HORDE), bracket_id); - - // invite players - for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) - for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.end(); ++citr) - BattlegroundMgr::InviteGroupToBG((*citr), bg, (*citr)->teamId); - } + // now fill the premade bg if possible (only one team for each side has been invited yet) + if (bg->HasFreeSlots()) + { + // call a function that fills whatever we can from normal queues + FillPlayersToBG(bg->GetFreeSlotsForTeam(TEAM_ALLIANCE), bg->GetFreeSlotsForTeam(TEAM_HORDE), bracket_id); + + // invite players + for (uint32 i = 0; i < BG_TEAMS_COUNT; i++) + for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE + i].SelectedGroups.end(); ++citr) + BattlegroundMgr::InviteGroupToBG((*citr), bg, (*citr)->teamId); + } } // check if can start new normal battleground or non-rated arena if (!isRated) { if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam) || - (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam))) + (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam))) { - BattlegroundTypeId newBgTypeId = m_bgTypeId; - uint32 minLvl = bracketEntry->minLevel; - uint32 maxLvl = bracketEntry->maxLevel; - - // for random bg use values from specific - if (m_bgTypeId == BATTLEGROUND_RB) - { - newBgTypeId = sBattlegroundMgr->RandomSystem.GetCurrentRandomBg(); - Battleground* specificTemplate = sBattlegroundMgr->GetBattlegroundTemplate(newBgTypeId); - if (!specificTemplate) - return; - PvPDifficultyEntry const* specificBracket = GetBattlegroundBracketByLevel(specificTemplate->GetMapId(), sBattlegroundMgr->randomBgDifficultyEntry.minLevel); - if (!specificBracket) - return; - minLvl = specificBracket->minLevel; - maxLvl = specificBracket->maxLevel; - - sBattlegroundMgr->RandomSystem.BattlegroundCreated(newBgTypeId); - } + BattlegroundTypeId newBgTypeId = m_bgTypeId; + uint32 minLvl = bracketEntry->minLevel; + uint32 maxLvl = bracketEntry->maxLevel; + + // for random bg use values from specific + if (m_bgTypeId == BATTLEGROUND_RB) + { + newBgTypeId = sBattlegroundMgr->RandomSystem.GetCurrentRandomBg(); + Battleground* specificTemplate = sBattlegroundMgr->GetBattlegroundTemplate(newBgTypeId); + if (!specificTemplate) + return; + PvPDifficultyEntry const* specificBracket = GetBattlegroundBracketByLevel(specificTemplate->GetMapId(), sBattlegroundMgr->randomBgDifficultyEntry.minLevel); + if (!specificBracket) + return; + minLvl = specificBracket->minLevel; + maxLvl = specificBracket->maxLevel; + + sBattlegroundMgr->RandomSystem.BattlegroundCreated(newBgTypeId); + } // create new battleground Battleground* bg = sBattlegroundMgr->CreateNewBattleground(newBgTypeId, minLvl, maxLvl, m_arenaType, false); @@ -783,158 +783,158 @@ void BattlegroundQueue::BattlegroundQueueUpdate(BattlegroundBracketId bracket_id bg->StartBattleground(); } } - // check if can start new rated arenas (can create many in single queue update) + // check if can start new rated arenas (can create many in single queue update) else if (bg_template->isArena()) { - // pussywizard: everything inside this section is mine, do NOT destroy! - - const uint32 currMSTime = World::GetGameTimeMS(); - const uint32 discardTime = sBattlegroundMgr->GetRatingDiscardTimer(); - const uint32 maxDefaultRatingDifference = (MaxPlayersPerTeam > 2 ? 300 : 200); - const uint32 maxCountedMMR = 2500; - - // we need to find 2 teams which will play next game - GroupsQueueType::iterator itr_teams[BG_TEAMS_COUNT]; - - bool increaseItr = true; - bool reverse1 = urand(0,1) ? true : false; - for (uint8 ii = BG_QUEUE_PREMADE_ALLIANCE; ii <= BG_QUEUE_PREMADE_HORDE; ii++) - { - uint8 i = reverse1 ? (BG_QUEUE_PREMADE_HORDE-ii) : ii; - for (GroupsQueueType::iterator itr = m_QueuedGroups[bracket_id][i].begin(); itr != m_QueuedGroups[bracket_id][i].end(); (increaseItr ? ++itr : itr)) - { - increaseItr = true; - - // if arenaRatedTeamId is set - look for oponents only for one team, if not - pair every possible team - if (arenaRatedTeamId != 0 && arenaRatedTeamId != (*itr)->ArenaTeamId) - continue; - if ((*itr)->IsInvitedToBGInstanceGUID) - continue; - - uint32 MMR1 = std::min((*itr)->ArenaMatchmakerRating, maxCountedMMR); - - GroupsQueueType::iterator oponentItr; - uint8 oponentQueue = BG_QUEUE_GROUP_TYPES_COUNT; - uint32 minOponentMMRDiff = 0xffffffff; - uint8 oponentValid = 0; - - bool reverse2 = urand(0,1) ? true : false; - for (uint8 jj = BG_QUEUE_PREMADE_ALLIANCE; jj <= BG_QUEUE_PREMADE_HORDE; jj++) - { - uint8 j = reverse2 ? (BG_QUEUE_PREMADE_HORDE-jj) : jj; - bool brk = false; - for (GroupsQueueType::iterator itr2 = m_QueuedGroups[bracket_id][j].begin(); itr2 != m_QueuedGroups[bracket_id][j].end(); ++itr2) - { - if ((*itr)->ArenaTeamId == (*itr2)->ArenaTeamId) - continue; - if ((*itr2)->IsInvitedToBGInstanceGUID) - continue; - uint32 MMR2 = std::min((*itr2)->ArenaMatchmakerRating, maxCountedMMR); - uint32 MMRDiff = (MMR2>=MMR1 ? MMR2-MMR1 : MMR1-MMR2); - - uint32 maxAllowedDiff = maxDefaultRatingDifference; - uint32 shorterWaitTime, longerWaitTime; - if (currMSTime-(*itr)->JoinTime <= currMSTime-(*itr2)->JoinTime) - { - shorterWaitTime = currMSTime-(*itr)->JoinTime; - longerWaitTime = currMSTime-(*itr2)->JoinTime; - } - else - { - shorterWaitTime = currMSTime-(*itr2)->JoinTime; - longerWaitTime = currMSTime-(*itr)->JoinTime; - } - if (longerWaitTime >= discardTime) - maxAllowedDiff += 150; - maxAllowedDiff += shorterWaitTime/600; // increased by 100 for each minute - - // now check if this team is more appropriate than previous ones: - - if (currMSTime-(*itr)->JoinTime >= 20*MINUTE*IN_MILLISECONDS && (oponentValid < 3 || MMRDiff < minOponentMMRDiff)) // after 20 minutes of waiting, pair with closest mmr, regardless the difference - { - oponentValid = 3; - minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; - } - else if (MMR1 >= 2000 && MMR2 >= 2000 && longerWaitTime >= 2*discardTime && (oponentValid < 2 || MMRDiff < minOponentMMRDiff)) // after 6 minutes of waiting, pair any 2000+ vs 2000+ - { - oponentValid = 2; - minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; - } - else if (oponentValid < 2 && MMRDiff < minOponentMMRDiff) - { - if (!oponentValid) - { - minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; - if (MMRDiff <= maxAllowedDiff) - oponentValid = 1; - } - if ((MMR1 < 1800 || MMR2 < 1800) && MaxPlayersPerTeam == 2 && MMRDiff <= maxDefaultRatingDifference) // in 2v2 below 1800 mmr - priority for default allowed difference - { - minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; - brk = true; - break; - } - } - } - if (brk) - break; - } - - if (oponentQueue != BG_QUEUE_GROUP_TYPES_COUNT) - { - if (oponentValid) - { - itr_teams[i] = itr; - itr_teams[i == 0 ? 1 : 0] = oponentItr; - - { - GroupQueueInfo* aTeam = *itr_teams[TEAM_ALLIANCE]; - GroupQueueInfo* hTeam = *itr_teams[TEAM_HORDE]; - Battleground* arena = sBattlegroundMgr->CreateNewBattleground(m_bgTypeId, bracketEntry->minLevel, bracketEntry->maxLevel, m_arenaType, true); - if (!arena) - return; - - aTeam->OpponentsTeamRating = hTeam->ArenaTeamRating; - hTeam->OpponentsTeamRating = aTeam->ArenaTeamRating; - aTeam->OpponentsMatchmakerRating = hTeam->ArenaMatchmakerRating; - hTeam->OpponentsMatchmakerRating = aTeam->ArenaMatchmakerRating; - - // now we must move team if we changed its faction to another faction queue, because then we will spam log by errors in Queue::RemovePlayer - if (aTeam->teamId != TEAM_ALLIANCE) - { - aTeam->_groupType = BG_QUEUE_PREMADE_ALLIANCE; - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].push_front(aTeam); - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].erase(itr_teams[TEAM_ALLIANCE]); - increaseItr = false; - itr = m_QueuedGroups[bracket_id][i].begin(); - } - if (hTeam->teamId != TEAM_HORDE) - { - hTeam->_groupType = BG_QUEUE_PREMADE_HORDE; - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].push_front(hTeam); - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].erase(itr_teams[TEAM_HORDE]); - increaseItr = false; - itr = m_QueuedGroups[bracket_id][i].begin(); - } - - arena->SetArenaMatchmakerRating(TEAM_ALLIANCE, aTeam->ArenaMatchmakerRating); - arena->SetArenaMatchmakerRating(TEAM_HORDE, hTeam->ArenaMatchmakerRating); - BattlegroundMgr::InviteGroupToBG(aTeam, arena, TEAM_ALLIANCE); - BattlegroundMgr::InviteGroupToBG(hTeam, arena, TEAM_HORDE); - - arena->StartBattleground(); - } - - if (arenaRatedTeamId) - return; - else - continue; - } - else if (arenaRatedTeamId) - return; - } - } - } + // pussywizard: everything inside this section is mine, do NOT destroy! + + const uint32 currMSTime = World::GetGameTimeMS(); + const uint32 discardTime = sBattlegroundMgr->GetRatingDiscardTimer(); + const uint32 maxDefaultRatingDifference = (MaxPlayersPerTeam > 2 ? 300 : 200); + const uint32 maxCountedMMR = 2500; + + // we need to find 2 teams which will play next game + GroupsQueueType::iterator itr_teams[BG_TEAMS_COUNT]; + + bool increaseItr = true; + bool reverse1 = urand(0,1) ? true : false; + for (uint8 ii = BG_QUEUE_PREMADE_ALLIANCE; ii <= BG_QUEUE_PREMADE_HORDE; ii++) + { + uint8 i = reverse1 ? (BG_QUEUE_PREMADE_HORDE-ii) : ii; + for (GroupsQueueType::iterator itr = m_QueuedGroups[bracket_id][i].begin(); itr != m_QueuedGroups[bracket_id][i].end(); (increaseItr ? ++itr : itr)) + { + increaseItr = true; + + // if arenaRatedTeamId is set - look for oponents only for one team, if not - pair every possible team + if (arenaRatedTeamId != 0 && arenaRatedTeamId != (*itr)->ArenaTeamId) + continue; + if ((*itr)->IsInvitedToBGInstanceGUID) + continue; + + uint32 MMR1 = std::min((*itr)->ArenaMatchmakerRating, maxCountedMMR); + + GroupsQueueType::iterator oponentItr; + uint8 oponentQueue = BG_QUEUE_GROUP_TYPES_COUNT; + uint32 minOponentMMRDiff = 0xffffffff; + uint8 oponentValid = 0; + + bool reverse2 = urand(0,1) ? true : false; + for (uint8 jj = BG_QUEUE_PREMADE_ALLIANCE; jj <= BG_QUEUE_PREMADE_HORDE; jj++) + { + uint8 j = reverse2 ? (BG_QUEUE_PREMADE_HORDE-jj) : jj; + bool brk = false; + for (GroupsQueueType::iterator itr2 = m_QueuedGroups[bracket_id][j].begin(); itr2 != m_QueuedGroups[bracket_id][j].end(); ++itr2) + { + if ((*itr)->ArenaTeamId == (*itr2)->ArenaTeamId) + continue; + if ((*itr2)->IsInvitedToBGInstanceGUID) + continue; + uint32 MMR2 = std::min((*itr2)->ArenaMatchmakerRating, maxCountedMMR); + uint32 MMRDiff = (MMR2>=MMR1 ? MMR2-MMR1 : MMR1-MMR2); + + uint32 maxAllowedDiff = maxDefaultRatingDifference; + uint32 shorterWaitTime, longerWaitTime; + if (currMSTime-(*itr)->JoinTime <= currMSTime-(*itr2)->JoinTime) + { + shorterWaitTime = currMSTime-(*itr)->JoinTime; + longerWaitTime = currMSTime-(*itr2)->JoinTime; + } + else + { + shorterWaitTime = currMSTime-(*itr2)->JoinTime; + longerWaitTime = currMSTime-(*itr)->JoinTime; + } + if (longerWaitTime >= discardTime) + maxAllowedDiff += 150; + maxAllowedDiff += shorterWaitTime/600; // increased by 100 for each minute + + // now check if this team is more appropriate than previous ones: + + if (currMSTime-(*itr)->JoinTime >= 20*MINUTE*IN_MILLISECONDS && (oponentValid < 3 || MMRDiff < minOponentMMRDiff)) // after 20 minutes of waiting, pair with closest mmr, regardless the difference + { + oponentValid = 3; + minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; + } + else if (MMR1 >= 2000 && MMR2 >= 2000 && longerWaitTime >= 2*discardTime && (oponentValid < 2 || MMRDiff < minOponentMMRDiff)) // after 6 minutes of waiting, pair any 2000+ vs 2000+ + { + oponentValid = 2; + minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; + } + else if (oponentValid < 2 && MMRDiff < minOponentMMRDiff) + { + if (!oponentValid) + { + minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; + if (MMRDiff <= maxAllowedDiff) + oponentValid = 1; + } + if ((MMR1 < 1800 || MMR2 < 1800) && MaxPlayersPerTeam == 2 && MMRDiff <= maxDefaultRatingDifference) // in 2v2 below 1800 mmr - priority for default allowed difference + { + minOponentMMRDiff = MMRDiff; oponentItr = itr2; oponentQueue = j; + brk = true; + break; + } + } + } + if (brk) + break; + } + + if (oponentQueue != BG_QUEUE_GROUP_TYPES_COUNT) + { + if (oponentValid) + { + itr_teams[i] = itr; + itr_teams[i == 0 ? 1 : 0] = oponentItr; + + { + GroupQueueInfo* aTeam = *itr_teams[TEAM_ALLIANCE]; + GroupQueueInfo* hTeam = *itr_teams[TEAM_HORDE]; + Battleground* arena = sBattlegroundMgr->CreateNewBattleground(m_bgTypeId, bracketEntry->minLevel, bracketEntry->maxLevel, m_arenaType, true); + if (!arena) + return; + + aTeam->OpponentsTeamRating = hTeam->ArenaTeamRating; + hTeam->OpponentsTeamRating = aTeam->ArenaTeamRating; + aTeam->OpponentsMatchmakerRating = hTeam->ArenaMatchmakerRating; + hTeam->OpponentsMatchmakerRating = aTeam->ArenaMatchmakerRating; + + // now we must move team if we changed its faction to another faction queue, because then we will spam log by errors in Queue::RemovePlayer + if (aTeam->teamId != TEAM_ALLIANCE) + { + aTeam->_groupType = BG_QUEUE_PREMADE_ALLIANCE; + m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].push_front(aTeam); + m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].erase(itr_teams[TEAM_ALLIANCE]); + increaseItr = false; + itr = m_QueuedGroups[bracket_id][i].begin(); + } + if (hTeam->teamId != TEAM_HORDE) + { + hTeam->_groupType = BG_QUEUE_PREMADE_HORDE; + m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].push_front(hTeam); + m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].erase(itr_teams[TEAM_HORDE]); + increaseItr = false; + itr = m_QueuedGroups[bracket_id][i].begin(); + } + + arena->SetArenaMatchmakerRating(TEAM_ALLIANCE, aTeam->ArenaMatchmakerRating); + arena->SetArenaMatchmakerRating(TEAM_HORDE, hTeam->ArenaMatchmakerRating); + BattlegroundMgr::InviteGroupToBG(aTeam, arena, TEAM_ALLIANCE); + BattlegroundMgr::InviteGroupToBG(hTeam, arena, TEAM_HORDE); + + arena->StartBattleground(); + } + + if (arenaRatedTeamId) + return; + else + continue; + } + else if (arenaRatedTeamId) + return; + } + } + } } } @@ -956,10 +956,10 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) if (!bg) return true; - // check if still in queue for this battleground - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(m_BgTypeId, m_ArenaType); + // check if still in queue for this battleground + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(m_BgTypeId, m_ArenaType); uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); - if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) + if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) { // confirm the player is invited to this instance id (he didn't requeue in the meanwhile) BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); @@ -984,7 +984,7 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { Player* player = ObjectAccessor::FindPlayerInOrOutOfWorld(m_PlayerGuid); - // player logged off, so he is no longer in queue + // player logged off, so he is no longer in queue if (!player) return true; @@ -992,7 +992,7 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) // battleground can be already deleted, bg may be NULL! - // check if still in queue for this battleground + // check if still in queue for this battleground uint32 queueSlot = player->GetBattlegroundQueueIndex(m_BgQueueTypeId); if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue { |