Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
Battlefield.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 BATTLEFIELD_H_
7#define BATTLEFIELD_H_
8
9#include "Battleground.h"
10#include "GameObject.h"
11#include "ObjectAccessor.h"
12#include "SharedDefines.h"
13#include "Utilities/Util.h"
14#include "WorldPacket.h"
15#include "WorldStateBuilder.h"
16#include "ZoneScript.h"
17
19{
20 BATTLEFIELD_WG, // Wintergrasp
21 BATTLEFIELD_TB // Tol Barad (cataclysm)
22};
23
25{
26 BATTLEFIELD_BATTLEID_WG = 1 // Wintergrasp battle
27};
28
39
46
51
52// some class predefs
53class Player;
54class GameObject;
55class WorldPacket;
56class Creature;
57class Unit;
58
59class Battlefield;
60class BfGraveyard;
61
62typedef std::set<uint64> GuidSet;
63typedef std::vector<BfGraveyard*> GraveyardVect;
64typedef std::map<uint64, time_t> PlayerTimerMap;
65
67{
68public:
72
73 virtual ~BfCapturePoint() { }
74
75 virtual void FillInitialWorldStates(WorldStateBuilder& /*builder*/) { }
76
77 // Send world state update to all players present
78 void SendUpdateWorldState(uint32 field, uint32 value);
79
80 // Send kill notify to players in the controlling faction
81 void SendObjectiveComplete(uint32 id, uint64 guid);
82
83 // Used when player is activated/inactivated in the area
84 virtual bool HandlePlayerEnter(Player* player);
85 virtual GuidSet::iterator HandlePlayerLeave(Player* player);
86 //virtual void HandlePlayerActivityChanged(Player* player);
87
88 // Checks if player is in range of a capture credit marker
89 bool IsInsideObjective(Player* player) const;
90
91 // Returns true if the state of the objective has changed, in this case, the OutdoorPvP must send a world state ui update.
92 virtual bool Update(uint32 diff);
93 virtual void ChangeTeam(TeamId /*oldTeam*/) { }
94 virtual void SendChangePhase();
95
96 bool SetCapturePointData(GameObject* capturePoint);
99
100 TeamId GetTeamId() const { return m_team; }
101protected:
102 bool DelCapturePoint();
103
104 // active Players in the area of the objective, 0 - alliance, 1 - horde
106
107 // Total shift needed to capture the objective
110
111 // Maximum speed of capture
113
114 // The status of the objective
115 float m_value;
117
118 // Objective states
121
122 // Neutral value on capture bar
124
125 // Pointer to the Battlefield this objective belongs to
127
128 // Capture point entry
130
131 // Gameobject related to that capture point
133};
134
136{
137public:
139 virtual ~BfGraveyard() { }
140
141 // Method to changing who controls the graveyard
142 void GiveControlTo(TeamId team);
144
145 // Find the nearest graveyard to a player
146 float GetDistance(Player* player);
147
148 // Initialize the graveyard
149 void Initialize(TeamId startcontrol, uint32 gy);
150
151 // Set spirit service for the graveyard
152 void SetSpirit(Creature* spirit, TeamId team);
153
154 // Add a player to the graveyard
155 void AddPlayer(uint64 player_guid);
156
157 // Remove a player from the graveyard
158 void RemovePlayer(uint64 player_guid);
159
160 // Resurrect players
161 void Resurrect();
162
163 // Move players waiting to that graveyard on the nearest one
164 void RelocateDeadPlayers();
165
166 // Check if this graveyard has a spirit guide
167 bool HasNpc(uint64 guid);
168
169 // Check if a player is in this graveyard's ressurect queue
170 bool HasPlayer(uint64 guid) { return m_ResurrectQueue.find(guid) != m_ResurrectQueue.end(); }
171
172 // Get the graveyard's ID.
174
175protected:
181};
182
184{
185 friend class BattlefieldMgr;
186
187public:
192
194 virtual ~Battlefield();
195
197 typedef std::map<uint32 /*lowguid */, BfCapturePoint*> BfCapturePointMap;
198
200 virtual bool SetupBattlefield() { return true; }
201
203 void SendUpdateWorldState(uint32 field, uint32 value);
204
212 virtual bool Update(uint32 diff);
213
220
222 virtual void HandleKill(Player* /*killer*/, Unit* /*killed*/) { };
223
224 uint32 GetTypeId() const { return m_TypeId; }
225 uint32 GetZoneId() const { return m_ZoneId; }
226 uint64 GetGUID() const { return m_Guid; }
227
228 void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2 = 0);
229
231 bool IsWarTime() const { return m_isActive; }
232
234 void ToggleBattlefield(bool enable) { m_IsEnabled = enable; }
236 bool IsEnabled() const { return m_IsEnabled; }
237
243
245 void HandlePlayerEnterZone(Player* player, uint32 zone);
247 void HandlePlayerLeaveZone(Player* player, uint32 zone);
248
249 // All-purpose data storage 64 bit
250 virtual uint64 GetData64(uint32 dataId) const { return m_Data64[dataId]; }
251 virtual void SetData64(uint32 dataId, uint64 value) { m_Data64[dataId] = value; }
252
253 // All-purpose data storage 32 bit
254 virtual uint32 GetData(uint32 dataId) const { return m_Data32[dataId]; }
255 virtual void SetData(uint32 dataId, uint32 value) { m_Data32[dataId] = value; }
256 virtual void UpdateData(uint32 index, int32 pad) { m_Data32[index] += pad; }
257
258 // Battlefield - generic methods
262 void SetDefenderTeam(TeamId team) { m_DefenderTeam = team; }
263
264 // Group methods
274
275 // Graveyard methods
276 // Find which graveyard the player must be teleported to to be resurrected by spiritguide
278
279 virtual void AddPlayerToResurrectQueue(uint64 npc_guid, uint64 player_guid);
280 void RemovePlayerFromResurrectQueue(uint64 player_guid);
281 void SetGraveyardNumber(uint32 number) { m_GraveyardList.resize(number); }
283
284 // Misc methods
285 Creature* SpawnCreature(uint32 entry, float x, float y, float z, float o, TeamId team);
286 Creature* SpawnCreature(uint32 entry, const Position& pos, TeamId team);
287 GameObject* SpawnGameObject(uint32 entry, float x, float y, float z, float o);
288
291
292 // Script-methods
293
295 virtual void OnBattleStart() { }
297 virtual void OnBattleEnd(bool /*endByTimer*/) { }
299 virtual void OnStartGrouping() { }
301 virtual void OnPlayerJoinWar(Player* /*player*/) { }
303 virtual void OnPlayerLeaveWar(Player* /*player*/) { }
305 virtual void OnPlayerLeaveZone(Player* /*player*/) { }
307 virtual void OnPlayerEnterZone(Player* /*player*/) { }
308
309 void SendWarningToAllInZone(uint32 entry);
310 //void SendWarningToAllInWar(int32 entry, ...); -- UNUSED
311 void SendWarningToPlayer(Player* player, uint32 entry);
312
313 void PlayerAcceptInviteToQueue(Player* player);
314 void PlayerAcceptInviteToWar(Player* player);
315 uint32 GetBattleId() const { return m_BattleId; }
316 void AskToLeaveQueue(Player* player);
317
318 virtual void DoCompleteOrIncrementAchievement(uint32 /*achievement*/, Player* /*player*/, uint8 /*incrementNumber = 1*/) { }
319
321 virtual void SendInitWorldStatesToAll() = 0;
322 virtual void FillInitialWorldStates(WorldStateBuilder& /*builder*/) = 0;
323
325 bool CanFlyIn() const { return !m_isActive; }
326
328
329 void StartBattle();
330 void EndBattle(bool endByTimer);
331
332 void HideNpc(Creature* creature);
333 void ShowNpc(Creature* creature, bool aggressive);
334
336
337 uint32 GetTimer() const { return m_Timer; }
338 void SetTimer(uint32 timer) { m_Timer = timer; }
339
340 void DoPlaySoundToAll(uint32 SoundID);
341
342 void InvitePlayerToQueue(Player* player);
343 void InvitePlayerToWar(Player* player);
344
345 void InitStalker(uint32 entry, float x, float y, float z, float o);
346
347protected:
349
351 uint32 m_Timer; // Global timer for event
355
356 // Map of the objectives belonging to this OutdoorPvP
358
359 // Players info maps
360 GuidSet m_players[BG_TEAMS_COUNT]; // Players in zone
361 GuidSet m_PlayersInQueue[BG_TEAMS_COUNT]; // Players in the queue
362 GuidSet m_PlayersInWar[BG_TEAMS_COUNT]; // Players in WG combat
365
366 // Variables that must exist for each battlefield
367 uint32 m_TypeId; // See enum BattlefieldTypes
368 uint32 m_BattleId; // BattleID (for packet)
369 uint32 m_ZoneId; // ZoneID of Wintergrasp = 4197
370 uint32 m_MapId; // MapId where is Battlefield
372 uint32 m_MaxPlayer; // Maximum number of player that participated to Battlefield
373 uint32 m_MinPlayer; // Minimum number of player for Battlefield start
374 uint32 m_MinLevel; // Required level to participate at Battlefield
375 uint32 m_BattleTime; // Length of a battle
376 uint32 m_NoWarBattleTime; // Time between two battles
377 uint32 m_RestartAfterCrash; // Delay to restart Wintergrasp if the server crashed during a running battle.
380 WorldLocation KickPosition; // Position where players are teleported if they switch to afk during the battle or if they don't accept invitation
381
382 uint32 m_uiKickAfkPlayersTimer; // Timer for check Afk in war
383
384 // Graveyard variables
385 GraveyardVect m_GraveyardList; // Vector witch contain the different GY of the battle
386 uint32 m_LastResurectTimer; // Timer for resurect player every 30 sec
387
388 uint32 m_StartGroupingTimer; // Timer for invite players in area 15 minute before start battle
389 bool m_StartGrouping; // bool for know if all players in area has been invited
390
391 GuidSet m_Groups[BG_TEAMS_COUNT]; // Contain different raid group
392
393 std::vector<uint64> m_Data64;
394 std::vector<uint32> m_Data32;
395
396 void KickAfkPlayers();
397
398 // use for switch off all worldstate for client
399 virtual void SendRemoveWorldStates(Player* /*player*/) { }
400
401 // use for send a packet for all player list
402 void BroadcastPacketToZone(WorldPacket& data) const;
403 void BroadcastPacketToQueue(WorldPacket& data) const;
404 void BroadcastPacketToWar(WorldPacket& data) const;
405
406 // CapturePoint system
408
410 {
411 Battlefield::BfCapturePointMap::const_iterator itr = m_capturePoints.find(lowguid);
412 if (itr != m_capturePoints.end())
413 return itr->second;
414 return NULL;
415 }
416
417 void RegisterZone(uint32 zoneid);
418 bool HasPlayer(Player* player) const;
419 void TeamCastSpell(TeamId team, int32 spellId);
420};
421
422#endif
std::vector< BfGraveyard * > GraveyardVect
Definition Battlefield.h:63
BattlefieldTypes
Definition Battlefield.h:19
@ BATTLEFIELD_WG
Definition Battlefield.h:20
@ BATTLEFIELD_TB
Definition Battlefield.h:21
BattlefieldSounds
Definition Battlefield.h:41
@ BF_START
Definition Battlefield.h:44
@ BF_ALLIANCE_WINS
Definition Battlefield.h:43
@ BF_HORDE_WINS
Definition Battlefield.h:42
BattlefieldTimers
Definition Battlefield.h:48
@ BATTLEFIELD_OBJECTIVE_UPDATE_INTERVAL
Definition Battlefield.h:49
std::set< uint64 > GuidSet
Definition Battlefield.h:62
BattlefieldObjectiveStates
Definition Battlefield.h:30
std::map< uint64, time_t > PlayerTimerMap
Definition Battlefield.h:64
BattlefieldIDs
Definition Battlefield.h:25
@ BATTLEFIELD_BATTLEID_WG
Definition Battlefield.h:26
#define BG_TEAMS_COUNT
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
TeamId
@ TEAM_NEUTRAL
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ ALLIANCE
@ HORDE
uint32 m_Timer
GuidSet m_PlayersInQueue[BG_TEAMS_COUNT]
uint32 m_MapId
friend class BattlefieldMgr
void BroadcastPacketToQueue(WorldPacket &data) const
GraveyardVect m_GraveyardList
void ShowNpc(Creature *creature, bool aggressive)
uint32 GetBattleId() const
void BroadcastPacketToZone(WorldPacket &data) const
void DoPlaySoundToAll(uint32 SoundID)
GuidSet m_players[BG_TEAMS_COUNT]
PlayerTimerMap m_InvitedPlayers[BG_TEAMS_COUNT]
void AddCapturePoint(BfCapturePoint *cp)
uint32 m_MaxPlayer
std::vector< uint32 > m_Data32
void SetTimer(uint32 timer)
void SendWarningToPlayer(Player *player, uint32 entry)
BfCapturePoint * GetCapturePoint(uint32 lowguid) const
uint32 m_NoWarBattleTime
virtual ~Battlefield()
Destructor.
virtual void SendInitWorldStatesToAll()=0
Send all worldstate data to all player in zone.
void EndBattle(bool endByTimer)
virtual void OnBattleEnd(bool)
Called at the end of battle.
void RemovePlayerFromResurrectQueue(uint64 player_guid)
uint32 m_BattleTime
uint32 GetZoneId() const
bool IsWarTime() const
Return true if battle is start, false if battle is not started.
uint32 m_ZoneId
virtual void UpdateData(uint32 index, int32 pad)
Group * GetGroupPlayer(uint64 guid, TeamId TeamId)
Return battlefield group where player is.
uint32 m_TypeId
uint32 m_BattleId
virtual void SetData(uint32 dataId, uint32 value)
virtual void DoCompleteOrIncrementAchievement(uint32, Player *, uint8)
void InvitePlayersInQueueToWar()
Invite all players in queue to join battle on battle start.
virtual bool SetupBattlefield()
Call this to init the Battlefield.
void BroadcastPacketToWar(WorldPacket &data) const
virtual void SendRemoveWorldStates(Player *)
uint32 m_StartGroupingTimer
uint32 m_LastResurectTimer
WorldSafeLocsEntry const * GetClosestGraveYard(Player *player)
virtual bool Update(uint32 diff)
Called every time for update bf data and time.
void InvitePlayersInZoneToQueue()
Invite all players in zone to join the queue, called x minutes before battle start in Update().
GameObject * GetGameObject(uint64 GUID)
void InvitePlayerToQueue(Player *player)
TeamId GetOtherTeam(TeamId team)
void RegisterZone(uint32 zoneid)
void SetDefenderTeam(TeamId team)
TeamId m_DefenderTeam
void InvitePlayerToWar(Player *player)
GuidSet m_PlayersInWar[BG_TEAMS_COUNT]
uint32 m_uiKickAfkPlayersTimer
void PlayerAcceptInviteToWar(Player *player)
uint64 StalkerGuid
Group * GetFreeBfRaid(TeamId TeamId)
Find a not full battlefield group, if there is no, create one.
void StartBattle()
virtual void OnPlayerJoinWar(Player *)
Called when a player accept to join the battle.
uint32 m_TimeForAcceptInvite
BfGraveyard * GetGraveyardById(uint32 id) const
virtual void FillInitialWorldStates(WorldStateBuilder &)=0
std::vector< uint64 > m_Data64
virtual void OnBattleStart()
Called on start.
void SendAreaSpiritHealerQueryOpcode(Player *player, uint64 guid)
void InvitePlayersInZoneToWar()
Invite all players in zone to join battle on battle start.
GameObject * SpawnGameObject(uint32 entry, float x, float y, float z, float o)
void HideNpc(Creature *creature)
uint32 m_RestartAfterCrash
virtual void SetData64(uint32 dataId, uint64 value)
TeamId GetAttackerTeam() const
uint32 m_MinLevel
virtual void HandleKill(Player *, Unit *)
Called when a Unit is kill in battlefield zone.
void InitStalker(uint32 entry, float x, float y, float z, float o)
bool AddOrSetPlayerToCorrectBfGroup(Player *player)
Force player to join a battlefield group.
void KickAfkPlayers()
TeamId GetDefenderTeam() const
virtual uint32 GetData(uint32 dataId) const
void TeamCastSpell(TeamId team, int32 spellId)
uint32 m_MinPlayer
GuidSet m_Groups[BG_TEAMS_COUNT]
uint32 GetTimer() const
virtual void AddPlayerToResurrectQueue(uint64 npc_guid, uint64 player_guid)
virtual void OnPlayerLeaveZone(Player *)
Called when a player leave battlefield zone.
Creature * GetCreature(uint64 GUID)
void PlayerAcceptInviteToQueue(Player *player)
BfCapturePointMap m_capturePoints
uint32 m_uiKickDontAcceptTimer
void ToggleBattlefield(bool enable)
Enable or Disable battlefield.
uint64 m_Guid
virtual uint64 GetData64(uint32 dataId) const
void SendWarningToAllInZone(uint32 entry)
GraveyardVect GetGraveyardVector()
virtual void OnStartGrouping()
Called x minutes before battle start when player in zone are invite to join queue.
bool m_StartGrouping
WorldLocation KickPosition
virtual void OnPlayerLeaveWar(Player *)
Called when a player leave the battle.
bool HasPlayer(Player *player) const
void SetGraveyardNumber(uint32 number)
void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2=0)
void AskToLeaveQueue(Player *player)
PlayerTimerMap m_PlayersWillBeKick[BG_TEAMS_COUNT]
uint64 GetGUID() const
bool IsEnabled() const
Return if battlefield is enable.
Creature * SpawnCreature(uint32 entry, float x, float y, float z, float o, TeamId team)
void HandlePlayerLeaveZone(Player *player, uint32 zone)
Called when player (player) leave the zone.
virtual void OnPlayerEnterZone(Player *)
Called when a player enter in battlefield zone.
void KickPlayerFromBattlefield(uint64 guid)
Kick player from battlefield and teleport him to kick-point location.
void SendUpdateWorldState(uint32 field, uint32 value)
Update data of a worldstate to all players present in zone.
std::map< uint32, BfCapturePoint * > BfCapturePointMap
typedef of map witch store capturepoint and the associate gameobject entry
Battlefield()
Constructor.
void HandlePlayerEnterZone(Player *player, uint32 zone)
Called when player (player) enter in zone.
uint32 GetTypeId() const
bool CanFlyIn() const
Return if we can use mount in battlefield.
virtual GuidSet::iterator HandlePlayerLeave(Player *player)
uint32 GetCapturePointEntry() const
Definition Battlefield.h:98
virtual bool HandlePlayerEnter(Player *player)
BfCapturePoint(Battlefield *bf)
Definition Battlefield.h:69
Battlefield * m_Bf
virtual ~BfCapturePoint()
Definition Battlefield.h:73
virtual bool Update(uint32 diff)
BattlefieldObjectiveStates m_OldState
bool SetCapturePointData(GameObject *capturePoint)
virtual void ChangeTeam(TeamId)
Definition Battlefield.h:93
TeamId GetTeamId() const
void SendObjectiveComplete(uint32 id, uint64 guid)
bool IsInsideObjective(Player *player) const
GameObject * GetCapturePointGo()
virtual void FillInitialWorldStates(WorldStateBuilder &)
Definition Battlefield.h:75
virtual void SendChangePhase()
void SendUpdateWorldState(uint32 field, uint32 value)
uint32 m_capturePointEntry
uint32 m_neutralValuePct
uint64 m_capturePointGUID
GuidSet m_activePlayers[2]
BattlefieldObjectiveStates m_State
bool HasPlayer(uint64 guid)
void RemovePlayer(uint64 player_guid)
uint64 m_SpiritGuide[2]
GuidSet m_ResurrectQueue
virtual ~BfGraveyard()
BfGraveyard(Battlefield *Bf)
bool HasNpc(uint64 guid)
void AddPlayer(uint64 player_guid)
uint32 m_GraveyardId
void GiveControlTo(TeamId team)
Battlefield * m_Bf
TeamId m_ControlTeam
void SetSpirit(Creature *spirit, TeamId team)
TeamId GetControlTeamId() const
uint32 GetGraveyardId() const
void Initialize(TeamId startcontrol, uint32 gy)
void RelocateDeadPlayers()
float GetDistance(Player *player)
Definition Group.h:147
Definition Map.h:238
Definition Unit.h:1367