TrinityCore
BattlefieldTB.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// TO-DO:
19// - Implement proper support for vehicles (Player::VehicleSpellInitialize())
20// - Siege Engine Turret (45564) crashing server (Auras: Unknown Shapeshift Type: 24)
21// - Graveyard spirit phasing, ressurection, Spiritual Immunity aura for players nearby
22// - Warn and teleport players out of the Baradin Hold instance (need sniffs; spell 94964?)
23// - Not sure, but players should probably be able to ressurect from guide spirits when there's no battle
24// - Check and script achievements
25
26#include "BattlefieldTB.h"
27#include "AchievementMgr.h"
28#include "Battleground.h"
29#include "CreatureTextMgr.h"
30#include "GameObject.h"
31#include "GameTime.h"
32#include "ObjectAccessor.h"
33#include "Player.h"
34#include "Random.h"
35#include "ScriptMgr.h"
36#include "TemporarySummon.h"
37#include "World.h"
38#include "WorldStateMgr.h"
39
41
43{
44 m_TypeId = BATTLEFIELD_TB; // See enum BattlefieldTypes
47
49
58
61 m_StartGrouping = false;
62 m_isActive = false;
63
64 KickPosition.Relocate(-605.5f, 1181.31f, 95.96f, 6.177155f);
66
68
70
73
74 // Was there a battle going on or time isn't set yet? Then use m_RestartAfterCrash
76 {
77 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
79 }
80
81 // Set timer
83
84 // Defending team isn't set yet? Choose randomly.
87
88 // Set defender team
90
93
99
100 // Create capture points
101 for (uint8 i = 0; i < TB_BASE_COUNT; i++)
102 {
103 //Spawn flag pole
104 if (GameObject* go = SpawnGameObject(TBCapturePoints[i].entryFlagPole[GetDefenderTeam()], TBCapturePoints[i].pos, QuaternionData::fromEulerAnglesZYX(TBCapturePoints[i].pos.GetOrientation(), 0.0f, 0.0f)))
105 {
106 std::unique_ptr<TolBaradCapturePoint> controlZone = std::make_unique<TolBaradCapturePoint>(this, TBCapturePoints[i]);
108 {
109 sWorldStateMgr->SetValue(controlZone->GetWorldStateAllianceControlled(), 1, false, GetMap());
110 go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(100));
111 go->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
112 }
113 else if (GetDefenderTeam() == TEAM_HORDE)
114 {
115 sWorldStateMgr->SetValue(controlZone->GetWorldStateHordeControlled(), 1, false, GetMap());
116 go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(0));
117 go->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
118 }
119
120 ControlZoneHandlers[go->GetEntry()] = std::move(controlZone);
121 }
122 }
123
124 // Spawn towers
125 for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
126 if (GameObject* go = SpawnGameObject(TBTowers[i].entry, TBTowers[i].pos, QuaternionData::fromEulerAnglesZYX(TBTowers[i].pos.GetOrientation(), 0.0f, 0.0f)))
127 Towers.insert(go->GetGUID());
128
129 // Init Graveyards
131
132 // Graveyards
133 for (uint8 i = 0; i < BATTLEFIELD_TB_GRAVEYARD_MAX; i++)
134 {
135 BfGraveyard* graveyard = new BfGraveyard(this);
136
137 // When between games, the graveyard is controlled by the defending team
138 graveyard->Initialize(GetDefenderTeam(), TBGraveyards[i].gyid);
139
140 // Spawn spirits
141 for (uint8 team = 0; team < 2; team++)
142 if (Creature* creature = SpawnCreature(TBGraveyards[i].spiritEntry[team], TBGraveyards[i].pos))
143 graveyard->SetSpirit(creature, TeamId(team));
144
145 m_GraveyardList[i] = graveyard;
146 }
147
148 // Time warning vars
149 warnedFiveMinutes = false;
150 warnedTwoMinutes = false;
151 warnedOneMinute = false;
152
154
155 return true;
156}
157
159{
160 bool m_return = Battlefield::Update(diff);
161
162 // Minutes till battle preparation warnings
164 {
166 {
167 warnedFiveMinutes = true;
169 }
170
172 {
173 warnedTwoMinutes = true;
175 }
176
178 {
179 warnedOneMinute = true;
181 }
182 }
183
185 {
186 if (m_updateObjectsTimer <= diff)
187 {
190 }
191 else
192 m_updateObjectsTimer -= diff;
193 }
194
195 return m_return;
196}
197
199{
200 if (!m_isActive)
201 RemoveAurasFromPlayer(player);
202}
203
205{
206 if (!m_isActive)
207 RemoveAurasFromPlayer(player);
208}
209
211{
212 RemoveAurasFromPlayer(player);
213
214 player->SetPvP(true);
215
216 // Bonus damage buff for attackers
217 if (player->GetTeamId() == GetAttackerTeam())
218 {
219 int32 towersDestroyed = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, m_Map);
220 if (towersDestroyed > 0)
222 }
223}
224
226{
227 RemoveAurasFromPlayer(player);
228}
229
231{
236}
237
239{
241
243
244 // Teleport players out of questing area
245 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
246 for (ObjectGuid const& guid : m_players[team])
247 if (Player* player = ObjectAccessor::FindPlayer(guid))
248 if (player->GetAreaId() == TBQuestAreas[m_iCellblockRandom].entry)
249 player->CastSpell(player, TBQuestAreas[m_iCellblockRandom].teleportSpell, true);
250
251 // Should we also teleport players out of Baradin Hold underground area?
252}
253
255{
257
259
262
264 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, 0, false, m_Map);
265
268
271
274
277
279 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 1, false, m_Map);
280
281 // Towers/spires
282 for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
283 {
284 sWorldStateMgr->SetValue(TBTowers[i].wsIntact[GetDefenderTeam()], 1, false, m_Map);
285 sWorldStateMgr->SetValue(TBTowers[i].wsDamaged[GetDefenderTeam()], 0, false, m_Map);
286 sWorldStateMgr->SetValue(TBTowers[i].wsDestroyed, 0, false, m_Map);
287 sWorldStateMgr->SetValue(TBTowers[i].wsDamaged[GetAttackerTeam()], 0, false, m_Map);
288 sWorldStateMgr->SetValue(TBTowers[i].wsIntact[GetAttackerTeam()], 0, false, m_Map);
289 }
290}
291
292void BattlefieldTB::OnBattleEnd(bool endByTimer)
293{
294 if (!endByTimer) // Attackers win (but now they are defenders already)
296 else // Defenders win
298
299 // UpdateNPCsAndGameObjects() must be called 1 minute after battle ends
301 updatedNPCAndObjects = false;
302
303 // Complete quest
305
306 // Rewards
308 for (uint32 i = 0; i < GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT); i++) // Unsure, for each intact tower or only once for having any tower intact?
311
312 for (uint8 team = 0; team < 2; ++team)
313 {
314 for (ObjectGuid const& guid : m_PlayersInWar[team])
315 if (Player* player = ObjectAccessor::FindPlayer(guid))
316 RemoveAurasFromPlayer(player);
317
318 m_PlayersInWar[team].clear();
319 }
320
321 // Reset time warning vars
322 warnedFiveMinutes = false;
323 warnedTwoMinutes = false;
324 warnedOneMinute = false;
325
328
331
334
340
342
343 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
344}
345
347{
348 for (ObjectGuid guid : BattleInactiveNPCs)
349 if (Creature* creature = GetCreature(guid))
350 HideNpc(creature);
351
352 for (ObjectGuid guid : BattleInactiveGOs)
353 if (GameObject* gameobject = GetGameObject(guid))
354 gameobject->SetRespawnTime(RESPAWN_ONE_DAY);
355
356 for (ObjectGuid guid : TemporaryNPCs)
357 if (Creature* creature = GetCreature(guid))
358 creature->RemoveFromWorld();
359 TemporaryNPCs.clear();
360
361 for (ObjectGuid guid : TemporaryGOs)
362 if (GameObject* gameobject = GetGameObject(guid))
363 gameobject->Delete();
364 TemporaryGOs.clear();
365
366 // Tol Barad gates - closed during warmup
368 gates->SetGoState(GetState() == BATTLEFIELD_WARMUP ? GO_STATE_READY : GO_STATE_ACTIVE);
369
370 // Baradin Hold door - open when inactive
373
374 // Decide which cellblock and questgiver will be active.
376
377 // To The Hole gate
380
381 // D-Block gate
384
385 // Cursed Depths gate
388
390 {
391 // Delete capture points
392 ControlZoneHandlers.clear();
393
394 // Create capture points
395 for (uint8 i = 0; i < TB_BASE_COUNT; i++)
396 {
397 if (GameObject* go = SpawnGameObject(TBCapturePoints[i].entryFlagPole[GetDefenderTeam()], TBCapturePoints[i].pos, QuaternionData::fromEulerAnglesZYX(TBCapturePoints[i].pos.GetOrientation(), 0.0f, 0.0f)))
398 {
399 std::unique_ptr<TolBaradCapturePoint> controlZone = std::make_unique<TolBaradCapturePoint>(this, TBCapturePoints[i]);
401 {
402 sWorldStateMgr->SetValue(controlZone->GetWorldStateAllianceControlled(), 1, false, GetMap());
403 go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(100));
404 go->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
405 }
406 else if (GetDefenderTeam() == TEAM_HORDE)
407 {
408 sWorldStateMgr->SetValue(controlZone->GetWorldStateHordeControlled(), 1, false, GetMap());
409 go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(0));
410 go->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
411 }
412
413 ControlZoneHandlers[go->GetEntry()] = std::move(controlZone);
414 }
415 }
416
417 for (ObjectGuid guid : BattleInactiveNPCs)
418 if (Creature* creature = GetCreature(guid))
419 ShowNpc(creature, true);
420
421 for (ObjectGuid guid : BattleInactiveGOs)
422 if (GameObject* gameobject = GetGameObject(guid))
423 gameobject->SetRespawnTime(RESPAWN_IMMEDIATELY);
424
425 for (uint8 i = 0; i < TB_QUEST_INFANTRY_MAX; i++)
426 {
428 if (Creature* creature = SpawnCreature(entry, TBQuestInfantrySpawnData[i]))
429 TemporaryNPCs.insert(creature->GetGUID());
430 }
431
432 for (uint8 i = 0; i < TB_GUARDS_MAX; i++)
434 TemporaryNPCs.insert(creature->GetGUID());
435
436 for (uint8 i = 0; i < TB_FACTION_NPC_MAX; i++)
437 if (Creature* creature = SpawnCreature(GetDefenderTeam() == TEAM_ALLIANCE ? FactionNPCSpawns[i].entryAlliance : FactionNPCSpawns[i].entryHorde, FactionNPCSpawns[i].pos))
438 TemporaryNPCs.insert(creature->GetGUID());
439
441 TemporaryNPCs.insert(creature->GetGUID());
442
443 // Spawn portals
444 for (uint8 i = 0; i < TB_PORTAL_MAX; i++)
446 TemporaryGOs.insert(go->GetGUID());
447
448 // Update towers
449 for (ObjectGuid guid : Towers)
450 if (GameObject* go = GetGameObject(guid))
451 go->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING);
452 }
453 else if (GetState() == BATTLEFIELD_IN_PROGRESS)
454 {
455 for (uint8 i = 0; i < TB_ABANDONED_SIEGE_ENGINE_COUNT; i++)
457 TemporaryNPCs.insert(creature->GetGUID());
458
459 for (ObjectGuid guid : Towers)
460 {
461 if (GameObject* go = GetGameObject(guid))
462 {
463 go->SetDestructibleState(GO_DESTRUCTIBLE_INTACT);
464 go->ModifyHealth(go->GetGOValue()->Building.MaxHealth);
465 }
466 }
467 }
468
469 // Spawn banners
470 for (uint8 i = 0; i < TB_BANNER_MAX; i++)
472 TemporaryGOs.insert(go->GetGUID());
473
474 // Set graveyard controls
475 for (uint8 i = 0; i < BATTLEFIELD_TB_GRAVEYARD_MAX; i++)
476 if (BfGraveyard* graveyard = GetGraveyardById(i))
477 graveyard->GiveControlTo(!IsWarTime() || TBGraveyards[i].defenderControls ? GetDefenderTeam() : GetAttackerTeam());
478}
479
481{
482 switch (creature->GetEntry())
483 {
484 // Store NPCs that need visibility toggling
498 case NPC_CROCOLISK:
499 case NPC_PROBLIM:
500 BattleInactiveNPCs.insert(creature->GetGUID());
501 if (GetState() == BATTLEFIELD_WARMUP) // If battle is about to start, we must hide these.
502 HideNpc(creature);
503 break;
506 creature->CastSpell(creature, SPELL_THICK_LAYER_OF_RUST, true);
507 break;
509 if (Unit* vehiclebase = creature->GetCharmerOrOwner()->GetVehicleBase())
510 creature->EnterVehicle(vehiclebase);
511 break;
513 creature->CastSpell(creature, SPELL_TOWER_RANGE_FINDER_PERIODIC, true);
514 break;
529 creature->CastSpell(creature, SPELL_TB_SPIRITUAL_IMMUNITY, true);
530 break;
531 default:
532 break;
533 }
534}
535
537{
538 switch (go->GetEntry())
539 {
541 TBGatesGUID = go->GetGUID();
543 break;
544 case GO_TOLBARAD_DOOR:
545 TBDoorGUID = go->GetGUID();
547 break;
551 break;
552 case GO_GATE_D_BLOCK:
555 break;
559 break;
568 BattleInactiveGOs.insert(go->GetGUID());
569 if (GetState() == BATTLEFIELD_WARMUP) // If battle is about to start, we must hide these.
571 break;
572 default:
573 break;
574 }
575}
576
578{
579 Battlefield::ProcessEvent(obj, eventId, invoker);
580 if (!IsWarTime())
581 return;
582
583 if (eventId == EVENT_COUNT_CAPTURED_BASE)
584 {
586 return;
587 }
588
589 if (!obj)
590 return;
591
592 GameObject* go = obj->ToGameObject();
593 if (!go)
594 return;
595
596 TBTowerId towerId;
597 switch (go->GetEntry())
598 {
599 case GO_WEST_SPIRE:
600 towerId = TB_TOWER_WEST_SPIRE;
601 break;
602 case GO_EAST_SPIRE:
603 towerId = TB_TOWER_EAST_SPIRE;
604 break;
605 case GO_SOUTH_SPIRE:
606 towerId = TB_TOWER_SOUTH_SPIRE;
607 break;
608 default:
609 return;
610 }
611
613 TowerDamaged(towerId);
615 TowerDestroyed(towerId);
616}
617
619{
620 if (!IsWarTime())
621 return;
622
623 SendWarning(TBTowers[tbTowerId].textDamaged);
624
626
627 sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsIntact[GetDefenderTeam()], 0, false, m_Map);
628 sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()], 1, false, m_Map);
629
631}
632
634{
635 if (!IsWarTime())
636 return;
637
638 // Add 5 minute bonus time
641
642 SendWarning(TBTowers[tbTowerId].textDestroyed);
643
645 int32 towersDestroyed = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, m_Map) + 1;
646 sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, towersDestroyed, false, m_Map);
647
648 sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()], 0, false, m_Map);
649 sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDestroyed, 1, false, m_Map);
650
651 // Attack bonus buff
652 for (ObjectGuid const& guid : m_PlayersInWar[GetAttackerTeam()])
653 if (Player* player = ObjectAccessor::FindPlayer(guid))
654 player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, towersDestroyed));
655
656 // Honor reward
658}
659
661{
662 uint32 numCapturedBases = 0; // How many bases attacker has captured
663
664 // these world states are either 0 or 1
666 {
668 numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_VIGIL_ALLIANCE_CONTROLLED, GetMap());
670 }
671 else if (GetAttackerTeam() == TEAM_HORDE)
672 {
673 numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_GARRISON_HORDE_CONTROLLED, GetMap());
674 numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_VIGIL_HORDE_CONTROLLED, GetMap());
676 }
677
678 sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED, numCapturedBases, false, m_Map);
679
680 // Check if attackers won
681 if (numCapturedBases == TB_BASE_COUNT)
682 EndBattle(false);
683}
684
685// Called when player kill a unit in wg zone
687{
688 if (killer == victim || victim->GetTypeId() != TYPEID_PLAYER)
689 return;
690
691 TeamId killerTeam = killer->GetTeamId();
692 for (ObjectGuid const& guid : m_PlayersInWar[killerTeam])
693 if (Player* player = ObjectAccessor::FindPlayer(guid))
694 if (player->GetDistance2d(killer) < 40.0f)
695 PromotePlayer(player);
696}
697
699{
700 if (!m_isActive || killer->HasAura(SPELL_TB_VETERAN))
701 return;
702
703 killer->CastSpell(killer, SPELL_TB_VETERAN, true);
704}
705
707 _textIdHordeCaptured(data.textGained[TEAM_HORDE]), _textIdAllianceCaptured(data.textGained[TEAM_ALLIANCE]),
708 _textIdHordeLost(data.textLost[TEAM_HORDE]), _textIdAllianceLost(data.textLost[TEAM_ALLIANCE]),
709 _worldstateHordeControlled(data.wsControlled[TEAM_HORDE]), _worldstateAllianceControlled(data.wsControlled[TEAM_ALLIANCE]),
710 _worldstateHordeCapturing(data.wsCapturing[TEAM_HORDE]), _worldstateAllianceCapturing(data.wsCapturing[TEAM_ALLIANCE]),
711 _worldstateNeutral(data.wsNeutral)
712{
713}
714
716{
718}
719
721{
723}
724
726{
730 sWorldStateMgr->SetValue(_worldstateHordeControlled, 1, false, controlZone->GetMap());
731 sWorldStateMgr->SetValue(_worldstateHordeCapturing, 0, false, controlZone->GetMap());
733}
734
736{
740 sWorldStateMgr->SetValue(_worldstateAllianceControlled, 1, false, controlZone->GetMap());
741 sWorldStateMgr->SetValue(_worldstateAllianceCapturing, 0, false, controlZone->GetMap());
743}
744
746{
748 sWorldStateMgr->SetValue(_worldstateHordeControlled, 0, false, controlZone->GetMap());
749 sWorldStateMgr->SetValue(_worldstateAllianceCapturing, 1, false, controlZone->GetMap());
751}
752
754{
756 sWorldStateMgr->SetValue(_worldstateAllianceControlled, 0, false, controlZone->GetMap());
757 sWorldStateMgr->SetValue(_worldstateHordeCapturing, 1, false, controlZone->GetMap());
759}
760
762{
765}
766
768{
769public:
770 Battlefield_tol_barad() : BattlefieldScript("battlefield_tb") { }
771
772 Battlefield* GetBattlefield(Map* map) const override
773 {
774 return new BattlefieldTB(map);
775 }
776};
777
779{
781}
void AddSC_BF_tol_barad()
TBPortalEntry
uint8 const TB_BANNER_MAX
TBCapturePointSpawnData const TBCapturePoints[TB_BASE_COUNT]
TBTowerId
@ TB_TOWERS_COUNT
@ TB_TOWER_EAST_SPIRE
@ TB_TOWER_SOUTH_SPIRE
@ TB_TOWER_WEST_SPIRE
int8 const TB_ABANDONED_SIEGE_ENGINE_COUNT
@ NPC_BARADIN_GUARD
@ NPC_HELLSCREAMS_SENTRY
TBQuestAreaInfo const TBQuestAreas[CELLBLOCK_MAX]
Position const GuardNPCSpawns[TB_GUARDS_MAX]
TBGraveyardInfo const TBGraveyards[BATTLEFIELD_TB_GRAVEYARD_MAX]
@ NPC_ABANDONED_SIEGE_ENGINE
uint8 const TB_GUARDS_MAX
Position const TBAbandonedSiegeEngineSpawnData[TB_ABANDONED_SIEGE_ENGINE_COUNT]
@ TB_TEXT_PREPARATIONS_IN_1_MIN
@ TB_TEXT_FORTRESS_DEFEND_ALLIANCE
@ TB_TEXT_PREPARATIONS_IN_2_MIN
@ TB_TEXT_PREPARATIONS_IN_5_MIN
@ TB_TEXT_FORTRESS_CAPTURE_ALLIANCE
@ TB_TEXT_FORTRESS_CAPTURE_HORDE
@ TB_TEXT_FORTRESS_DEFEND_HORDE
Position const RandomQuestgiverPos
TBFactionNPCInfo const FactionNPCSpawns[TB_FACTION_NPC_MAX]
uint32 const RandomQuestgivers[PVP_TEAMS_COUNT][CELLBLOCK_MAX]
TBTowerInfo const TBTowers[TB_TOWERS_COUNT]
uint8 const TB_PORTAL_MAX
@ TB_GO_ARTKIT_FLAG_NONE
@ TB_GO_ARTKIT_FLAG_HORDE
@ TB_GO_ARTKIT_FLAG_ALLIANCE
@ EVENT_COUNT_CAPTURED_BASE
uint32 const TBBannerEntry[PVP_TEAMS_COUNT]
Position const TBBanners[TB_BANNER_MAX]
@ SPELL_REWARD_TOWER_DESTROYED
Definition: BattlefieldTB.h:51
@ SPELL_TOWER_RANGE_FINDER_PERIODIC
Definition: BattlefieldTB.h:68
@ SPELL_VICTORY_HORDE
Definition: BattlefieldTB.h:42
@ SPELL_REWARD_TOWER_INTACT
Definition: BattlefieldTB.h:49
@ SPELL_TB_SLOW_FALL
Definition: BattlefieldTB.h:54
@ SPELL_REWARD_TOWER_DAMAGED
Definition: BattlefieldTB.h:50
@ SPELL_TOWER_ATTACK_BONUS
Definition: BattlefieldTB.h:56
@ SPELL_TB_SPIRITUAL_IMMUNITY
Definition: BattlefieldTB.h:57
@ SPELL_REWARD_VICTORY_ALLIANCE
Definition: BattlefieldTB.h:45
@ SPELL_REWARD_DEFEAT
Definition: BattlefieldTB.h:47
@ SPELL_THICK_LAYER_OF_RUST
Definition: BattlefieldTB.h:60
@ SPELL_TB_VETERAN
Definition: BattlefieldTB.h:55
@ SPELL_REWARD_VICTORY_HORDE
Definition: BattlefieldTB.h:46
@ SPELL_VICTORY_ALLIANCE
Definition: BattlefieldTB.h:41
Position const TolBaradDebugAnnouncerPos
@ GO_GATE_D_BLOCK
@ CELLBLOCK_THE_HOLE
@ CELLBLOCK_D_BLOCK
@ GO_GATE_TO_THE_HOLE
@ GO_CURSED_DEPTHS_GATE
@ CELLBLOCK_CURSED_DEPTHS
@ GO_DUSTY_PRISON_JOURNAL
@ GO_CRATE_OF_CELLBLOCK_RATIONS
@ GO_CURSED_SHACKLES
@ CELLBLOCK_NONE
Position const TBQuestInfantrySpawnData[TB_QUEST_INFANTRY_MAX]
Position const TBPortals[TB_PORTAL_MAX]
@ BATTLEFIELD_TB_DATA_TOWERS_INTACT
Definition: BattlefieldTB.h:34
@ BATTLEFIELD_TB_DATA_MAX
Definition: BattlefieldTB.h:35
@ BATTLEFIELD_TB_ZONEID
Definition: BattlefieldTB.h:29
const uint32 TBFactions[PVP_TEAMS_COUNT]
uint8 const TB_QUEST_INFANTRY_MAX
@ BATTLEFIELD_TB_GRAVEYARD_MAX
uint8 const TB_FACTION_NPC_MAX
uint32 const TB_QUEST_INFANTRY[PVP_TEAMS_COUNT][4]
@ TB_BASE_COUNT
@ GO_TOLBARAD_DOOR
@ GO_TB_INSTANCE_VISUAL_3
@ GO_TB_INSTANCE_VISUAL_4
@ GO_TB_INSTANCE_VISUAL_2
@ GO_WEST_SPIRE
@ GO_TB_INSTANCE_VISUAL_1
@ GO_EAST_SPIRE
@ GO_TB_MEETING_STONE
@ GO_TOLBARAD_GATES
@ GO_SOUTH_SPIRE
@ NPC_TOLBARAD_JAILED_WRATHGUARD
Definition: BattlefieldTB.h:89
@ NPC_TB_GY_SPIRIT_EAST_SPIRE_H
@ NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_H
@ NPC_TOLBARAD_EXILED_MAGE
Definition: BattlefieldTB.h:96
@ NPC_TB_GY_SPIRIT_SOUTH_SPIRE_H
@ NPC_TB_GY_SPIRIT_WARDENS_VIGIL_H
@ NPC_TB_GY_SPIRIT_WEST_SPIRE_H
@ NPC_TOLBARAD_ARCHMAGE_GALUS
Definition: BattlefieldTB.h:82
@ NPC_TOLBARAD_IMPRISONED_IMP
Definition: BattlefieldTB.h:90
@ NPC_TOLBARAD_CELL_WATCHER
Definition: BattlefieldTB.h:87
@ NPC_TB_GY_SPIRIT_BARADIN_HOLD_H
@ NPC_DEBUG_ANNOUNCER
@ NPC_TB_GY_SPIRIT_EAST_SPIRE_A
@ NPC_TOLBARAD_WARDEN_SILVA
Definition: BattlefieldTB.h:93
@ NPC_TOLBARAD_IMPRISONED_WORKER
Definition: BattlefieldTB.h:95
@ NPC_TOLBARAD_GHASTLY_CONVICT
Definition: BattlefieldTB.h:83
@ NPC_TOLBARAD_WARDEN_GUARD
Definition: BattlefieldTB.h:94
@ NPC_TOLBARAD_CELLBLOCK_OOZE
Definition: BattlefieldTB.h:81
@ NPC_TOLBARAD_SVARNOS
Definition: BattlefieldTB.h:88
@ NPC_TB_GY_SPIRIT_SLAGWORKS_H
@ NPC_TB_GY_SPIRIT_SOUTH_SPIRE_A
@ NPC_TB_GY_SPIRIT_SLAGWORKS_A
@ NPC_TOLBARAD_SHIVARRA_DESTROYER
Definition: BattlefieldTB.h:86
@ NPC_CROCOLISK
Definition: BattlefieldTB.h:99
@ NPC_TB_GY_SPIRIT_WARDENS_VIGIL_A
@ NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_A
@ NPC_TOLBARAD_CAPTIVE_SPIRIT
Definition: BattlefieldTB.h:80
@ NPC_TB_GY_SPIRIT_BARADIN_HOLD_A
@ NPC_SIEGE_ENGINE_TURRET
@ NPC_TB_GY_SPIRIT_WEST_SPIRE_A
@ NPC_TOWER_RANGE_FINDER
@ NPC_PROBLIM
@ BATTLEFIELD_TB
Definition: Battlefield.h:30
@ BATTLEFIELD_WARMUP
Definition: Battlefield.h:44
@ BATTLEFIELD_IN_PROGRESS
Definition: Battlefield.h:45
@ BATTLEFIELD_INACTIVE
Definition: Battlefield.h:43
@ BATTLEFIELD_BATTLEID_TB
Definition: Battlefield.h:37
@ RESPAWN_IMMEDIATELY
Definition: Battleground.h:137
@ RESPAWN_ONE_DAY
Definition: Battleground.h:136
@ IN_MILLISECONDS
Definition: Common.h:35
@ MINUTE
Definition: Common.h:29
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ GO_DESTRUCTIBLE_DESTROYED
@ GO_DESTRUCTIBLE_REBUILDING
@ GO_DESTRUCTIBLE_INTACT
@ GO_DESTRUCTIBLE_DAMAGED
uint8 constexpr PVP_TEAMS_COUNT
@ WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW
@ WS_BATTLEFIELD_TB_VIGIL_HORDE_CONTROLLED
@ WS_BATTLEFIELD_TB_KEEP_ALLIANCE
@ WS_BATTLEFIELD_TB_SLAGWORKS_ALLIANCE_CONTROLLED
@ WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW
@ WS_BATTLEFIELD_TB_KEEP_HORDE
@ WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED_SHOW
@ WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED
@ WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW
@ WS_BATTLEFIELD_TB_STATE_PREPARATIONS
@ WS_BATTLEFIELD_TB_TIME_BATTLE_END_SHOW
@ WS_BATTLEFIELD_TB_VIGIL_ALLIANCE_CONTROLLED
@ WS_BATTLEFIELD_TB_GARRISON_ALLIANCE_CONTROLLED
@ WS_BATTLEFIELD_TB_FACTION_CONTROLLING
@ WS_BATTLEFIELD_TB_TOWERS_DESTROYED
@ WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW
@ WS_BATTLEFIELD_TB_TOWERS_DESTROYED_SHOW
@ WS_BATTLEFIELD_TB_SLAGWORKS_HORDE_CONTROLLED
@ WS_BATTLEFIELD_TB_STATE_BATTLE
@ WS_BATTLEFIELD_TB_GARRISON_HORDE_CONTROLLED
@ WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW
@ WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE
@ WS_BATTLEFIELD_TB_TIME_BATTLE_END
@ GO_STATE_READY
@ GO_STATE_ACTIVE
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ SPELLVALUE_AURA_STACK
Definition: SpellDefines.h:231
#define sWorldStateMgr
Definition: WorldStateMgr.h:50
void OnPlayerLeaveWar(Player *player) override
Called when a player leave the battle.
void RemoveAurasFromPlayer(Player *player)
void OnBattleEnd(bool endByTimer) override
Called at the end of battle.
bool Update(uint32 diff) override
Called every time for update bf data and time.
GuidSet TemporaryNPCs
void ProcessEvent(WorldObject *obj, uint32 eventId, WorldObject *invoker) override
void OnBattleStart() override
Called on start.
void TowerDestroyed(TBTowerId tbTowerId)
void OnPlayerJoinWar(Player *player) override
Called when a player accept to join the battle.
ObjectGuid m_gateCursedDepthsGUID
bool SetupBattlefield() override
Call this to init the Battlefield.
void HandleKill(Player *killer, Unit *victim) override
Called when a Unit is kill in battlefield zone.
void OnStartGrouping() override
Called x minutes before battle start when player in zone are invite to join queue.
GuidSet BattleInactiveNPCs
void OnPlayerEnterZone(Player *player) override
Called when a player enter in battlefield zone.
ObjectGuid TBGatesGUID
void OnGameObjectCreate(GameObject *go) override
void OnCreatureCreate(Creature *creature) override
uint32 m_updateObjectsTimer
void UpdateCapturedBaseCount()
bool warnedFiveMinutes
ObjectGuid m_gateDBlockGUID
GuidSet TemporaryGOs
void TowerDamaged(TBTowerId tbTowerId)
bool updatedNPCAndObjects
uint32 m_BonusTime
void OnPlayerLeaveZone(Player *player) override
Called when a player leave battlefield zone.
GuidSet BattleInactiveGOs
uint8 m_iCellblockRandom
void PromotePlayer(Player *killer)
ObjectGuid m_gateToTheHoleGUID
void UpdateNPCsAndGameObjects()
ObjectGuid TBDoorGUID
Battlefield * GetBattlefield(Map *map) const override
uint32 m_Timer
Definition: Battlefield.h:300
Map * GetMap() const
Definition: Battlefield.h:183
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 ShowNpc(Creature *creature, bool aggressive)
Creature * GetCreature(ObjectGuid guid)
uint32 m_MaxPlayer
Definition: Battlefield.h:321
std::vector< uint32 > m_Data32
Definition: Battlefield.h:342
Creature * SpawnCreature(uint32 entry, Position const &pos)
uint32 m_NoWarBattleTime
Definition: Battlefield.h:325
void EndBattle(bool endByTimer)
virtual void SetData(uint32 dataId, uint32 value) override
Definition: Battlefield.h:215
uint32 m_BattleTime
Definition: Battlefield.h:324
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
int8 GetState() const
Definition: Battlefield.h:191
uint32 m_StartGroupingTimer
Definition: Battlefield.h:336
virtual bool Update(uint32 diff)
Called every time for update bf data and time.
void RegisterZone(uint32 zoneid)
void SetDefenderTeam(TeamId team)
Definition: Battlefield.h:222
void SendWarning(uint8 id, WorldObject const *target=nullptr)
uint32 m_TimeForAcceptInvite
Definition: Battlefield.h:327
BfGraveyard * GetGraveyardById(uint32 id) const
GuidUnorderedSet m_PlayersInWar[PVP_TEAMS_COUNT]
Definition: Battlefield.h:311
void HideNpc(Creature *creature)
uint32 m_RestartAfterCrash
Definition: Battlefield.h:326
TeamId GetAttackerTeam() const
Definition: Battlefield.h:220
uint32 m_MinLevel
Definition: Battlefield.h:323
TeamId GetDefenderTeam() const
Definition: Battlefield.h:219
void TeamCastSpell(TeamId team, int32 spellId)
uint32 m_MinPlayer
Definition: Battlefield.h:322
virtual uint32 GetData(uint32 dataId) const override
Definition: Battlefield.h:214
bool m_IsEnabled
Definition: Battlefield.h:301
ControlZoneHandlerMap ControlZoneHandlers
Definition: Battlefield.h:306
bool m_StartGrouping
Definition: Battlefield.h:337
WorldLocation KickPosition
Definition: Battlefield.h:329
void SetGraveyardNumber(uint32 number)
Definition: Battlefield.h:239
bool m_isActive
Definition: Battlefield.h:302
GuidUnorderedSet m_players[PVP_TEAMS_COUNT]
Definition: Battlefield.h:309
void SetSpirit(Creature *spirit, TeamId team)
void Initialize(TeamId startcontrol, uint32 gy)
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 HandleProgressEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:51
virtual void HandleNeutralEvent(GameObject *controlZone)
Definition: ZoneScript.h:55
virtual void HandleContestedEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:49
void SetGoState(GOState state)
void SetRespawnTime(int32 respawn)
void SetGoArtKit(uint32 artkit)
GameObjectDestructibleState GetDestructibleState() const
Definition: GameObject.h:363
Definition: Map.h:189
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
TeamId GetTeamId() const
Definition: Player.h:2236
void SetPvP(bool state) override
Definition: Player.cpp:23353
uint32 _worldstateHordeCapturing
uint32 _worldstateHordeControlled
void HandleContestedEventAlliance(GameObject *controlZone) override
void HandleNeutralEventHorde(GameObject *controlZone) override
void HandleContestedEventHorde(GameObject *controlZone) override
void HandleNeutralEvent(GameObject *controlZone) override
void HandleNeutralEventAlliance(GameObject *controlZone) override
void HandleProgressEventAlliance(GameObject *controlZone) override
uint32 _worldstateAllianceCapturing
uint32 _worldstateAllianceControlled
TolBaradCapturePoint(BattlefieldTB *battlefield, TBCapturePointSpawnData const &data)
void HandleProgressEventHorde(GameObject *controlZone) override
Definition: Unit.h:627
void EnterVehicle(Unit *base, int8 seatId=-1)
Definition: Unit.cpp:12118
void SetFaction(uint32 faction) override
Definition: Unit.h:859
Unit * GetVehicleBase() const
Definition: Unit.cpp:11480
Unit * GetCharmerOrOwner() const
Definition: Unit.h:1200
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
uint32 m_mapId
Definition: Position.h:203
Map * GetMap() const
Definition: Object.h:624
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
#define sWorld
Definition: World.h:931
@ CONFIG_TOLBARAD_BATTLETIME
Definition: World.h:400
@ CONFIG_TOLBARAD_PLR_MIN_LVL
Definition: World.h:399
@ CONFIG_TOLBARAD_RESTART_AFTER_CRASH
Definition: World.h:403
@ CONFIG_TOLBARAD_BONUSTIME
Definition: World.h:401
@ CONFIG_TOLBARAD_PLR_MAX
Definition: World.h:397
@ CONFIG_TOLBARAD_PLR_MIN
Definition: World.h:398
@ CONFIG_TOLBARAD_NOBATTLETIME
Definition: World.h:402
@ CONFIG_TOLBARAD_ENABLE
Definition: World.h:170
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
constexpr void Relocate(float x, float y)
Definition: Position.h:63
static QuaternionData fromEulerAnglesZYX(float Z, float Y, float X)
Definition: GameObject.cpp:118