TrinityCore
Battlefield.cpp
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#include "Battlefield.h"
19#include "BattlefieldMgr.h"
20#include "Battleground.h"
21#include "BattlegroundPackets.h"
22#include "CellImpl.h"
23#include "CreatureTextMgr.h"
24#include "GameTime.h"
25#include "GridNotifiers.h"
26#include "GridNotifiersImpl.h"
27#include "Group.h"
28#include "GroupMgr.h"
29#include "Log.h"
30#include "Map.h"
31#include "MiscPackets.h"
32#include "ObjectAccessor.h"
33#include "ObjectMgr.h"
34#include <G3D/g3dmath.h>
35
37{
38 m_Timer = 0;
39 m_IsEnabled = true;
40 m_isActive = false;
42
43 m_TypeId = 0;
44 m_BattleId = 0;
45 m_ZoneId = 0;
46 m_Map = map;
47 m_MapId = map->GetId();
48 m_MaxPlayer = 0;
49 m_MinPlayer = 0;
50 m_MinLevel = 0;
51 m_BattleTime = 0;
56
58
60 m_StartGrouping = false;
61}
62
64{
65 for (GraveyardVect::const_iterator itr = m_GraveyardList.begin(); itr != m_GraveyardList.end(); ++itr)
66 delete *itr;
67}
68
69// Called when a player enters the zone
71{
72 // If battle is started,
73 // If not full of players > invite player to join the war
74 // If full of players > announce to player that BF is full and kick him after a few second if he desn't leave
75 if (IsWarTime())
76 {
77 if (m_PlayersInWar[player->GetTeamId()].size() + m_InvitedPlayers[player->GetTeamId()].size() < m_MaxPlayer) // Vacant spaces
78 InvitePlayerToWar(player);
79 else // No more vacant places
80 {
82 m_PlayersWillBeKick[player->GetTeamId()][player->GetGUID()] = GameTime::GetGameTime() + 10;
83 InvitePlayerToQueue(player);
84 }
85 }
86 else
87 {
88 // If time left is < 15 minutes invite player to join queue
90 InvitePlayerToQueue(player);
91 }
92
93 // Add player in the list of player in zone
94 m_players[player->GetTeamId()].insert(player->GetGUID());
95 OnPlayerEnterZone(player);
96}
97
98// Called when a player leave the zone
100{
101 if (IsWarTime())
102 {
103 // If the player is participating to the battle
104 if (m_PlayersInWar[player->GetTeamId()].find(player->GetGUID()) != m_PlayersInWar[player->GetTeamId()].end())
105 {
106 m_PlayersInWar[player->GetTeamId()].erase(player->GetGUID());
107 if (Group* group = player->GetGroup()) // Remove the player from the raid group
108 group->RemoveMember(player->GetGUID());
109
110 OnPlayerLeaveWar(player);
111 }
112 }
113
114 m_InvitedPlayers[player->GetTeamId()].erase(player->GetGUID());
115 m_PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID());
116 m_players[player->GetTeamId()].erase(player->GetGUID());
117 SendRemoveWorldStates(player);
118 OnPlayerLeaveZone(player);
119}
120
122{
123 if (m_Timer <= diff)
124 {
125 // Battlefield ends on time
126 if (IsWarTime())
127 EndBattle(true);
128 else // Time to start a new battle!
129 StartBattle();
130 }
131 else
132 m_Timer -= diff;
133
134 // Invite players a few minutes before the battle's beginning
136 {
137 m_StartGrouping = true;
140 }
141
142 if (IsWarTime())
143 {
144 if (m_uiKickAfkPlayersTimer <= diff)
145 {
148 }
149 else
151
152 // Kick players who chose not to accept invitation to the battle
153 if (m_uiKickDontAcceptTimer <= diff)
154 {
155 time_t now = GameTime::GetGameTime();
156 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
157 for (PlayerTimerMap::iterator itr = m_InvitedPlayers[team].begin(); itr != m_InvitedPlayers[team].end(); ++itr)
158 if (itr->second <= now)
159 KickPlayerFromBattlefield(itr->first);
160
162 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
163 for (PlayerTimerMap::iterator itr = m_PlayersWillBeKick[team].begin(); itr != m_PlayersWillBeKick[team].end(); ++itr)
164 if (itr->second <= now)
165 KickPlayerFromBattlefield(itr->first);
166
168 }
169 else
171 }
172
173 return false;
174}
175
177{
178 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
179 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
180 if (Player* player = ObjectAccessor::FindPlayer(*itr))
181 InvitePlayerToQueue(player);
182}
183
185{
186 if (m_PlayersInQueue[player->GetTeamId()].count(player->GetGUID()))
187 return;
188
189 if (m_PlayersInQueue[player->GetTeamId()].size() <= m_MinPlayer || m_PlayersInQueue[GetOtherTeam(player->GetTeamId())].size() >= m_MinPlayer)
191}
192
194{
195 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
196 {
197 for (auto itr = m_PlayersInQueue[team].begin(); itr != m_PlayersInQueue[team].end(); ++itr)
198 {
199 if (Player* player = ObjectAccessor::FindPlayer(*itr))
200 {
201 if (m_PlayersInWar[player->GetTeamId()].size() + m_InvitedPlayers[player->GetTeamId()].size() < m_MaxPlayer)
202 InvitePlayerToWar(player);
203 else
204 {
205 //Full
206 }
207 }
208 }
209 m_PlayersInQueue[team].clear();
210 }
211}
212
214{
215 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
216 {
217 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
218 {
219 if (Player* player = ObjectAccessor::FindPlayer(*itr))
220 {
221 if (m_PlayersInWar[player->GetTeamId()].count(player->GetGUID()) || m_InvitedPlayers[player->GetTeamId()].count(player->GetGUID()))
222 continue;
223 if (m_PlayersInWar[player->GetTeamId()].size() + m_InvitedPlayers[player->GetTeamId()].size() < m_MaxPlayer)
224 InvitePlayerToWar(player);
225 else // Battlefield is full of players
226 m_PlayersWillBeKick[player->GetTeamId()][player->GetGUID()] = GameTime::GetGameTime() + 10;
227 }
228 }
229 }
230}
231
233{
234 return MAKE_PAIR64(m_BattleId | 0x20000, 0x1F100000);
235}
236
238{
239 if (!player)
240 return;
241
243 if (player->IsInFlight())
244 return;
245
246 if (player->InArena() || player->GetBattleground())
247 {
248 m_PlayersInQueue[player->GetTeamId()].erase(player->GetGUID());
249 return;
250 }
251
252 // If the player does not match minimal level requirements for the battlefield, kick him
253 if (player->GetLevel() < m_MinLevel)
254 {
255 if (m_PlayersWillBeKick[player->GetTeamId()].count(player->GetGUID()) == 0)
256 m_PlayersWillBeKick[player->GetTeamId()][player->GetGUID()] = GameTime::GetGameTime() + 10;
257 return;
258 }
259
260 // Check if player is not already in war
261 if (m_PlayersInWar[player->GetTeamId()].count(player->GetGUID()) || m_InvitedPlayers[player->GetTeamId()].count(player->GetGUID()))
262 return;
263
264 m_PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID());
267}
268
270{
271 if (Creature* creature = SpawnCreature(entry, pos))
272 StalkerGuid = creature->GetGUID();
273 else
274 TC_LOG_ERROR("bg.battlefield", "Battlefield::InitStalker: Could not spawn Stalker (Creature entry {}), zone messages will be unavailable!", entry);
275}
276
278{
279 ZoneScript::ProcessEvent(target, eventId, invoker);
280
281 if (invoker)
282 {
283 if (GameObject* gameobject = invoker->ToGameObject())
284 {
285 if (gameobject->GetGoType() == GAMEOBJECT_TYPE_CONTROL_ZONE)
286 {
287 if (!ControlZoneHandlers.contains(gameobject->GetEntry()))
288 return;
289
290 auto controlzone = gameobject->GetGOInfo()->controlZone;
292 if (eventId == controlzone.CaptureEventAlliance)
293 handler.HandleCaptureEventAlliance(gameobject);
294 else if (eventId == controlzone.CaptureEventHorde)
295 handler.HandleCaptureEventHorde(gameobject);
296 else if (eventId == controlzone.ContestedEventAlliance)
297 handler.HandleContestedEventAlliance(gameobject);
298 else if (eventId == controlzone.ContestedEventHorde)
299 handler.HandleContestedEventHorde(gameobject);
300 else if (eventId == controlzone.NeutralEventAlliance)
301 handler.HandleNeutralEventAlliance(gameobject);
302 else if (eventId == controlzone.NeutralEventHorde)
303 handler.HandleNeutralEventHorde(gameobject);
304 else if (eventId == controlzone.ProgressEventAlliance)
305 handler.HandleProgressEventAlliance(gameobject);
306 else if (eventId == controlzone.ProgressEventHorde)
307 handler.HandleProgressEventHorde(gameobject);
308 }
309 }
310 }
311}
312
314{
315 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
316 for (auto itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr)
317 if (Player* player = ObjectAccessor::FindPlayer(*itr))
318 if (player->isAFK())
320}
321
323{
324 if (Player* player = ObjectAccessor::FindPlayer(guid))
325 if (player->GetZoneId() == GetZoneId())
326 player->TeleportTo(KickPosition);
327}
328
330{
331 if (m_isActive)
332 return;
333
334 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
335 {
336 m_PlayersInWar[team].clear();
337 m_Groups[team].clear();
338 }
339
341 m_isActive = true;
342
345
347}
348
349void Battlefield::EndBattle(bool endByTimer)
350{
351 if (!m_isActive)
352 return;
353
354 m_isActive = false;
355
356 m_StartGrouping = false;
357
358 if (!endByTimer)
360
361 // Reset battlefield timer
363
364 OnBattleEnd(endByTimer);
365}
366
368{
370}
371
373{
374 return m_players[player->GetTeamId()].find(player->GetGUID()) != m_players[player->GetTeamId()].end();
375}
376
377// Called in Battlefield::InvitePlayerToQueue
379{
380 // Add player in queue
381 m_PlayersInQueue[player->GetTeamId()].insert(player->GetGUID());
382}
383
384// Called in WorldSession::HandleBfExitRequest
386{
387 // Remove player from queue
388 m_PlayersInQueue[player->GetTeamId()].erase(player->GetGUID());
389}
390
391// Called in WorldSession::HandleHearthAndResurrect
393{
394 // Player leaving Wintergrasp, teleport to Dalaran.
395 // ToDo: confirm teleport destination.
396 player->TeleportTo(571, 5804.1499f, 624.7710f, 647.7670f, 1.6400f);
397}
398
399// Called in Battlefield::InvitePlayerToWar
401{
402 if (!IsWarTime())
403 return;
404
406 {
407 m_PlayersInWar[player->GetTeamId()].insert(player->GetGUID());
408 m_InvitedPlayers[player->GetTeamId()].erase(player->GetGUID());
409
410 if (player->isAFK())
411 player->ToggleAFK();
412
413 OnPlayerJoinWar(player); //for scripting
414 }
415}
416
418{
419 if (spellId > 0)
420 {
421 for (auto itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr)
422 if (Player* player = ObjectAccessor::FindPlayer(*itr))
423 player->CastSpell(player, uint32(spellId), true);
424 }
425 else
426 {
427 for (auto itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr)
428 if (Player* player = ObjectAccessor::FindPlayer(*itr))
429 player->RemoveAuraFromStack(uint32(-spellId));
430 }
431}
432
434{
435 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
436 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
437 if (Player* player = ObjectAccessor::FindPlayer(*itr))
438 player->SendDirectMessage(data);
439}
440
442{
443 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
444 for (auto itr = m_PlayersInQueue[team].begin(); itr != m_PlayersInQueue[team].end(); ++itr)
446 player->SendDirectMessage(data);
447}
448
450{
451 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
452 for (auto itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr)
453 if (Player* player = ObjectAccessor::FindPlayer(*itr))
454 player->SendDirectMessage(data);
455}
456
457void Battlefield::SendWarning(uint8 id, WorldObject const* target /*= nullptr*/)
458{
459 if (Creature* stalker = GetCreature(StalkerGuid))
460 sCreatureTextMgr->SendChat(stalker, id, target);
461}
462
464{
465 sBattlefieldMgr->AddZone(zoneId, this);
466}
467
469{
470 creature->CombatStop();
471 creature->SetReactState(REACT_PASSIVE);
473 creature->SetUninteractible(true);
474 creature->DisappearAndDie();
475 creature->SetVisible(false);
476}
477
478void Battlefield::ShowNpc(Creature* creature, bool aggressive)
479{
480 creature->SetVisible(true);
482 creature->SetUninteractible(false);
483 if (!creature->IsAlive())
484 creature->Respawn(true);
485 if (aggressive)
487 else
488 {
490 creature->SetReactState(REACT_PASSIVE);
491 }
492}
493
494// ****************************************************
495// ******************* Group System *******************
496// ****************************************************
498{
499 for (auto itr = m_Groups[TeamId].begin(); itr != m_Groups[TeamId].end(); ++itr)
500 if (Group* group = sGroupMgr->GetGroupByGUID(*itr))
501 if (!group->IsFull())
502 return group;
503
504 return nullptr;
505}
506
508{
509 for (auto itr = m_Groups[TeamId].begin(); itr != m_Groups[TeamId].end(); ++itr)
510 if (Group* group = sGroupMgr->GetGroupByGUID(*itr))
511 if (group->IsMember(guid))
512 return group;
513
514 return nullptr;
515}
516
518{
519 if (!player->IsInWorld())
520 return false;
521
522 if (Group* group = player->GetGroup())
523 group->RemoveMember(player->GetGUID());
524
525 Group* group = GetFreeBfRaid(player->GetTeamId());
526 if (!group)
527 {
528 group = new Group;
529 group->SetBattlefieldGroup(this);
530 group->Create(player);
531 sGroupMgr->AddGroup(group);
532 m_Groups[player->GetTeamId()].insert(group->GetGUID());
533 }
534 else if (group->IsMember(player->GetGUID()))
535 {
536 uint8 subgroup = group->GetMemberGroup(player->GetGUID());
537 player->SetBattlegroundOrBattlefieldRaid(group, subgroup);
538 }
539 else
540 group->AddMember(player);
541
542 return true;
543}
544
545//***************End of Group System*******************
546
547//*****************************************************
548//***************Spirit Guide System*******************
549//*****************************************************
550
551//--------------------
552//-Battlefield Method-
553//--------------------
555{
556 if (id < m_GraveyardList.size())
557 {
558 if (BfGraveyard* graveyard = m_GraveyardList.at(id))
559 return graveyard;
560 else
561 TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:{} does not exist.", id);
562 }
563 else
564 TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:{} could not be found.", id);
565
566 return nullptr;
567}
568
570{
571 BfGraveyard* closestGY = nullptr;
572 float maxdist = -1;
573 for (uint8 i = 0; i < m_GraveyardList.size(); i++)
574 {
575 if (m_GraveyardList[i])
576 {
577 if (m_GraveyardList[i]->GetControlTeamId() != player->GetTeamId())
578 continue;
579
580 float dist = m_GraveyardList[i]->GetDistance(player);
581 if (dist < maxdist || maxdist < 0)
582 {
583 closestGY = m_GraveyardList[i];
584 maxdist = dist;
585 }
586 }
587 }
588
589 if (closestGY)
590 return sObjectMgr->GetWorldSafeLoc(closestGY->GetGraveyardId());
591
592 return nullptr;
593}
594
595// ----------------------
596// - BfGraveyard Method -
597// ----------------------
599{
600 m_Bf = battlefield;
601 m_GraveyardId = 0;
603}
604
605void BfGraveyard::Initialize(TeamId startControl, uint32 graveyardId)
606{
607 m_ControlTeam = startControl;
608 m_GraveyardId = graveyardId;
609}
610
612{
613 if (!spirit)
614 {
615 TC_LOG_ERROR("bg.battlefield", "BfGraveyard::SetSpirit: Invalid Spirit.");
616 return;
617 }
618
619 m_SpiritGuide[team] = spirit->GetGUID();
621}
622
624{
625 WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(m_GraveyardId);
626 return player->GetDistance2d(safeLoc->Loc.GetPositionX(), safeLoc->Loc.GetPositionY());
627}
628
629// For changing graveyard control
631{
632 // Guide switching
633 // Note: Visiblity changes are made by phasing
634 /*if (m_SpiritGuide[1 - team])
635 m_SpiritGuide[1 - team]->SetVisible(false);
636 if (m_SpiritGuide[team])
637 m_SpiritGuide[team]->SetVisible(true);*/
638
639 if (Creature* spiritHealer = m_Bf->GetCreature(m_SpiritGuide[team]))
640 spiritHealer->SummonGraveyardTeleporter();
641
642 m_ControlTeam = team;
643}
644
646{
648 return false;
649
652 return false;
653
654 return (m_SpiritGuide[TEAM_ALLIANCE] == guid || m_SpiritGuide[TEAM_HORDE] == guid);
655}
656
657// *******************************************************
658// *************** End Spirit Guide system ***************
659// *******************************************************
660// ********************** Misc ***************************
661// *******************************************************
662
664{
665 if (!sObjectMgr->GetCreatureTemplate(entry))
666 {
667 TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: entry {} does not exist.", entry);
668 return nullptr;
669 }
670
671 Creature* creature = Creature::CreateCreature(entry, m_Map, pos);
672 if (!creature)
673 {
674 TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Can't create creature entry: {}", entry);
675 return nullptr;
676 }
677
678 creature->SetHomePosition(pos);
679
680 // Set creature in world
681 m_Map->AddToMap(creature);
682 creature->setActive(true);
683 creature->SetFarVisible(true);
684
685 return creature;
686}
687
688// Method for spawning gameobject on map
690{
691 if (!sObjectMgr->GetGameObjectTemplate(entry))
692 {
693 TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: GameObject template {} not found in database! Battlefield not created!", entry);
694 return nullptr;
695 }
696
697 // Create gameobject
698 GameObject* go = GameObject::CreateGameObject(entry, m_Map, pos, rot, 255, GO_STATE_READY);
699 if (!go)
700 {
701 TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Could not create gameobject template {}! Battlefield has not been created!", entry);
702 return nullptr;
703 }
704
705 // Add to world
706 m_Map->AddToMap(go);
707 go->setActive(true);
708 go->SetFarVisible(true);
709
710 return go;
711}
712
714{
715 if (!m_Map)
716 return nullptr;
717 return m_Map->GetCreature(guid);
718}
719
721{
722 if (!m_Map)
723 return nullptr;
724 return m_Map->GetGameObject(guid);
725}
726
727// *******************************************************
728// ******************* CapturePoint **********************
729// *******************************************************
730
732{
733}
734
736{
737 return _battlefield;
738}
#define sBattlefieldMgr
#define sCreatureTextMgr
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
#define sGroupMgr
Definition: GroupMgr.h:61
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
uint64 MAKE_PAIR64(uint32 l, uint32 h)
Definition: ObjectDefines.h:87
#define sObjectMgr
Definition: ObjectMgr.h:1946
@ GAMEOBJECT_TYPE_CONTROL_ZONE
TeamId
@ TEAM_NEUTRAL
@ TEAM_ALLIANCE
@ TEAM_HORDE
uint8 constexpr PVP_TEAMS_COUNT
@ GO_STATE_READY
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
static Summons Group[]
Definition: boss_urom.cpp:83
BattlefieldControlZoneHandler(Battlefield *bf)
uint32 m_Timer
Definition: Battlefield.h:300
uint32 m_MapId
Definition: Battlefield.h:319
GameObject * SpawnGameObject(uint32 entry, Position const &pos, QuaternionData const &rot)
void ProcessEvent(WorldObject *target, uint32 eventId, WorldObject *invoker) override
GraveyardVect m_GraveyardList
Definition: Battlefield.h:334
GameObject * GetGameObject(ObjectGuid guid)
void BroadcastPacketToWar(WorldPacket const *data) const
void ShowNpc(Creature *creature, bool aggressive)
Creature * GetCreature(ObjectGuid guid)
void DoPlaySoundToAll(uint32 SoundID)
uint32 m_MaxPlayer
Definition: Battlefield.h:321
ObjectGuid StalkerGuid
Definition: Battlefield.h:299
Creature * SpawnCreature(uint32 entry, Position const &pos)
void BroadcastPacketToZone(WorldPacket const *data) const
uint32 m_NoWarBattleTime
Definition: Battlefield.h:325
virtual ~Battlefield()
Destructor.
Definition: Battlefield.cpp:63
void EndBattle(bool endByTimer)
virtual void OnBattleEnd(bool)
Called at the end of battle.
Definition: Battlefield.h:254
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
void InitStalker(uint32 entry, Position const &pos)
uint32 m_TypeId
Definition: Battlefield.h:316
uint32 m_BattleId
Definition: Battlefield.h:317
void InvitePlayersInQueueToWar()
Invite all players in queue to join battle on battle start.
virtual void SendRemoveWorldStates(Player *)
Definition: Battlefield.h:347
uint32 m_StartGroupingTimer
Definition: Battlefield.h:336
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()
void KickPlayerFromBattlefield(ObjectGuid guid)
Kick player from battlefield and teleport him to kick-point location.
void InvitePlayerToQueue(Player *player)
void RegisterZone(uint32 zoneid)
void SetDefenderTeam(TeamId team)
Definition: Battlefield.h:222
TeamId m_DefenderTeam
Definition: Battlefield.h:303
void InvitePlayerToWar(Player *player)
uint32 m_uiKickAfkPlayersTimer
Definition: Battlefield.h:331
void PlayerAcceptInviteToWar(Player *player)
void BroadcastPacketToQueue(WorldPacket const *data) const
void SendWarning(uint8 id, WorldObject const *target=nullptr)
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.
Definition: Battlefield.h:258
uint32 m_TimeForAcceptInvite
Definition: Battlefield.h:327
BfGraveyard * GetGraveyardById(uint32 id) const
virtual void OnBattleStart()
Called on start.
Definition: Battlefield.h:252
GuidUnorderedSet m_PlayersInWar[PVP_TEAMS_COUNT]
Definition: Battlefield.h:311
uint64 GetQueueId() const
void InvitePlayersInZoneToWar()
Invite all players in zone to join battle on battle start.
void HideNpc(Creature *creature)
PlayerTimerMap m_PlayersWillBeKick[PVP_TEAMS_COUNT]
Definition: Battlefield.h:313
uint32 m_RestartAfterCrash
Definition: Battlefield.h:326
TeamId GetAttackerTeam() const
Definition: Battlefield.h:220
uint32 m_MinLevel
Definition: Battlefield.h:323
GuidUnorderedSet m_PlayersInQueue[PVP_TEAMS_COUNT]
Definition: Battlefield.h:310
bool AddOrSetPlayerToCorrectBfGroup(Player *player)
Force player to join a battlefield group.
void KickAfkPlayers()
void PlayerAskToLeave(Player *player)
void TeamCastSpell(TeamId team, int32 spellId)
uint32 m_MinPlayer
Definition: Battlefield.h:322
virtual void OnPlayerLeaveZone(Player *)
Called when a player leave battlefield zone.
Definition: Battlefield.h:262
void PlayerAcceptInviteToQueue(Player *player)
Group * GetGroupPlayer(ObjectGuid guid, TeamId TeamId)
Return battlefield group where player is.
uint32 m_uiKickDontAcceptTimer
Definition: Battlefield.h:328
bool m_IsEnabled
Definition: Battlefield.h:301
ControlZoneHandlerMap ControlZoneHandlers
Definition: Battlefield.h:306
GuidUnorderedSet m_Groups[PVP_TEAMS_COUNT]
Definition: Battlefield.h:339
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
PlayerTimerMap m_InvitedPlayers[PVP_TEAMS_COUNT]
Definition: Battlefield.h:312
bool HasPlayer(Player *player) const
void AskToLeaveQueue(Player *player)
TeamId GetOtherTeam(TeamId team) const
Definition: Battlefield.h:221
bool m_isActive
Definition: Battlefield.h:302
Battlefield(Map *map)
Constructor.
Definition: Battlefield.cpp:36
WorldSafeLocsEntry const * GetClosestGraveyard(Player *player)
void HandlePlayerLeaveZone(Player *player, uint32 zone)
Called when player (player) leave the zone.
Definition: Battlefield.cpp:99
virtual void OnPlayerEnterZone(Player *)
Called when a player enter in battlefield zone.
Definition: Battlefield.h:264
GuidUnorderedSet m_players[PVP_TEAMS_COUNT]
Definition: Battlefield.h:309
void HandlePlayerEnterZone(Player *player, uint32 zone)
Called when player (player) enter in zone.
Definition: Battlefield.cpp:70
ObjectGuid m_SpiritGuide[PVP_TEAMS_COUNT]
Definition: Battlefield.h:136
BfGraveyard(Battlefield *Bf)
bool HasNpc(ObjectGuid guid)
uint32 m_GraveyardId
Definition: Battlefield.h:135
void GiveControlTo(TeamId team)
Battlefield * m_Bf
Definition: Battlefield.h:137
TeamId m_ControlTeam
Definition: Battlefield.h:134
void SetSpirit(Creature *spirit, TeamId team)
uint32 GetGraveyardId() const
Definition: Battlefield.h:131
void Initialize(TeamId startcontrol, uint32 gy)
float GetDistance(Player *player)
virtual void HandleNeutralEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:53
virtual void HandleProgressEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:52
virtual void HandleContestedEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:50
virtual void HandleNeutralEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:54
virtual void HandleCaptureEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:47
virtual void HandleProgressEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:51
virtual void HandleContestedEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:49
virtual void HandleCaptureEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:48
void SetHomePosition(float x, float y, float z, float o)
Definition: Creature.h:371
void Respawn(bool force=false)
Definition: Creature.cpp:2303
static Creature * CreateCreature(uint32 entry, Map *map, Position const &pos, uint32 vehId=0)
Definition: Creature.cpp:1177
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DisappearAndDie()
Definition: Creature.h:83
static GameObject * CreateGameObject(uint32 entry, Map *map, Position const &pos, QuaternionData const &rotation, uint32 animProgress, GOState goState, uint32 artKit=0)
Definition: Group.h:197
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:1742
void SetBattlefieldGroup(Battlefield *bf)
Definition: Group.cpp:1755
bool AddMember(Player *player)
Definition: Group.cpp:426
ObjectGuid GetGUID() const
Definition: Group.cpp:1663
bool IsMember(ObjectGuid guid) const
Definition: Group.cpp:1695
bool Create(Player *leader)
Definition: Group.cpp:141
Definition: Map.h:189
bool AddToMap(T *)
Definition: Map.cpp:550
GameObject * GetGameObject(ObjectGuid const &guid)
Definition: Map.cpp:3489
uint32 GetId() const
Definition: Map.cpp:3228
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3479
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
bool IsInWorld() const
Definition: Object.h:154
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
Definition: Player.cpp:1250
TeamId GetTeamId() const
Definition: Player.h:2236
Battleground * GetBattleground() const
Definition: Player.cpp:24976
void ToggleAFK()
Definition: Player.cpp:1214
bool InArena() const
Definition: Player.cpp:25106
Group * GetGroup(Optional< uint8 > partyIndex)
Definition: Player.h:2606
bool isAFK() const
Definition: Player.h:1156
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
Definition: Player.cpp:25987
void SetVisible(bool x)
Definition: Unit.cpp:8351
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition: Unit.cpp:5827
bool IsAlive() const
Definition: Unit.h:1164
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
bool IsInFlight() const
Definition: Unit.h:1012
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
uint8 GetLevel() const
Definition: Unit.h:746
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
void setActive(bool isActiveObject)
Definition: Object.cpp:922
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
void SetFarVisible(bool on)
Definition: Object.cpp:973
virtual void ProcessEvent(WorldObject *, uint32, WorldObject *)
Definition: ZoneScript.h:95
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
WorldLocation Loc
Definition: ObjectMgr.h:835