TrinityCore
BattlegroundSA.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 "BattlegroundSA.h"
19#include "BattlegroundScore.h"
20#include "Creature.h"
21#include "CreatureAI.h"
22#include "DB2Stores.h"
23#include "GameObject.h"
24#include "GameTime.h"
25#include "Log.h"
26#include "Map.h"
27#include "ObjectAccessor.h"
28#include "ObjectMgr.h"
29#include "Player.h"
30#include "Random.h"
31#include "UpdateData.h"
32#include "WorldStateMgr.h"
33
35{
38};
39
41{
45};
46
48{
55 NPC_DEMOLISHER_SA = 28781
56};
57
59{
60 SPAWN_DEFENDERS = 1399
61};
62
64{
66 DATA_STATUS = 2
67};
68
70{
78};
79
81{
82 { 0.0f, 5.0f, 9.6f, 3.14f },
83 { -6.0f, -3.0f, 8.6f, 0.0f }
84};
85
86BattlegroundSA::BattlegroundSA(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate)
87{
88 StartMessageIds[BG_STARTING_EVENT_FOURTH] = 0; // handle by Kanrethad
89
90 BgObjects.resize(0);
91 BgCreatures.resize(0);
92 TimerEnabled = false;
94 SignaledRoundTwo = false;
96 InitSecondRound = false;
98 TotalTime = 0;
99 EndRoundTimer = 0;
100 ShipsStarted = false;
102
103 for (BG_SA_RoundScore& roundScore : RoundScores)
104 {
105 roundScore.winner = TEAM_ALLIANCE;
106 roundScore.time = 0;
107 }
108
109 _boatGUIDs = { };
110 _staticBombGUIDs = { };
111}
112
114
116{
117 TotalTime = 0;
118 ShipsStarted = false;
120}
121
123{
124 return true;
125}
126
128{
129 for (ObjectGuid const& bombGuid : _dynamicBombGUIDs)
130 if (GameObject* bomb = GetBgMap()->GetGameObject(bombGuid))
131 bomb->Delete();
132
133 _dynamicBombGUIDs.clear();
134
136
137 TotalTime = 0;
138 ShipsStarted = false;
139
142
145
148
151
155
157
158 for (ObjectGuid const& guid : _gateGUIDs)
159 if (GameObject* gate = GetBgMap()->GetGameObject(guid))
160 gate->SetDestructibleState(GO_DESTRUCTIBLE_INTACT, nullptr, true);
161
169
171
173 door->ResetDoorOrButton();
174
176 GetBgMap()->DoOnPlayers([&](Player* player)
177 {
178 SendTransportInit(player);
179 });
180
182 return true;
183}
184
186{
187 if (ShipsStarted)
188 return;
189
190 for (ObjectGuid const& guid : _boatGUIDs[Attackers])
191 {
192 if (GameObject* boat = GetBgMap()->GetGameObject(guid))
193 {
194 boat->SetGoState(GO_STATE_TRANSPORT_STOPPED);
195
196 // make sure every player knows the transport exists & is moving
197 for (auto const& [playerGuid, _] : GetPlayers())
198 {
199 if (Player const* player = ObjectAccessor::FindPlayer(playerGuid))
200 {
201 UpdateData data(player->GetMapId());
202 WorldPacket pkt;
203 boat->BuildValuesUpdateBlockForPlayer(&data, player);
204 data.BuildPacket(&pkt);
205 player->SendDirectMessage(&pkt);
206 }
207 }
208 }
209 }
210
211 ShipsStarted = true;
212}
213
215{
216 if (InitSecondRound)
217 {
218 if (UpdateWaitTimer < diff)
219 {
220 if (!SignaledRoundTwo)
221 {
222 SignaledRoundTwo = true;
223 InitSecondRound = false;
225 }
226 }
227 else
228 {
229 UpdateWaitTimer -= diff;
230 return;
231 }
232 }
233 TotalTime += diff;
234
235 if (Status == BG_SA_WARMUP)
236 {
240 {
241 if (Creature* c = FindKanrethad())
243
244 TotalTime = 0;
245 ToggleTimer();
248 }
250 StartShips();
251 return;
252 }
253 else if (Status == BG_SA_SECOND_WARMUP)
254 {
255 if (RoundScores[0].time<BG_SA_ROUNDLENGTH)
257 else
259
261 if (TotalTime >= 60000)
262 {
263 if (Creature* c = FindKanrethad())
265
266 TotalTime = 0;
267 ToggleTimer();
270 // status was set to STATUS_WAIT_JOIN manually for Preparation, set it back now
272 for (const auto& [playerGuid, bp] : GetPlayers())
273 if (Player* p = ObjectAccessor::FindPlayer(playerGuid))
274 p->RemoveAurasDueToSpell(SPELL_PREPARATION);
275 }
276 if (TotalTime >= 30000)
277 {
279 {
282 }
283 }
284 StartShips();
285 return;
286 }
287 else if (GetStatus() == STATUS_IN_PROGRESS)
288 {
289 if (Status == BG_SA_ROUND_ONE)
290 {
292 {
293 EndRound();
294 return;
295 }
296 }
297 else if (Status == BG_SA_ROUND_TWO)
298 {
300 {
305 if (RoundScores[0].time == RoundScores[1].time)
307 else if (RoundScores[0].time < RoundScores[1].time)
309 else
311 return;
312 }
313 }
314 }
315}
316
318{
319 bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
320 Battleground::AddPlayer(player, queueId);
321
322 SendTransportInit(player);
323
324 if (!isInBattleground)
326}
327
328void BattlegroundSA::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) { }
329
331{
332 for (auto const& [playerGuid, bp] : GetPlayers())
333 {
334 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
335 {
336 // should remove spirit of redemption
337 if (player->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))
338 player->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);
339
340 if (!player->IsAlive())
341 {
342 player->ResurrectPlayer(1.0f);
343 player->SpawnCorpseBones();
344 }
345
346 player->ResetAllPowers();
347 player->CombatStopWithPets(true);
348
349 player->CastSpell(player, SPELL_PREPARATION, true);
350
352 }
353 }
354}
355
356// This function teleports player to entrance position, but it's not implemented correctly
357// It is also used on round swap; which should be handled by the following spells: 52365, 52528, 53464, 53465 (Split Teleport (FACTION) (Boat X))
358// This spell however cannot work with current system because of grid limitations.
359// On battleground start, this function should work fine, except that it is called to late and we need a NearTeleport to solve this.
361{
363 {
364 ObjectGuid const boatGUID = _boatGUIDs[Attackers][urand(0, 1)];
365
366 if (GameObject* boat = GetBgMap()->GetGameObject(boatGUID))
367 {
368 if (TransportBase* transport = boat->ToTransportBase())
369 {
371 transport->AddPassenger(player);
373 float x, y, z, o;
375 transport->CalculatePassengerPosition(x, y, z, &o);
376 player->Relocate(x, y, z, o);
377
378 if (player->IsInWorld())
379 player->NearTeleportTo({ x, y, z, o });
380 }
381 }
382 }
383 else if (WorldSafeLocsEntry const* defenderSpawn = sObjectMgr->GetWorldSafeLoc(SPAWN_DEFENDERS))
384 {
385 if (player->IsInWorld())
386 player->TeleportTo(defenderSpawn->Loc);
387 else
388 player->WorldRelocate(defenderSpawn->Loc);
389 }
390}
391
392void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker /*= nullptr*/)
393{
394 switch (eventId)
395 {
397 for (ObjectGuid const& bombGuid : _staticBombGUIDs[TEAM_ALLIANCE])
398 if (GameObject* bomb = GetBgMap()->GetGameObject(bombGuid))
399 bomb->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
400 break;
402 for (ObjectGuid const& bombGuid : _staticBombGUIDs[TEAM_HORDE])
403 if (GameObject* bomb = GetBgMap()->GetGameObject(bombGuid))
404 bomb->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
405 break;
406 default:
407 break;
408 }
409
410 if (GameObject* go = Object::ToGameObject(obj))
411 {
412 switch (go->GetGoType())
413 {
415 if (invoker)
416 if (eventId == EVENT_TITAN_RELIC_ACTIVATED)
417 TitanRelicActivated(invoker->ToPlayer());
418 break;
420 {
421 if (GateInfo const* gate = GetGate(obj->GetEntry()))
422 {
423 uint32 gateId = gate->GameObjectId;
424
425 // damaged
426 if (eventId == go->GetGOInfo()->destructibleBuilding.DamagedEvent)
427 {
429
430 if (Creature* c = obj->FindNearestCreature(NPC_WORLD_TRIGGER, 500.0f))
431 SendChatMessage(c, gate->DamagedText, invoker);
432
434
435 UpdateWorldState(gate->WorldState, gateState);
436 }
437 // destroyed
438 else if (eventId == go->GetGOInfo()->destructibleBuilding.DestroyedEvent)
439 {
441 if (Creature* c = obj->FindNearestCreature(NPC_WORLD_TRIGGER, 500.0f))
442 SendChatMessage(c, gate->DestroyedText, invoker);
443
445
446 // check if other gate from same line of defense is already destroyed for honor reward
447 bool rewardHonor = true;
448 switch (gateId)
449 {
452 rewardHonor = false;
453 break;
456 rewardHonor = false;
457 break;
460 rewardHonor = false;
461 break;
464 rewardHonor = false;
465 break;
466 default:
467 break;
468 }
469
470 if (invoker)
471 {
472 if (Unit* unit = invoker->ToUnit())
473 {
474 if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
475 {
477 if (rewardHonor)
479 }
480 }
481 }
482
483 if (rewardHonor)
484 MakeObjectsInteractable(gate->LineOfDefense);
485
486 UpdateWorldState(gate->WorldState, gateState);
488 }
489 }
490 break;
491 }
492 default:
493 break;
494 }
495 }
496}
497
499{
500 if (creature->GetEntry() == NPC_DEMOLISHER_SA)
501 {
502 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
505 int32 currentDestroyedVehicles = sWorldStateMgr->GetValue(worldStateId, GetBgMap());
506 UpdateWorldState(worldStateId, currentDestroyedVehicles + 1);
507 }
508}
509
511{
512}
513
515{
516 switch (graveyard)
517 {
521 break;
525 break;
529
532 break;
533 default:
534 break;
535 }
536}
537
539{
540 if (!clicker)
541 return;
542
543 TeamId clickerTeamId = GetTeamIndexByTeamId(GetPlayerTeam(clicker->GetGUID()));
544 if (clickerTeamId == Attackers)
545 {
546 if (clickerTeamId == TEAM_ALLIANCE)
548 else
550
551 if (Status == BG_SA_ROUND_ONE)
552 {
553 EndRound();
554 // Achievement Storm the Beach (1310)
555 for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
556 {
557 if (Player* player = ObjectAccessor::FindPlayer(itr->first))
558 if (GetTeamIndexByTeamId(GetPlayerTeam(player->GetGUID())) == Attackers)
559 player->UpdateCriteria(CriteriaType::BeSpellTarget, 65246);
560 }
561
562 if (Creature* c = FindKanrethad())
564 }
565 else if (Status == BG_SA_ROUND_TWO)
566 {
569 ToggleTimer();
570 // Achievement Storm the Beach (1310)
571 for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
572 {
573 if (Player* player = ObjectAccessor::FindPlayer(itr->first))
574 if (GetTeamIndexByTeamId(GetPlayerTeam(player->GetGUID())) == Attackers && RoundScores[1].winner == Attackers)
575 player->UpdateCriteria(CriteriaType::BeSpellTarget, 65246);
576 }
577
578 if (RoundScores[0].time == RoundScores[1].time)
580 else if (RoundScores[0].time < RoundScores[1].time)
582 else
584 }
585 }
586}
587
589{
592}
593
595{
596 // honor reward for winning
597 if (winner == ALLIANCE)
599 else if (winner == HORDE)
601
602 // complete map_end rewards (even if no team wins)
605
607}
608
610{
611 UpdateData transData(player->GetMapId());
612 for (ObjectGuid const& boatGuid : _boatGUIDs[Attackers])
613 if (GameObject const* boat = GetBgMap()->GetGameObject(boatGuid))
614 boat->BuildCreateUpdateBlockForPlayer(&transData, player);
615
616 WorldPacket packet;
617 transData.BuildPacket(&packet);
618 player->SendDirectMessage(&packet);
619}
620
622{
623 UpdateData transData(player->GetMapId());
624 for (ObjectGuid const& boatGuid : _boatGUIDs[Attackers])
625 if (GameObject const* boat = GetBgMap()->GetGameObject(boatGuid))
626 boat->BuildOutOfRangeUpdateBlock(&transData);
627
628 WorldPacket packet;
629 transData.BuildPacket(&packet);
630 player->SendDirectMessage(&packet);
631}
632
633bool BattlegroundSA::IsGateDestroyed(GateInfo const* gateInfo) const
634{
635 if (!gateInfo)
636 return false;
637
638 int32 value = GetBgMap()->GetWorldStateValue(gateInfo->WorldState);
640}
641
643{
644 if (!graveyardBanner || !player)
645 return;
646
647 TeamId const teamId = GetTeamIndexByTeamId(GetPlayerTeam(player->GetGUID()));
648 // Only attackers can capture graveyard by gameobject action
649 if (teamId != Attackers)
650 return;
651
652 switch (graveyardBanner->GetEntry())
653 {
657 break;
661 break;
665 break;
666 default:
667 break;
668 }
669}
670
672{
673 auto makeInteractable = [&](ObjectGuid const& guid) -> void
674 {
675 if (GameObject* gameObject = GetBgMap()->GetGameObject(guid))
676 gameObject->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
677 };
678
679 switch (defenseLine)
680 {
682 makeInteractable(_graveyardWest);
683 makeInteractable(_graveyardEast);
684 break;
686 makeInteractable(_graveyardCentral);
687 break;
689 break;
691 // make titan orb interactable
693 door->UseDoorOrButton();
694
695 makeInteractable(_titanRelicGUID);
696 break;
697 default:
698 break;
699 }
700}
701
703{
705}
706
708{
710 RoundScores[0].time = std::min<uint32>(TotalTime, BG_SA_ROUNDLENGTH);
711
714 TotalTime = 0;
715 ToggleTimer();
716
717 UpdateWaitTimer = 5000;
718 SignaledRoundTwo = false;
720 InitSecondRound = true;
721 ResetObjs();
723
726
729}
730
732{
734
736 _gateGUIDs.insert(gameobject->GetGUID());
737
738 switch (gameobject->GetEntry())
739 {
740 case BG_SA_BOAT_ONE_A:
741 _boatGUIDs[TEAM_ALLIANCE][0] = gameobject->GetGUID();
742 break;
743 case BG_SA_BOAT_TWO_A:
744 _boatGUIDs[TEAM_ALLIANCE][1] = gameobject->GetGUID();
745 break;
746 case BG_SA_BOAT_ONE_H:
747 _boatGUIDs[TEAM_HORDE][0] = gameobject->GetGUID();
748 break;
749 case BG_SA_BOAT_TWO_H:
750 _boatGUIDs[TEAM_HORDE][1] = gameobject->GetGUID();
751 break;
753 _staticBombGUIDs[TEAM_ALLIANCE].insert(gameobject->GetGUID());
756 break;
758 _staticBombGUIDs[TEAM_HORDE].insert(gameobject->GetGUID());
761 break;
764 _dynamicBombGUIDs.insert(gameobject->GetGUID());
765 break;
768 _graveyardEast = gameobject->GetGUID();
769 break;
772 _graveyardWest = gameobject->GetGUID();
773 break;
776 _graveyardCentral = gameobject->GetGUID();
777 break;
779 _collisionDoorGUID = gameobject->GetGUID();
780 break;
781 case GO_TITAN_RELIC_A:
782 case GO_TITAN_RELIC_H:
783 _titanRelicGUID = gameobject->GetGUID();
784 break;
785 default:
786 break;
787 }
788}
789
791{
792 switch (actionId)
793 {
796 break;
797 default:
798 break;
799 }
800}
801
803{
805
806 switch (creature->GetEntry())
807 {
808 case NPC_DEMOLISHER:
810 break;
813 break;
814 case NPC_KANRETHAD:
815 _kanrethadGUID = creature->GetGUID();
816 break;
820 break;
821 default:
822 break;
823 }
824}
825
827{
829 ResetObjs();
830}
831
833{
834 switch (dataId)
835 {
836 case DATA_ATTACKERS:
837 return Attackers;
838 case DATA_STATUS:
839 return Status;
840 default:
841 return Battleground::GetData(dataId);
842 }
843}
StrandOfTheAncientsData
@ DATA_STATUS
@ DATA_ATTACKERS
StrandOfTheAncientsPvpStats
@ PVP_STAT_GATES_DESTROYED
@ PVP_STAT_DEMOLISHERS_DESTROYED
StrandOfTheAncientsCreatures
@ NPC_RIGGER_SPARKLIGHT
@ NPC_WORLD_TRIGGER
@ NPC_KANRETHAD
@ NPC_GORGRIL_RIGSPARK
@ NPC_ANTIPERSONNEL_CANNON
@ NPC_DEMOLISHER
@ NPC_DEMOLISHER_SA
StrandOfTheAncientsSpawnPositions
@ SPAWN_DEFENDERS
Position const spawnPositionOnTransport[]
StrandOfTheAncientsEvents
@ EVENT_TITAN_RELIC_ACTIVATED
@ EVENT_HORDE_ASSAULT_STARTED
@ EVENT_ALLIANCE_ASSAULT_STARTED
StrandOfTheAncientSpells
@ SPELL_TELEPORT_DEFENDER
@ SPELL_TELEPORT_ATTACKERS
@ SPELL_HORDE_CONTROL_PHASE_SHIFT
@ SPELL_REMOVE_SEAFORIUM
@ SPELL_END_OF_ROUND
@ SPELL_ALLIANCE_CONTROL_PHASE_SHIFT
@ SPELL_CARRYING_SEAFORIUM_CHARGE
@ ACTION_SOTA_CAPTURE_GRAVEYARD
StrandOfTheAncientsGraveyard
@ BG_SA_BOAT_START
@ BG_SA_WARMUPLENGTH
@ BG_SA_ROUNDLENGTH
BG_SA_GateState
@ BG_SA_HORDE_GATE_DAMAGED
@ BG_SA_ALLIANCE_GATE_OK
@ BG_SA_HORDE_GATE_DESTROYED
@ BG_SA_ALLIANCE_GATE_DESTROYED
@ BG_SA_HORDE_GATE_OK
@ BG_SA_ALLIANCE_GATE_DAMAGED
@ BG_SA_ROUND_ONE
@ BG_SA_NOT_STARTED
@ BG_SA_ROUND_TWO
@ BG_SA_SECOND_WARMUP
@ BG_SA_WARMUP
@ BG_SA_BOAT_ONE_H
@ BG_SA_BOAT_TWO_H
@ BG_SA_BOAT_ONE_A
@ BG_SA_BOAT_TWO_A
@ GO_GRAVEYARD_WEST_H
@ GO_GATE_OF_THE_BLUE_SAPPHIRE
@ GO_GATE_OF_THE_RED_SUN
@ GO_GRAVEYARD_CENTRAL_A
@ GO_GRAVEYARD_WEST_A
@ GO_COLLISION_DOOR
@ GO_TITAN_RELIC_H
@ GO_GRAVEYARD_CENTRAL_H
@ GO_GATE_OF_THE_PURPLE_AMETHYST
@ GO_SEAFORIUM_CHARGE_A
@ GO_SEAFORIUM_BOMB_A
@ GO_GRAVEYARD_EAST_A
@ GO_SEAFORIUM_BOMB_H
@ GO_GRAVEYARD_EAST_H
@ GO_SEAFORIUM_CHARGE_H
@ GO_TITAN_RELIC_A
@ GO_GATE_OF_THE_GREEN_EMERALD
@ TEXT_ROUND_1_FINISHED
@ TEXT_SPARKLIGHT_RIGSPARK_SPAWN
@ TEXT_ROUND_STARTED
@ SOUND_WALL_DESTROYED_HORDE
@ SOUND_WALL_ATTACKED_HORDE
@ SOUND_WALL_DESTROYED_ALLIANCE
@ SOUND_WALL_ATTACKED_ALLIANCE
uint32 const BG_SA_Factions[2]
@ BG_SA_DESTROYED_HORDE_VEHICLES
@ BG_SA_TIMER
@ BG_SA_ENABLE_TIMER
@ BG_SA_ANCIENT_GATEWS
@ BG_SA_LEFT_ATT_TOKEN_ALL
@ BG_SA_PURPLE_GATEWS
@ BG_SA_RED_GATEWS
@ BG_SA_BLUE_GATEWS
@ BG_SA_CENTER_GY_ALLIANCE
@ BG_SA_ATTACKER_TEAM
@ BG_SA_RIGHT_ATT_TOKEN_HRD
@ BG_SA_LEFT_GY_ALLIANCE
@ BG_SA_RIGHT_ATT_TOKEN_ALL
@ BG_SA_YELLOW_GATEWS
@ BG_SA_LEFT_GY_HORDE
@ BG_SA_ALLIANCE_DEFENCE_TOKEN
@ BG_SA_DESTROYED_ALLIANCE_VEHICLES
@ BG_SA_RIGHT_GY_ALLIANCE
@ BG_SA_HORDE_DEFENCE_TOKEN
@ BG_SA_LEFT_ATT_TOKEN_HRD
@ BG_SA_CENTER_GY_HORDE
@ BG_SA_GREEN_GATEWS
@ BG_SA_RIGHT_GY_HORDE
@ BG_SA_ALLY_ATTACKS
@ BG_SA_HORDE_ATTACKS
DefenseLine
@ BG_SA_TEXT_ROUND_TWO_START_ONE_MINUTE
@ BG_SA_TEXT_ALLIANCE_CAPTURED_TITAN_PORTAL
@ BG_SA_TEXT_ROUND_TWO_START_HALF_MINUTE
@ BG_SA_TEXT_HORDE_CAPTURED_TITAN_PORTAL
@ SCORE_BONUS_HONOR
@ STATUS_WAIT_JOIN
Definition: Battleground.h:166
@ STATUS_IN_PROGRESS
Definition: Battleground.h:167
@ BG_STARTING_EVENT_FOURTH
Definition: Battleground.h:209
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
#define sObjectMgr
Definition: ObjectMgr.h:1946
@ SPELL_PREPARATION
Definition: PlayerAI.cpp:174
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
@ GAMEOBJECT_TYPE_GOOBER
@ GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ GO_DESTRUCTIBLE_INTACT
Team
@ TEAM_OTHER
@ ALLIANCE
@ HORDE
@ GO_FLAG_NOT_SELECTABLE
@ CHAT_MSG_BG_SYSTEM_ALLIANCE
@ CHAT_MSG_BG_SYSTEM_HORDE
@ CHAT_MSG_BG_SYSTEM_NEUTRAL
@ GO_STATE_TRANSPORT_STOPPED
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
#define sWorldStateMgr
Definition: WorldStateMgr.h:50
bool TimerEnabled
used for know we are in timer phase or not (used for worldstate update)
GateInfo const * GetGate(uint32 entry)
Return GateInfo, relative to bg data, according to gameobject entry.
void SendTransportInit(Player *player)
Send packet to player for create boats (client part)
void ToggleTimer()
Switch on/off timer worldstate.
BG_SA_Status Status
Statu of battle (Start or not, and what round)
void PostUpdateImpl(uint32 diff) override
Called every time for update battle data -Update timer -Round switch.
TeamId Attackers
Id of attacker team.
uint32 EndRoundTimer
Max time of round.
BattlegroundSA(BattlegroundTemplate const *battlegroundTemplate)
bool SignaledRoundTwo
for know if warning about second round start has been sent
void TeleportPlayers() const
Called between the two round -Teleport all players to good location.
uint32 GetData(uint32 dataId) const override
std::array< GuidUnorderedSet, PVP_TEAMS_COUNT > _staticBombGUIDs
void Reset() override
Creature * FindKanrethad() const
void RemovePlayer(Player *player, ObjectGuid guid, uint32 team) override
Called when a player leave battleground.
void OnCreatureCreate(Creature *creature) override
void OnMapSet(BattlegroundMap *map) override
bool SignaledRoundTwoHalfMin
for know if warning about second round start has been sent
ObjectGuid _graveyardCentral
ObjectGuid _collisionDoorGUID
void DestroyGate(Player *player, GameObject *go) override
Called when a gate is destroy -Give honor to player witch destroy it -Update worldstate -Delete gameo...
BG_SA_RoundScore RoundScores[2]
Score of each round.
uint32 UpdateWaitTimer
5secs before starting the 1min countdown for second round
void EndBattleground(Team winner) override
Called on battleground ending.
void DoAction(uint32 actionId, WorldObject *source, WorldObject *target) override
std::array< std::array< ObjectGuid, 2 >, PVP_TEAMS_COUNT > _boatGUIDs
void HandleCaptureGraveyardAction(GameObject *graveyardBanner, Player *player)
void MakeObjectsInteractable(DefenseLine defenseLine)
void OnGameObjectCreate(GameObject *gameobject) override
bool SetupBattleground() override
Called for ini battleground, after that the first player be entered.
bool ShipsStarted
For know if boats has start moving or not yet.
bool InitSecondRound
for know if second round has been init
ObjectGuid _graveyardWest
bool IsGateDestroyed(GateInfo const *gateInfo) const
bool ResetObjs()
Called on setup and between the two round -Delete all gameobject / creature -Respawn all gameobject /...
void AddPlayer(Player *player, BattlegroundQueueTypeId queueId) override
Called when a player join battle.
void CaptureGraveyard(StrandOfTheAncientsGraveyard graveyard, TeamId teamId)
Called when a graveyard is capture -Update spiritguide -Update gameobject (flag) -Update Worldstate -...
GuidUnorderedSet _dynamicBombGUIDs
void TeleportToEntrancePosition(Player *player) const
ObjectGuid _graveyardEast
void TitanRelicActivated(Player *clicker)
Called when a player clicked on relic.
void StartShips()
Called for start ship movement.
void ProcessEvent(WorldObject *, uint32, WorldObject *=nullptr) override
Called when someone activates an event.
void SendTransportsRemove(Player *player)
Send packet to player for destroy boats (client part)
ObjectGuid _kanrethadGUID
void HandleKillUnit(Creature *creature, Unit *killer) override
Called when a player kill a unit in bg.
ObjectGuid _titanRelicGUID
GuidUnorderedSet _gateGUIDs
uint32 TotalTime
Totale elapsed time of current round.
virtual void OnMapSet(BattlegroundMap *map)
Definition: Battleground.h:499
void PlaySoundToAll(uint32 SoundID)
GuidVector BgObjects
Definition: Battleground.h:443
void RewardHonorToTeam(uint32 Honor, Team team)
BattlegroundMap * GetBgMap() const
void RemoveAuraOnTeam(uint32 SpellID, Team team)
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
GuidVector BgCreatures
Definition: Battleground.h:444
void SendChatMessage(Creature *source, uint8 textId, WorldObject *target=nullptr)
static TeamId GetTeamIndexByTeamId(Team team)
Definition: Battleground.h:392
void UpdateWorldState(int32 worldStateId, int32 value, bool hidden=false)
void SetStatus(BattlegroundStatus Status)
Definition: Battleground.h:307
virtual void EndBattleground(Team winner)
bool IsPlayerInBattleground(ObjectGuid guid) const
void SendBroadcastText(uint32 id, ChatMsg msgType, WorldObject const *target=nullptr)
BattlegroundPlayerMap const & GetPlayers() const
Definition: Battleground.h:334
virtual void AddPlayer(Player *player, BattlegroundQueueTypeId queueId)
BattlegroundStatus GetStatus() const
Definition: Battleground.h:284
virtual bool UpdatePlayerScore(Player *player, uint32 type, uint32 value, bool doAddHonor=true)
Team GetPlayerTeam(ObjectGuid guid) const
uint32 GetBonusHonorFromKill(uint32 kills) const
void UpdatePvpStat(Player *player, uint32 pvpStatId, uint32 value)
void CastSpellOnTeam(uint32 SpellID, Team team)
uint32 StartMessageIds[BG_STARTING_EVENT_COUNT]
Definition: Battleground.h:563
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
CreatureAI * AI() const
Definition: Creature.h:214
void RemoveFlag(GameObjectFlags flags)
Definition: GameObject.h:275
GameobjectTypes GetGoType() const
Definition: GameObject.h:279
void UpdateSpawnGroupConditions()
Definition: Map.cpp:2504
void DoOnPlayers(T &&fn)
Definition: Map.h:370
int32 GetWorldStateValue(int32 worldStateId) const
Definition: Map.cpp:460
GameObject * GetGameObject(ObjectGuid const &guid)
Definition: Map.cpp:3489
void UpdateAreaDependentAuras()
Definition: Map.cpp:4015
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3479
static Unit * ToUnit(Object *o)
Definition: Object.h:225
Player * ToPlayer()
Definition: Object.h:215
bool IsInWorld() const
Definition: Object.h:154
GameObject * ToGameObject()
Definition: Object.h:233
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
Definition: Player.cpp:1250
Definition: Unit.h:627
void SetFaction(uint32 faction) override
Definition: Unit.h:859
void NearTeleportTo(Position const &pos, bool casting=false)
Definition: Unit.cpp:12327
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:40
constexpr void WorldRelocate(WorldLocation const &loc)
Definition: Position.h:187
constexpr uint32 GetMapId() const
Definition: Position.h:201
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Object.cpp:2252
MovementInfo m_movementInfo
Definition: Object.h:761
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void OnCreatureCreate(Creature *)
Definition: ZoneScript.h:71
virtual void OnGameObjectCreate(GameObject *)
Definition: ZoneScript.h:74
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
uint32 WorldState
struct MovementInfo::TransportInfo transport
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr void Relocate(float x, float y)
Definition: Position.h:63
uint8 const defenders