Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
BattlegroundQueue.h
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#ifndef SF_BATTLEGROUNDQUEUE_H
7#define SF_BATTLEGROUNDQUEUE_H
8
9#include "Battleground.h"
10#include "Common.h"
11#include "DBCEnums.h"
12#include "EventProcessor.h"
13
14#include <deque>
15
16//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
17typedef std::list<Battleground*> BGFreeSlotQueueContainer;
18
19#define COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME 10
20
21struct GroupQueueInfo; // type predefinition
22struct PlayerQueueInfo // stores information for players in queue
23{
24 uint32 LastOnlineTime; // for tracking and removing offline players from queue after 5 minutes
25 GroupQueueInfo* GroupInfo; // pointer to the associated groupqueueinfo
26};
27
28struct GroupQueueInfo // stores information about the group in queue (also used when joined as solo!)
29{
30 std::map<uint64, PlayerQueueInfo*> Players; // player queue info map
31 uint32 Team; // Player team (ALLIANCE/HORDE)
32 BattlegroundTypeId BgTypeId; // battleground type id
33 bool IsRated; // rated
34 uint8 ArenaType; // 2v2, 3v3, 5v5 or 0 when BG
36 uint32 JoinTime; // time when group was added
37 uint32 RemoveInviteTime; // time when we will remove invite for players in group
38 uint32 IsInvitedToBGInstanceGUID; // was invited to certain BG
39 uint32 ArenaTeamRating; // if rated match, inited to the rating of the team
40 uint32 ArenaMatchmakerRating; // if rated match, inited to the rating of the team
41 uint32 OpponentsTeamRating; // for rated arena matches
42 uint32 OpponentsMatchmakerRating; // for rated arena matches
43};
44
52#define BG_QUEUE_GROUP_TYPES_COUNT 4
53
54class Battleground;
56{
57public:
60
61 void BattlegroundQueueUpdate(uint32 diff, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType = 0, bool isRated = false, uint32 minRating = 0);
62 void UpdateEvents(uint32 diff);
63
65 bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
66 bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);
67 bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam);
68 GroupQueueInfo* AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating);
69 void RemovePlayer(uint64 guid, bool decreaseInvitedCount);
70 bool IsPlayerInvited(uint64 pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime);
74
75 typedef std::map<uint64, PlayerQueueInfo> QueuedPlayersMap;
77
78 //we need constant add to begin and constant remove / add from the end, therefore deque suits our problem well
79 typedef std::deque<GroupQueueInfo*> GroupsQueueType;
80
81 /*
82 This two dimensional array is used to store All queued groups
83 First dimension specifies the bgTypeId
84 Second dimension specifies the player's group types -
85 BG_QUEUE_PREMADE_ALLIANCE is used for premade alliance groups and alliance rated arena teams
86 BG_QUEUE_PREMADE_HORDE is used for premade horde groups and horde rated arena teams
87 BG_QUEUE_NORMAL_ALLIANCE is used for normal (or small) alliance groups or non-rated arena matches
88 BG_QUEUE_NORMAL_HORDE is used for normal (or small) horde groups or non-rated arena matches
89 */
91
92 // class to select and invite groups to bg
94 {
95 public:
97 void Init();
98 bool AddGroup(GroupQueueInfo* ginfo, uint32 desiredCount);
99 bool KickGroup(uint32 size);
101 public:
103 private:
105 };
106
107 //one selection pool for horde, other one for alliance
110
111private:
112 bool InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, uint32 side);
116
117 // Event handler
119};
120
121/*
122 This class is used to invite player to BG again, when minute lasts from his first invitation
123 it is capable to solve all possibilities
124*/
126{
127public:
128 BGQueueInviteEvent(uint64 pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime) :
129 m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_ArenaType(arenaType), m_RemoveTime(removeTime)
130 { }
132
133 virtual bool Execute(uint64 e_time, uint32 p_time);
134 virtual void Abort(uint64 e_time);
135private:
141};
142
143/*
144 This class is used to remove player from BG queue after 1 minute 20 seconds from first invitation
145 We must store removeInvite time in case player left queue and joined and is invited again
146 We must store bgQueueTypeId, because battleground can be deleted already, when player entered it
147*/
149{
150public:
151 BGQueueRemoveEvent(uint64 pl_guid, uint32 bgInstanceGUID, BattlegroundTypeId BgTypeId, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime)
152 : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_RemoveTime(removeTime), m_BgTypeId(BgTypeId), m_BgQueueTypeId(bgQueueTypeId)
153 { }
154
156
157 virtual bool Execute(uint64 e_time, uint32 p_time);
158 virtual void Abort(uint64 e_time);
159private:
165};
166
167#endif
ArenaType
#define BG_TEAMS_COUNT
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
#define MAX_BATTLEGROUND_BRACKETS
Definition DBCEnums.h:34
BattlegroundBracketId
Definition DBCEnums.h:28
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
BattlegroundQueueTypeId
TeamId
BattlegroundTypeId
BattlegroundTypeId m_BgTypeId
virtual bool Execute(uint64 e_time, uint32 p_time)
virtual void Abort(uint64 e_time)
BGQueueInviteEvent(uint64 pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime)
virtual bool Execute(uint64 e_time, uint32 p_time)
virtual void Abort(uint64 e_time)
BattlegroundTypeId m_BgTypeId
BattlegroundQueueTypeId m_BgQueueTypeId
BGQueueRemoveEvent(uint64 pl_guid, uint32 bgInstanceGUID, BattlegroundTypeId BgTypeId, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime)
bool AddGroup(GroupQueueInfo *ginfo, uint32 desiredCount)
uint32 m_SumOfWaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS]
void FillPlayersToBG(Battleground *bg, BattlegroundBracketId bracket_id)
void UpdateEvents(uint32 diff)
void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo *ginfo, BattlegroundBracketId bracket_id)
uint32 m_WaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME]
GroupQueueInfo * AddGroup(Player *leader, Group *group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const *bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating)
uint32 GetAverageQueueWaitTime(GroupQueueInfo *ginfo, BattlegroundBracketId bracket_id) const
QueuedPlayersMap m_QueuedPlayers
bool CheckNormalMatch(Battleground *bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers)
bool InviteGroupToBG(GroupQueueInfo *ginfo, Battleground *bg, uint32 side)
bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam)
bool GetPlayerGroupInfoData(uint64 guid, GroupQueueInfo *ginfo)
void BattlegroundQueueUpdate(uint32 diff, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType=0, bool isRated=false, uint32 minRating=0)
bool IsPlayerInvited(uint64 pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime)
std::deque< GroupQueueInfo * > GroupsQueueType
std::map< uint64, PlayerQueueInfo > QueuedPlayersMap
void RemovePlayer(uint64 guid, bool decreaseInvitedCount)
GroupsQueueType m_QueuedGroups[MAX_BATTLEGROUND_BRACKETS][BG_QUEUE_GROUP_TYPES_COUNT]
uint32 GetPlayersInQueue(TeamId id)
bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam)
EventProcessor m_events
uint32 m_WaitTimeLastPlayer[BG_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS]
SelectionPool m_SelectionPools[BG_TEAMS_COUNT]
Definition Group.h:147
uint32 IsInvitedToBGInstanceGUID
std::map< uint64, PlayerQueueInfo * > Players
uint32 OpponentsMatchmakerRating
BattlegroundTypeId BgTypeId
GroupQueueInfo * GroupInfo