2 * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef __BATTLEGROUNDMGR_H
20 #define __BATTLEGROUNDMGR_H
22 #include "BattleGround.h"
23 #include "Policies/Singleton.h"
27 //TODO it is not possible to have this structure, because we should have BattlegroundSet for each queue
28 //so i propose to change this type to array 1..MAX_BATTLEGROUND_TYPES of sets or maps..
29 typedef std::map
<uint32
, BattleGround
*> BattleGroundSet
;
30 //typedef std::map<uint32, BattleGroundQueue*> BattleGroundQueueSet;
31 typedef std::deque
<BattleGround
*> BGFreeSlotQueueType
;
33 #define MAX_BATTLEGROUND_QUEUES 8 // for level ranges 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80+
35 #define MAX_BATTLEGROUND_TYPES 12 // each BG type will be in array
37 #define MAX_BATTLEGROUND_QUEUE_TYPES 8
39 #define BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY 86400 // seconds in a day
41 struct GroupQueueInfo
; // type predefinition
42 struct PlayerQueueInfo
// stores information for players in queue
44 uint32 InviteTime
; // first invite time
45 uint32 LastInviteTime
; // last invite time
46 uint32 LastOnlineTime
; // for tracking and removing offline players from queue after 5 minutes
47 GroupQueueInfo
* GroupInfo
; // pointer to the associated groupqueueinfo
50 struct GroupQueueInfo
// stores information about the group in queue (also used when joined as solo!)
52 std::map
<uint64
, PlayerQueueInfo
*> Players
; // player queue info map
53 uint32 Team
; // Player team (ALLIANCE/HORDE)
54 uint32 BgTypeId
; // battleground type id
55 bool IsRated
; // rated
56 uint8 ArenaType
; // 2v2, 3v3, 5v5 or 0 when BG
57 uint32 ArenaTeamId
; // team id if rated match
58 uint32 JoinTime
; // time when group was added
59 uint32 IsInvitedToBGInstanceGUID
; // was invited to certain BG
60 uint32 ArenaTeamRating
; // if rated match, inited to the rating of the team
61 uint32 OpponentsTeamRating
; // for rated arena matches
65 class BattleGroundQueue
71 void Update(uint32 bgTypeId
, uint32 queue_id
, uint8 arenatype
= 0, bool isRated
= false, uint32 minRating
= 0);
73 GroupQueueInfo
* AddGroup(Player
* leader
, uint32 BgTypeId
, uint8 ArenaType
, bool isRated
, uint32 ArenaRating
, uint32 ArenaTeamId
= 0);
74 void AddPlayer(Player
*plr
, GroupQueueInfo
*ginfo
);
75 void RemovePlayer(uint64 guid
, bool decreaseInvitedCount
);
76 void DecreaseGroupLength(uint32 queueId
, uint32 AsGroup
);
77 void BGEndedRemoveInvites(BattleGround
* bg
);
78 void AnnounceWorld(GroupQueueInfo
*ginfo
, uint64 playerGUID
, bool isAddedToQueue
);
80 typedef std::map
<uint64
, PlayerQueueInfo
> QueuedPlayersMap
;
81 QueuedPlayersMap m_QueuedPlayers
[MAX_BATTLEGROUND_QUEUES
];
83 typedef std::list
<GroupQueueInfo
*> QueuedGroupsList
;
84 QueuedGroupsList m_QueuedGroups
[MAX_BATTLEGROUND_QUEUES
];
86 // class to hold pointers to the groups eligible for a specific selection pool building mode
87 class EligibleGroups
: public std::list
<GroupQueueInfo
*>
90 void Init(QueuedGroupsList
* source
, uint32 BgTypeId
, uint32 side
, uint32 MaxPlayers
, uint8 ArenaType
= 0, bool IsRated
= false, uint32 MinRating
= 0, uint32 MaxRating
= 0, uint32 DisregardTime
= 0, uint32 excludeTeam
= 0);
91 void RemoveGroup(GroupQueueInfo
* ginfo
);
94 EligibleGroups m_EligibleGroups
;
96 // class to select and invite groups to bg
101 void AddGroup(GroupQueueInfo
* group
);
102 GroupQueueInfo
* GetMaximalGroup();
103 void RemoveGroup(GroupQueueInfo
* group
);
104 uint32
GetPlayerCount() const {return PlayerCount
;}
106 std::list
<GroupQueueInfo
*> SelectedGroups
;
109 GroupQueueInfo
* MaxGroup
;
112 enum SelectionPoolBuildMode
116 ONESIDE_ALLIANCE_TEAM1
,
117 ONESIDE_ALLIANCE_TEAM2
,
121 NUM_SELECTION_POOL_TYPES
124 SelectionPool m_SelectionPools
[NUM_SELECTION_POOL_TYPES
];
126 bool BuildSelectionPool(uint32 bgTypeId
, uint32 queue_id
, uint32 MinPlayers
, uint32 MaxPlayers
, SelectionPoolBuildMode mode
, uint8 ArenaType
= 0, bool isRated
= false, uint32 MinRating
= 0, uint32 MaxRating
= 0, uint32 DisregardTime
= 0, uint32 excludeTeam
= 0);
130 bool InviteGroupToBG(GroupQueueInfo
* ginfo
, BattleGround
* bg
, uint32 side
);
134 This class is used to invite player to BG again, when minute lasts from his first invitation
135 it is capable to solve all possibilities
137 class BGQueueInviteEvent
: public BasicEvent
140 BGQueueInviteEvent(uint64 pl_guid
, uint32 BgInstanceGUID
) : m_PlayerGuid(pl_guid
), m_BgInstanceGUID(BgInstanceGUID
) {};
141 virtual ~BGQueueInviteEvent() {};
143 virtual bool Execute(uint64 e_time
, uint32 p_time
);
144 virtual void Abort(uint64 e_time
);
147 uint32 m_BgInstanceGUID
;
151 This class is used to remove player from BG queue after 2 minutes from first invitation
153 class BGQueueRemoveEvent
: public BasicEvent
156 BGQueueRemoveEvent(uint64 pl_guid
, uint32 bgInstanceGUID
, uint32 playersTeam
) : m_PlayerGuid(pl_guid
), m_BgInstanceGUID(bgInstanceGUID
), m_PlayersTeam(playersTeam
) {};
157 virtual ~BGQueueRemoveEvent() {};
159 virtual bool Execute(uint64 e_time
, uint32 p_time
);
160 virtual void Abort(uint64 e_time
);
163 uint32 m_BgInstanceGUID
;
164 uint32 m_PlayersTeam
;
167 class BattleGroundMgr
173 void Update(time_t diff
);
175 /* Packet Building */
176 void BuildPlayerJoinedBattleGroundPacket(WorldPacket
*data
, Player
*plr
);
177 void BuildPlayerLeftBattleGroundPacket(WorldPacket
*data
, Player
*plr
);
178 void BuildBattleGroundListPacket(WorldPacket
*data
, uint64 guid
, Player
*plr
, uint32 bgTypeId
);
179 void BuildGroupJoinedBattlegroundPacket(WorldPacket
*data
, uint32 bgTypeId
);
180 void BuildUpdateWorldStatePacket(WorldPacket
*data
, uint32 field
, uint32 value
);
181 void BuildPvpLogDataPacket(WorldPacket
*data
, BattleGround
*bg
);
182 void BuildBattleGroundStatusPacket(WorldPacket
*data
, BattleGround
*bg
, uint32 team
, uint8 QueueSlot
, uint8 StatusID
, uint32 Time1
, uint32 Time2
, uint32 arenatype
= 0, uint8 israted
= 0);
183 void BuildPlaySoundPacket(WorldPacket
*data
, uint32 soundid
);
185 /* Player invitation */
186 // called from Queue update, or from Addplayer to queue
187 void InvitePlayer(Player
* plr
, uint32 bgInstanceGUID
, uint32 team
);
190 BattleGroundSet::iterator
GetBattleGroundsBegin() { return m_BattleGrounds
.begin(); };
191 BattleGroundSet::iterator
GetBattleGroundsEnd() { return m_BattleGrounds
.end(); };
193 BattleGround
* GetBattleGround(uint32 ID
)
195 BattleGroundSet::iterator i
= m_BattleGrounds
.find(ID
);
196 if(i
!= m_BattleGrounds
.end())
202 BattleGround
* GetBattleGroundTemplate(uint32 bgTypeId
);
203 BattleGround
* CreateNewBattleGround(uint32 bgTypeId
);
205 uint32
CreateBattleGround(uint32 bgTypeId
, uint32 MinPlayersPerTeam
, uint32 MaxPlayersPerTeam
, uint32 LevelMin
, uint32 LevelMax
, char* BattleGroundName
, uint32 MapID
, float Team1StartLocX
, float Team1StartLocY
, float Team1StartLocZ
, float Team1StartLocO
, float Team2StartLocX
, float Team2StartLocY
, float Team2StartLocZ
, float Team2StartLocO
);
207 inline void AddBattleGround(uint32 ID
, BattleGround
* BG
) { m_BattleGrounds
[ID
] = BG
; };
208 void RemoveBattleGround(uint32 instanceID
);
210 void CreateInitialBattleGrounds();
212 void SendToBattleGround(Player
*pl
, uint32 bgTypeId
);
214 /* Battleground queues */
215 //these queues are instantiated when creating BattlegroundMrg
216 BattleGroundQueue m_BattleGroundQueues
[MAX_BATTLEGROUND_QUEUE_TYPES
]; // public, because we need to access them in BG handler code
218 BGFreeSlotQueueType BGFreeSlotQueue
[MAX_BATTLEGROUND_TYPES
];
220 void SendAreaSpiritHealerQueryOpcode(Player
*pl
, BattleGround
*bg
, uint64 guid
);
222 bool IsArenaType(uint32 bgTypeId
) const;
223 bool IsBattleGroundType(uint32 bgTypeId
) const;
224 uint32
BGQueueTypeId(uint32 bgTypeId
, uint8 arenaType
) const;
225 uint32
BGTemplateId(uint32 bgQueueTypeId
) const;
226 uint8
BGArenaType(uint32 bgQueueTypeId
) const;
228 uint32
GetMaxRatingDifference() const {return m_MaxRatingDifference
;}
229 uint32
GetRatingDiscardTimer() const {return m_RatingDiscardTimer
;}
231 void InitAutomaticArenaPointDistribution();
232 void DistributeArenaPoints();
233 uint32
GetPrematureFinishTime() const {return m_PrematureFinishTimer
;}
234 void ToggleArenaTesting();
235 const bool isArenaTesting() const { return m_ArenaTesting
; }
240 BattleGroundSet m_BattleGrounds
;
241 uint32 m_MaxRatingDifference
;
242 uint32 m_RatingDiscardTimer
;
243 uint32 m_NextRatingDiscardUpdate
;
244 bool m_AutoDistributePoints
;
245 uint64 m_NextAutoDistributionTime
;
246 uint32 m_AutoDistributionTimeChecker
;
247 uint32 m_PrematureFinishTimer
;
251 #define sBattleGroundMgr MaNGOS::Singleton<BattleGroundMgr>::Instance()