TrinityCore
Battlefield.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 BATTLEFIELD_H_
19#define BATTLEFIELD_H_
20
21#include "Position.h"
22#include "SharedDefines.h"
23#include "ZoneScript.h"
24#include <map>
25#include <memory>
26
28{
29 BATTLEFIELD_WG = 1, // Wintergrasp
30 BATTLEFIELD_TB = 2, // Tol Barad (cataclysm)
32};
33
35{
36 BATTLEFIELD_BATTLEID_WG = 1, // Wintergrasp battle
37 BATTLEFIELD_BATTLEID_TB = 21, // Tol Barad
38 BATTLEFIELD_BATTLEID_ASHRAN = 24 // Ashran
39};
40
42{
46};
47
49{
57};
58
60{
63 BF_SOUND_START = 3439
64};
65
67{
69};
70
71// some class predefs
72class Battlefield;
73class BfGraveyard;
74class Creature;
75class GameObject;
76class Group;
77class Map;
78class Player;
79class Unit;
80class WorldPacket;
81struct Position;
82struct QuaternionData;
84
85namespace WorldPackets
86{
87 namespace WorldState
88 {
89 class InitWorldStates;
90 }
91}
92
93typedef std::vector<BfGraveyard*> GraveyardVect;
94typedef std::map<ObjectGuid, time_t> PlayerTimerMap;
95
97{
98public:
101
102protected:
103 Battlefield* GetBattlefield();
104private:
106};
107
109{
110 public:
112 virtual ~BfGraveyard() = default;
113
114 // Method to changing who controls the graveyard
115 void GiveControlTo(TeamId team);
116 TeamId GetControlTeamId() const { return m_ControlTeam; }
117
118 // Find the nearest graveyard to a player
119 float GetDistance(Player* player);
120
121 // Initialize the graveyard
122 void Initialize(TeamId startcontrol, uint32 gy);
123
124 // Set spirit service for the graveyard
125 void SetSpirit(Creature* spirit, TeamId team);
126
127 // Check if this graveyard has a spirit guide
128 bool HasNpc(ObjectGuid guid);
129
130 // Get the graveyard's ID.
131 uint32 GetGraveyardId() const { return m_GraveyardId; }
132
133 protected:
138};
139
141{
142 friend class BattlefieldMgr;
143
144 public:
146 explicit Battlefield(Map* map);
147 Battlefield(Battlefield const& right) = delete;
148 Battlefield(Battlefield&& right) = delete;
149 Battlefield& operator=(Battlefield const& right) = delete;
152 virtual ~Battlefield();
153
155
156 typedef std::unordered_map<uint32 /*control zone entry*/, std::unique_ptr<BattlefieldControlZoneHandler>> ControlZoneHandlerMap;
157
159 virtual bool SetupBattlefield() { return true; }
160
168 virtual bool Update(uint32 diff);
169
171 void InvitePlayersInZoneToQueue();
173 void InvitePlayersInQueueToWar();
175 void InvitePlayersInZoneToWar();
176
178 virtual void HandleKill(Player* /*killer*/, Unit* /*killed*/) { };
179
180 uint32 GetTypeId() const { return m_TypeId; }
181 uint32 GetZoneId() const { return m_ZoneId; }
182 uint32 GetMapId() const { return m_MapId; }
183 Map* GetMap() const { return m_Map; }
184 uint64 GetQueueId() const;
185
186 void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2 = 0);
187
189 bool IsWarTime() const { return m_isActive; }
190
191 int8 GetState() const { return m_isActive ? BATTLEFIELD_IN_PROGRESS : (m_Timer <= m_StartGroupingTimer ? BATTLEFIELD_WARMUP : BATTLEFIELD_INACTIVE); }
192
194 void ToggleBattlefield(bool enable) { m_IsEnabled = enable; }
196 bool IsEnabled() const { return m_IsEnabled; }
197
202 void KickPlayerFromBattlefield(ObjectGuid guid);
203
205 void HandlePlayerEnterZone(Player* player, uint32 zone);
207 void HandlePlayerLeaveZone(Player* player, uint32 zone);
208
209 // All-purpose data storage 64 bit
210 virtual uint64 GetData64(uint32 dataId) const override { return m_Data64[dataId]; }
211 virtual void SetData64(uint32 dataId, uint64 value) override { m_Data64[dataId] = value; }
212
213 // All-purpose data storage 32 bit
214 virtual uint32 GetData(uint32 dataId) const override { return m_Data32[dataId]; }
215 virtual void SetData(uint32 dataId, uint32 value) override { m_Data32[dataId] = value; }
216 virtual void UpdateData(uint32 index, int32 pad) { m_Data32[index] += pad; }
217
218 // Battlefield - generic methods
219 TeamId GetDefenderTeam() const { return m_DefenderTeam; }
220 TeamId GetAttackerTeam() const { return TeamId(1 - m_DefenderTeam); }
221 TeamId GetOtherTeam(TeamId team) const { return (team == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE); }
222 void SetDefenderTeam(TeamId team) { m_DefenderTeam = team; }
223
224 // Group methods
229 Group* GetFreeBfRaid(TeamId TeamId);
231 Group* GetGroupPlayer(ObjectGuid guid, TeamId TeamId);
233 bool AddOrSetPlayerToCorrectBfGroup(Player* player);
234
235 // Graveyard methods
236 // Find which graveyard the player must be teleported to to be resurrected by spiritguide
237 WorldSafeLocsEntry const* GetClosestGraveyard(Player* player);
238
239 void SetGraveyardNumber(uint32 number) { m_GraveyardList.resize(number); }
240 BfGraveyard* GetGraveyardById(uint32 id) const;
241
242 // Misc methods
243 Creature* SpawnCreature(uint32 entry, Position const& pos);
244 GameObject* SpawnGameObject(uint32 entry, Position const& pos, QuaternionData const& rot);
245
248
249 // Script-methods
250
252 virtual void OnBattleStart() { }
254 virtual void OnBattleEnd(bool /*endByTimer*/) { }
256 virtual void OnStartGrouping() { }
258 virtual void OnPlayerJoinWar(Player* /*player*/) { }
260 virtual void OnPlayerLeaveWar(Player* /*player*/) { }
262 virtual void OnPlayerLeaveZone(Player* /*player*/) { }
264 virtual void OnPlayerEnterZone(Player* /*player*/) { }
265
266 void SendWarning(uint8 id, WorldObject const* target = nullptr);
267
268 void PlayerAcceptInviteToQueue(Player* player);
269 void PlayerAcceptInviteToWar(Player* player);
270 uint32 GetBattleId() const { return m_BattleId; }
271 void AskToLeaveQueue(Player* player);
272 void PlayerAskToLeave(Player* player);
273
274 virtual void DoCompleteOrIncrementAchievement(uint32 /*achievement*/, Player* /*player*/, uint8 /*incrementNumber = 1*/) { }
275
277 bool CanFlyIn() { return !m_isActive; }
278
279 void StartBattle();
280 void EndBattle(bool endByTimer);
281
282 void HideNpc(Creature* creature);
283 void ShowNpc(Creature* creature, bool aggressive);
284
285 GraveyardVect GetGraveyardVector() const { return m_GraveyardList; }
286
287 uint32 GetTimer() const { return m_Timer; }
288 void SetTimer(uint32 timer) { m_Timer = timer; }
289
290 void DoPlaySoundToAll(uint32 SoundID);
291
292 void InvitePlayerToQueue(Player* player);
293 void InvitePlayerToWar(Player* player);
294
295 void InitStalker(uint32 entry, Position const& pos);
296
297 void ProcessEvent(WorldObject* target, uint32 eventId, WorldObject* invoker) override;
298 protected:
300 uint32 m_Timer; // Global timer for event
304
305 // Map of the objectives belonging to this OutdoorPvP
307
308 // Players info maps
309 GuidUnorderedSet m_players[PVP_TEAMS_COUNT]; // Players in zone
310 GuidUnorderedSet m_PlayersInQueue[PVP_TEAMS_COUNT]; // Players in the queue
311 GuidUnorderedSet m_PlayersInWar[PVP_TEAMS_COUNT]; // Players in WG combat
313 PlayerTimerMap m_PlayersWillBeKick[PVP_TEAMS_COUNT];
314
315 // Variables that must exist for each battlefield
316 uint32 m_TypeId; // See enum BattlefieldTypes
317 uint32 m_BattleId; // BattleID (for packet)
318 uint32 m_ZoneId; // ZoneID of Wintergrasp = 4197
319 uint32 m_MapId; // MapId where is Battlefield
321 uint32 m_MaxPlayer; // Maximum number of player that participated to Battlefield
322 uint32 m_MinPlayer; // Minimum number of player for Battlefield start
323 uint32 m_MinLevel; // Required level to participate at Battlefield
324 uint32 m_BattleTime; // Length of a battle
325 uint32 m_NoWarBattleTime; // Time between two battles
326 uint32 m_RestartAfterCrash; // Delay to restart Wintergrasp if the server crashed during a running battle.
329 WorldLocation KickPosition; // Position where players are teleported if they switch to afk during the battle or if they don't accept invitation
330
331 uint32 m_uiKickAfkPlayersTimer; // Timer for check Afk in war
332
333 // Graveyard variables
334 GraveyardVect m_GraveyardList; // Vector witch contain the different GY of the battle
335
336 uint32 m_StartGroupingTimer; // Timer for invite players in area 15 minute before start battle
337 bool m_StartGrouping; // bool for know if all players in area has been invited
338
339 GuidUnorderedSet m_Groups[PVP_TEAMS_COUNT]; // Contain different raid group
340
341 std::vector<uint64> m_Data64;
342 std::vector<uint32> m_Data32;
343
344 void KickAfkPlayers();
345
346 // use for switch off all worldstate for client
347 virtual void SendRemoveWorldStates(Player* /*player*/) { }
348
349 // use for send a packet for all player list
350 void BroadcastPacketToZone(WorldPacket const* data) const;
351 void BroadcastPacketToQueue(WorldPacket const* data) const;
352 void BroadcastPacketToWar(WorldPacket const* data) const;
353
354 void RegisterZone(uint32 zoneid);
355 bool HasPlayer(Player* player) const;
356 void TeamCastSpell(TeamId team, int32 spellId);
357};
358
359#endif
std::map< ObjectGuid, time_t > PlayerTimerMap
Definition: Battlefield.h:94
std::vector< BfGraveyard * > GraveyardVect
Definition: Battlefield.h:93
BattlefieldTypes
Definition: Battlefield.h:28
@ BATTLEFIELD_WG
Definition: Battlefield.h:29
@ BATTLEFIELD_MAX
Definition: Battlefield.h:31
@ BATTLEFIELD_TB
Definition: Battlefield.h:30
BattlefieldSounds
Definition: Battlefield.h:60
@ BF_SOUND_HORDE_WINS
Definition: Battlefield.h:61
@ BF_SOUND_ALLIANCE_WINS
Definition: Battlefield.h:62
@ BF_SOUND_START
Definition: Battlefield.h:63
BattlefieldTimers
Definition: Battlefield.h:67
@ BATTLEFIELD_OBJECTIVE_UPDATE_INTERVAL
Definition: Battlefield.h:68
BattlefieldState
Definition: Battlefield.h:42
@ BATTLEFIELD_WARMUP
Definition: Battlefield.h:44
@ BATTLEFIELD_IN_PROGRESS
Definition: Battlefield.h:45
@ BATTLEFIELD_INACTIVE
Definition: Battlefield.h:43
BattlefieldObjectiveStates
Definition: Battlefield.h:49
@ BF_CAPTUREPOINT_OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE
Definition: Battlefield.h:54
@ BF_CAPTUREPOINT_OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE
Definition: Battlefield.h:53
@ BF_CAPTUREPOINT_OBJECTIVESTATE_HORDE
Definition: Battlefield.h:52
@ BF_CAPTUREPOINT_OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE
Definition: Battlefield.h:55
@ BF_CAPTUREPOINT_OBJECTIVESTATE_ALLIANCE
Definition: Battlefield.h:51
@ BF_CAPTUREPOINT_OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE
Definition: Battlefield.h:56
@ BF_CAPTUREPOINT_OBJECTIVESTATE_NEUTRAL
Definition: Battlefield.h:50
BattlefieldIDs
Definition: Battlefield.h:35
@ BATTLEFIELD_BATTLEID_WG
Definition: Battlefield.h:36
@ BATTLEFIELD_BATTLEID_TB
Definition: Battlefield.h:37
@ BATTLEFIELD_BATTLEID_ASHRAN
Definition: Battlefield.h:38
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition: ObjectGuid.h:396
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
uint8 constexpr PVP_TEAMS_COUNT
WorldState
virtual ~BattlefieldControlZoneHandler()=default
void HandlePlayerLeaveZone(Player *player, uint32 zoneId)
void HandlePlayerEnterZone(Player *player, uint32 zoneId)
uint32 m_Timer
Definition: Battlefield.h:300
Map * GetMap() const
Definition: Battlefield.h:183
uint32 m_MapId
Definition: Battlefield.h:319
GraveyardVect m_GraveyardList
Definition: Battlefield.h:334
uint32 GetBattleId() const
Definition: Battlefield.h:270
virtual uint64 GetData64(uint32 dataId) const override
Definition: Battlefield.h:210
uint32 m_MaxPlayer
Definition: Battlefield.h:321
std::vector< uint32 > m_Data32
Definition: Battlefield.h:342
void SetTimer(uint32 timer)
Definition: Battlefield.h:288
ObjectGuid StalkerGuid
Definition: Battlefield.h:299
uint32 m_NoWarBattleTime
Definition: Battlefield.h:325
virtual void OnBattleEnd(bool)
Called at the end of battle.
Definition: Battlefield.h:254
virtual void SetData(uint32 dataId, uint32 value) override
Definition: Battlefield.h:215
uint32 m_BattleTime
Definition: Battlefield.h:324
uint32 GetZoneId() const
Definition: Battlefield.h:181
bool IsWarTime() const
Return true if battle is start, false if battle is not started.
Definition: Battlefield.h:189
uint32 m_ZoneId
Definition: Battlefield.h:318
virtual void UpdateData(uint32 index, int32 pad)
Definition: Battlefield.h:216
uint32 m_TypeId
Definition: Battlefield.h:316
uint32 m_BattleId
Definition: Battlefield.h:317
GraveyardVect GetGraveyardVector() const
Definition: Battlefield.h:285
virtual void DoCompleteOrIncrementAchievement(uint32, Player *, uint8)
Definition: Battlefield.h:274
int8 GetState() const
Definition: Battlefield.h:191
virtual bool SetupBattlefield()
Call this to init the Battlefield.
Definition: Battlefield.h:159
virtual void SendRemoveWorldStates(Player *)
Definition: Battlefield.h:347
uint32 m_StartGroupingTimer
Definition: Battlefield.h:336
void SetDefenderTeam(TeamId team)
Definition: Battlefield.h:222
TeamId m_DefenderTeam
Definition: Battlefield.h:303
Battlefield(Battlefield const &right)=delete
uint32 m_uiKickAfkPlayersTimer
Definition: Battlefield.h:331
virtual void OnPlayerJoinWar(Player *)
Called when a player accept to join the battle.
Definition: Battlefield.h:258
uint32 m_TimeForAcceptInvite
Definition: Battlefield.h:327
std::vector< uint64 > m_Data64
Definition: Battlefield.h:341
virtual void OnBattleStart()
Called on start.
Definition: Battlefield.h:252
virtual void SetData64(uint32 dataId, uint64 value) override
Definition: Battlefield.h:211
std::unordered_map< uint32, std::unique_ptr< BattlefieldControlZoneHandler > > ControlZoneHandlerMap
typedef of map witch store capturepoint and the associate gameobject entry
Definition: Battlefield.h:156
uint32 m_RestartAfterCrash
Definition: Battlefield.h:326
Battlefield & operator=(Battlefield &&right)=delete
TeamId GetAttackerTeam() const
Definition: Battlefield.h:220
Battlefield & operator=(Battlefield const &right)=delete
uint32 GetMapId() const
Definition: Battlefield.h:182
uint32 m_MinLevel
Definition: Battlefield.h:323
virtual void HandleKill(Player *, Unit *)
Called when a Unit is kill in battlefield zone.
Definition: Battlefield.h:178
bool CanFlyIn()
Return if we can use mount in battlefield.
Definition: Battlefield.h:277
TeamId GetDefenderTeam() const
Definition: Battlefield.h:219
uint32 m_MinPlayer
Definition: Battlefield.h:322
uint32 GetTimer() const
Definition: Battlefield.h:287
virtual uint32 GetData(uint32 dataId) const override
Definition: Battlefield.h:214
virtual void OnPlayerLeaveZone(Player *)
Called when a player leave battlefield zone.
Definition: Battlefield.h:262
uint32 m_uiKickDontAcceptTimer
Definition: Battlefield.h:328
void ToggleBattlefield(bool enable)
Enable or Disable battlefield.
Definition: Battlefield.h:194
bool m_IsEnabled
Definition: Battlefield.h:301
ControlZoneHandlerMap ControlZoneHandlers
Definition: Battlefield.h:306
Battlefield(Battlefield &&right)=delete
virtual void OnStartGrouping()
Called x minutes before battle start when player in zone are invite to join queue.
Definition: Battlefield.h:256
bool m_StartGrouping
Definition: Battlefield.h:337
WorldLocation KickPosition
Definition: Battlefield.h:329
virtual void OnPlayerLeaveWar(Player *)
Called when a player leave the battle.
Definition: Battlefield.h:260
void SetGraveyardNumber(uint32 number)
Definition: Battlefield.h:239
void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2=0)
TeamId GetOtherTeam(TeamId team) const
Definition: Battlefield.h:221
bool m_isActive
Definition: Battlefield.h:302
bool IsEnabled() const
Return if battlefield is enable.
Definition: Battlefield.h:196
virtual void OnPlayerEnterZone(Player *)
Called when a player enter in battlefield zone.
Definition: Battlefield.h:264
uint32 GetTypeId() const
Definition: Battlefield.h:180
virtual ~BfGraveyard()=default
uint32 m_GraveyardId
Definition: Battlefield.h:135
Battlefield * m_Bf
Definition: Battlefield.h:137
TeamId m_ControlTeam
Definition: Battlefield.h:134
TeamId GetControlTeamId() const
Definition: Battlefield.h:116
uint32 GetGraveyardId() const
Definition: Battlefield.h:131
Definition: Group.h:197
Definition: Map.h:189
Definition: Unit.h:627
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:90