TrinityCore
BattlegroundAV.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 "BattlegroundAV.h"
19#include "Creature.h"
20#include "CreatureAI.h"
21#include "DB2Stores.h"
22#include "GameObject.h"
23#include "Log.h"
24#include "Map.h"
25#include "MotionMaster.h"
26#include "ObjectMgr.h"
27#include "Player.h"
28
30{
36};
37
39{
41};
42
44{
50};
51
53{
59};
60
62{
65};
66
68{
70};
71
73{
76};
77
78BattlegroundAV::BattlegroundAV(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate)
79{
80 BgObjects.resize(0);
81 BgCreatures.resize(0);
82
84 _isInformedNearVictory = { false, false };
85
86 for (uint8 i = 0; i < 2; i++) //forloop for both teams (it just make 0 == alliance and 1 == horde also for both mines 0=north 1=south
87 {
88 for (uint8 j = 0; j < 9; j++)
89 m_Team_QuestStatus[i][j] = 0;
90
91 _captainBuffTimer[i].Reset(120000 + urand(0, 4) * 60); //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes @todo get the right times
92 }
93
96
97 for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves
98 InitNode(i, ALLIANCE, false);
99 for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers
100 InitNode(i, ALLIANCE, true);
101 for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves
102 InitNode(i, HORDE, false);
104 InitNode(i, HORDE, true);
105 InitNode(BG_AV_NODES_SNOWFALL_GRAVE, TEAM_OTHER, false); //give snowfall neutral owner
106
108
112}
113
115{
117 return;
118
119 Battleground::HandleKillPlayer(player, killer);
120 UpdateScore(GetPlayerTeam(player->GetGUID()), -1);
121}
122
124{
125 TC_LOG_DEBUG("bg.battleground", "bg_av HandleKillUnit {}", unit->GetEntry());
127 return;
128
129 switch (unit->GetEntry())
130 {
132 {
134 CastSpellOnTeam(SPELL_COMPLETE_ALTERAC_VALLEY_QUEST, HORDE); //this is a spell which finishes a quest where a player has to kill the boss
138 break;
139 }
141 {
143 CastSpellOnTeam(SPELL_COMPLETE_ALTERAC_VALLEY_QUEST, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
147 break;
148 }
150 {
155 if (Creature* herald = FindHerald("bg_av_herald_horde_win"))
156 herald->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD);
157 break;
158 }
160 {
165 if (Creature* herald = FindHerald("bg_av_herald_alliance_win"))
166 herald->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD);
167 break;
168 }
170 {
171 // if mine is not owned by morloch, then nothing happens
173 break;
174
175 Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
177 break;
178 }
180 {
182 break;
183
184 Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
186 break;
187 }
190 {
191 Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
193 break;
194 }
197 {
198 Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
200 break;
201 }
202 }
203}
204
206{
208 return;//maybe we should log this, cause this must be a cheater or a big bug
209 Team team = GetPlayerTeam(player->GetGUID());
210 TeamId teamIndex = GetTeamIndexByTeamId(team);
212 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed", questid);
213 switch (questid)
214 {
219 m_Team_QuestStatus[teamIndex][0] += 20;
220 break;
223 m_Team_QuestStatus[teamIndex][1]++;
224 RewardReputationToTeam(teamIndex, 1, team);
225 if (m_Team_QuestStatus[teamIndex][1] == 30)
226 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
227 break;
230 m_Team_QuestStatus[teamIndex][2]++;
231 RewardReputationToTeam(teamIndex, 1, team);
232 if (m_Team_QuestStatus[teamIndex][2] == 60)
233 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
234 break;
237 m_Team_QuestStatus[teamIndex][3]++;
238 RewardReputationToTeam(teamIndex, 1, team);
239 if (m_Team_QuestStatus[teamIndex][3] == 120)
240 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
241 break;
242 case AV_QUEST_A_BOSS1:
243 case AV_QUEST_H_BOSS1:
244 m_Team_QuestStatus[teamIndex][4] += 4; //you can turn in 5 or 1 item..
245 [[fallthrough]];
246 case AV_QUEST_A_BOSS2:
247 case AV_QUEST_H_BOSS2:
248 m_Team_QuestStatus[teamIndex][4]++;
249 if (m_Team_QuestStatus[teamIndex][4] >= 200)
250 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
252 break;
255 m_Team_QuestStatus[teamIndex][5]++;
256 if (m_Team_QuestStatus[teamIndex][5] == 28)
257 {
258 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
259 if (m_Team_QuestStatus[teamIndex][6] == 7)
260 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here - ground assault ready", questid);
261 }
262 break;
265 m_Team_QuestStatus[teamIndex][6]++;
266 if (m_Team_QuestStatus[teamIndex][6] == 7)
267 {
268 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
269 if (m_Team_QuestStatus[teamIndex][5] == 20)
270 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here - ground assault ready", questid);
271 }
272 break;
275 m_Team_QuestStatus[teamIndex][7]++;
276 if (m_Team_QuestStatus[teamIndex][7] == 25)
277 {
278 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
279 if (m_Team_QuestStatus[teamIndex][8] == 25)
280 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here - rider assault ready", questid);
281 }
282 break;
285 m_Team_QuestStatus[teamIndex][8]++;
286 if (m_Team_QuestStatus[teamIndex][8] == 25)
287 {
288 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid);
289 if (m_Team_QuestStatus[teamIndex][7] == 25)
290 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here - rider assault ready", questid);
291 }
292 break;
293 default:
294 TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed but is not interesting at all", questid);
295 break;
296 }
297}
298
300{
301 ASSERT(team == ALLIANCE || team == HORDE);
302 TeamId teamindex = GetTeamIndexByTeamId(team);
303 _teamResources[teamindex] += points;
304
306 if (points < 0)
307 {
308 if (_teamResources[teamindex] < 1)
309 {
310 _teamResources[teamindex] = 0;
311 EndBattleground(teamindex == TEAM_HORDE ? ALLIANCE : HORDE);
312 }
313 else if (!_isInformedNearVictory[teamindex] && _teamResources[teamindex] < NEAR_LOSE_POINTS)
314 {
315 if (teamindex == TEAM_ALLIANCE)
317 else
320 _isInformedNearVictory[teamindex] = true;
321 }
322 }
323}
324
326{
328 return;
329
332 {
333 for (AlteracValleyMineInfo const& info : _mineInfo)
334 {
335 if (info.Owner == TEAM_OTHER)
336 continue;
337
338 UpdateScore(info.Owner, 1);
339 }
340
342 }
343
344 for (uint8 i = TEAM_ALLIANCE; i <= TEAM_HORDE; i++)
345 {
346 if (!IsCaptainAlive(TeamId(i)))
347 continue;
348
349 _captainBuffTimer[i].Update(diff);
350 if (_captainBuffTimer[i].Passed())
351 {
352 if (i == 0)
353 {
355 if (Creature* creature = GetBgMap()->GetCreature(_balindaGUID))
356 creature->AI()->DoAction(ACTION_BUFF_YELL);
357 }
358 else
359 {
361 if (Creature* creature = GetBgMap()->GetCreature(_galvangarGUID))
362 creature->AI()->DoAction(ACTION_BUFF_YELL);
363 }
364
365 _captainBuffTimer[i].Reset(120000 + urand(0, 4) * 60000); //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes @todo get the right times
366 }
367 }
368}
369
371{
372 if (teamId == TEAM_HORDE)
374 else if (teamId == TEAM_ALLIANCE)
376
377 return false;
378}
379
381{
382 TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning mine stuff");
383
386
387 // Achievement: The Alterac Blitz
389
390 for (ObjectGuid const& guid : _doorGUIDs)
391 {
392 if (GameObject* gameObject = GetBgMap()->GetGameObject(guid))
393 {
394 gameObject->UseDoorOrButton();
395 Seconds delay = gameObject->GetEntry() == BG_AV_GHOST_GATE ? 0s : 3s;
396 gameObject->DespawnOrUnsummon(delay);
397 }
398 }
399}
400
402{
403 //calculate bonuskills for both teams:
404 //first towers:
405 std::array<uint8, PVP_TEAMS_COUNT> kills = { 0, 0 };
406 std::array<uint8, PVP_TEAMS_COUNT> rep = { 0, 0 };
407
409 {
410 if (_nodes[i].State == POINT_CONTROLED)
411 {
412 if (_nodes[i].Owner == ALLIANCE)
413 {
416 }
417 else
418 {
421 }
422 }
423 }
424
425 for (uint8 i = TEAM_ALLIANCE; i <= TEAM_HORDE; ++i)
426 {
427 if (IsCaptainAlive(TeamId(i)))
428 {
431 }
432 if (rep[i] != 0)
434 if (kills[i] != 0)
436 }
437
440}
441
442void BattlegroundAV::RemovePlayer(Player* player, ObjectGuid /*guid*/, uint32 /*team*/)
443{
444 if (!player)
445 {
446 TC_LOG_ERROR("bg.battleground", "bg_AV no player at remove");
447 return;
448 }
451}
452
454{
455 if (!gameobject)
456 return;
457
458 BG_AV_Nodes node = GetNodeThroughObject(gameobject->GetEntry());
459 DestroyNode(node);
461
462 Team owner = _nodes[node].Owner;
463 if (IsTower(node))
464 {
468 }
469
470 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
471 if (Creature* herald = FindHerald(nodeInfo->StringIds.HordeOrDestroy))
472 herald->AI()->Talk(owner == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
473
475}
476
478{
479 switch (actionId)
480 {
483 break;
485 if (target && source && source->IsPlayer())
487 break;
488 default:
489 TC_LOG_ERROR("bg.battleground", "BattlegroundAV::DoAction: {}. Unhandled action.", actionId);
490 break;
491 }
492}
493
495{
496 if (team != ALLIANCE && team != HORDE)
497 team = TEAM_OTHER;
498
499 AlteracValleyMineInfo& mineInfo = _mineInfo[uint8(mine)];
500
501 if (mineInfo.Owner == team && !initial)
502 return;
503
504 mineInfo.Owner = team;
505
507
508 uint8 textId = team == ALLIANCE ? mineInfo.StaticInfo.TextIdAlliance : mineInfo.StaticInfo.TextIdHorde;
509
510 std::string stringId = team == ALLIANCE ? "bg_av_herald_mine_alliance" : "bg_av_herald_mine_horde";
511
512 if (Creature* herald = FindHerald(stringId))
513 herald->AI()->Talk(textId);
514}
515
517{
518 switch (object)
519 {
596 default:
597 TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object :(");
598 ABORT();
599 return BG_AV_Nodes(0);
600 }
601}
602
604{
605 if (!player || !target)
606 return;
607
608 switch (target->GetEntry())
609 {
610 // graveyards
623 // Snowfall
627 // towers
636 EventPlayerAssaultsPoint(player, target->GetEntry());
637 break;
638 // graveyards
651 // towers
660 EventPlayerDefendsPoint(player, target->GetEntry());
661 break;
662 // Snowfall special cases (either defend/assault)
665 {
666 BG_AV_Nodes node = GetNodeThroughObject(target->GetEntry());
667 if (_nodes[node].TotalOwner == TEAM_OTHER)
668 EventPlayerAssaultsPoint(player, target->GetEntry());
669 else
670 EventPlayerDefendsPoint(player, target->GetEntry());
671 break;
672 }
673 default:
674 break;
675 }
676}
677
679{
680 BG_AV_Nodes node = GetNodeThroughObject(object);
681
682 Team owner = _nodes[node].Owner;
683 Team team = GetPlayerTeam(player->GetGUID());
684
685 if (owner == team || _nodes[node].State != POINT_ASSAULTED)
686 return;
687
688 TC_LOG_DEBUG("bg.battleground", "player defends point object: {} node: {}", object, node);
689 if (_nodes[node].PrevOwner != team)
690 {
691 TC_LOG_ERROR("bg.battleground", "BG_AV: player defends point which doesn't belong to his team {}", node);
692 return;
693 }
694
695 DefendNode(node, team);
697
698 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
699 {
700 std::string stringId;
701
702 if (IsTower(node))
703 stringId = nodeInfo->StringIds.AllianceOrDefend;
704 else
705 stringId = team == ALLIANCE ? nodeInfo->StringIds.AllianceOrDefend : nodeInfo->StringIds.HordeOrDestroy;
706
707 if (Creature* herald = FindHerald(stringId))
708 herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
709 }
710
711 // update the statistic for the defending player
714}
715
717{
718 BG_AV_Nodes node = GetNodeThroughObject(object);
719 Team owner = _nodes[node].Owner; //maybe name it prevowner
720 Team team = GetPlayerTeam(player->GetGUID());
721
722 TC_LOG_DEBUG("bg.battleground", "bg_av: player assaults point object {} node {}", object, node);
723 if (owner == team || team == _nodes[node].TotalOwner)
724 return; //surely a gm used this object
725
726 AssaultNode(node, team);
728
729 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
730 {
731 std::string stringId;
732 if (IsTower(node))
733 stringId = nodeInfo->StringIds.HordeOrDestroy;
734 else
735 stringId = team == ALLIANCE ? nodeInfo->StringIds.AllianceOrDefend : nodeInfo->StringIds.HordeOrDestroy;
736
737 if (Creature* herald = FindHerald(stringId))
738 herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack);
739 }
740
741 // update the statistic for the assaulting player
744}
745
747{
748 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
749 {
750 uint16 owner = _nodes[node].Owner;
751 BG_AV_States state = _nodes[node].State;
752
753 UpdateWorldState(nodeInfo->WorldStateIds.AllianceAssault, owner == ALLIANCE && state == POINT_ASSAULTED);
754 UpdateWorldState(nodeInfo->WorldStateIds.AllianceControl, owner == ALLIANCE && state >= POINT_DESTROYED);
755 UpdateWorldState(nodeInfo->WorldStateIds.HordeAssault, owner == HORDE && state == POINT_ASSAULTED);
756 UpdateWorldState(nodeInfo->WorldStateIds.HordeControl, owner == HORDE && state >= POINT_DESTROYED);
757 if (nodeInfo->WorldStateIds.Owner)
758 UpdateWorldState(nodeInfo->WorldStateIds.Owner, owner == HORDE ? 2 : owner == ALLIANCE ? 1 : 0);
759 }
760
761 if (node == BG_AV_NODES_SNOWFALL_GRAVE)
763}
764
766{
767 AlteracValleyMineInfo& mineInfo = _mineInfo[uint8(mine)];
771 UpdateWorldState(mineInfo.StaticInfo.WorldStateOwner, mineInfo.Owner == HORDE ? 2 : mineInfo.Owner == ALLIANCE ? 1 : 0);
772}
773
775{
777}
778
780{
781 return true;
782}
783
785{
786 _nodes[node].PrevOwner = _nodes[node].Owner;
787 _nodes[node].Owner = team;
788 _nodes[node].PrevState = _nodes[node].State;
789 _nodes[node].State = POINT_ASSAULTED;
790}
791
793{
794 _nodes[node].TotalOwner = _nodes[node].Owner;
795 _nodes[node].PrevOwner = _nodes[node].Owner;
796 _nodes[node].PrevState = _nodes[node].State;
797 _nodes[node].State = (_nodes[node].Tower)? POINT_DESTROYED : POINT_CONTROLED;
798}
799
800void BattlegroundAV::InitNode(BG_AV_Nodes node, Team team, bool tower)
801{
802 _nodes[node].TotalOwner = team;
803 _nodes[node].Owner = team;
804 _nodes[node].PrevOwner = 0;
805 _nodes[node].State = POINT_CONTROLED;
806 _nodes[node].PrevState = _nodes[node].State;
807 _nodes[node].State = POINT_CONTROLED;
808 _nodes[node].Tower = tower;
809}
810
812{
813 _nodes[node].PrevOwner = _nodes[node].Owner;
814 _nodes[node].Owner = team;
815 _nodes[node].PrevState = _nodes[node].State;
816 _nodes[node].State = POINT_CONTROLED;
817}
818
820{
823
824 if (allianceScore > hordeScore)
825 return ALLIANCE;
826 else if (hordeScore > allianceScore)
827 return HORDE;
828
830}
831
833{
834 switch (gameObject->GetEntry())
835 {
836 case BG_AV_GHOST_GATE:
838 _doorGUIDs.insert(gameObject->GetGUID());
839 break;
840 default:
841 break;
842 }
843}
844
846{
847 switch (creature->GetEntry())
848 {
850 _galvangarGUID = creature->GetGUID();
851 break;
853 _balindaGUID = creature->GetGUID();
854 break;
856 _heraldGUIDs.insert(creature->GetGUID());
857 break;
858 default:
859 break;
860 }
861}
862
864{
865 auto getDefenderTierForTeam = [&](TeamId teamId) -> BG_AV_DefenderTier
866 {
867 if (m_Team_QuestStatus[teamId][0] < 500)
869
870 if (m_Team_QuestStatus[teamId][0] < 1000)
872
873 if (m_Team_QuestStatus[teamId][0] < 1500)
875
877 };
878
879 switch (dataId)
880 {
882 return getDefenderTierForTeam(TEAM_ALLIANCE);
884 return getDefenderTierForTeam(TEAM_HORDE);
885 default:
886 return Battleground::GetData(dataId);
887 }
888}
889
890Creature* BattlegroundAV::FindHerald(std::string_view stringId) const
891{
892 for (ObjectGuid const& guid : _heraldGUIDs)
893 if (Creature* creature = GetBgMap()->GetCreature(guid))
894 if (creature->HasStringId(stringId))
895 return creature;
896
897 return nullptr;
898}
AlteracValleyResourceLoss
@ RESOURCE_LOSS_CAPTAIN
@ RESOURCE_LOSS_TOWER
AlteracValleyReputationGains
@ REP_GAIN_BOSS
@ REP_GAIN_DESTROY_TOWER
@ REP_GAIN_CAPTAIN
@ REP_GAIN_SURVIVING_TOWER
@ REP_GAIN_SURVIVING_CAPTAIN
AlteracValleyPvpStats
@ PVP_STAT_GRAVEYARDS_DEFENDED
@ PVP_STAT_GRAVEYARDS_ASSAULTED
@ PVP_STAT_TOWERS_ASSAULTED
@ PVP_STAT_SECONDARY_OBJECTIVES
@ PVP_STAT_TOWERS_DEFENDED
AlteracValleyHonorKillBonus
@ HONOR_KILL_BONUS_SURVIVING_TOWER
@ HONOR_KILL_BONUS_SURVIVING_CAPTAIN
@ HONOR_KILL_BONUS_BOSS
@ HONOR_KILL_BONUS_CAPTAIN
@ HONOR_KILL_BONUS_DESTROY_TOWER
AlteracValleySpells
@ SPELL_COMPLETE_ALTERAC_VALLEY_QUEST
AlteracValleyFactions
@ FACTION_FROSTWOLF_CLAN
@ FACTION_STORMPIKE_GUARD
AlteracValleyMisc
@ NEAR_LOSE_POINTS
@ AV_BUFF_H_CAPTAIN
@ AV_BUFF_ARMOR
@ AV_BUFF_A_CAPTAIN
@ AV_SOUND_NEAR_VICTORY
@ BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTESTED
@ BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_STORMPIKE_HORDE_CONTESTED
@ BG_AV_OBJECTID_SNOWFALL_HORDE_CONTROLLED
@ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTROLLED
@ BG_AV_OBJECTID_SNOWFALL_HORDE_CONTESTED
@ BG_AV_GHOST_GATE
@ BG_AV_OBJECTID_TOWER_POINT_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_BANNER
@ BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_BANNER
@ BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTESTED
@ BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTROLLED
@ BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTESTED
@ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_BANNER
@ BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_SNOWFALL_NEUTRAL
@ BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_STORMPIKE_HORDE_CONTROLLED
@ BG_AV_OBJECTID_AID_STATION_HORDE_CONTESTED
@ BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTROLLED
@ BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_BANNER
@ BG_AV_OBJECTID_GATE
@ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTROLLED
@ BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTESTED
@ BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTROLLED
@ BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTROLLED
@ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_BANNER
@ BG_AV_OBJECTID_AID_STATION_HORDE_CONTROLLED
@ BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_WEST_TOWER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTROLLED
@ BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_TOWER_BANNER
@ BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTROLLED
@ BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_BANNER
@ BG_AV_OBJECTID_EAST_TOWER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_BANNER
@ BG_AV_OBJECTID_WEST_TOWER_CONTESTED_BANNER
@ BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTROLLED
@ BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_TOWER_BANNER
@ BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_EAST_TOWER_CONTESTED_BANNER
@ BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTROLLED
@ BG_AV_OBJECTID_TOWER_POINT_CONTESTED_BANNER
@ BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTESTED
@ BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTROLLED
BG_AV_Nodes
@ BG_AV_NODES_ICEWING_BUNKER
@ BG_AV_NODES_TOWER_POINT
@ BG_AV_NODES_SNOWFALL_GRAVE
@ BG_AV_NODES_FIRSTAID_STATION
@ BG_AV_NODES_FROSTWOLF_GRAVE
@ BG_AV_NODES_STORMPIKE_GRAVE
@ BG_AV_NODES_STONEHEART_GRAVE
@ BG_AV_NODES_ICEBLOOD_TOWER
@ BG_AV_NODES_DUNBALDAR_NORTH
@ BG_AV_NODES_STONEHEART_BUNKER
@ BG_AV_NODES_FROSTWOLF_WTOWER
@ BG_AV_NODES_FROSTWOLF_ETOWER
@ BG_AV_NODES_DUNBALDAR_SOUTH
@ BG_AV_NODES_FROSTWOLF_HUT
@ BG_AV_NODES_ICEBLOOD_GRAVE
BG_AV_States
@ POINT_DESTROYED
@ POINT_CONTROLED
@ POINT_ASSAULTED
constexpr Seconds BG_AV_MINE_RESOURCE_TIMER
@ DATA_DEFENDER_TIER_HORDE
@ DATA_DEFENDER_TIER_ALLIANCE
@ ACTION_BUFF_YELL
@ ACTION_AV_INTERACT_CAPTURABLE_OBJECT
@ ACTION_AV_CAPTURE_CAPTURABLE_OBJECT
@ AV_EXPLOIT_TELEPORT_LOCATION_ALLIANCE
@ AV_EXPLOIT_TELEPORT_LOCATION_HORDE
@ AV_QUEST_A_COMMANDER3
@ AV_QUEST_H_SCRAPS1
@ AV_QUEST_H_BOSS1
@ AV_QUEST_H_RIDER_TAME
@ AV_QUEST_A_COMMANDER1
@ AV_QUEST_A_RIDER_HIDE
@ AV_QUEST_A_SCRAPS1
@ AV_QUEST_H_COMMANDER1
@ AV_QUEST_A_RIDER_TAME
@ AV_QUEST_H_COMMANDER3
@ AV_QUEST_H_NEAR_MINE
@ AV_QUEST_A_COMMANDER2
@ AV_QUEST_A_OTHER_MINE
@ AV_QUEST_A_NEAR_MINE
@ AV_QUEST_H_OTHER_MINE
@ AV_QUEST_A_SCRAPS2
@ AV_QUEST_H_BOSS2
@ AV_QUEST_A_BOSS1
@ AV_QUEST_H_COMMANDER2
@ AV_QUEST_H_RIDER_HIDE
@ AV_QUEST_A_BOSS2
@ AV_QUEST_H_SCRAPS2
@ TEXT_FROSTWOLF_GENERAL_DEAD
@ TEXT_STORMPIKE_GENERAL_DEAD
@ TEXT_COLDTOOTH_MINE_HORDE_TAKEN
@ TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN
@ TEXT_IRONDEEP_MINE_HORDE_TAKEN
@ TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN
AlteracValleyMine
@ BG_AV_CREATURE_MASHA_SWIFTCUT
@ BG_AV_CREATURE_AGI_RUMBLESTOMP
@ BG_AV_CREATURE_BALINDA
@ BG_AV_CREATURE_UMI_THORSON
@ BG_AV_CREATURE_GALVANGAR
@ BG_AV_CREATURE_VANNDAR
@ BG_AV_CREATURE_TASKMASTER_SNIVVLE
@ BG_AV_CREATURE_HERALD
@ BG_AV_CREATURE_DREKTHAR
@ BG_AV_CREATURE_KEETAR
@ BG_AV_CREATURE_MORLOCH
@ AV_WS_COLDTOOTH_MINE_KOBOLD_CONTROLLED
@ AV_WS_HORDE_REINFORCEMENTS
@ AV_WS_IRONDEEP_MINE_OWNER
@ AV_WS_IRONDEEP_MINE_HORDE_CONTROLLED
@ AV_WS_IRONDEEP_MINE_TROGG_CONTROLLED
@ AV_WS_DREKTHAR_ALIVE
@ AV_WS_GALVAGAR_ALIVE
@ AV_WS_COLDTOOTH_MINE_HORDE_CONTROLLED
@ AV_WS_IRONDEEP_MINE_ALLIANCE_CONTROLLED
@ AV_WS_ALLIANCE_REINFORCEMENTS
@ AV_WS_BALINDA_ALIVE
@ AV_WS_COLDTOOTH_MINE_ALLIANCE_CONTROLLED
@ AV_WS_LOKHOLAR_STORMPIKE_SOLDIERS_BLOOD_COUNT
@ AV_WS_SNOWFALL_GRAVEYARD_UNCONTROLLED
@ AV_WS_SHOW_HORDE_REINFORCEMENTS
@ AV_WS_SHOW_ALLIANCE_REINFORCEMENTS
@ AV_WS_COLDTOOTH_MINE_OWNER
@ AV_WS_VANDAAR_ALIVE
@ AV_WS_IVUS_STORM_CRYSTAL_COUNT
BG_AV_DefenderTier
@ BG_AV_DEFENDER_TIER_DEFENDER
@ BG_AV_DEFENDER_TIER_VETERAN
@ BG_AV_DEFENDER_TIER_SEASONED
@ BG_AV_DEFENDER_TIER_CHAMPION
constexpr uint32 BG_AV_EVENT_START_BATTLE
constexpr uint32 BG_AV_SCORE_INITIAL_POINTS
@ BG_AV_TEXT_ALLIANCE_NEAR_LOSE
@ BG_AV_TEXT_START_HALF_MINUTE
@ BG_AV_TEXT_START_ONE_MINUTE
@ BG_AV_TEXT_HORDE_NEAR_LOSE
@ BG_AV_TEXT_BATTLE_HAS_BEGUN
@ STATUS_IN_PROGRESS
Definition: Battleground.h:167
@ BG_STARTING_EVENT_THIRD
Definition: Battleground.h:208
@ BG_STARTING_EVENT_SECOND
Definition: Battleground.h:207
@ BG_STARTING_EVENT_FOURTH
Definition: Battleground.h:209
uint8_t uint8
Definition: Define.h:144
int16_t int16
Definition: Define.h:139
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
#define ABORT
Definition: Errors.h:74
#define ASSERT
Definition: Errors.h:68
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
#define sObjectMgr
Definition: ObjectMgr.h:1946
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
Team
@ TEAM_OTHER
@ ALLIANCE
@ HORDE
@ CHAT_MSG_BG_SYSTEM_ALLIANCE
@ CHAT_MSG_BG_SYSTEM_HORDE
StaticNodeInfo const * GetStaticNodeInfo(BG_AV_Nodes node) const
void AssaultNode(BG_AV_Nodes node, Team team)
void InitNode(BG_AV_Nodes node, Team team, bool tower)
std::array< BG_AV_NodeInfo, BG_AV_NODES_MAX > _nodes
void DoAction(uint32 actionId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
void StartingEventOpenDoors() override
void DefendNode(BG_AV_Nodes node, Team team)
void EventPlayerAssaultsPoint(Player *player, uint32 object)
bool IsCaptainAlive(TeamId teamId) const
bool SetupBattleground() override
std::array< AlteracValleyMineInfo, 2 > _mineInfo
void EndBattleground(Team winner) override
std::array< bool, PVP_TEAMS_COUNT > _isInformedNearVictory
uint32 m_Team_QuestStatus[PVP_TEAMS_COUNT][9]
Creature * FindHerald(std::string_view stringId) const
ObjectGuid _balindaGUID
Team GetPrematureWinner() override
BG_AV_Nodes GetNodeThroughObject(uint32 object)
void PostUpdateImpl(uint32 diff) override
Post-update hook.
uint32 GetData(uint32 dataId) const override
void UpdateScore(Team team, int16 points)
void SendMineWorldStates(AlteracValleyMine mine)
void HandleQuestComplete(uint32 questid, Player *player) override
GuidUnorderedSet _doorGUIDs
void EventPlayerDestroyedPoint(GameObject *gameobject)
GuidUnorderedSet _heraldGUIDs
void HandleKillUnit(Creature *unit, Unit *killer) override
void HandleKillPlayer(Player *player, Player *killer) override
std::array< int32, PVP_TEAMS_COUNT > _teamResources
void OnCreatureCreate(Creature *creature) override
void RemovePlayer(Player *player, ObjectGuid guid, uint32 team) override
void OnGameObjectCreate(GameObject *gameObject) override
TimeTracker _mineResourceTimer
void ChangeMineOwner(AlteracValleyMine mine, Team team, bool initial=false)
void UpdateNodeWorldState(BG_AV_Nodes node)
std::array< TimeTracker, PVP_TEAMS_COUNT > _captainBuffTimer
WorldSafeLocsEntry const * GetExploitTeleportLocation(Team team) override
void HandleInteractCapturableObject(Player *player, GameObject *target)
bool IsTower(BG_AV_Nodes node) const
ObjectGuid _galvangarGUID
void DestroyNode(BG_AV_Nodes node)
void EventPlayerDefendsPoint(Player *player, uint32 object)
BattlegroundAV(BattlegroundTemplate const *battlegroundTemplate)
virtual Team GetPrematureWinner()
virtual void HandleKillPlayer(Player *player, Player *killer)
void PlaySoundToAll(uint32 SoundID)
GuidVector BgObjects
Definition: Battleground.h:443
void RewardHonorToTeam(uint32 Honor, Team team)
BattlegroundMap * GetBgMap() const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
GuidVector BgCreatures
Definition: Battleground.h:444
static TeamId GetTeamIndexByTeamId(Team team)
Definition: Battleground.h:392
void UpdateWorldState(int32 worldStateId, int32 value, bool hidden=false)
virtual void EndBattleground(Team winner)
void SendBroadcastText(uint32 id, ChatMsg msgType, WorldObject const *target=nullptr)
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, Team team)
BattlegroundStatus GetStatus() const
Definition: Battleground.h:284
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 UpdateSpawnGroupConditions()
Definition: Map.cpp:2504
int32 GetWorldStateValue(int32 worldStateId) const
Definition: Map.cpp:460
bool IsPlayer() const
Definition: Object.h:212
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
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
Definition: Unit.h:627
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Object.cpp:2252
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
StaticMineInfo StaticInfo
int32 WorldStateHordeControlled
int32 WorldStateNeutralControlled
int32 WorldStateAllianceControlled
void Update(int32 diff)
Definition: Timer.h:121
bool Passed() const
Definition: Timer.h:131
void Reset(int32 expiry)
Definition: Timer.h:136