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();
118 SelectedGroups.push_back(ginfo);
120 PlayerCount += ginfo->
Players.size();
123 if (PlayerCount < desiredCount)
174 Player* member = itr->GetSource();
201 uint32 MinPlayers = bg->GetMinPlayersPerTeam();
206 GroupsQueueType::const_iterator itr;
208 if (!(*itr)->IsInvitedToBGInstanceGUID)
209 qAlliance += (*itr)->Players.size();
211 if (!(*itr)->IsInvitedToBGInstanceGUID)
212 qHorde += (*itr)->Players.size();
219 qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (
uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (
uint32)0);
225 qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (
uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (
uint32)0);
254 m_WaitTimes[team_index][bracket_id][(*lastPlayerAddedPointer)] = timeInQueue;
258 (*lastPlayerAddedPointer)++;
286 int32 bracket_id = -1;
287 QueuedPlayersMap::iterator itr;
294 std::string playerName =
"Unknown";
296 playerName = player->GetName();
297 TC_LOG_DEBUG(
"bg.battleground",
"BattlegroundQueue: couldn't find player {} ({})", playerName, guid.
ToString());
302 GroupsQueueType::iterator group_itr;
314 GroupsQueueType::iterator k =
m_QueuedGroups[bracket_id_tmp][j].begin();
319 bracket_id = bracket_id_tmp;
330 if (bracket_id == -1)
332 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue: ERROR Cannot find groupinfo for {}", guid.
ToString());
343 std::map<ObjectGuid, PlayerQueueInfo*>::iterator pitr = group->
Players.find(guid);
344 if (pitr != group->
Players.end())
350 bg->DecreaseInvitedCount(group->
Team);
393 plr2->RemoveBattlegroundQueueId(
m_queueId);
397 sBattlegroundMgr->BuildBattlegroundStatusNone(&battlefieldStatus, plr2, queueSlot, plr2->GetBattlegroundQueueJoinTime(
m_queueId));
398 plr2->SendDirectMessage(battlefieldStatus.
Write());
410 && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == bgInstanceGuid
411 && qItr->second.GroupInfo->RemoveInviteTime == removeTime);
419 *ginfo = *(qItr->second.GroupInfo);
450 for (std::map<ObjectGuid, PlayerQueueInfo*>::iterator itr = ginfo->
Players.begin(); itr != ginfo->
Players.end(); ++itr)
476 TC_LOG_DEBUG(
"bg.battleground",
"Battleground: invited player {} {} to BG instance {} queueindex {} bgtype {}",
505 if (hordeFree == 1 && aliFree == 1)
509 int32 hordeExtra = hordeCount - aliCount;
510 int32 aliExtra = aliCount - hordeCount;
512 hordeExtra = std::max(hordeExtra, 0);
513 aliExtra = std::max(aliExtra, 0);
515 if (aliCount != hordeCount)
518 hordeFree -= hordeExtra;
520 aliFree = std::max(aliFree, 0);
521 hordeFree = std::max(hordeFree, 0);
559 if (diffAli < diffHorde)
570 if (aliFree <= diffHorde + 1)
585 if (hordeFree <= diffAli + 1)
606 GroupsQueueType::const_iterator ali_group, horde_group;
608 if (!(*ali_group)->IsInvitedToBGInstanceGUID)
611 if (!(*horde_group)->IsInvitedToBGInstanceGUID)
620 GroupsQueueType::const_iterator itr;
644 if (!(*itr)->IsInvitedToBGInstanceGUID && ((*itr)->JoinTime < time_before || (*itr)->Players.size() < MinPlayersPerTeam))
665 if (!(*(itr_team[i]))->IsInvitedToBGInstanceGUID)
684 if (!(*(itr_team[j]))->IsInvitedToBGInstanceGUID)
720 if (ginfo == *itr_team)
724 GroupsQueueType::iterator itr_team2 = itr_team;
730 if (!(*itr_team2)->IsInvitedToBGInstanceGUID && !
m_SelectionPools[otherTeam].
AddGroup(*itr_team2, minPlayersPerTeam))
740 (*itr)->Team = otherTeamId;
744 GroupsQueueType::iterator itr2 = itr_team;
794 for (BGFreeSlotQueueContainer::iterator itr = bgQueues.begin(); itr != bgQueues.end();)
833 MinPlayersPerTeam = 1;
884 else if (bg_template->
IsArena())
903 if (front1 && front2)
908 else if (!front1 && !front2)
930 GroupsQueueType::iterator itr2 =
m_QueuedGroups[bracket_id][i].begin();
934 if (!(*itr2)->IsInvitedToBGInstanceGUID
935 && (((*itr2)->ArenaMatchmakerRating >= arenaMinRating && (*itr2)->ArenaMatchmakerRating <= arenaMaxRating)
936 || (
int32)(*itr2)->JoinTime < discardTime))
938 itr_teams[found++] = itr2;
950 for (GroupsQueueType::iterator itr3 = itr_teams[0]; itr3 !=
m_QueuedGroups[bracket_id][team].end(); ++itr3)
952 if (!(*itr3)->IsInvitedToBGInstanceGUID
953 && (((*itr3)->ArenaMatchmakerRating >= arenaMinRating && (*itr3)->ArenaMatchmakerRating <= arenaMaxRating)
954 || (
int32)(*itr3)->JoinTime < discardTime)
955 && (*itr_teams[0])->ArenaTeamId != (*itr3)->ArenaTeamId)
957 itr_teams[found++] = itr3;
971 TC_LOG_ERROR(
"bg.battleground",
"BattlegroundQueue::Update couldn't create arena instance for rated arena match!");
999 TC_LOG_DEBUG(
"bg.battleground",
"Starting rated arena match!");
1026 if (bgQueue.
IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
1066 if (bgQueue.
IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
1068 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__,...)
#define TC_LOG_ERROR(filterType__,...)
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
GroupsQueueType SelectedGroups
bool KickGroup(uint32 size)
bool AddGroup(GroupQueueInfo *ginfo, uint32 desiredCount)
uint32 GetPlayerCount() const
GroupQueueInfo * AddGroup(Player const *leader, Group const *group, Team team, PVPDifficultyEntry const *bracketEntry, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId=0)
void FillPlayersToBG(Battleground *bg, BattlegroundBracketId bracket_id)
void BattlegroundQueueUpdate(uint32 diff, BattlegroundBracketId bracket_id, uint32 minRating=0)
void UpdateEvents(uint32 diff)
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 SetArenaTeamIdForTeam(Team team, uint32 ArenaTeamId)
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(const char *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()
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
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 &)
constexpr std::size_t size()
uint16 BattlemasterListId
BattlemasterListEntry const * BattlemasterEntry
uint16 GetMaxPlayersPerTeam() const
uint16 GetMinPlayersPerTeam() const
std::array< int16, 16 > MapID
uint32 IsInvitedToBGInstanceGUID
std::map< ObjectGuid, PlayerQueueInfo * > Players
uint32 OpponentsMatchmakerRating
uint32 OpponentsTeamRating
uint32 ArenaMatchmakerRating
BattlegroundBracketId GetBracketId() const
GroupQueueInfo * GroupInfo