TrinityCore
BattlegroundQueue.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __BATTLEGROUNDQUEUE_H
19#define __BATTLEGROUNDQUEUE_H
20
21#include "Common.h"
22#include "DBCEnums.h"
23#include "Battleground.h"
24#include "EventProcessor.h"
25
26//this container can't be deque, because deque doesn't like removing the last element - if you remove it, it invalidates next iterator and crash appears
27typedef std::list<Battleground*> BGFreeSlotQueueContainer;
28
29#define COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME 10
30
31struct GroupQueueInfo; // type predefinition
32struct PlayerQueueInfo // stores information for players in queue
33{
34 uint32 LastOnlineTime; // for tracking and removing offline players from queue after 5 minutes
35 GroupQueueInfo* GroupInfo; // pointer to the associated groupqueueinfo
36};
37
38struct GroupQueueInfo // stores information about the group in queue (also used when joined as solo!)
39{
40 std::map<ObjectGuid, PlayerQueueInfo*> Players; // player queue info map
41 ::Team Team; // Player team (ALLIANCE/HORDE)
42 uint32 ArenaTeamId; // team id if rated match
43 uint32 JoinTime; // time when group was added
44 uint32 RemoveInviteTime; // time when we will remove invite for players in group
45 uint32 IsInvitedToBGInstanceGUID; // was invited to certain BG
46 uint32 ArenaTeamRating; // if rated match, inited to the rating of the team
47 uint32 ArenaMatchmakerRating; // if rated match, inited to the rating of the team
48 uint32 OpponentsTeamRating; // for rated arena matches
49 uint32 OpponentsMatchmakerRating; // for rated arena matches
50};
51
53{
58};
59#define BG_QUEUE_GROUP_TYPES_COUNT 4
60
62{
63 BG_QUEUE_INVITATION_TYPE_NO_BALANCE = 0, // no balance: N+M vs N players
64 BG_QUEUE_INVITATION_TYPE_BALANCED = 1, // teams balanced: N+1 vs N players
65 BG_QUEUE_INVITATION_TYPE_EVEN = 2 // teams even: N vs N players
66};
67
68class Battleground;
70{
71 public:
74
75 void BattlegroundQueueUpdate(uint32 diff, BattlegroundBracketId bracket_id, uint32 minRating = 0);
76 void UpdateEvents(uint32 diff);
77
78 void FillPlayersToBG(Battleground* bg, BattlegroundBracketId bracket_id);
79 bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
80 bool CheckNormalMatch(BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);
81 bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam);
82 GroupQueueInfo* AddGroup(Player const* leader, Group const* group, Team team, PVPDifficultyEntry const* bracketEntry, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0);
83 void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount);
84 bool IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime);
85 bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo* ginfo);
86 void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BattlegroundBracketId bracket_id);
87 uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BattlegroundBracketId bracket_id) const;
88
89 typedef std::map<ObjectGuid, PlayerQueueInfo> QueuedPlayersMap;
91
92 //do NOT use deque because deque.erase() invalidates ALL iterators
93 typedef std::list<GroupQueueInfo*> GroupsQueueType;
94
95 /*
96 This two dimensional array is used to store All queued groups
97 First dimension specifies the bgTypeId
98 Second dimension specifies the player's group types -
99 BG_QUEUE_PREMADE_ALLIANCE is used for premade alliance groups and alliance rated arena teams
100 BG_QUEUE_PREMADE_HORDE is used for premade horde groups and horde rated arena teams
101 BG_QUEUE_NORMAL_ALLIANCE is used for normal (or small) alliance groups or non-rated arena matches
102 BG_QUEUE_NORMAL_HORDE is used for normal (or small) horde groups or non-rated arena matches
103 */
105
106 // class to select and invite groups to bg
108 {
109 public:
110 SelectionPool(): PlayerCount(0) { }
111 void Init();
112 bool AddGroup(GroupQueueInfo* ginfo, uint32 desiredCount);
113 bool KickGroup(uint32 size);
114 uint32 GetPlayerCount() const {return PlayerCount;}
115 public:
117 private:
119 };
120
121 //one selection pool for horde, other one for alliance
123 uint32 GetPlayersInQueue(TeamId id);
124
125 BattlegroundQueueTypeId const GetQueueId() const { return m_queueId; }
126 private:
127
129
130 bool InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, Team side);
134
135 // Event handler
137};
138
139/*
140 This class is used to invite player to BG again, when minute lasts from his first invitation
141 it is capable to solve all possibilities
142*/
144{
145 public:
146 BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint32 removeTime, BattlegroundQueueTypeId queueId) :
147 m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_RemoveTime(removeTime), m_QueueId(queueId)
148 { }
150
151 virtual bool Execute(uint64 e_time, uint32 p_time) override;
152 virtual void Abort(uint64 e_time) override;
153 private:
159};
160
161/*
162 This class is used to remove player from BG queue after 1 minute 20 seconds from first invitation
163 We must store removeInvite time in case player left queue and joined and is invited again
164 We must store bgQueueTypeId, because battleground can be deleted already, when player entered it
165*/
167{
168 public:
169 BGQueueRemoveEvent(ObjectGuid pl_guid, uint32 bgInstanceGUID, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime)
170 : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_RemoveTime(removeTime), m_BgQueueTypeId(bgQueueTypeId)
171 { }
172
174
175 virtual bool Execute(uint64 e_time, uint32 p_time) override;
176 virtual void Abort(uint64 e_time) override;
177 private:
182};
183
184#endif
BattlegroundQueueInvitationType
@ BG_QUEUE_INVITATION_TYPE_NO_BALANCE
@ BG_QUEUE_INVITATION_TYPE_EVEN
@ BG_QUEUE_INVITATION_TYPE_BALANCED
BattlegroundQueueGroupTypes
@ BG_QUEUE_PREMADE_HORDE
@ BG_QUEUE_NORMAL_ALLIANCE
@ BG_QUEUE_PREMADE_ALLIANCE
@ BG_QUEUE_NORMAL_HORDE
#define BG_QUEUE_GROUP_TYPES_COUNT
#define COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME
std::list< Battleground * > BGFreeSlotQueueContainer
BattlegroundBracketId
Definition: DBCEnums.h:59
@ MAX_BATTLEGROUND_BRACKETS
Definition: DBCEnums.h:64
#define TC_GAME_API
Definition: Define.h:123
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
TeamId
uint8 constexpr PVP_TEAMS_COUNT
Team
BattlegroundTypeId
BattlegroundQueueTypeId m_QueueId
BattlegroundTypeId m_BgTypeId
BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint32 removeTime, BattlegroundQueueTypeId queueId)
BattlegroundQueueTypeId m_BgQueueTypeId
BGQueueRemoveEvent(ObjectGuid pl_guid, uint32 bgInstanceGUID, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime)
QueuedPlayersMap m_QueuedPlayers
BattlegroundQueueTypeId const GetQueueId() const
BattlegroundQueueTypeId m_queueId
std::list< GroupQueueInfo * > GroupsQueueType
std::map< ObjectGuid, PlayerQueueInfo > QueuedPlayersMap
EventProcessor m_events
Definition: Group.h:197
TC_COMMON_API void Init()
Definition: Locales.cpp:28
void Abort(char const *file, int line, char const *function)
Definition: Errors.cpp:124
constexpr std::size_t size()
Definition: UpdateField.h:796
uint32 IsInvitedToBGInstanceGUID
std::map< ObjectGuid, PlayerQueueInfo * > Players
uint32 OpponentsMatchmakerRating
uint32 OpponentsTeamRating
uint32 ArenaMatchmakerRating
GroupQueueInfo * GroupInfo