77 GroupsQueueType::iterator groupToKick = SelectedGroups.begin();
78 for (GroupsQueueType::iterator itr = groupToKick; itr != SelectedGroups.end(); ++itr)
80 if (abs((
int32)((*itr)->Players.size() - size)) <= 1)
85 else if (!found && (*itr)->Players.size() >= (*groupToKick)->Players.size())
93 SelectedGroups.erase(groupToKick);
94 PlayerCount -= ginfo->
Players.size();
96 if (ginfo->
Players.size() <= size + 1)
111 SelectedGroups.push_back(ginfo);
113 PlayerCount += ginfo->
Players.size();
116 if (PlayerCount < desiredCount)
146 if (!isRated && !isPremade)
167 Player* member = itr->GetSource();
194 uint32 MinPlayers = bg->GetMinPlayersPerTeam();
199 GroupsQueueType::const_iterator itr;
201 if (!(*itr)->IsInvitedToBGInstanceGUID)
202 qAlliance += (*itr)->Players.size();
204 if (!(*itr)->IsInvitedToBGInstanceGUID)
205 qHorde += (*itr)->Players.size();
211 qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (
uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (
uint32)0);
217 qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (
uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (
uint32)0);
247 m_WaitTimes[team_index][(*lastPlayerAddedPointer)] = timeInQueue;
251 (*lastPlayerAddedPointer)++;
279 int32 bracket_id = -1;
280 QueuedPlayersMap::iterator itr;
287 std::string playerName =
"Unknown";
289 playerName = player->GetName();
290 TC_LOG_DEBUG(
"bg.battleground",
"BattlegroundQueue: couldn't find player {} ({})", playerName, guid.
ToString());
295 GroupsQueueType::iterator group_itr;
320 if (bracket_id == -1)
322 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue: ERROR Cannot find groupinfo for {}", guid.
ToString());
333 std::map<ObjectGuid, PlayerQueueInfo*>::iterator pitr = group->
Players.find(guid);
334 if (pitr != group->
Players.end())
340 bg->DecreaseInvitedCount(group->
Team);
383 plr2->RemoveBattlegroundQueueId(
m_queueId);
388 plr2->SendDirectMessage(battlefieldStatus.
Write());
400 && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == bgInstanceGuid
401 && qItr->second.GroupInfo->RemoveInviteTime == removeTime);
409 *ginfo = *(qItr->second.GroupInfo);
439 for (std::map<ObjectGuid, PlayerQueueInfo*>::iterator itr = ginfo->
Players.begin(); itr != ginfo->
Players.end(); ++itr)
467 TC_LOG_DEBUG(
"bg.battleground",
"Battleground: invited player {} {} to BG instance {} queueindex {} bgtype {}",
496 if (hordeFree == 1 && aliFree == 1)
500 int32 hordeExtra = hordeCount - aliCount;
501 int32 aliExtra = aliCount - hordeCount;
503 hordeExtra = std::max(hordeExtra, 0);
504 aliExtra = std::max(aliExtra, 0);
506 if (aliCount != hordeCount)
509 hordeFree -= hordeExtra;
511 aliFree = std::max(aliFree, 0);
512 hordeFree = std::max(hordeFree, 0);
550 if (diffAli < diffHorde)
561 if (aliFree <= diffHorde + 1)
576 if (hordeFree <= diffAli + 1)
597 GroupsQueueType::const_iterator ali_group, horde_group;
599 if (!(*ali_group)->IsInvitedToBGInstanceGUID)
602 if (!(*horde_group)->IsInvitedToBGInstanceGUID)
611 GroupsQueueType::const_iterator itr;
635 if (!(*itr)->IsInvitedToBGInstanceGUID && ((*itr)->JoinTime < time_before || (*itr)->Players.size() < MinPlayersPerTeam))
656 if (!(*(itr_team[i]))->IsInvitedToBGInstanceGUID)
675 if (!(*(itr_team[j]))->IsInvitedToBGInstanceGUID)
711 if (ginfo == *itr_team)
715 GroupsQueueType::iterator itr_team2 = itr_team;
721 if (!(*itr_team2)->IsInvitedToBGInstanceGUID && !
m_SelectionPools[otherTeam].
AddGroup(*itr_team2, minPlayersPerTeam))
731 (*itr)->Team = otherTeamId;
735 GroupsQueueType::iterator itr2 = itr_team;
775 for (BGFreeSlotQueueContainer::iterator itr = bgQueues.begin(); itr != bgQueues.end();)
806 TC_LOG_ERROR(
"bg.battleground",
"Battleground: Update: bg template not found for {}", bgTypeId);
813 TC_LOG_ERROR(
"bg.battleground",
"Battleground: Update: bg bracket entry not found for map {} bracket id {}", bg_template->
GetMapId(), bracket_id);
823 MaxPlayersPerTeam = arenaType;
827 MinPlayersPerTeam = 1;
840 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue::Update - Cannot create battleground: {}", bgTypeId);
866 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue::Update - Cannot create battleground: {}", bgTypeId);
878 else if (bg_template->
isArena())
897 if (front1 && front2)
902 else if (!front1 && !front2)
931 if (!(*itr2)->IsInvitedToBGInstanceGUID
932 && (((*itr2)->ArenaMatchmakerRating >= arenaMinRating && (*itr2)->ArenaMatchmakerRating <= arenaMaxRating)
933 || (
int32)(*itr2)->JoinTime < discardTime))
935 itr_teams[found++] = itr2;
947 for (GroupsQueueType::iterator itr3 = itr_teams[0]; itr3 !=
m_QueuedGroups[team].end(); ++itr3)
949 if (!(*itr3)->IsInvitedToBGInstanceGUID
950 && (((*itr3)->ArenaMatchmakerRating >= arenaMinRating && (*itr3)->ArenaMatchmakerRating <= arenaMaxRating) || (
int32)(*itr3)->JoinTime < discardTime)
951 && ((*itr_teams[0])->ArenaTeamId != (*itr3)->PreviousOpponentsTeamId || ((
int32)(*itr3)->JoinTime < discardOpponentsTime))
952 && (*itr_teams[0])->ArenaTeamId != (*itr3)->ArenaTeamId)
954 itr_teams[found++] = itr3;
968 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue::Update couldn't create arena instance for rated arena match!");
996 TC_LOG_DEBUG(
"bg.battleground",
"Starting rated arena match!");
1023 if (bgQueue.
IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
1063 if (bgQueue.
IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
1075 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
@ BG_DESERTION_TYPE_NO_ENTER_BUTTON
@ CHAR_INS_DESERTER_TRACK
PvPDifficultyEntry const * GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id)
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
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__,...)
#define TC_LOG_ERROR(filterType__,...)
uint8 constexpr PVP_TEAMS_COUNT
#define PLAYER_MAX_BATTLEGROUND_QUEUES
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
static void BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation *battlefieldStatus, Battleground const *bg, uint32 queueSlot, uint32 timeout, BattlegroundQueueTypeId queueId)
static void BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone *battlefieldStatus, uint32 queueSlot)
GroupsQueueType SelectedGroups
bool KickGroup(uint32 size)
bool AddGroup(GroupQueueInfo *ginfo, uint32 desiredCount)
uint32 GetPlayerCount() const
void UpdateEvents(uint32 diff)
void BattlegroundQueueUpdate(uint32 diff, bool isRated=false, uint32 minRating=0)
uint32 GetAverageQueueWaitTime(GroupQueueInfo *ginfo) const
uint32 m_WaitTimes[PVP_TEAMS_COUNT][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME]
bool CheckSkirmishForSameFaction(uint32 minPlayersPerTeam)
bool InviteGroupToBG(GroupQueueInfo *ginfo, Battleground *bg, Team side)
QueuedPlayersMap m_QueuedPlayers
bool CheckNormalMatch(Battleground *bg_template, uint32 minPlayers, uint32 maxPlayers)
bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo *ginfo)
GroupsQueueType m_QueuedGroups[BG_QUEUE_GROUP_TYPES_COUNT]
uint32 m_WaitTimeLastPlayer[PVP_TEAMS_COUNT]
void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo *ginfo)
uint32 m_SumOfWaitTimes[PVP_TEAMS_COUNT]
BattlegroundQueue(BattlegroundQueueTypeId queueId)
void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
BattlegroundQueueTypeId m_queueId
SelectionPool m_SelectionPools[PVP_TEAMS_COUNT]
bool CheckPremadeMatch(uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam)
GroupQueueInfo * AddGroup(Player *leader, Group const *group, PvPDifficultyEntry const *bracketEntry, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId=0, uint32 OpponentsArenaTeamId=0)
bool IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime)
void FillPlayersToBG(Battleground *bg)
uint32 GetPlayersInQueue(TeamId id)
void IncreaseInvitedCount(uint32 team)
BattlegroundTypeId GetTypeID(bool GetRandom=false) const
uint32 GetMinPlayersPerTeam() const
uint32 GetMaxPlayersPerTeam() const
uint32 GetInstanceID() const
void SetArenaTeamIdForTeam(uint32 Team, uint32 ArenaTeamId)
void SetArenaMatchmakerRating(uint32 Team, uint32 MMR)
bool isBattleground() const
BattlegroundStatus GetStatus() const
bool HasFreeSlots() const
void RemoveFromBGFreeSlotQueue()
BattlegroundBracketId GetBracketId() const
uint32 GetFreeSlotsForTeam(uint32 Team) 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
GroupReference * GetFirstMember()
LowType GetCounter() const
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
void SendDirectMessage(WorldPacket const *data) const
WorldSession * GetSession() const
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
void SetInviteForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
void setUInt32(uint8 index, uint32 value)
void setUInt8(uint8 index, uint8 value)
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_ARENA_PREV_OPPONENTS_DISCARD_TIMER
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY
@ CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
uint16 BattlemasterListId
uint32 IsInvitedToBGInstanceGUID
std::map< ObjectGuid, PlayerQueueInfo * > Players
uint32 PreviousOpponentsTeamId
uint32 OpponentsMatchmakerRating
uint32 OpponentsTeamRating
uint32 ArenaMatchmakerRating
GroupQueueInfo * GroupInfo