TrinityCore
Loading...
Searching...
No Matches
battleground_alterac_valley.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 "BattlegroundScript.h"
19#include "alterac_valley.h"
20#include "Battleground.h"
21#include "BattlegroundMgr.h"
22#include "BattlegroundPackets.h"
23#include "Creature.h"
24#include "CreatureAI.h"
25#include "GameObject.h"
26#include "GameTime.h"
27#include "Log.h"
28#include "Map.h"
29#include "Player.h"
30#include "ScriptMgr.h"
31
33constexpr uint32 BG_AV_EVENT_START_BATTLE = 9166; // Achievement: The Alterac Blitz
34
44
46{
48
49 AV_SOUND_ALLIANCE_ASSAULTS = 8212, //tower, grave + enemy boss if someone tries to attack him
51 AV_SOUND_ALLIANCE_GOOD = 8173, //if something good happens for the team: wins(maybe only through killing the boss), captures mine or grave, destroys tower and defends grave
54
55 AV_SOUND_ALLIANCE_CAPTAIN = 8232, //gets called when someone attacks them and at the beginning after 5min+rand(x)*10sec (maybe buff)
57};
58
60
62{
63 North = 0,
64 South
65};
66
90
92{
93 //cause the mangos-system is a bit different, we don't use the right go-ids for every node.. if we want to be 100% like another big server, we must take one object for every node
94 //snowfall 4flags as eyecandy 179424 (alliance neutral)
95 //Banners - stolen from battleground_AB.h ;-)
96 BG_AV_OBJECTID_BANNER_A = 178925, // can only be used by horde
97 BG_AV_OBJECTID_BANNER_H = 178943, // can only be used by alliance
98 BG_AV_OBJECTID_BANNER_CONT_A = 178940, // can only be used by horde
99 BG_AV_OBJECTID_BANNER_CONT_H = 179435, // can only be used by alliance
100
106
107 //snowfall eyecandy banner:
112
113 //banners on top of towers:
114 BG_AV_OBJECTID_TOWER_BANNER_A = 178927, //[PH] Alliance A1 Tower Banner BIG
115 BG_AV_OBJECTID_TOWER_BANNER_H = 178955, //[PH] Horde H1 Tower Banner BIG
116 BG_AV_OBJECTID_TOWER_BANNER_PA = 179446, //[PH] Alliance H1 Tower Pre-Banner BIG
117 BG_AV_OBJECTID_TOWER_BANNER_PH = 179436, //[PH] Horde A1 Tower Pre-Banner BIG
118
119 //Auras
126
129
130 //mine supplies
133
136
137 // Towers
142
147
152
157
162
167
172
177
178 // Graveyards
183
188
193
199
204
209
215
236
238{
240 AV_BUFF_A_CAPTAIN = 23693, //the buff which the alliance captain does
241 AV_BUFF_H_CAPTAIN = 22751 //the buff which the horde captain does
250
252{
258
259// Graves
260 // Alliance
261 //Stormpike first aid station
266 //Stormpike Graveyard
271 //Stoneheart Grave
276 //Neutral
277 //Snowfall Grave
283 //Horde
284 //Iceblood grave
289 //Frostwolf Grave
294 //Frostwolf Hut
299
300//Towers
301 //Alliance
302 //Dunbaldar South Bunker
308 //Dunbaldar North Bunker
314 //Icewing Bunker
320 //Stoneheart Bunker
326 //Horde
327 //Iceblood Tower
333 //Tower Point
339 //Frostwolf West
345 //Frostwolf East
351
352//Mines
357
362
363//Turnins
368
369//Bosses
372
373//Captains
376};
377
387
394
422
424{
425 { BG_AV_NODES_FIRSTAID_STATION, { 47, 48, 45, 46 }, { 1325, 1326, 1327, 1328, 0 }, { "bg_av_herald_stormpike_aid_station_alliance", "bg_av_herald_stormpike_aid_station_horde" } }, // Stormpike First Aid Station
426 { BG_AV_NODES_STORMPIKE_GRAVE, { 1, 2, 3, 4 }, { 1333, 1335, 1334, 1336, 0 }, { "bg_av_herald_stormpike_alliance", "bg_av_herald_stormpike_horde" } }, // Stormpike Graveyard
427 { BG_AV_NODES_STONEHEART_GRAVE, { 55, 56, 53, 54 }, { 1302, 1304, 1301, 1303, 0 }, { "bg_av_herald_stonehearth_alliance", "bg_av_herald_stonehearth_horde" } }, // Stoneheart Graveyard
428 { BG_AV_NODES_SNOWFALL_GRAVE, { 5, 6, 7, 8 }, { 1341, 1343, 1342, 1344, 0 }, { "bg_av_herald_snowfall_alliance", "bg_av_herald_snowfall_horde" } }, // Snowfall Graveyard
429 { BG_AV_NODES_ICEBLOOD_GRAVE, { 59, 60, 57, 58 }, { 1346, 1348, 1347, 1349, 0 }, { "bg_av_herald_iceblood_alliance", "bg_av_herald_iceblood_horde" } }, // Iceblood Graveyard
430 { BG_AV_NODES_FROSTWOLF_GRAVE, { 9, 10, 11, 12 }, { 1337, 1339, 1338, 1340, 0 }, { "bg_av_herald_frostwolf_alliance", "bg_av_herald_frostwolf_horde" } }, // Frostwolf Graveyard
431 { BG_AV_NODES_FROSTWOLF_HUT, { 51, 52, 49, 50 }, { 1329, 1331, 1330, 1332, 0 }, { "bg_av_herald_frostwolf_hut_alliance", "bg_av_herald_frostwolf_hut_horde" } }, // Frostwolf Hut
432 { BG_AV_NODES_DUNBALDAR_SOUTH, { 16, 15, 14, 13 }, { 1361, 1375, 1370, 1378, 1181 }, { "bg_av_herald_south_bunker_defend", "bg_av_herald_south_bunker_attack" } }, // Dunbaldar South Bunker
433 { BG_AV_NODES_DUNBALDAR_NORTH, { 20, 19, 18, 17 }, { 1362, 1374, 1371, 1379, 1182 }, { "bg_av_herald_north_bunker_defend", "bg_av_herald_south_bunker_attack" } }, // Dunbaldar North Bunker
434 { BG_AV_NODES_ICEWING_BUNKER, { 24, 23, 22, 21 }, { 1363, 1376, 1372, 1380, 1183 }, { "bg_av_herald_icewing_bunker_defend", "bg_av_herald_icewing_bunker_attack" } }, // Icewing Bunker
435 { BG_AV_NODES_STONEHEART_BUNKER, { 28, 27, 26, 25 }, { 1364, 1377, 1373, 1381, 1184 }, { "bg_av_herald_stonehearth_bunker_defend", "bg_av_herald_stonehearth_bunker_attack" } }, // Stoneheart Bunker
436 { BG_AV_NODES_ICEBLOOD_TOWER, { 44, 43, 42, 41 }, { 1368, 1390, 1385, 1395, 1188 }, { "bg_av_herald_iceblood_tower_defend", "bg_av_herald_iceblood_tower_attack" } }, // Iceblood Tower
437 { BG_AV_NODES_TOWER_POINT, { 40, 39, 38, 37 }, { 1367, 1389, 1384, 1394, 1187 }, { "bg_av_herald_tower_point_defend", "bg_av_herald_tower_point_attack" } }, // Tower Point
438 { BG_AV_NODES_FROSTWOLF_ETOWER, { 36, 35, 34, 33 }, { 1366, 1388, 1383, 1393, 1186 }, { "bg_av_herald_east_tower_defend", "bg_av_herald_east_tower_attack" } }, // Frostwolf East Tower
439 { BG_AV_NODES_FROSTWOLF_WTOWER, { 32, 31, 30, 29 }, { 1365, 1387, 1382, 1392, 1185 }, { "bg_av_herald_west_tower_defend", "bg_av_herald_west_tower_attack" } }, // Frostwolf West Tower
440};
441
443{
444 // Herold
445 // Towers/Graveyards = 1 - 60
452 TEXT_ALLIANCE_WINS = 67, // NYI /// @todo: sound is missing
453 TEXT_HORDE_WINS = 68, // NYI /// @todo: sound is missing
454
455 // Taskmaster Snivvle
458
464
474
475inline BG_AV_Nodes& operator++(BG_AV_Nodes& i) { return i = BG_AV_Nodes(i + 1); }
476
478{
504
510
518
527
528 enum Misc
529 {
530 NEAR_LOSE_POINTS = 140
531 };
532
541
550
556
561
567
569 {
571 _isInformedNearVictory = { false, false };
572
573 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
574 {
575 for (uint8 j = 0; j < 9; j++)
576 _teamQuestStatus[i][j] = 0;
577
578 _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
579 }
580
583
584 for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves
585 InitNode(i, ALLIANCE, false);
586 for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers
587 InitNode(i, ALLIANCE, true);
588 for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves
589 InitNode(i, HORDE, false);
591 InitNode(i, HORDE, true);
592 InitNode(BG_AV_NODES_SNOWFALL_GRAVE, TEAM_OTHER, false); //give snowfall neutral owner
593
595 }
596
597 void OnUpdate(uint32 diff) override
598 {
600 return;
601
604 {
605 for (AlteracValleyMineInfo const& info : _mineInfo)
606 {
607 if (info.Owner == TEAM_OTHER)
608 continue;
609
610 UpdateScore(info.Owner, 1);
611 }
612
614 }
615
616 for (uint8 i = TEAM_ALLIANCE; i <= TEAM_HORDE; i++)
617 {
618 if (!IsCaptainAlive(TeamId(i)))
619 continue;
620
621 _captainBuffTimer[i].Update(diff);
622 if (_captainBuffTimer[i].Passed())
623 {
624 if (i == 0)
625 {
627 if (Creature const* creature = battlegroundMap->GetCreature(_balindaGUID))
628 creature->AI()->DoAction(ACTION_BUFF_YELL);
629 }
630 else
631 {
633 if (Creature const* creature = battlegroundMap->GetCreature(_galvangarGUID))
634 creature->AI()->DoAction(ACTION_BUFF_YELL);
635 }
636
637 _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
638 }
639 }
640 }
641
642 void OnPlayerKilled(Player* victim, Player* /*killer*/) override
643 {
645 }
646
647 void OnUnitKilled(Creature* victim, Unit* killer) override
648 {
649 switch (victim->GetEntry())
650 {
652 {
654 battleground->CastSpellOnTeam(SPELL_COMPLETE_ALTERAC_VALLEY_QUEST, HORDE); //this is a spell which finishes a quest where a player has to kill the boss
658 break;
659 }
661 {
663 battleground->CastSpellOnTeam(SPELL_COMPLETE_ALTERAC_VALLEY_QUEST, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
667 break;
668 }
670 {
675 if (Creature const* herald = FindHerald("bg_av_herald_horde_win"))
676 herald->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD);
677 break;
678 }
680 {
685 if (Creature const* herald = FindHerald("bg_av_herald_alliance_win"))
686 herald->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD);
687 break;
688 }
690 {
691 // if mine is not owned by morloch, then nothing happens
693 break;
694
695 Team const killerTeam = battleground->GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
697 break;
698 }
700 {
702 break;
703
704 Team const killerTeam = battleground->GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
706 break;
707 }
710 {
711 Team const killerTeam = battleground->GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
713 break;
714 }
717 {
718 Team const killerTeam = battleground->GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
720 break;
721 }
722 }
723 }
724
725 bool IsCaptainAlive(TeamId teamId) const
726 {
727 if (teamId == TEAM_HORDE)
729
730 if (teamId == TEAM_ALLIANCE)
732
733 return false;
734 }
735
736 void OnStart() override
737 {
740
741 // Achievement: The Alterac Blitz
743
744 for (ObjectGuid const& guid : _doorGUIDs)
745 {
746 if (GameObject* gameObject = battlegroundMap->GetGameObject(guid))
747 {
748 gameObject->UseDoorOrButton();
749 Seconds delay = gameObject->GetEntry() == BG_AV_GHOST_GATE ? 0s : 3s;
750 gameObject->DespawnOrUnsummon(delay);
751 }
752 }
753 }
754
755 void OnEnd(Team winner) override
756 {
758 //calculate bonuskills for both teams:
759 //first towers:
760 std::array<uint8, PVP_TEAMS_COUNT> kills = { 0, 0 };
761 std::array<uint8, PVP_TEAMS_COUNT> rep = { 0, 0 };
762
764 {
765 if (_nodes[i].State == POINT_CONTROLED)
766 {
767 if (_nodes[i].Owner == ALLIANCE)
768 {
771 }
772 else
773 {
776 }
777 }
778 }
779
780 for (uint8 i = TEAM_ALLIANCE; i <= TEAM_HORDE; ++i)
781 {
782 if (IsCaptainAlive(TeamId(i)))
783 {
786 }
787 if (rep[i] != 0)
789 if (kills[i] != 0)
791 }
792 }
793
794 void OnPlayerLeft(Player* player) override
795 {
797 if (!player)
798 return;
799
801 }
802
804 {
805 if (!gameobject)
806 return;
807
808 BG_AV_Nodes const node = GetNodeThroughObject(gameobject->GetEntry());
809 DestroyNode(node);
811
812 Team const owner = _nodes[node].Owner;
813 if (IsTower(node))
814 {
818 }
819
820 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
821 if (Creature const* herald = FindHerald(nodeInfo->StringIds.HordeOrDestroy))
822 herald->AI()->Talk(owner == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
823
825 }
826
827 void DoAction(uint32 actionId, WorldObject* source, WorldObject* target) override
828 {
829 Team const team = battleground->GetPlayerTeam(source->GetGUID());
830 TeamId const teamIndex = Battleground::GetTeamIndexByTeamId(team);
831
832 switch (actionId)
833 {
836 break;
838 if (target && source && source->IsPlayer())
840 break;
842 _teamQuestStatus[teamIndex][0] += 20;
843 break;
845 _teamQuestStatus[teamIndex][1]++;
846 battleground->RewardReputationToTeam(teamIndex, 1, team);
847 if (_teamQuestStatus[teamIndex][1] == 30)
848 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
849 break;
851 _teamQuestStatus[teamIndex][2]++;
852 battleground->RewardReputationToTeam(teamIndex, 1, team);
853 if (_teamQuestStatus[teamIndex][2] == 60)
854 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
855 break;
857 _teamQuestStatus[teamIndex][3]++;
858 battleground->RewardReputationToTeam(teamIndex, 1, team);
859 if (_teamQuestStatus[teamIndex][3] == 120)
860 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
861 break;
863 _teamQuestStatus[teamIndex][4] += 4; //you can turn in 5 or 1 item..
864 [[fallthrough]];
866 _teamQuestStatus[teamIndex][4]++;
867 if (_teamQuestStatus[teamIndex][4] >= 200)
868 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
870 break;
872 _teamQuestStatus[teamIndex][5]++;
873 if (_teamQuestStatus[teamIndex][5] == 28)
874 {
875 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
876 if (_teamQuestStatus[teamIndex][6] == 7)
877 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here - ground assault ready", actionId);
878 }
879 break;
881 _teamQuestStatus[teamIndex][6]++;
882 if (_teamQuestStatus[teamIndex][6] == 7)
883 {
884 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
885 if (_teamQuestStatus[teamIndex][5] == 20)
886 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here - ground assault ready", actionId);
887 }
888 break;
890 _teamQuestStatus[teamIndex][7]++;
891 if (_teamQuestStatus[teamIndex][7] == 25)
892 {
893 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
894 if (_teamQuestStatus[teamIndex][8] == 25)
895 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here - rider assault ready", actionId);
896 }
897 break;
899 _teamQuestStatus[teamIndex][8]++;
900 if (_teamQuestStatus[teamIndex][8] == 25)
901 {
902 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here", actionId);
903 if (_teamQuestStatus[teamIndex][7] == 25)
904 TC_LOG_DEBUG("bg.battleground", "BG_AV action {} completed (need to implement some events here - rider assault ready", actionId);
905 }
906 break;
907 default:
908 TC_LOG_ERROR("bg.battleground", "BattlegroundAV::DoAction: {}. Unhandled action.", actionId);
909 break;
910 }
911 }
912
913 void ChangeMineOwner(AlteracValleyMine mine, Team team, bool initial = false)
914 {
915 if (team != ALLIANCE && team != HORDE)
916 team = TEAM_OTHER;
917
918 AlteracValleyMineInfo& mineInfo = _mineInfo[uint8(mine)];
919
920 if (mineInfo.Owner == team && !initial)
921 return;
922
923 mineInfo.Owner = team;
924
926
927 uint8 const textId = team == ALLIANCE ? mineInfo.StaticInfo.TextIdAlliance : mineInfo.StaticInfo.TextIdHorde;
928
929 std::string const stringId = team == ALLIANCE ? "bg_av_herald_mine_alliance" : "bg_av_herald_mine_horde";
930
931 if (Creature const* herald = FindHerald(stringId))
932 herald->AI()->Talk(textId);
933 }
934
936 {
937 switch (object)
938 {
1015 default:
1016 TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object :(");
1017 ABORT();
1018 return BG_AV_Nodes(0);
1019 }
1020 }
1021
1023 {
1024 if (!player || !target)
1025 return;
1026
1027 switch (target->GetEntry())
1028 {
1029 // graveyards
1042 // Snowfall
1046 // towers
1055 EventPlayerAssaultsPoint(player, target->GetEntry());
1056 break;
1057 // graveyards
1070 // towers
1079 EventPlayerDefendsPoint(player, target->GetEntry());
1080 break;
1081 // Snowfall special cases (either defend/assault)
1084 {
1085 BG_AV_Nodes const node = GetNodeThroughObject(target->GetEntry());
1086 if (_nodes[node].TotalOwner == TEAM_OTHER)
1087 EventPlayerAssaultsPoint(player, target->GetEntry());
1088 else
1089 EventPlayerDefendsPoint(player, target->GetEntry());
1090 break;
1091 }
1092 default:
1093 break;
1094 }
1095 }
1096
1098 {
1099 BG_AV_Nodes node = GetNodeThroughObject(object);
1100
1101 Team const owner = _nodes[node].Owner;
1102 Team const team = battleground->GetPlayerTeam(player->GetGUID());
1103
1104 if (owner == team || _nodes[node].State != POINT_ASSAULTED)
1105 return;
1106
1107 TC_LOG_DEBUG("bg.battleground", "player defends point object: {} node: {}", object, node);
1108 if (_nodes[node].PrevOwner != team)
1109 {
1110 TC_LOG_ERROR("bg.battleground", "BG_AV: player defends point which doesn't belong to his team {}", node);
1111 return;
1112 }
1113
1114 DefendNode(node, team);
1116
1117 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
1118 {
1119 std::string stringId;
1120
1121 if (IsTower(node))
1122 stringId = nodeInfo->StringIds.AllianceOrDefend;
1123 else
1124 stringId = team == ALLIANCE ? nodeInfo->StringIds.AllianceOrDefend : nodeInfo->StringIds.HordeOrDestroy;
1125
1126 if (Creature const* herald = FindHerald(stringId))
1127 herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
1128 }
1129
1130 // update the statistic for the defending player
1133 }
1134
1136 {
1137 BG_AV_Nodes node = GetNodeThroughObject(object);
1138 Team const owner = _nodes[node].Owner; //maybe name it prevowner
1139 Team const team = battleground->GetPlayerTeam(player->GetGUID());
1140
1141 TC_LOG_DEBUG("bg.battleground", "bg_av: player assaults point object {} node {}", object, node);
1142 if (owner == team || team == _nodes[node].TotalOwner)
1143 return; //surely a gm used this object
1144
1145 AssaultNode(node, team);
1147
1148 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
1149 {
1150 std::string stringId;
1151 if (IsTower(node))
1152 stringId = nodeInfo->StringIds.HordeOrDestroy;
1153 else
1154 stringId = team == ALLIANCE ? nodeInfo->StringIds.AllianceOrDefend : nodeInfo->StringIds.HordeOrDestroy;
1155
1156 if (Creature const* herald = FindHerald(stringId))
1157 herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack);
1158 }
1159
1160 // update the statistic for the assaulting player
1163 }
1164
1166 {
1167 if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
1168 {
1169 uint16 const owner = _nodes[node].Owner;
1170 BG_AV_States const state = _nodes[node].State;
1171
1172 UpdateWorldState(nodeInfo->WorldStateIds.AllianceAssault, owner == ALLIANCE && state == POINT_ASSAULTED);
1173 UpdateWorldState(nodeInfo->WorldStateIds.AllianceControl, owner == ALLIANCE && state >= POINT_DESTROYED);
1174 UpdateWorldState(nodeInfo->WorldStateIds.HordeAssault, owner == HORDE && state == POINT_ASSAULTED);
1175 UpdateWorldState(nodeInfo->WorldStateIds.HordeControl, owner == HORDE && state >= POINT_DESTROYED);
1176 if (nodeInfo->WorldStateIds.Owner)
1177 UpdateWorldState(nodeInfo->WorldStateIds.Owner, owner == HORDE ? 2 : owner == ALLIANCE ? 1 : 0);
1178 }
1179
1180 if (node == BG_AV_NODES_SNOWFALL_GRAVE)
1182 }
1183
1185 {
1186 AlteracValleyMineInfo const& mineInfo = _mineInfo[uint8(mine)];
1190 UpdateWorldState(mineInfo.StaticInfo.WorldStateOwner, mineInfo.Owner == HORDE ? 2 : mineInfo.Owner == ALLIANCE ? 1 : 0);
1191 }
1192
1194 {
1195 _nodes[node].PrevOwner = _nodes[node].Owner;
1196 _nodes[node].Owner = team;
1197 _nodes[node].PrevState = _nodes[node].State;
1198 _nodes[node].State = POINT_ASSAULTED;
1199 }
1200
1202 {
1203 _nodes[node].TotalOwner = _nodes[node].Owner;
1204 _nodes[node].PrevOwner = _nodes[node].Owner;
1205 _nodes[node].PrevState = _nodes[node].State;
1206 _nodes[node].State = (_nodes[node].Tower) ? POINT_DESTROYED : POINT_CONTROLED;
1207 }
1208
1209 void InitNode(BG_AV_Nodes node, Team team, bool tower)
1210 {
1211 _nodes[node].TotalOwner = team;
1212 _nodes[node].Owner = team;
1213 _nodes[node].PrevOwner = 0;
1214 _nodes[node].State = POINT_CONTROLED;
1215 _nodes[node].PrevState = _nodes[node].State;
1216 _nodes[node].State = POINT_CONTROLED;
1217 _nodes[node].Tower = tower;
1218 }
1219
1220 void DefendNode(BG_AV_Nodes node, Team team)
1221 {
1222 _nodes[node].PrevOwner = _nodes[node].Owner;
1223 _nodes[node].Owner = team;
1224 _nodes[node].PrevState = _nodes[node].State;
1225 _nodes[node].State = POINT_CONTROLED;
1226 }
1227
1229 {
1232
1233 if (allianceScore > hordeScore)
1234 return ALLIANCE;
1235 if (hordeScore > allianceScore)
1236 return HORDE;
1237
1239 }
1240
1241 void OnGameObjectCreate(GameObject* gameObject) override
1242 {
1243 switch (gameObject->GetEntry())
1244 {
1245 case BG_AV_GHOST_GATE:
1247 _doorGUIDs.insert(gameObject->GetGUID());
1248 break;
1249 default:
1250 break;
1251 }
1252 }
1253
1254 void OnCreatureCreate(Creature* creature) override
1255 {
1256 switch (creature->GetEntry())
1257 {
1259 _galvangarGUID = creature->GetGUID();
1260 break;
1262 _balindaGUID = creature->GetGUID();
1263 break;
1265 _heraldGUIDs.insert(creature->GetGUID());
1266 break;
1267 default:
1268 break;
1269 }
1270 }
1271
1272 uint32 GetData(uint32 dataId) const override
1273 {
1274 auto getDefenderTierForTeam = [&](TeamId teamId) -> DefenderTier
1275 {
1276 if (_teamQuestStatus[teamId][0] < 500)
1278
1279 if (_teamQuestStatus[teamId][0] < 1000)
1281
1282 if (_teamQuestStatus[teamId][0] < 1500)
1284
1286 };
1287
1288 switch (dataId)
1289 {
1291 return getDefenderTierForTeam(TEAM_ALLIANCE);
1293 return getDefenderTierForTeam(TEAM_HORDE);
1294 default:
1295 return BattlegroundScript::GetData(dataId);
1296 }
1297 }
1298
1299 Creature* FindHerald(std::string_view stringId) const
1300 {
1301 for (ObjectGuid const& guid : _heraldGUIDs)
1302 if (Creature* creature = battlegroundMap->GetCreature(guid))
1303 if (creature->HasStringId(stringId))
1304 return creature;
1305
1306 return nullptr;
1307 }
1308
1310 {
1311 for (const auto& nodeInfo : BGAVNodeInfo)
1312 if (nodeInfo.NodeId == node)
1313 return &nodeInfo;
1314
1315 return nullptr;
1316 }
1317
1318 bool IsTower(BG_AV_Nodes node) const { return _nodes[node].Tower; }
1319
1320 void UpdateScore(Team team, int16 points)
1321 {
1322 ASSERT(team == ALLIANCE || team == HORDE);
1323 TeamId const teamindex = Battleground::GetTeamIndexByTeamId(team);
1324 _teamResources[teamindex] += points;
1325
1327 if (points < 0)
1328 {
1329 if (_teamResources[teamindex] < 1)
1330 {
1331 _teamResources[teamindex] = 0;
1333 }
1334 else if (!_isInformedNearVictory[teamindex] && _teamResources[teamindex] < NEAR_LOSE_POINTS)
1335 {
1336 if (teamindex == TEAM_ALLIANCE)
1338 else
1341 _isInformedNearVictory[teamindex] = true;
1342 }
1343 }
1344 }
1345
1346private:
1347 /*variables */
1348 std::array<int32, PVP_TEAMS_COUNT> _teamResources;
1349 uint32 _teamQuestStatus[PVP_TEAMS_COUNT][9]; //[x][y] x=team y=questcounter
1350
1351 std::array<BG_AV_NodeInfo, BG_AV_NODES_MAX> _nodes;
1352
1353 TimeTracker _mineResourceTimer; //ticks for both teams
1354
1355 std::array<AlteracValleyMineInfo, 2> _mineInfo;
1356
1357 std::array<TimeTracker, PVP_TEAMS_COUNT> _captainBuffTimer;
1358
1359 std::array<bool, PVP_TEAMS_COUNT> _isInformedNearVictory;
1364};
1365
@ STATUS_IN_PROGRESS
uint8_t uint8
Definition Define.h:156
int16_t int16
Definition Define.h:151
int32_t int32
Definition Define.h:150
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:28
#define ABORT
Definition Errors.h:87
#define ASSERT
Definition Errors.h:80
#define TC_LOG_DEBUG(filterType__, message__,...)
Definition Log.h:181
#define TC_LOG_ERROR(filterType__, message__,...)
Definition Log.h:190
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition ObjectGuid.h:435
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
#define RegisterBattlegroundMapScript(script_name, mapId)
Definition ScriptMgr.h:1447
@ TEAM_ALLIANCE
@ TEAM_HORDE
uint8 constexpr PVP_TEAMS_COUNT
@ TEAM_OTHER
@ ALLIANCE
@ HORDE
@ CHAT_MSG_BG_SYSTEM_ALLIANCE
@ CHAT_MSG_BG_SYSTEM_HORDE
@ ACTION_BUFF_YELL
@ ACTION_AV_INTERACT_CAPTURABLE_OBJECT
@ ACTION_TURN_IN_COMMANDER_1
@ ACTION_TURN_IN_NEAR_MINE
@ ACTION_TURN_IN_RIDER_HIDE
@ ACTION_TURN_IN_OTHER_MINE
@ ACTION_TURN_IN_RIDER_TAME
@ ACTION_TURN_IN_BOSS_2
@ ACTION_TURN_IN_BOSS_1
@ ACTION_TURN_IN_COMMANDER_3
@ ACTION_AV_CAPTURE_CAPTURABLE_OBJECT
@ ACTION_TURN_IN_COMMANDER_2
@ ACTION_TURN_IN_SCRAPS
@ 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_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_SNOWFALL_CANDY_A
@ BG_AV_OBJECTID_BANNER_SNOWFALL_N
@ BG_AV_OBJECTID_STORMPIKE_HORDE_CONTROLLED
@ BG_AV_OBJECTID_AID_STATION_HORDE_CONTESTED
@ BG_AV_OBJECTID_SNOWFALL_CANDY_PH
@ BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTROLLED
@ BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_BANNER
@ 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_SNOWFALL_CANDY_H
@ BG_AV_OBJECTID_SNOWFALL_CANDY_PA
@ 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
constexpr Seconds BG_AV_MINE_RESOURCE_TIMER
@ AV_EXPLOIT_TELEPORT_LOCATION_ALLIANCE
@ AV_EXPLOIT_TELEPORT_LOCATION_HORDE
void AddSC_battleground_alterac_valley()
@ TEXT_COLDTOOTH_MINE_HORDE_TAKEN
@ TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN
@ TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN
BG_AV_Nodes & operator++(BG_AV_Nodes &i)
@ BG_AV_CREATURE_CHAMPION_GUARDIAN
@ BG_AV_CREATURE_SEASONED_DEFENDER
@ BG_AV_CREATURE_MASHA_SWIFTCUT
@ BG_AV_CREATURE_AGI_RUMBLESTOMP
@ BG_AV_CREATURE_VETERAN_DEFENDER
@ BG_AV_CREATURE_TASKMASTER_SNIVVLE
@ BG_AV_CREATURE_VETERAN_GUARDIAN
@ BG_AV_CREATURE_FROSTWOLF_GUARDIAN
@ BG_AV_CREATURE_STORMPIKE_DEFENDER
@ BG_AV_CREATURE_CHAMPION_DEFENDER
@ BG_AV_CREATURE_SEASONED_GUARDIAN
@ AV_WS_EAST_FROSTWOLF_TOWER_HORDE_CONTROLLED
@ AV_WS_COLDTOOTH_MINE_KOBOLD_CONTROLLED
@ AV_WS_STONEHEARTH_BUNKER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_SNOWFALL_GRAVEYARD_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_ICEBLOOD_TOWER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_FROSTWOLF_RELIEF_HUT_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_STONEHEARTH_GRAVEYARD_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STORMPIKE_GRAVEYARD_HORDE_CONTROLLED
@ AV_WS_WEST_FROSTWOLF_TOWER_DESTROYED
@ AV_WS_STONEHEARTH_GRAVEYARD_ALLIANCE_CONTROLLED
@ AV_WS_ICEWING_BUNKER_ALLIANCE_CONTROLLED
@ AV_WS_WEST_FROSTWOLF_TOWER_OWNER
@ AV_WS_FROSTWOLF_GRAVEYARD_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_EAST_FROSTWOLF_TOWER_DESTROYED
@ AV_WS_WEST_FROSTWOLF_TOWER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_EAST_FROSTWOLF_TOWER_OWNER
@ AV_WS_STORMPIKE_AID_STATION_HORDE_CONTROLLED
@ AV_WS_FROSTWOLF_GRAVEYARD_HORDE_CONTROLLED
@ AV_WS_IRONDEEP_MINE_HORDE_CONTROLLED
@ AV_WS_ICEBLOOD_GRAVEYARD_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_STONEHEARTH_BUNKER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STORMPIKE_GRAVEYARD_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_DUN_BALDAR_NORTH_BUNKER_DESTROYED
@ AV_WS_IRONDEEP_MINE_TROGG_CONTROLLED
@ AV_WS_DUN_BALDAR_NORTH_BUNKER_OWNER
@ AV_WS_ICEWING_BUNKER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STONEHEARTH_GRAVEYARD_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_COLDTOOTH_MINE_HORDE_CONTROLLED
@ AV_WS_ICEWING_BUNKER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_IRONDEEP_MINE_ALLIANCE_CONTROLLED
@ AV_WS_DUN_BALDAR_SOUTH_BUNKER_ALLIANCE_CONTROLLED
@ AV_WS_DUN_BALDAR_NORTH_BUNKER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STONEHEARTH_BUNKER_DESTROYED
@ AV_WS_FROSTWOLF_RELIEF_HUT_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_COLDTOOTH_MINE_ALLIANCE_CONTROLLED
@ AV_WS_LOKHOLAR_STORMPIKE_SOLDIERS_BLOOD_COUNT
@ AV_WS_TOWER_POINT_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_DUN_BALDAR_SOUTH_BUNKER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STONEHEARTH_BUNKER_ALLIANCE_CONTROLLED
@ AV_WS_ICEBLOOD_GRAVEYARD_ALLIANCE_CONTROLLED
@ AV_WS_FROSTWOLF_GRAVEYARD_ALLIANCE_CONTROLLED
@ AV_WS_SNOWFALL_GRAVEYARD_UNCONTROLLED
@ AV_WS_DUN_BALDAR_NORTH_BUNKER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_SHOW_HORDE_REINFORCEMENTS
@ AV_WS_WEST_FROSTWOLF_TOWER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STORMPIKE_GRAVEYARD_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_SHOW_ALLIANCE_REINFORCEMENTS
@ AV_WS_STORMPIKE_AID_STATION_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_ICEBLOOD_TOWER_HORDE_CONTROLLED
@ AV_WS_TOWER_POINT_HORDE_CONTROLLED
@ AV_WS_STONEHEARTH_GRAVEYARD_HORDE_CONTROLLED
@ AV_WS_LOKHOLAR_STORMPIKE_SOLDIERS_BLOOD_MAX
@ AV_WS_DUN_BALDAR_NORTH_BUNKER_ALLIANCE_CONTROLLED
@ AV_WS_DUN_BALDAR_SOUTH_BUNKER_OWNER
@ AV_WS_DUN_BALDAR_SOUTH_BUNKER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_ICEBLOOD_TOWER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STORMPIKE_GRAVEYARD_ALLIANCE_CONTROLLED
@ AV_WS_SNOWFALL_GRAVEYARD_ALLIANCE_CONTROLLED
@ AV_WS_STORMPIKE_AID_STATION_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_SNOWFALL_GRAVEYARD_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_STORMPIKE_AID_STATION_ALLIANCE_CONTROLLED
@ AV_WS_TOWER_POINT_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_FROSTWOLF_GRAVEYARD_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_ICEBLOOD_GRAVEYARD_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_WEST_FROSTWOLF_TOWER_HORDE_CONTROLLED
@ AV_WS_SNOWFALL_GRAVEYARD_HORDE_CONTROLLED
@ AV_WS_EAST_FROSTWOLF_TOWER_IN_CONFLICT_HORDE_ATTACKING
@ AV_WS_DUN_BALDAR_SOUTH_BUNKER_DESTROYED
@ AV_WS_FROSTWOLF_RELIEF_HUT_HORDE_CONTROLLED
@ AV_WS_ICEBLOOD_GRAVEYARD_HORDE_CONTROLLED
@ AV_WS_EAST_FROSTWOLF_TOWER_IN_CONFLICT_ALLIANCE_ATTACKING
@ AV_WS_FROSTWOLF_RELIEF_HUT_ALLIANCE_CONTROLLED
static StaticNodeInfo const BGAVNodeInfo[]
constexpr uint32 BG_AV_EVENT_START_BATTLE
constexpr uint32 BG_AV_SCORE_INITIAL_POINTS
@ BG_AV_TEXT_ALLIANCE_NEAR_LOSE
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
Battleground * battleground
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
BattlegroundMap * battlegroundMap
virtual void OnEnd(Team winner)
virtual void OnPlayerLeft(Player *player)
virtual Team GetPrematureWinner()
void UpdateWorldState(int32 worldStateId, int32 value, bool hidden=false) const
void PlaySoundToAll(uint32 SoundID)
void RewardHonorToTeam(uint32 Honor, Team team)
static TeamId GetTeamIndexByTeamId(Team team)
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
Team GetPlayerTeam(ObjectGuid guid) const
uint32 GetBonusHonorFromKill(uint32 kills) const
void UpdatePvpStat(Player *player, uint32 pvpStatId, uint32 value)
void CastSpellOnTeam(uint32 SpellID, Team team)
void UpdateSpawnGroupConditions()
Definition Map.cpp:2506
int32 GetWorldStateValue(int32 worldStateId) const
Definition Map.cpp:427
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:3552
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:3542
Player * ToPlayer()
Definition Object.h:126
GameObject * ToGameObject()
Definition Object.h:131
uint32 GetEntry() const
Definition Object.h:89
Definition Unit.h:635
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Object.cpp:1621
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:99
struct StaticNodeInfo::@330 WorldStateIds
struct StaticNodeInfo::@331 StringIds
struct StaticNodeInfo::@329 TextIds
void Update(int32 diff)
Definition Timer.h:121
bool Passed() const
Definition Timer.h:131
void Reset(int32 expiry)
Definition Timer.h:136
uint32 GetData(uint32 dataId) const override
void InitNode(BG_AV_Nodes node, Team team, bool tower)
void OnPlayerKilled(Player *victim, Player *) override
static BG_AV_Nodes GetNodeThroughObject(uint32 object)
Creature * FindHerald(std::string_view stringId) const
void AssaultNode(BG_AV_Nodes node, Team team)
uint32 _teamQuestStatus[PVP_TEAMS_COUNT][9]
void OnCreatureCreate(Creature *creature) override
void SendMineWorldStates(AlteracValleyMine mine) const
static StaticNodeInfo const * GetStaticNodeInfo(BG_AV_Nodes node)
void EventPlayerDefendsPoint(Player *player, uint32 object)
std::array< bool, PVP_TEAMS_COUNT > _isInformedNearVictory
void HandleInteractCapturableObject(Player *player, GameObject *target)
void DefendNode(BG_AV_Nodes node, Team team)
void EventPlayerAssaultsPoint(Player *player, uint32 object)
void OnGameObjectCreate(GameObject *gameObject) override
void OnPlayerLeft(Player *player) override
void DoAction(uint32 actionId, WorldObject *source, WorldObject *target) override
void EventPlayerDestroyedPoint(GameObject *gameobject)
void UpdateScore(Team team, int16 points)
void ChangeMineOwner(AlteracValleyMine mine, Team team, bool initial=false)
std::array< TimeTracker, PVP_TEAMS_COUNT > _captainBuffTimer
std::array< int32, PVP_TEAMS_COUNT > _teamResources
std::array< BG_AV_NodeInfo, BG_AV_NODES_MAX > _nodes
std::array< AlteracValleyMineInfo, 2 > _mineInfo
void UpdateNodeWorldState(BG_AV_Nodes node) const
void OnUnitKilled(Creature *victim, Unit *killer) override