84 GroupsQueueType::iterator groupToKick = SelectedGroups.begin();
85 for (GroupsQueueType::iterator itr = groupToKick; itr != SelectedGroups.end(); ++itr)
87 if (abs((
int32)((*itr)->Players.size() - size)) <= 1)
92 else if (!found && (*itr)->Players.size() >= (*groupToKick)->Players.size())
100 SelectedGroups.erase(groupToKick);
101 PlayerCount -= ginfo->
Players.size();
103 if (ginfo->
Players.size() <= size + 1)
118 SelectedGroups.push_back(ginfo);
120 PlayerCount += ginfo->
Players.size();
123 if (PlayerCount < desiredCount)
173 Player* member = itr.GetSource();
198 uint32 MinPlayers = bg->GetMinPlayersPerTeam();
203 GroupsQueueType::const_iterator itr;
205 if (!(*itr)->IsInvitedToBGInstanceGUID)
206 qAlliance += (*itr)->Players.size();
208 if (!(*itr)->IsInvitedToBGInstanceGUID)
209 qHorde += (*itr)->Players.size();
216 qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (
uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (
uint32)0);
222 qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (
uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (
uint32)0);
251 m_WaitTimes[team_index][bracket_id][(*lastPlayerAddedPointer)] = timeInQueue;
255 (*lastPlayerAddedPointer)++;
283 int32 bracket_id = -1;
284 QueuedPlayersMap::iterator itr;
291 std::string playerName =
"Unknown";
293 playerName = player->GetName();
294 TC_LOG_DEBUG(
"bg.battleground",
"BattlegroundQueue: couldn't find player {} ({})", playerName, guid.
ToString());
299 GroupsQueueType::iterator group_itr;
311 GroupsQueueType::iterator k =
m_QueuedGroups[bracket_id_tmp][j].begin();
316 bracket_id = bracket_id_tmp;
327 if (bracket_id == -1)
329 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue: ERROR Cannot find groupinfo for {}", guid.
ToString());
340 std::map<ObjectGuid, PlayerQueueInfo*>::iterator pitr = group->
Players.find(guid);
341 if (pitr != group->
Players.end())
347 bg->DecreaseInvitedCount(group->
Team);
390 plr2->RemoveBattlegroundQueueId(
m_queueId);
395 plr2->SendDirectMessage(battlefieldStatus.
Write());
407 && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == bgInstanceGuid
408 && qItr->second.GroupInfo->RemoveInviteTime == removeTime);
416 *ginfo = *(qItr->second.GroupInfo);
443 for (std::map<ObjectGuid, PlayerQueueInfo*>::iterator itr = ginfo->
Players.begin(); itr != ginfo->
Players.end(); ++itr)
469 TC_LOG_DEBUG(
"bg.battleground",
"Battleground: invited player {} {} to BG instance {} queueindex {} bgtype {}",
498 if (hordeFree == 1 && aliFree == 1)
502 int32 hordeExtra = hordeCount - aliCount;
503 int32 aliExtra = aliCount - hordeCount;
505 hordeExtra = std::max(hordeExtra, 0);
506 aliExtra = std::max(aliExtra, 0);
508 if (aliCount != hordeCount)
511 hordeFree -= hordeExtra;
513 aliFree = std::max(aliFree, 0);
514 hordeFree = std::max(hordeFree, 0);
552 if (diffAli < diffHorde)
563 if (aliFree <= diffHorde + 1)
578 if (hordeFree <= diffAli + 1)
599 GroupsQueueType::const_iterator ali_group, horde_group;
601 if (!(*ali_group)->IsInvitedToBGInstanceGUID)
604 if (!(*horde_group)->IsInvitedToBGInstanceGUID)
613 GroupsQueueType::const_iterator itr;
637 if (!(*itr)->IsInvitedToBGInstanceGUID && ((*itr)->JoinTime < time_before || (*itr)->Players.size() < MinPlayersPerTeam))
658 if (!(*(itr_team[i]))->IsInvitedToBGInstanceGUID)
677 if (!(*(itr_team[j]))->IsInvitedToBGInstanceGUID)
713 if (ginfo == *itr_team)
717 GroupsQueueType::iterator itr_team2 = itr_team;
723 if (!(*itr_team2)->IsInvitedToBGInstanceGUID && !
m_SelectionPools[otherTeam].
AddGroup(*itr_team2, minPlayersPerTeam))
733 (*itr)->Team = otherTeamId;
737 GroupsQueueType::iterator itr2 = itr_team;
784 for (BGFreeSlotQueueContainer::iterator itr = bgQueues.begin(); itr != bgQueues.end();)
823 MinPlayersPerTeam = 1;
874 else if (bg_template->
IsArena())
893 if (front1 && front2)
898 else if (!front1 && !front2)
920 GroupsQueueType::iterator itr2 =
m_QueuedGroups[bracket_id][i].begin();
924 if (!(*itr2)->IsInvitedToBGInstanceGUID
925 && (((*itr2)->ArenaMatchmakerRating >= arenaMinRating && (*itr2)->ArenaMatchmakerRating <= arenaMaxRating)
926 || (
int32)(*itr2)->JoinTime < discardTime))
928 itr_teams[found++] = itr2;
940 for (GroupsQueueType::iterator itr3 = itr_teams[0]; itr3 !=
m_QueuedGroups[bracket_id][team].end(); ++itr3)
944 if (itr3 == itr_teams[0])
947 if (!(*itr3)->IsInvitedToBGInstanceGUID
948 && (((*itr3)->ArenaMatchmakerRating >= arenaMinRating && (*itr3)->ArenaMatchmakerRating <= arenaMaxRating)
949 || (
int32)(*itr3)->JoinTime < discardTime))
951 itr_teams[found++] = itr3;
965 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue::Update couldn't create arena instance for rated arena match!");
993 TC_LOG_DEBUG(
"bg.battleground",
"Starting rated arena match!");
1020 if (bgQueue.
IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
1060 if (bgQueue.
IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
1062 TC_LOG_DEBUG(
"bg.battleground",
"Battleground: removing player {} from bg queue for instance {} because of not pressing enter battle in time.", player->
GetGUID().
ToString(), m_BgInstanceGUID);
@ BG_QUEUE_INVITATION_TYPE_NO_BALANCE
@ BG_QUEUE_INVITATION_TYPE_EVEN
@ BG_QUEUE_NORMAL_ALLIANCE
@ BG_QUEUE_PREMADE_ALLIANCE
#define BG_QUEUE_GROUP_TYPES_COUNT
#define COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME
std::list< Battleground * > BGFreeSlotQueueContainer
@ INVITE_ACCEPT_WAIT_TIME
@ MAX_BATTLEGROUND_BRACKETS
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
@ LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT
@ LANG_BG_QUEUE_ANNOUNCE_SELF
@ LANG_BG_QUEUE_ANNOUNCE_WORLD
@ LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
static constexpr uint8 PLAYER_MAX_BATTLEGROUND_QUEUES
uint8 constexpr PVP_TEAMS_COUNT
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
std::string const & GetName() const
virtual void Abort(uint64 e_time) override
virtual bool Execute(uint64 e_time, uint32 p_time) override
virtual bool Execute(uint64 e_time, uint32 p_time) override
virtual void Abort(uint64 e_time) override
ObjectGuid const & GetGUID() const
static void BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation *battlefieldStatus, Battleground const *bg, Player const *player, uint32 ticketId, uint32 joinTime, uint32 timeout, BattlegroundQueueTypeId queueId)
static void BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone *battlefieldStatus, Player const *player, uint32 ticketId, uint32 joinTime)
GroupsQueueType SelectedGroups
bool KickGroup(uint32 size)
bool AddGroup(GroupQueueInfo *ginfo, uint32 desiredCount)
uint32 GetPlayerCount() const
void FillPlayersToBG(Battleground *bg, BattlegroundBracketId bracket_id)
void BattlegroundQueueUpdate(uint32 diff, BattlegroundBracketId bracket_id, uint32 minRating=0)
void UpdateEvents(uint32 diff)
GroupQueueInfo * AddGroup(Player const *leader, Group const *group, Team team, PVPDifficultyEntry const *bracketEntry, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating)
void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo *ginfo, BattlegroundBracketId bracket_id)
bool InviteGroupToBG(GroupQueueInfo *ginfo, Battleground *bg, Team side)
uint32 GetAverageQueueWaitTime(GroupQueueInfo *ginfo, BattlegroundBracketId bracket_id) const
QueuedPlayersMap m_QueuedPlayers
bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam)
bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo *ginfo)
uint32 m_WaitTimes[PVP_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME]
BattlegroundQueue(BattlegroundQueueTypeId queueId)
void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
BattlegroundQueueTypeId m_queueId
bool CheckNormalMatch(BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers)
SelectionPool m_SelectionPools[PVP_TEAMS_COUNT]
uint32 m_WaitTimeLastPlayer[PVP_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS]
bool IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime)
GroupsQueueType m_QueuedGroups[MAX_BATTLEGROUND_BRACKETS][BG_QUEUE_GROUP_TYPES_COUNT]
uint32 GetPlayersInQueue(TeamId id)
bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam)
uint32 m_SumOfWaitTimes[PVP_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS]
void IncreaseInvitedCount(Team team)
uint32 GetInstanceID() const
void SetArenaMatchmakerRating(Team team, uint32 MMR)
bool isBattleground() const
BattlegroundStatus GetStatus() const
bool HasFreeSlots() const
void RemoveFromBGFreeSlotQueue()
uint32 GetFreeSlotsForTeam(Team team) const
BattlegroundBracketId GetBracketId() const
virtual LocaleConstant GetSessionDbcLocale() const
void PSendSysMessage(char const *fmt, Args &&... args)
void KillAllEvents(bool force)
void Update(uint32 p_time)
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
GroupRefManager & GetMembers()
std::string ToString() const
void SendDirectMessage(WorldPacket const *data) const
uint32 GetBattlegroundQueueJoinTime(BattlegroundQueueTypeId bgQueueTypeId) const
WorldSession * GetSession() const
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
void SetInviteForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
std::string const & GetName() const
WorldPacket const * Write() override
WorldPacket const * Write() override
@ CONFIG_BATTLEGROUND_INVITATION_TYPE
@ CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY
@ CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
uint16 BattlemasterListId
uint16 GetMaxPlayersPerTeam() const
std::vector< int32 > MapIDs
uint16 GetMinPlayersPerTeam() const
uint32 IsInvitedToBGInstanceGUID
std::map< ObjectGuid, PlayerQueueInfo * > Players
uint32 OpponentsMatchmakerRating
uint32 OpponentsTeamRating
uint32 ArenaMatchmakerRating
BattlegroundBracketId GetBracketId() const
GroupQueueInfo * GroupInfo