aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy <Golrag@users.noreply.github.com>2024-01-01 23:33:25 +0100
committerGitHub <noreply@github.com>2024-01-01 23:33:25 +0100
commit6db980b69eed8275a9ffb474bae3ddbbd8cedfe9 (patch)
treee1d61e30d27fd88f301f6acff65efcae7dd6dd6c /src
parent9e22f4fa535d3c26fcb2a6ef7b8e923002f14d26 (diff)
Core/Battlegrounds: Rework Alterac Valley (#29530)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp1567
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h1425
-rw-r--r--src/server/game/Spells/SpellEffects.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp108
4 files changed, 773 insertions, 2331 deletions
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
index 5c9e5ef48c5..ce5a1023858 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
@@ -21,6 +21,7 @@
#include "DB2Stores.h"
#include "GameObject.h"
#include "Log.h"
+#include "Map.h"
#include "MotionMaster.h"
#include "ObjectMgr.h"
#include "Player.h"
@@ -34,36 +35,82 @@ enum AlteracValleyPvpStats
PVP_STAT_SECONDARY_OBJECTIVES = 82
};
+enum AlteracValleyMisc
+{
+ NEAR_LOSE_POINTS = 140
+};
+
+enum AlteracValleyHonorKillBonus
+{
+ HONOR_KILL_BONUS_BOSS = 4,
+ HONOR_KILL_BONUS_CAPTAIN = 3,
+ HONOR_KILL_BONUS_SURVIVING_TOWER = 2,
+ HONOR_KILL_BONUS_SURVIVING_CAPTAIN = 2,
+ HONOR_KILL_BONUS_DESTROY_TOWER = 3
+};
+
+enum AlteracValleyReputationGains
+{
+ REP_GAIN_BOSS = 350,
+ REP_GAIN_CAPTAIN = 125,
+ REP_GAIN_DESTROY_TOWER = 12,
+ REP_GAIN_SURVIVING_TOWER = 12,
+ REP_GAIN_SURVIVING_CAPTAIN = 125
+};
+
+enum AlteracValleyResourceLoss
+{
+ RESOURCE_LOSS_TOWER = -75,
+ RESOURCE_LOSS_CAPTAIN = -100
+};
+
+enum AlteracValleySpells
+{
+ SPELL_COMPLETE_ALTERAC_VALLEY_QUEST = 23658,
+};
+
+enum AlteracValleyFactions
+{
+ FACTION_FROSTWOLF_CLAN = 729,
+ FACTION_STORMPIKE_GUARD = 730,
+};
+
BattlegroundAV::BattlegroundAV(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate)
{
- BgObjects.resize(BG_AV_OBJECT_MAX);
- BgCreatures.resize(AV_CPLACE_MAX + AsUnderlyingType(AV_STATICCPLACE_MAX));
+ BgObjects.resize(0);
+ BgCreatures.resize(0);
- for (uint8 i = 0; i < 2; i++)
+ _teamResources = { BG_AV_SCORE_INITIAL_POINTS, BG_AV_SCORE_INITIAL_POINTS };
+ _isInformedNearVictory = { false, false };
+
+ 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
{
for (uint8 j = 0; j < 9; j++)
m_Team_QuestStatus[i][j] = 0;
- m_Team_Scores[i] = 0;
- m_IsInformedNearVictory[i] = false;
- m_CaptainAlive[i] = true;
- m_CaptainBuffTimer[i] = 0;
- m_Mine_Owner[i] = TEAM_OTHER;
- m_Mine_PrevOwner[i] = 0;
- m_Mine_Reclaim_Timer[i] = 0;
+
+ _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
}
- m_Mine_Timer = 0;
+ _mineInfo[uint8(AlteracValleyMine::North)] = { TEAM_OTHER, { AV_WS_IRONDEEP_MINE_OWNER, AV_WS_IRONDEEP_MINE_ALLIANCE_CONTROLLED, AV_WS_IRONDEEP_MINE_HORDE_CONTROLLED, AV_WS_IRONDEEP_MINE_TROGG_CONTROLLED, TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN, TEXT_IRONDEEP_MINE_HORDE_TAKEN } };
+ _mineInfo[uint8(AlteracValleyMine::South)] = { TEAM_OTHER, { AV_WS_COLDTOOTH_MINE_OWNER, AV_WS_COLDTOOTH_MINE_ALLIANCE_CONTROLLED, AV_WS_COLDTOOTH_MINE_HORDE_CONTROLLED, AV_WS_COLDTOOTH_MINE_KOBOLD_CONTROLLED, TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN, TEXT_COLDTOOTH_MINE_HORDE_TAKEN } };
+
+ for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves
+ InitNode(i, ALLIANCE, false);
+ for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers
+ InitNode(i, ALLIANCE, true);
+ for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves
+ InitNode(i, HORDE, false);
+ for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) //horde towers
+ InitNode(i, HORDE, true);
+ InitNode(BG_AV_NODES_SNOWFALL_GRAVE, TEAM_OTHER, false); //give snowfall neutral owner
- for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
- InitNode(i, TEAM_OTHER, false);
+ _mineResourceTimer.Reset(BG_AV_MINE_RESOURCE_TIMER);
StartMessageIds[BG_STARTING_EVENT_SECOND] = BG_AV_TEXT_START_ONE_MINUTE;
StartMessageIds[BG_STARTING_EVENT_THIRD] = BG_AV_TEXT_START_HALF_MINUTE;
StartMessageIds[BG_STARTING_EVENT_FOURTH] = BG_AV_TEXT_BATTLE_HAS_BEGUN;
}
-BattlegroundAV::~BattlegroundAV() { }
-
void BattlegroundAV::HandleKillPlayer(Player* player, Player* killer)
{
if (GetStatus() != STATUS_IN_PROGRESS)
@@ -79,82 +126,80 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Unit* killer)
if (GetStatus() != STATUS_IN_PROGRESS)
return;
- uint32 entry = unit->GetEntry();
- Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself();
-
- /*
- uint32 triggerSpawnID = 0;
- if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0])
- triggerSpawnID = AV_CPLACE_TRIGGER16;
- else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS][0])
- triggerSpawnID = AV_CPLACE_TRIGGER17;
- else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0])
- triggerSpawnID = AV_CPLACE_TRIGGER18;
- else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS][0])
- triggerSpawnID = AV_CPLACE_TRIGGER19;
- */
- if (entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS])
- {
- UpdateWorldState(AV_WS_VANDAAR_ALIVE, 0);
- CastSpellOnTeam(23658, HORDE); //this is a spell which finishes a quest where a player has to kill the boss
- RewardReputationToTeam(729, BG_AV_REP_BOSS, HORDE);
- RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), HORDE);
- EndBattleground(HORDE);
- DelCreature(AV_CPLACE_TRIGGER17);
- }
- else if (entry == BG_AV_CreatureInfo[AV_NPC_H_BOSS])
- {
- UpdateWorldState(AV_WS_DREKTHAR_ALIVE, 0);
- CastSpellOnTeam(23658, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
- RewardReputationToTeam(730, BG_AV_REP_BOSS, ALLIANCE);
- RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), ALLIANCE);
- EndBattleground(ALLIANCE);
- DelCreature(AV_CPLACE_TRIGGER19);
- }
- else if (entry == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN])
+ switch (unit->GetEntry())
{
- if (!m_CaptainAlive[0])
+ case BG_AV_CREATURE_VANNDAR:
{
- TC_LOG_ERROR("bg.battleground", "Killed a Captain twice, please report this bug, if you haven't done \".respawn\"");
- return;
+ UpdateWorldState(AV_WS_VANDAAR_ALIVE, 0);
+ CastSpellOnTeam(SPELL_COMPLETE_ALTERAC_VALLEY_QUEST, HORDE); //this is a spell which finishes a quest where a player has to kill the boss
+ RewardReputationToTeam(FACTION_FROSTWOLF_CLAN, REP_GAIN_BOSS, HORDE);
+ RewardHonorToTeam(GetBonusHonorFromKill(HONOR_KILL_BONUS_BOSS), HORDE);
+ EndBattleground(HORDE);
+ break;
}
- m_CaptainAlive[0]=false;
- UpdateWorldState(AV_WS_BALINDA_ALIVE, 0);
- RewardReputationToTeam(729, BG_AV_REP_CAPTAIN, HORDE);
- RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), HORDE);
- UpdateScore(ALLIANCE, (-1)*BG_AV_RES_CAPTAIN);
- //spawn destroyed aura
- for (uint8 i=0; i <= 9; i++)
- SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+i, RESPAWN_IMMEDIATELY);
- DelCreature(AV_CPLACE_TRIGGER16);
-
- if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))
- herold->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD);
- }
- else if (entry == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN])
- {
- if (!m_CaptainAlive[1])
+ case BG_AV_CREATURE_DREKTHAR:
+ {
+ UpdateWorldState(AV_WS_DREKTHAR_ALIVE, 0);
+ CastSpellOnTeam(SPELL_COMPLETE_ALTERAC_VALLEY_QUEST, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
+ RewardReputationToTeam(FACTION_STORMPIKE_GUARD, REP_GAIN_BOSS, ALLIANCE);
+ RewardHonorToTeam(GetBonusHonorFromKill(HONOR_KILL_BONUS_BOSS), ALLIANCE);
+ EndBattleground(ALLIANCE);
+ break;
+ }
+ case BG_AV_CREATURE_BALINDA:
+ {
+ UpdateWorldState(AV_WS_BALINDA_ALIVE, 0);
+ RewardReputationToTeam(FACTION_FROSTWOLF_CLAN, REP_GAIN_CAPTAIN, HORDE);
+ RewardHonorToTeam(GetBonusHonorFromKill(HONOR_KILL_BONUS_CAPTAIN), HORDE);
+ UpdateScore(ALLIANCE, RESOURCE_LOSS_CAPTAIN);
+ if (Creature* herald = FindHerald("bg_av_herald_horde_win"))
+ herald->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD);
+ break;
+ }
+ case BG_AV_CREATURE_GALVANGAR:
+ {
+ UpdateWorldState(AV_WS_GALVAGAR_ALIVE, 0);
+ RewardReputationToTeam(FACTION_STORMPIKE_GUARD, REP_GAIN_CAPTAIN, ALLIANCE);
+ RewardHonorToTeam(GetBonusHonorFromKill(HONOR_KILL_BONUS_CAPTAIN), ALLIANCE);
+ UpdateScore(HORDE, RESOURCE_LOSS_CAPTAIN);
+ if (Creature* herald = FindHerald("bg_av_herald_alliance_win"))
+ herald->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD);
+ break;
+ }
+ case BG_AV_CREATURE_MORLOCH:
+ {
+ // if mine is not owned by morloch, then nothing happens
+ if (_mineInfo[uint8(AlteracValleyMine::North)].Owner != TEAM_OTHER)
+ break;
+
+ Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
+ ChangeMineOwner(AlteracValleyMine::North, killerTeam);
+ break;
+ }
+ case BG_AV_CREATURE_TASKMASTER_SNIVVLE:
+ {
+ if (_mineInfo[uint8(AlteracValleyMine::South)].Owner != TEAM_OTHER)
+ break;
+
+ Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
+ ChangeMineOwner(AlteracValleyMine::South, killerTeam);
+ break;
+ }
+ case BG_AV_CREATURE_UMI_THORSON:
+ case BG_AV_CREATURE_KEETAR:
{
- TC_LOG_ERROR("bg.battleground", "Killed a Captain twice, please report this bug, if you haven't done \".respawn\"");
- return;
+ Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
+ ChangeMineOwner(AlteracValleyMine::North, killerTeam);
+ break;
+ }
+ case BG_AV_CREATURE_AGI_RUMBLESTOMP:
+ case BG_AV_CREATURE_MASHA_SWIFTCUT:
+ {
+ Team killerTeam = GetPlayerTeam(Coalesce<Unit>(killer->GetCharmerOrOwnerPlayerOrPlayerItself(), killer)->GetGUID());
+ ChangeMineOwner(AlteracValleyMine::South, killerTeam);
+ break;
}
- m_CaptainAlive[1]=false;
- UpdateWorldState(AV_WS_GALVAGAR_ALIVE, 0);
- RewardReputationToTeam(730, BG_AV_REP_CAPTAIN, ALLIANCE);
- RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), ALLIANCE);
- UpdateScore(HORDE, (-1)*BG_AV_RES_CAPTAIN);
- //spawn destroyed aura
- for (uint8 i=0; i <= 9; i++)
- SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_HORDE+i, RESPAWN_IMMEDIATELY);
- DelCreature(AV_CPLACE_TRIGGER18);
-
- if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))
- herold->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD);
}
- else if ((entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_H_4]) && killerPlayer)
- ChangeMineOwner(AV_NORTH_MINE, GetPlayerTeam(killerPlayer->GetGUID()));
- else if ((entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_H_4]) && killerPlayer)
- ChangeMineOwner(AV_SOUTH_MINE, GetPlayerTeam(killerPlayer->GetGUID()));
}
void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
@@ -162,7 +207,7 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
if (GetStatus() != STATUS_IN_PROGRESS)
return;//maybe we should log this, cause this must be a cheater or a big bug
Team team = GetPlayerTeam(player->GetGUID());
- uint8 teamIndex = GetTeamIndexByTeamId(team);
+ TeamId teamIndex = GetTeamIndexByTeamId(team);
/// @todo add reputation, events (including quest not available anymore, next quest available, go/npc de/spawning)and maybe honor
TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed", questid);
switch (questid)
@@ -171,18 +216,7 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
case AV_QUEST_A_SCRAPS2:
case AV_QUEST_H_SCRAPS1:
case AV_QUEST_H_SCRAPS2:
- m_Team_QuestStatus[teamIndex][0]+=20;
- if (m_Team_QuestStatus[teamIndex][0] == 500 || m_Team_QuestStatus[teamIndex][0] == 1000 || m_Team_QuestStatus[teamIndex][0] == 1500) //25, 50, 75 turn ins
- {
- TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed starting with unit upgrading..", questid);
- for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
- if (m_Nodes[i].Owner == team && m_Nodes[i].State == POINT_CONTROLED)
- {
- DePopulateNode(i);
- PopulateNode(i);
- //maybe this is bad, because it will instantly respawn all creatures on every grave..
- }
- }
+ m_Team_QuestStatus[teamIndex][0] += 20;
break;
case AV_QUEST_A_COMMANDER1:
case AV_QUEST_H_COMMANDER1:
@@ -258,230 +292,145 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
break;
default:
TC_LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed but is not interesting at all", questid);
- return; //was no interesting quest at all
break;
}
}
void BattlegroundAV::UpdateScore(Team team, int16 points)
-{ //note: to remove reinforcementpoints points must be negative, for adding reinforcements points must be positive
+{
ASSERT(team == ALLIANCE || team == HORDE);
- uint8 teamindex = GetTeamIndexByTeamId(team); //0=ally 1=horde
- m_Team_Scores[teamindex] += points;
+ TeamId teamindex = GetTeamIndexByTeamId(team);
+ _teamResources[teamindex] += points;
- UpdateWorldState(teamindex == TEAM_HORDE ? AV_WS_HORDE_REINFORCEMENTS : AV_WS_ALLIANCE_REINFORCEMENTS, m_Team_Scores[teamindex]);
+ UpdateWorldState(teamindex == TEAM_HORDE ? AV_WS_HORDE_REINFORCEMENTS : AV_WS_ALLIANCE_REINFORCEMENTS, _teamResources[teamindex]);
if (points < 0)
{
- if (m_Team_Scores[teamindex] < 1)
+ if (_teamResources[teamindex] < 1)
{
- m_Team_Scores[teamindex] = 0;
+ _teamResources[teamindex] = 0;
EndBattleground(teamindex == TEAM_HORDE ? ALLIANCE : HORDE);
}
- else if (!m_IsInformedNearVictory[teamindex] && m_Team_Scores[teamindex] < SEND_MSG_NEAR_LOSE)
+ else if (!_isInformedNearVictory[teamindex] && _teamResources[teamindex] < NEAR_LOSE_POINTS)
{
if (teamindex == TEAM_ALLIANCE)
SendBroadcastText(BG_AV_TEXT_ALLIANCE_NEAR_LOSE, CHAT_MSG_BG_SYSTEM_ALLIANCE);
else
SendBroadcastText(BG_AV_TEXT_HORDE_NEAR_LOSE, CHAT_MSG_BG_SYSTEM_HORDE);
PlaySoundToAll(AV_SOUND_NEAR_VICTORY);
- m_IsInformedNearVictory[teamindex] = true;
+ _isInformedNearVictory[teamindex] = true;
}
}
}
-Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type)
+void BattlegroundAV::PostUpdateImpl(uint32 diff)
{
- bool isStatic = false;
- Creature* creature = nullptr;
- ASSERT(type < AV_CPLACE_MAX + AsUnderlyingType(AV_STATICCPLACE_MAX));
- if (type >= AV_CPLACE_MAX) //static
- {
- type -= AV_CPLACE_MAX;
- cinfoid = uint16(BG_AV_StaticCreaturePos[type][4]);
- creature = AddCreature(BG_AV_StaticCreatureInfo[cinfoid],
- type + AV_CPLACE_MAX,
- BG_AV_StaticCreaturePos[type][0],
- BG_AV_StaticCreaturePos[type][1],
- BG_AV_StaticCreaturePos[type][2],
- BG_AV_StaticCreaturePos[type][3]);
- isStatic = true;
- }
- else
- {
- creature = AddCreature(BG_AV_CreatureInfo[cinfoid], type, BG_AV_CreaturePos[type]);
- }
- if (!creature)
- return nullptr;
- if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN] || creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN])
- creature->SetRespawnDelay(RESPAWN_ONE_DAY); /// @todo look if this can be done by database + also add this for the wingcommanders
+ if (GetStatus() != STATUS_IN_PROGRESS)
+ return;
- if ((isStatic && cinfoid >= 10 && cinfoid <= 14) || (!isStatic && (cinfoid <= AV_NPC_A_GRAVEDEFENSE3 || (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3))))
+ _mineResourceTimer.Update(diff);
+ if (_mineResourceTimer.Passed())
{
- if (!isStatic && (cinfoid <= AV_NPC_A_GRAVEDEFENSE3 || (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3)))
+ for (AlteracValleyMineInfo const& info : _mineInfo)
{
- CreatureData &data = sObjectMgr->NewOrExistCreatureData(creature->GetSpawnId());
- data.spawnGroupData = sObjectMgr->GetDefaultSpawnGroup();
- data.wander_distance = 5;
- }
- //else wander_distance will be 15, so creatures move maximum=10
- //creature->SetDefaultMovementType(RANDOM_MOTION_TYPE);
- creature->GetMotionMaster()->Initialize();
- creature->setDeathState(JUST_DIED);
- creature->Respawn();
- /// @todo find a way to add a motionmaster without killing the creature (i
- //just copied this code from a gm-command
- }
+ if (info.Owner == TEAM_OTHER)
+ continue;
- uint32 triggerSpawnID = 0;
- uint32 newFaction = 0;
- if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN])
- {
- triggerSpawnID = AV_CPLACE_TRIGGER16;
- newFaction = 84;
- }
- else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS])
- {
- triggerSpawnID = AV_CPLACE_TRIGGER17;
- newFaction = 84;
- }
- else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN])
- {
- triggerSpawnID = AV_CPLACE_TRIGGER18;
- newFaction = 83;
- }
- else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS])
- {
- triggerSpawnID = AV_CPLACE_TRIGGER19;
- newFaction = 83;
- }
- if (triggerSpawnID && newFaction)
- {
- if (Creature* trigger = AddCreature(WORLD_TRIGGER, triggerSpawnID, BG_AV_CreaturePos[triggerSpawnID]))
- {
- trigger->SetFaction(newFaction);
- trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);
+ UpdateScore(info.Owner, 1);
}
- }
- return creature;
-}
+ _mineResourceTimer.Reset(BG_AV_MINE_RESOURCE_TIMER);
+ }
-void BattlegroundAV::PostUpdateImpl(uint32 diff)
-{
- if (GetStatus() == STATUS_IN_PROGRESS)
+ for (uint8 i = TEAM_ALLIANCE; i <= TEAM_HORDE; i++)
{
- for (uint8 i=0; i <= 1; i++)//0=alliance, 1=horde
+ if (!IsCaptainAlive(TeamId(i)))
+ continue;
+
+ _captainBuffTimer[i].Update(diff);
+ if (_captainBuffTimer[i].Passed())
{
- if (!m_CaptainAlive[i])
- continue;
- if (m_CaptainBuffTimer[i] > diff)
- m_CaptainBuffTimer[i] -= diff;
- else
+ if (i == 0)
{
- if (i == 0)
- {
- CastSpellOnTeam(AV_BUFF_A_CAPTAIN, ALLIANCE);
- if (Creature* creature = GetBGCreature(AV_CPLACE_MAX + 61))
- creature->AI()->DoAction(ACTION_BUFF_YELL);
- }
- else
- {
- CastSpellOnTeam(AV_BUFF_H_CAPTAIN, HORDE);
- if (Creature* creature = GetBGCreature(AV_CPLACE_MAX + 59))
- creature->AI()->DoAction(ACTION_BUFF_YELL);
- }
- m_CaptainBuffTimer[i] = 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
+ CastSpellOnTeam(AV_BUFF_A_CAPTAIN, ALLIANCE);
+ if (Creature* creature = GetBgMap()->GetCreature(_balindaGUID))
+ creature->AI()->DoAction(ACTION_BUFF_YELL);
}
- }
- //add points from mine owning, and look if he neutral team wanrts to reclaim the mine
- m_Mine_Timer -=diff;
- for (uint8 mine=0; mine <2; mine++)
- {
- if (m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE)
+ else
{
- if (m_Mine_Timer <= 0)
- UpdateScore(m_Mine_Owner[mine], 1);
-
- if (m_Mine_Reclaim_Timer[mine] > diff)
- m_Mine_Reclaim_Timer[mine] -= diff;
- else{ //we don't need to set this timer to 0 cause this codepart wont get called when this thing is 0
- ChangeMineOwner(mine, TEAM_OTHER);
- }
+ CastSpellOnTeam(AV_BUFF_H_CAPTAIN, HORDE);
+ if (Creature* creature = GetBgMap()->GetCreature(_galvangarGUID))
+ creature->AI()->DoAction(ACTION_BUFF_YELL);
}
- }
- if (m_Mine_Timer <= 0)
- m_Mine_Timer = AV_MINE_TICK_TIMER; //this is at the end, cause we need to update both mines
- //looks for all timers of the nodes and destroy the building (for graveyards the building wont get destroyed, it goes just to the other team
- for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
- if (m_Nodes[i].State == POINT_ASSAULTED) //maybe remove this
- {
- if (m_Nodes[i].Timer > diff)
- m_Nodes[i].Timer -= diff;
- else
- EventPlayerDestroyedPoint(i);
- }
+ _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
+ }
}
}
-void BattlegroundAV::StartingEventCloseDoors()
+bool BattlegroundAV::IsCaptainAlive(TeamId teamId) const
{
- DoorClose(BG_AV_OBJECT_DOOR_A);
- DoorClose(BG_AV_OBJECT_DOOR_H);
+ if (teamId == TEAM_HORDE)
+ return GetBgMap()->GetWorldStateValue(AV_WS_GALVAGAR_ALIVE) == 1;
+ else if (teamId == TEAM_ALLIANCE)
+ return GetBgMap()->GetWorldStateValue(AV_WS_BALINDA_ALIVE) == 1;
+
+ return false;
}
void BattlegroundAV::StartingEventOpenDoors()
{
TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning mine stuff");
- for (uint16 i= BG_AV_OBJECT_MINE_SUPPLY_N_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_N_MAX; i++)
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
- for (uint16 i= BG_AV_OBJECT_MINE_SUPPLY_S_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_S_MAX; i++)
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
- for (uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; mine++) //mine population
- ChangeMineOwner(mine, TEAM_OTHER, true);
UpdateWorldState(AV_WS_SHOW_HORDE_REINFORCEMENTS, 1);
UpdateWorldState(AV_WS_SHOW_ALLIANCE_REINFORCEMENTS, 1);
- DoorOpen(BG_AV_OBJECT_DOOR_H);
- DoorOpen(BG_AV_OBJECT_DOOR_A);
-
// Achievement: The Alterac Blitz
TriggerGameEvent(BG_AV_EVENT_START_BATTLE);
+
+ for (ObjectGuid const& guid : _doorGUIDs)
+ {
+ if (GameObject* gameObject = GetBgMap()->GetGameObject(guid))
+ {
+ gameObject->UseDoorOrButton();
+ Seconds delay = gameObject->GetEntry() == BG_AV_GHOST_GATE ? 0s : 3s;
+ gameObject->DespawnOrUnsummon(delay);
+ }
+ }
}
void BattlegroundAV::EndBattleground(Team winner)
{
//calculate bonuskills for both teams:
//first towers:
- uint8 kills[2] = {0, 0}; // 0 = Alliance 1 = Horde
- uint8 rep[2] = {0, 0}; // 0 = Alliance 1 = Horde
+ std::array<uint8, PVP_TEAMS_COUNT> kills = { 0, 0 };
+ std::array<uint8, PVP_TEAMS_COUNT> rep = { 0, 0 };
+
for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i)
{
- if (m_Nodes[i].State == POINT_CONTROLED)
+ if (_nodes[i].State == POINT_CONTROLED)
+ {
+ if (_nodes[i].Owner == ALLIANCE)
+ {
+ rep[TEAM_ALLIANCE] += REP_GAIN_SURVIVING_TOWER;
+ kills[TEAM_ALLIANCE] += HONOR_KILL_BONUS_SURVIVING_TOWER;
+ }
+ else
{
- if (m_Nodes[i].Owner == ALLIANCE)
- {
- rep[0] += BG_AV_REP_SURVIVING_TOWER;
- kills[0] += BG_AV_KILL_SURVIVING_TOWER;
- }
- else
- {
- rep[0] += BG_AV_KILL_SURVIVING_TOWER;
- kills[1] += BG_AV_KILL_SURVIVING_TOWER;
- }
+ rep[TEAM_HORDE] += REP_GAIN_SURVIVING_TOWER;
+ kills[TEAM_HORDE] += HONOR_KILL_BONUS_SURVIVING_TOWER;
}
+ }
}
- for (int i = TEAM_ALLIANCE; i <= TEAM_HORDE; ++i)
+ for (uint8 i = TEAM_ALLIANCE; i <= TEAM_HORDE; ++i)
{
- if (m_CaptainAlive[i])
+ if (IsCaptainAlive(TeamId(i)))
{
- kills[i] += BG_AV_KILL_SURVIVING_CAPTAIN;
- rep[i] += BG_AV_REP_SURVIVING_CAPTAIN;
+ kills[i] += HONOR_KILL_BONUS_SURVIVING_CAPTAIN;
+ rep[i] += REP_GAIN_SURVIVING_CAPTAIN;
}
if (rep[i] != 0)
- RewardReputationToTeam(i == 0 ? 730 : 729, rep[i], i == 0 ? ALLIANCE : HORDE);
+ RewardReputationToTeam(i == 0 ? FACTION_STORMPIKE_GUARD : FACTION_FROSTWOLF_CLAN, rep[i], i == 0 ? ALLIANCE : HORDE);
if (kills[i] != 0)
RewardHonorToTeam(GetBonusHonorFromKill(kills[i]), i == 0 ? ALLIANCE : HORDE);
}
@@ -492,15 +441,13 @@ void BattlegroundAV::EndBattleground(Team winner)
void BattlegroundAV::RemovePlayer(Player* player, ObjectGuid /*guid*/, uint32 /*team*/)
{
- if (!player)
+ if (!player)
{
TC_LOG_ERROR("bg.battleground", "bg_AV no player at remove");
return;
}
/// @todo search more buffs
player->RemoveAurasDueToSpell(AV_BUFF_ARMOR);
- player->RemoveAurasDueToSpell(AV_BUFF_A_CAPTAIN);
- player->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);
}
void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
@@ -529,312 +476,226 @@ void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger, bool ente
}
}
-void BattlegroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node)
+void BattlegroundAV::EventPlayerDestroyedPoint(GameObject* gameobject)
{
- uint32 object = GetObjectThroughNode(node);
- TC_LOG_DEBUG("bg.battleground", "bg_av: player destroyed point node {} object {}", node, object);
+ if (!gameobject)
+ return;
- //despawn banner
- SpawnBGObject(object, RESPAWN_ONE_DAY);
+ BG_AV_Nodes node = GetNodeThroughObject(gameobject->GetEntry());
DestroyNode(node);
UpdateNodeWorldState(node);
- Team owner = m_Nodes[node].Owner;
+ Team owner = _nodes[node].Owner;
if (IsTower(node))
{
- uint8 tmp = node-BG_AV_NODES_DUNBALDAR_SOUTH;
- //despawn marshal
- if (!BgCreatures[AV_CPLACE_A_MARSHAL_SOUTH + tmp].IsEmpty())
- DelCreature(AV_CPLACE_A_MARSHAL_SOUTH + tmp);
- else
- TC_LOG_ERROR("bg.battleground", "BG_AV: playerdestroyedpoint: marshal {} doesn't exist", AV_CPLACE_A_MARSHAL_SOUTH + tmp);
- //spawn destroyed aura
- for (uint8 i=0; i <= 9; i++)
- SpawnBGObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + i + (tmp * 10), RESPAWN_IMMEDIATELY);
+ UpdateScore((owner == ALLIANCE) ? HORDE : ALLIANCE, RESOURCE_LOSS_TOWER);
+ RewardReputationToTeam(owner == ALLIANCE ? FACTION_STORMPIKE_GUARD : FACTION_FROSTWOLF_CLAN, REP_GAIN_DESTROY_TOWER, owner);
+ RewardHonorToTeam(GetBonusHonorFromKill(HONOR_KILL_BONUS_DESTROY_TOWER), owner);
+ }
- UpdateScore((owner == ALLIANCE) ? HORDE : ALLIANCE, -1 * BG_AV_RES_TOWER);
- RewardReputationToTeam(owner == ALLIANCE ? 730 : 729, BG_AV_REP_TOWER, owner);
- RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_TOWER), owner);
+ if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
+ if (Creature* herald = FindHerald(nodeInfo->StringIds.HordeOrDestroy))
+ herald->AI()->Talk(owner == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
- SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + uint32(GetTeamIndexByTeamId(owner)) + (2 * tmp), RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH + uint32(GetTeamIndexByTeamId(owner)) + (2 * tmp), RESPAWN_ONE_DAY);
- }
- else
+ GetBgMap()->UpdateSpawnGroupConditions();
+}
+
+void BattlegroundAV::DoAction(uint32 actionId, WorldObject* source, WorldObject* target)
+{
+ switch (actionId)
{
- if (owner == ALLIANCE)
- SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);
- else
- SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);
- SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION + uint32(GetTeamIndexByTeamId(owner)) + 3 * node, RESPAWN_IMMEDIATELY);
- PopulateNode(node);
- if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy
- {
- for (uint8 i = 0; i < 4; i++)
- {
- SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY);
- SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY);
- }
- }
+ case ACTION_AV_CAPTURE_CAPTURABLE_OBJECT:
+ EventPlayerDestroyedPoint(source->ToGameObject());
+ break;
+ case ACTION_AV_INTERACT_CAPTURABLE_OBJECT:
+ if (target && source && source->IsPlayer())
+ HandleInteractCapturableObject(source->ToPlayer(), target->ToGameObject());
+ break;
+ default:
+ TC_LOG_ERROR("bg.battleground", "BattlegroundAV::DoAction: {}. Unhandled action.", actionId);
+ break;
}
-
- if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
- if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))
- herold->AI()->Talk(owner == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
}
-void BattlegroundAV::ChangeMineOwner(uint8 mine, Team team, bool initial)
+void BattlegroundAV::ChangeMineOwner(AlteracValleyMine mine, Team team, bool initial)
{
- // mine=0 northmine mine=1 southmin
- // changing the owner results in setting respawntim to infinite for current creatures,
- // spawning new mine owners creatures and changing the chest-objects so that the current owning team can use them
- ASSERT(mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE);
if (team != ALLIANCE && team != HORDE)
team = TEAM_OTHER;
- if (m_Mine_Owner[mine] == team && !initial)
- return;
- m_Mine_PrevOwner[mine] = m_Mine_Owner[mine];
- m_Mine_Owner[mine] = team;
-
- if (!initial)
- {
- TC_LOG_DEBUG("bg.battleground", "bg_av depopulating mine {} (0=north, 1=south)", mine);
- if (mine == AV_SOUTH_MINE)
- for (uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++)
- if (!BgCreatures[i].IsEmpty())
- DelCreature(i); /// @todo just set the respawntime to 999999
- for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3); i++)
- if (!BgCreatures[i].IsEmpty())
- DelCreature(i); /// @todo here also
- }
- SendMineWorldStates(mine);
-
- TC_LOG_DEBUG("bg.battleground", "bg_av populating mine {} (0=north, 1=south)", mine);
- uint16 miner;
- //also neutral team exists.. after a big time, the neutral team tries to conquer the mine
- if (mine == AV_NORTH_MINE)
- {
- if (team == ALLIANCE)
- miner = AV_NPC_N_MINE_A_1;
- else if (team == HORDE)
- miner = AV_NPC_N_MINE_H_1;
- else
- miner = AV_NPC_N_MINE_N_1;
- }
- else
- {
- uint16 cinfo;
- if (team == ALLIANCE)
- miner = AV_NPC_S_MINE_A_1;
- else if (team == HORDE)
- miner = AV_NPC_S_MINE_H_1;
- else
- miner = AV_NPC_S_MINE_N_1;
- //vermin
- TC_LOG_DEBUG("bg.battleground", "spawning vermin");
- if (team == ALLIANCE)
- cinfo = AV_NPC_S_MINE_A_3;
- else if (team == HORDE)
- cinfo = AV_NPC_S_MINE_H_3;
- else
- cinfo = AV_NPC_S_MINE_N_S;
- for (uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++)
- AddAVCreature(cinfo, i);
- }
- for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MAX:AV_CPLACE_MINE_S_1_MAX); i++)
- AddAVCreature(miner, i);
- //the next chooses randomly between 2 cretures
- for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MIN:AV_CPLACE_MINE_S_2_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MAX:AV_CPLACE_MINE_S_2_MAX); i++)
- AddAVCreature(miner+(urand(1, 2)), i);
- AddAVCreature(miner+3, (mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3);
-
- if (team == ALLIANCE || team == HORDE)
- {
- m_Mine_Reclaim_Timer[mine]=AV_MINE_RECLAIM_TIMER;
+ AlteracValleyMineInfo& mineInfo = _mineInfo[uint8(mine)];
- if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))
- {
- if (mine == AV_NORTH_MINE)
- herold->AI()->Talk(team == ALLIANCE ? TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN : TEXT_IRONDEEP_MINE_HORDE_TAKEN);
- else if (mine == AV_SOUTH_MINE)
- herold->AI()->Talk(team == ALLIANCE ? TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN : TEXT_COLDTOOTH_MINE_HORDE_TAKEN);
- }
- }
- else
- {
- if (mine == AV_SOUTH_MINE) //i think this gets called all the time
- {
- if (Creature* creature = GetBGCreature(AV_CPLACE_MINE_S_3))
- creature->AI()->Talk(TEXT_SNIVVLE_RANDOM);
- }
- }
- return;
-}
+ if (mineInfo.Owner == team && !initial)
+ return;
-bool BattlegroundAV::CanActivateGO(int32 GOId, uint32 team) const
-{
- if (GOId == BG_AV_OBJECTID_MINE_N)
- return (m_Mine_Owner[AV_NORTH_MINE] == Team(team));
- if (GOId == BG_AV_OBJECTID_MINE_S)
- return (m_Mine_Owner[AV_SOUTH_MINE] == Team(team));
- return true; //cause it's no mine'object it is ok if this is true
-}
+ mineInfo.Owner = team;
-void BattlegroundAV::PopulateNode(BG_AV_Nodes node)
-{
- Team owner = m_Nodes[node].Owner;
- ASSERT(owner);
+ SendMineWorldStates(mine);
- uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + (4 * node);
- uint32 creatureid;
- if (IsTower(node))
- creatureid=(owner == ALLIANCE)?AV_NPC_A_TOWERDEFENSE:AV_NPC_H_TOWERDEFENSE;
- else
- {
- uint8 team2 = GetTeamIndexByTeamId(owner);
- if (m_Team_QuestStatus[team2][0] < 500)
- creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE0 : AV_NPC_H_GRAVEDEFENSE0;
- else if (m_Team_QuestStatus[team2][0] < 1000)
- creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE1 : AV_NPC_H_GRAVEDEFENSE1;
- else if (m_Team_QuestStatus[team2][0] < 1500)
- creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE2 : AV_NPC_H_GRAVEDEFENSE2;
- else
- creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE3 : AV_NPC_H_GRAVEDEFENSE3;
- //spiritguide
- if (!BgCreatures[node].IsEmpty())
- DelCreature(node);
- if (!AddSpiritGuide(node, BG_AV_CreaturePos[node], GetTeamIndexByTeamId(owner)))
- TC_LOG_ERROR("bg.battleground", "AV: couldn't spawn spiritguide at node {}", node);
- }
- for (uint8 i=0; i<4; i++)
- AddAVCreature(creatureid, c_place+i);
+ uint8 textId = team == ALLIANCE ? mineInfo.StaticInfo.TextIdAlliance : mineInfo.StaticInfo.TextIdHorde;
- if (node >= BG_AV_NODES_MAX)//fail safe
- return;
- Creature* trigger = GetBGCreature(node + 302, false);//0-302 other creatures
- if (!trigger)
- {
- trigger = AddCreature(WORLD_TRIGGER,
- node + 302,
- BG_AV_CreaturePos[node + 302],
- GetTeamIndexByTeamId(owner));
- }
+ std::string stringId = team == ALLIANCE ? "bg_av_herald_mine_alliance" : "bg_av_herald_mine_horde";
- //add bonus honor aura trigger creature when node is accupied
- //cast bonus aura (+50% honor in 25yards)
- //aura should only apply to players who have accupied the node, set correct faction for trigger
- if (trigger)
- {
- if (owner != ALLIANCE && owner != HORDE)//node can be neutral, remove trigger
- {
- DelCreature(node + 302);
- return;
- }
- trigger->SetFaction(owner == ALLIANCE ? FACTION_ALLIANCE_GENERIC : FACTION_HORDE_GENERIC);
- trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);
- }
-}
-void BattlegroundAV::DePopulateNode(BG_AV_Nodes node)
-{
- uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + (4 * node);
- for (uint8 i = 0; i < 4; i++)
- if (!BgCreatures[c_place + i].IsEmpty())
- DelCreature(c_place + i);
- //spiritguide
- if (!IsTower(node) && !BgCreatures[node].IsEmpty())
- DelCreature(node);
-
- //remove bonus honor aura trigger creature when node is lost
- if (node < BG_AV_NODES_MAX)//fail safe
- DelCreature(node + 302);//NULL checks are in DelCreature! 0-302 spirit guides
+ if (Creature* herald = FindHerald(stringId))
+ herald->AI()->Talk(textId);
}
BG_AV_Nodes BattlegroundAV::GetNodeThroughObject(uint32 object)
{
- TC_LOG_DEBUG("bg.battleground", "bg_AV getnodethroughobject {}", object);
- if (object <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER)
- return BG_AV_Nodes(object);
- if (object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT)
- return BG_AV_Nodes(object - 11);
- if (object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER)
- return BG_AV_Nodes(object - 7);
- if (object <= BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER)
- return BG_AV_Nodes(object -22);
- if (object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT)
- return BG_AV_Nodes(object - 33);
- if (object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER)
- return BG_AV_Nodes(object - 29);
- if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE)
- return BG_AV_NODES_SNOWFALL_GRAVE;
- TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object :(");
- ABORT();
- return BG_AV_Nodes(0);
-}
-
-uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node)
-{ //this function is the counterpart to GetNodeThroughObject()
- TC_LOG_DEBUG("bg.battleground", "bg_AV GetObjectThroughNode {}", node);
- if (m_Nodes[node].Owner == ALLIANCE)
- {
- if (m_Nodes[node].State == POINT_ASSAULTED)
- {
- if (node <= BG_AV_NODES_FROSTWOLF_HUT)
- return node+11;
- if (node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER)
- return node+7;
- }
- else if (m_Nodes[node].State == POINT_CONTROLED)
- if (node <= BG_AV_NODES_STONEHEART_BUNKER)
- return node;
- }
- else if (m_Nodes[node].Owner == HORDE)
- {
- if (m_Nodes[node].State == POINT_ASSAULTED)
- {
- if (node <= BG_AV_NODES_STONEHEART_BUNKER)
- return node+22;
- }
- else if (m_Nodes[node].State == POINT_CONTROLED)
- {
- if (node <= BG_AV_NODES_FROSTWOLF_HUT)
- return node+33;
- if (node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER)
- return node+29;
- }
+ switch (object)
+ {
+ case BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_AID_STATION_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_AID_STATION_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTESTED:
+ return BG_AV_NODES_FIRSTAID_STATION;
+ case BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_STORMPIKE_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_STORMPIKE_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTESTED:
+ return BG_AV_NODES_STORMPIKE_GRAVE;
+ case BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTROLLED:
+ return BG_AV_NODES_STONEHEART_GRAVE;
+ case BG_AV_OBJECTID_SNOWFALL_NEUTRAL:
+ case BG_AV_OBJECTID_SNOWFALL_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_SNOWFALL_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTROLLED:
+ return BG_AV_NODES_SNOWFALL_GRAVE;
+ case BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTESTED:
+ return BG_AV_NODES_ICEBLOOD_GRAVE;
+ case BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTESTED:
+ return BG_AV_NODES_FROSTWOLF_GRAVE;
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTESTED:
+ return BG_AV_NODES_FROSTWOLF_HUT;
+ case BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_DUNBALDAR_SOUTH;
+ case BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_DUNBALDAR_NORTH;
+ case BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_EAST_TOWER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_EAST_TOWER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_FROSTWOLF_ETOWER;
+ case BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_WEST_TOWER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_WEST_TOWER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_FROSTWOLF_WTOWER;
+ case BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_TOWER_POINT_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_TOWER_POINT_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_TOWER_POINT;
+ case BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_ICEBLOOD_TOWER;
+ case BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_STONEHEART_BUNKER;
+ case BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_TOWER_BANNER:
+ case BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_TOWER_BANNER:
+ return BG_AV_NODES_ICEWING_BUNKER;
+ default:
+ TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object :(");
+ ABORT();
+ return BG_AV_Nodes(0);
}
- else if (m_Nodes[node].Owner == TEAM_OTHER)
- return BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE;
- TC_LOG_ERROR("bg.battleground", "BattlegroundAV: Error! GetPlaceNode couldn't resolve node {}", node);
- ABORT();
- return 0;
}
-//called when using banner
-
-void BattlegroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj)
+void BattlegroundAV::HandleInteractCapturableObject(Player* player, GameObject* target)
{
- if (GetStatus() != STATUS_IN_PROGRESS)
- return;
- int32 object = GetObjectType(target_obj->GetGUID());
- TC_LOG_DEBUG("bg.battleground", "BG_AV using gameobject {} with type {}", target_obj->GetEntry(), object);
- if (object < 0)
+ if (!player || !target)
return;
- switch (target_obj->GetEntry())
- {
- case BG_AV_OBJECTID_BANNER_A:
- case BG_AV_OBJECTID_BANNER_A_B:
- case BG_AV_OBJECTID_BANNER_H:
- case BG_AV_OBJECTID_BANNER_H_B:
- case BG_AV_OBJECTID_BANNER_SNOWFALL_N:
- EventPlayerAssaultsPoint(source, object);
+
+ switch (target->GetEntry())
+ {
+ // graveyards
+ case BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_AID_STATION_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTROLLED:
+ case BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_STORMPIKE_HORDE_CONTROLLED:
+ // Snowfall
+ case BG_AV_OBJECTID_SNOWFALL_NEUTRAL:
+ case BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTROLLED:
+ case BG_AV_OBJECTID_SNOWFALL_HORDE_CONTROLLED:
+ // towers
+ case BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_BANNER:
+ case BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_BANNER:
+ EventPlayerAssaultsPoint(player, target->GetEntry());
+ break;
+ // graveyards
+ case BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_AID_STATION_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTESTED:
+ case BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_STORMPIKE_HORDE_CONTESTED:
+ // towers
+ case BG_AV_OBJECTID_EAST_TOWER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_WEST_TOWER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_TOWER_POINT_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_BANNER:
+ case BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_BANNER:
+ EventPlayerDefendsPoint(player, target->GetEntry());
break;
- case BG_AV_OBJECTID_BANNER_CONT_A:
- case BG_AV_OBJECTID_BANNER_CONT_A_B:
- case BG_AV_OBJECTID_BANNER_CONT_H:
- case BG_AV_OBJECTID_BANNER_CONT_H_B:
- EventPlayerDefendsPoint(source, object);
+ // Snowfall special cases (either defend/assault)
+ case BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTESTED:
+ case BG_AV_OBJECTID_SNOWFALL_HORDE_CONTESTED:
+ {
+ BG_AV_Nodes node = GetNodeThroughObject(target->GetEntry());
+ if (_nodes[node].TotalOwner == TEAM_OTHER)
+ EventPlayerAssaultsPoint(player, target->GetEntry());
+ else
+ EventPlayerDefendsPoint(player, target->GetEntry());
break;
+ }
default:
break;
}
@@ -842,165 +703,78 @@ void BattlegroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* target
void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)
{
- ASSERT(GetStatus() == STATUS_IN_PROGRESS);
BG_AV_Nodes node = GetNodeThroughObject(object);
- Team owner = m_Nodes[node].Owner; //maybe should name it prevowner
+ Team owner = _nodes[node].Owner;
Team team = GetPlayerTeam(player->GetGUID());
- if (owner == team || m_Nodes[node].State != POINT_ASSAULTED)
+ if (owner == team || _nodes[node].State != POINT_ASSAULTED)
return;
- if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM)
- { //until snowfall doesn't belong to anyone it is better handled in assault-code
- ASSERT(node == BG_AV_NODES_SNOWFALL_GRAVE); //currently the only neutral grave
- EventPlayerAssaultsPoint(player, object);
- return;
- }
+
TC_LOG_DEBUG("bg.battleground", "player defends point object: {} node: {}", object, node);
- if (m_Nodes[node].PrevOwner != team)
+ if (_nodes[node].PrevOwner != team)
{
TC_LOG_ERROR("bg.battleground", "BG_AV: player defends point which doesn't belong to his team {}", node);
return;
}
- //spawn new go :)
- if (m_Nodes[node].Owner == ALLIANCE)
- SpawnBGObject(object+22, RESPAWN_IMMEDIATELY); //spawn horde banner
- else
- SpawnBGObject(object-22, RESPAWN_IMMEDIATELY); //spawn alliance banner
-
- if (!IsTower(node))
- {
- SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION + uint32(GetTeamIndexByTeamId(team)) + 3 * node, RESPAWN_IMMEDIATELY);
- }
- // despawn old go
- SpawnBGObject(object, RESPAWN_ONE_DAY);
-
DefendNode(node, team);
- PopulateNode(node);
UpdateNodeWorldState(node);
- if (IsTower(node))
- {
- //spawn big flag+aura on top of tower
- SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- }
- else if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy
+ if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
{
- for (uint8 i = 0; i < 4; i++)
- {
- SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY);
- SpawnBGObject(((team == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY);
- }
- }
+ std::string stringId;
- if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
- if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))
- herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
+ if (IsTower(node))
+ stringId = nodeInfo->StringIds.AllianceOrDefend;
+ else
+ stringId = team == ALLIANCE ? nodeInfo->StringIds.AllianceOrDefend : nodeInfo->StringIds.HordeOrDestroy;
+
+ if (Creature* herald = FindHerald(stringId))
+ herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);
+ }
// update the statistic for the defending player
UpdatePvpStat(player, IsTower(node) ? PVP_STAT_TOWERS_DEFENDED : PVP_STAT_GRAVEYARDS_DEFENDED, 1);
+ GetBgMap()->UpdateSpawnGroupConditions();
}
void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)
{
- ASSERT(GetStatus() == STATUS_IN_PROGRESS);
-
BG_AV_Nodes node = GetNodeThroughObject(object);
- Team owner = m_Nodes[node].Owner; //maybe name it prevowner
+ Team owner = _nodes[node].Owner; //maybe name it prevowner
Team team = GetPlayerTeam(player->GetGUID());
+
TC_LOG_DEBUG("bg.battleground", "bg_av: player assaults point object {} node {}", object, node);
- if (owner == team || team == m_Nodes[node].TotalOwner)
+ if (owner == team || team == _nodes[node].TotalOwner)
return; //surely a gm used this object
- if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall is a bit special in capping + it gets eyecandy stuff
- {
- if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE) //initial capping
- {
- if (!(owner == TEAM_OTHER && m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM))
- return;
-
- if (team == ALLIANCE)
- SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
- else
- SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
- SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_IMMEDIATELY); //neutral aura spawn
- }
- else if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) //recapping, when no team owns this node realy
- {
- if (!(m_Nodes[node].State != POINT_CONTROLED))
- return;
-
- if (team == ALLIANCE)
- SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);
- else
- SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);
- }
- //eyecandy
- uint32 spawn, despawn;
- if (team == ALLIANCE)
- {
- despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H;
- spawn = BG_AV_OBJECT_SNOW_EYECANDY_PA;
- }
- else
- {
- despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A;
- spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH;
- }
- for (uint8 i = 0; i < 4; i++)
- {
- SpawnBGObject(despawn+i, RESPAWN_ONE_DAY);
- SpawnBGObject(spawn+i, RESPAWN_IMMEDIATELY);
- }
- }
+ AssaultNode(node, team);
+ UpdateNodeWorldState(node);
- //if snowfall gots capped it can be handled like all other graveyards
- if (m_Nodes[node].TotalOwner != AV_NEUTRAL_TEAM)
+ if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
{
- ASSERT(m_Nodes[node].Owner != TEAM_OTHER);
- if (team == ALLIANCE)
- SpawnBGObject(object-22, RESPAWN_IMMEDIATELY);
- else
- SpawnBGObject(object+22, RESPAWN_IMMEDIATELY);
+ std::string stringId;
if (IsTower(node))
- { //spawning/despawning of bigflag+aura
- SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
- }
+ stringId = nodeInfo->StringIds.HordeOrDestroy;
else
- {
- //spawning/despawning of aura
- SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_IMMEDIATELY); //neutral aura spawn
- SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION + uint32(GetTeamIndexByTeamId(owner)) + 3 * node, RESPAWN_ONE_DAY); //teeamaura despawn
- }
- DePopulateNode(node);
- }
+ stringId = team == ALLIANCE ? nodeInfo->StringIds.AllianceOrDefend : nodeInfo->StringIds.HordeOrDestroy;
- SpawnBGObject(object, RESPAWN_ONE_DAY); //delete old banner
- AssaultNode(node, team);
- UpdateNodeWorldState(node);
-
- if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
- if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))
- herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack);
+ if (Creature* herald = FindHerald(stringId))
+ herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack);
+ }
// update the statistic for the assaulting player
UpdatePvpStat(player, (IsTower(node)) ? PVP_STAT_TOWERS_ASSAULTED : PVP_STAT_GRAVEYARDS_ASSAULTED, 1);
+ GetBgMap()->UpdateSpawnGroupConditions();
}
void BattlegroundAV::UpdateNodeWorldState(BG_AV_Nodes node)
{
if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))
{
- uint16 owner = m_Nodes[node].Owner;
- BG_AV_States state = m_Nodes[node].State;
+ uint16 owner = _nodes[node].Owner;
+ BG_AV_States state = _nodes[node].State;
UpdateWorldState(nodeInfo->WorldStateIds.AllianceAssault, owner == ALLIANCE && state == POINT_ASSAULTED);
UpdateWorldState(nodeInfo->WorldStateIds.AllianceControl, owner == ALLIANCE && state >= POINT_DESTROYED);
@@ -1011,449 +785,140 @@ void BattlegroundAV::UpdateNodeWorldState(BG_AV_Nodes node)
}
if (node == BG_AV_NODES_SNOWFALL_GRAVE)
- UpdateWorldState(AV_WS_SNOWFALL_GRAVEYARD_UNCONTROLLED, m_Nodes[node].Owner == TEAM_OTHER);
+ UpdateWorldState(AV_WS_SNOWFALL_GRAVEYARD_UNCONTROLLED, _nodes[node].Owner == TEAM_OTHER);
}
-void BattlegroundAV::SendMineWorldStates(uint32 mine)
+void BattlegroundAV::SendMineWorldStates(AlteracValleyMine mine)
{
- ASSERT(mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE);
-// currently i'm sure, that this works (:
-// ASSERT(m_Mine_PrevOwner[mine] == ALLIANCE || m_Mine_PrevOwner[mine] == HORDE || m_Mine_PrevOwner[mine] == AV_NEUTRAL_TEAM);
-// ASSERT(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE || m_Mine_Owner[mine] == AV_NEUTRAL_TEAM);
-
- uint8 owner, prevowner, mine2; //those variables are needed to access the right worldstate in the BG_AV_MineWorldStates array
- mine2 = (mine == AV_NORTH_MINE)?0:1;
- if (m_Mine_PrevOwner[mine] == ALLIANCE)
- prevowner = 0;
- else if (m_Mine_PrevOwner[mine] == HORDE)
- prevowner = 2;
- else
- prevowner = 1;
- if (m_Mine_Owner[mine] == ALLIANCE)
- owner = 0;
- else if (m_Mine_Owner[mine] == HORDE)
- owner = 2;
- else
- owner = 1;
-
- UpdateWorldState(BG_AV_MineWorldStates[mine2][owner], 1);
- if (prevowner != owner)
- UpdateWorldState(BG_AV_MineWorldStates[mine2][prevowner], 0);
-
- UpdateWorldState(BG_AV_MineWorldStates[mine2][3], m_Mine_Owner[mine] == HORDE ? 2 : m_Mine_Owner[mine] == ALLIANCE ? 1 : 0);
-}
-
-WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveyard(Player* player)
-{
- float x, y;
- player->GetPosition(x, y);
-
- Team team = GetPlayerTeam(player->GetGUID());
- WorldSafeLocsEntry const* pGraveyard = sObjectMgr->GetWorldSafeLoc(BG_AV_GraveyardIds[GetTeamIndexByTeamId(team) + 7]);
- float minDist = (pGraveyard->Loc.GetPositionX() - x) * (pGraveyard->Loc.GetPositionX() - x) + (pGraveyard->Loc.GetPositionY() - y) * (pGraveyard->Loc.GetPositionY() - y);
-
- for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
- if (m_Nodes[i].Owner == team && m_Nodes[i].State == POINT_CONTROLED)
- {
- if (WorldSafeLocsEntry const* entry = sObjectMgr->GetWorldSafeLoc(BG_AV_GraveyardIds[i]))
- {
- float dist = (entry->Loc.GetPositionX() - x) * (entry->Loc.GetPositionX() - x) + (entry->Loc.GetPositionY() - y) * (entry->Loc.GetPositionY() - y);
- if (dist < minDist)
- {
- minDist = dist;
- pGraveyard = entry;
- }
- }
- }
- return pGraveyard;
+ AlteracValleyMineInfo& mineInfo = _mineInfo[uint8(mine)];
+ UpdateWorldState(mineInfo.StaticInfo.WorldStateHordeControlled, mineInfo.Owner == HORDE);
+ UpdateWorldState(mineInfo.StaticInfo.WorldStateAllianceControlled, mineInfo.Owner == ALLIANCE);
+ UpdateWorldState(mineInfo.StaticInfo.WorldStateNeutralControlled, mineInfo.Owner == TEAM_OTHER);
+ UpdateWorldState(mineInfo.StaticInfo.WorldStateOwner, mineInfo.Owner == HORDE ? 2 : mineInfo.Owner == ALLIANCE ? 1 : 0);
}
WorldSafeLocsEntry const* BattlegroundAV::GetExploitTeleportLocation(Team team)
{
- return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? AV_EXPLOIT_TELEPORT_LOCATION_ALLIANCE: AV_EXPLOIT_TELEPORT_LOCATION_HORDE);
+ return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? AV_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : AV_EXPLOIT_TELEPORT_LOCATION_HORDE);
}
bool BattlegroundAV::SetupBattleground()
{
- // Create starting objects
- if (// alliance gates
- !AddObject(BG_AV_OBJECT_DOOR_A, BG_AV_OBJECTID_GATE_A, BG_AV_DoorPositons[0], BG_AV_DoorRotation[0].x, BG_AV_DoorRotation[0].y, BG_AV_DoorRotation[0].z, BG_AV_DoorRotation[0].w, RESPAWN_IMMEDIATELY)
- // horde gates
- || !AddObject(BG_AV_OBJECT_DOOR_H, BG_AV_OBJECTID_GATE_H, BG_AV_DoorPositons[1], BG_AV_DoorRotation[1].x, BG_AV_DoorRotation[1].y, BG_AV_DoorRotation[1].z, BG_AV_DoorRotation[1].w, RESPAWN_IMMEDIATELY))
- {
- TC_LOG_ERROR("sql.sql", "BatteGroundAV: Failed to spawn some object Battleground not created!1");
- return false;
- }
-
- //spawn node-objects
- for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
- {
- if (i <= BG_AV_NODES_FROSTWOLF_HUT)
- {
- if (!AddObject(i, BG_AV_OBJECTID_BANNER_A_B,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(i+11, BG_AV_OBJECTID_BANNER_CONT_A_B,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(i+33, BG_AV_OBJECTID_BANNER_H_B,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(i+22, BG_AV_OBJECTID_BANNER_CONT_H_B,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- //aura
- || !AddObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_N,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_A,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_H,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!2");
- return false;
- }
- }
- else //towers
- {
- if (i <= BG_AV_NODES_STONEHEART_BUNKER) //alliance towers
- {
- if (!AddObject(i, BG_AV_OBJECTID_BANNER_A,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(i+22, BG_AV_OBJECTID_BANNER_CONT_H,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_A,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_N,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_A,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_PH,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!3");
- return false;
- }
- }
- else //horde towers
- {
- if (!AddObject(i+7, BG_AV_OBJECTID_BANNER_CONT_A,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(i+29, BG_AV_OBJECTID_BANNER_H,
- BG_AV_ObjectPos[i],
- 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_N,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_H,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_PA,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_H,
- BG_AV_ObjectPos[i+8],
- 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!4");
- return false;
- }
- }
- for (uint8 j=0; j <= 9; j++) //burning aura
- {
- if (!AddObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j,
- BG_AV_OBJECTID_FIRE,
- BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j],
- 0,
- 0,
- std::sin(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j].GetOrientation()/2),
- std::cos(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j].GetOrientation()/2),
- RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!5.{}", i);
- return false;
- }
- }
- }
- }
- for (uint8 i=0; i<2; i++) //burning aura for buildings
- {
- for (uint8 j=0; j <= 9; j++)
- {
- if (j<5)
- {
- if (!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j,
- BG_AV_OBJECTID_SMOKE,
- BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j],
- 0,
- 0,
- std::sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2),
- std::cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2),
- RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!6.{}", i);
- return false;
- }
- }
- else
- {
- if (!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j,
- BG_AV_OBJECTID_FIRE,
- BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j],
- 0,
- 0,
- std::sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2),
- std::cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2),
- RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!7.{}", i);
- return false;
- }
- }
- }
- }
- for (uint16 i= 0; i <= (BG_AV_OBJECT_MINE_SUPPLY_N_MAX-BG_AV_OBJECT_MINE_SUPPLY_N_MIN); i++)
- {
- if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_N_MIN+i,
- BG_AV_OBJECTID_MINE_N,
- BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i],
- 0,
- 0,
- std::sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i].GetOrientation()/2),
- std::cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i].GetOrientation()/2),
- RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.5.{}", i);
- return false;
- }
- }
- for (uint16 i= 0; i <= (BG_AV_OBJECT_MINE_SUPPLY_S_MAX-BG_AV_OBJECT_MINE_SUPPLY_S_MIN); i++)
- {
- if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_S_MIN+i,
- BG_AV_OBJECTID_MINE_S,
- BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i],
- 0,
- 0,
- std::sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i].GetOrientation()/2),
- std::cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i].GetOrientation()/2),
- RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.6.{}", i);
- return false;
- }
- }
-
- if (!AddObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE,
- BG_AV_OBJECTID_BANNER_SNOWFALL_N,
- BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE],
- 0,
- 0,
- std::sin(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE].GetOrientation()/2),
- std::cos(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE].GetOrientation()/2),
- RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!8");
- return false;
- }
- for (uint8 i = 0; i < 4; i++)
- {
- if (!AddObject(BG_AV_OBJECT_SNOW_EYECANDY_A+i, BG_AV_OBJECTID_SNOWFALL_CANDY_A,
- BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i],
- 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PA+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PA,
- BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i],
- 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_H+i, BG_AV_OBJECTID_SNOWFALL_CANDY_H,
- BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i],
- 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY)
- || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PH+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PH,
- BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i],
- 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY))
- {
- TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!9.{}", i);
- return false;
- }
- }
-
- uint16 i;
- TC_LOG_DEBUG("bg.battleground", "Alterac Valley: entering state STATUS_WAIT_JOIN ...");
- // Initial Nodes
- for (i = 0; i < BG_AV_OBJECT_MAX; i++)
- SpawnBGObject(i, RESPAWN_ONE_DAY);
-
- for (i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE; i++)
- {
- SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+3*i, RESPAWN_IMMEDIATELY);
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
- }
-
- for (i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER; i++)
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
-
- for (i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER; i++)
- {
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
- if (i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT)
- SpawnBGObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+3*GetNodeThroughObject(i), RESPAWN_IMMEDIATELY);
- }
-
- for (i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; i+=2)
- {
- SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag
- SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura
- }
-
- for (i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; i+=2)
- {
- SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag
- SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura
- }
-
- //snowfall and the doors
- for (i = BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; i <= BG_AV_OBJECT_DOOR_A; i++)
- SpawnBGObject(i, RESPAWN_IMMEDIATELY);
-
- SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
-
- //creatures
- TC_LOG_DEBUG("bg.battleground", "BG_AV start poputlating nodes");
- for (BG_AV_Nodes n = BG_AV_NODES_FIRSTAID_STATION; n < BG_AV_NODES_MAX; ++n)
- {
- if (m_Nodes[n].Owner)
- PopulateNode(n);
- }
- //all creatures which don't get despawned through the script are static
- TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning static creatures");
- for (i = 0; i < AV_STATICCPLACE_MAX; i++)
- AddAVCreature(0, i + AV_CPLACE_MAX);
- //mainspiritguides:
- TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning spiritguides creatures");
- AddSpiritGuide(7, BG_AV_CreaturePos[7], TEAM_ALLIANCE);
- AddSpiritGuide(8, BG_AV_CreaturePos[8], TEAM_HORDE);
- //spawn the marshals (those who get deleted, if a tower gets destroyed)
- TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning marshal creatures");
- for (i = AV_NPC_A_MARSHAL_SOUTH; i <= AV_NPC_H_MARSHAL_WTOWER; i++)
- AddAVCreature(i, AV_CPLACE_A_MARSHAL_SOUTH + (i - AV_NPC_A_MARSHAL_SOUTH));
- AddAVCreature(AV_NPC_HERALD, AV_CPLACE_HERALD);
return true;
}
void BattlegroundAV::AssaultNode(BG_AV_Nodes node, Team team)
{
- if (m_Nodes[node].TotalOwner == team)
- {
- TC_LOG_FATAL("bg.battleground", "Assaulting team is TotalOwner of node");
- ABORT();
- }
- if (m_Nodes[node].Owner == team)
- {
- TC_LOG_FATAL("bg.battleground", "Assaulting team is owner of node");
- ABORT();
- }
- if (m_Nodes[node].State == POINT_DESTROYED)
- {
- TC_LOG_FATAL("bg.battleground", "Destroyed node is being assaulted");
- ABORT();
- }
- if (m_Nodes[node].State == POINT_ASSAULTED && m_Nodes[node].TotalOwner) //only assault an assaulted node if no totalowner exists
- {
- TC_LOG_FATAL("bg.battleground", "Assault on an not assaulted node with total owner");
- ABORT();
- }
- //the timer gets another time, if the previous owner was 0 == Neutral
- m_Nodes[node].Timer = (m_Nodes[node].PrevOwner)? BG_AV_CAPTIME : BG_AV_SNOWFALL_FIRSTCAP;
- m_Nodes[node].PrevOwner = m_Nodes[node].Owner;
- m_Nodes[node].Owner = team;
- m_Nodes[node].PrevState = m_Nodes[node].State;
- m_Nodes[node].State = POINT_ASSAULTED;
+ _nodes[node].PrevOwner = _nodes[node].Owner;
+ _nodes[node].Owner = team;
+ _nodes[node].PrevState = _nodes[node].State;
+ _nodes[node].State = POINT_ASSAULTED;
}
void BattlegroundAV::DestroyNode(BG_AV_Nodes node)
{
- ASSERT(m_Nodes[node].State == POINT_ASSAULTED);
-
- m_Nodes[node].TotalOwner = m_Nodes[node].Owner;
- m_Nodes[node].PrevOwner = m_Nodes[node].Owner;
- m_Nodes[node].PrevState = m_Nodes[node].State;
- m_Nodes[node].State = (m_Nodes[node].Tower)? POINT_DESTROYED : POINT_CONTROLED;
- m_Nodes[node].Timer = 0;
+ _nodes[node].TotalOwner = _nodes[node].Owner;
+ _nodes[node].PrevOwner = _nodes[node].Owner;
+ _nodes[node].PrevState = _nodes[node].State;
+ _nodes[node].State = (_nodes[node].Tower)? POINT_DESTROYED : POINT_CONTROLED;
}
void BattlegroundAV::InitNode(BG_AV_Nodes node, Team team, bool tower)
{
- m_Nodes[node].TotalOwner = team;
- m_Nodes[node].Owner = team;
- m_Nodes[node].PrevOwner = 0;
- m_Nodes[node].State = POINT_CONTROLED;
- m_Nodes[node].PrevState = m_Nodes[node].State;
- m_Nodes[node].State = POINT_CONTROLED;
- m_Nodes[node].Timer = 0;
- m_Nodes[node].Tower = tower;
+ _nodes[node].TotalOwner = team;
+ _nodes[node].Owner = team;
+ _nodes[node].PrevOwner = 0;
+ _nodes[node].State = POINT_CONTROLED;
+ _nodes[node].PrevState = _nodes[node].State;
+ _nodes[node].State = POINT_CONTROLED;
+ _nodes[node].Tower = tower;
}
void BattlegroundAV::DefendNode(BG_AV_Nodes node, Team team)
{
- ASSERT(m_Nodes[node].TotalOwner == team);
- ASSERT(m_Nodes[node].Owner != team);
- ASSERT(m_Nodes[node].State != POINT_CONTROLED && m_Nodes[node].State != POINT_DESTROYED);
- m_Nodes[node].PrevOwner = m_Nodes[node].Owner;
- m_Nodes[node].Owner = team;
- m_Nodes[node].PrevState = m_Nodes[node].State;
- m_Nodes[node].State = POINT_CONTROLED;
- m_Nodes[node].Timer = 0;
+ _nodes[node].PrevOwner = _nodes[node].Owner;
+ _nodes[node].Owner = team;
+ _nodes[node].PrevState = _nodes[node].State;
+ _nodes[node].State = POINT_CONTROLED;
+}
+
+Team BattlegroundAV::GetPrematureWinner()
+{
+ uint32 allianceScore = _teamResources[GetTeamIndexByTeamId(ALLIANCE)];
+ uint32 hordeScore = _teamResources[GetTeamIndexByTeamId(HORDE)];
+
+ if (allianceScore > hordeScore)
+ return ALLIANCE;
+ else if (hordeScore > allianceScore)
+ return HORDE;
+
+ return Battleground::GetPrematureWinner();
}
-void BattlegroundAV::Reset()
+void BattlegroundAV::OnGameObjectCreate(GameObject* gameObject)
{
- Battleground::Reset();
+ switch (gameObject->GetEntry())
+ {
+ case BG_AV_GHOST_GATE:
+ case BG_AV_OBJECTID_GATE:
+ _doorGUIDs.insert(gameObject->GetGUID());
+ break;
+ default:
+ break;
+ }
+}
- 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
+void BattlegroundAV::OnCreatureCreate(Creature* creature)
+{
+ switch (creature->GetEntry())
{
- for (uint8 j=0; j<9; j++)
- m_Team_QuestStatus[i][j]=0;
- m_Team_Scores[i] = BG_AV_SCORE_INITIAL_POINTS;
- m_IsInformedNearVictory[i]=false;
- m_CaptainAlive[i] = true;
- m_CaptainBuffTimer[i] = 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
- m_Mine_Owner[i] = TEAM_OTHER;
- m_Mine_PrevOwner[i] = m_Mine_Owner[i];
+ case BG_AV_CREATURE_GALVANGAR:
+ _galvangarGUID = creature->GetGUID();
+ break;
+ case BG_AV_CREATURE_BALINDA:
+ _balindaGUID = creature->GetGUID();
+ break;
+ case BG_AV_CREATURE_HERALD:
+ _heraldGUIDs.insert(creature->GetGUID());
+ break;
+ default:
+ break;
}
+}
- for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves
- InitNode(i, ALLIANCE, false);
- for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers
- InitNode(i, ALLIANCE, true);
- for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves
- InitNode(i, HORDE, false);
- for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) //horde towers
- InitNode(i, HORDE, true);
- InitNode(BG_AV_NODES_SNOWFALL_GRAVE, TEAM_OTHER, false); //give snowfall neutral owner
+uint32 BattlegroundAV::GetData(uint32 dataId) const
+{
+ auto getDefenderTierForTeam = [&](TeamId teamId) -> BG_AV_DefenderTier
+ {
+ if (m_Team_QuestStatus[teamId][0] < 500)
+ return BG_AV_DEFENDER_TIER_DEFENDER;
+
+ if (m_Team_QuestStatus[teamId][0] < 1000)
+ return BG_AV_DEFENDER_TIER_SEASONED;
+
+ if (m_Team_QuestStatus[teamId][0] < 1500)
+ return BG_AV_DEFENDER_TIER_VETERAN;
- m_Mine_Timer = AV_MINE_TICK_TIMER;
- for (uint16 i = 0; i < AV_CPLACE_MAX + AsUnderlyingType(AV_STATICCPLACE_MAX); i++)
- if (!BgCreatures[i].IsEmpty())
- DelCreature(i);
+ return BG_AV_DEFENDER_TIER_CHAMPION;
+ };
+
+ switch (dataId)
+ {
+ case DATA_DEFENDER_TIER_ALLIANCE:
+ return getDefenderTierForTeam(TEAM_ALLIANCE);
+ case DATA_DEFENDER_TIER_HORDE:
+ return getDefenderTierForTeam(TEAM_HORDE);
+ default:
+ return Battleground::GetData(dataId);
+ }
}
-Team BattlegroundAV::GetPrematureWinner()
+Creature* BattlegroundAV::FindHerald(std::string_view stringId) const
{
- uint32 allianceScore = m_Team_Scores[GetTeamIndexByTeamId(ALLIANCE)];
- uint32 hordeScore = m_Team_Scores[GetTeamIndexByTeamId(HORDE)];
+ for (ObjectGuid const& guid : _heraldGUIDs)
+ if (Creature* creature = GetBgMap()->GetCreature(guid))
+ if (creature->HasStringId(stringId))
+ return creature;
- if (allianceScore > hordeScore)
- return ALLIANCE;
- else if (hordeScore > allianceScore)
- return HORDE;
-
- return Battleground::GetPrematureWinner();
+ return nullptr;
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
index f93cd770178..4e3a88d3bd2 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
@@ -22,37 +22,16 @@
#include "BattlegroundScore.h"
#include "Object.h"
#include "QuaternionData.h"
+#include "Timer.h"
-#define BG_AV_CAPTIME 240000 //4:00
-#define BG_AV_SNOWFALL_FIRSTCAP 300000 //5:00 but i also have seen 4:05
+constexpr uint32 BG_AV_SCORE_INITIAL_POINTS = 700;
+constexpr uint32 BG_AV_EVENT_START_BATTLE = 9166; // Achievement: The Alterac Blitz
-#define BG_AV_SCORE_INITIAL_POINTS 700
-#define SEND_MSG_NEAR_LOSE 120
-
-#define BG_AV_KILL_BOSS 4
-#define BG_AV_REP_BOSS 350
-
-#define BG_AV_KILL_CAPTAIN 3
-#define BG_AV_REP_CAPTAIN 125
-#define BG_AV_RES_CAPTAIN 100
-
-#define BG_AV_KILL_TOWER 3
-#define BG_AV_REP_TOWER 12
-#define BG_AV_RES_TOWER 75
-
-#define BG_AV_GET_COMMANDER 1 //for a safely returned wingcommander
-//bonushonor at the end
-#define BG_AV_KILL_SURVIVING_TOWER 2
-#define BG_AV_REP_SURVIVING_TOWER 12
-
-#define BG_AV_KILL_SURVIVING_CAPTAIN 2
-#define BG_AV_REP_SURVIVING_CAPTAIN 125
-
-#define BG_AV_EVENT_START_BATTLE 9166 // Achievement: The Alterac Blitz
-
-enum SharedActions
+enum AlteracValleySharedActions
{
- ACTION_BUFF_YELL = -30001
+ ACTION_BUFF_YELL = -30001,
+ ACTION_AV_INTERACT_CAPTURABLE_OBJECT = 1,
+ ACTION_AV_CAPTURE_CAPTURABLE_OBJECT = 2,
};
enum BG_AV_BroadcastTexts
@@ -111,15 +90,38 @@ horde:
AV_SOUND_HORDE_CAPTAIN = 8333
};
-enum BG_AV_OTHER_VALUES
+constexpr Seconds BG_AV_MINE_RESOURCE_TIMER = 45s;
+
+enum class AlteracValleyMine : uint8
+{
+ North = 0,
+ South
+};
+
+enum BG_AV_CreatureIds
{
- AV_STATICCPLACE_MAX = 123,
- AV_NORTH_MINE = 0,
- AV_SOUTH_MINE = 1,
- AV_MINE_TICK_TIMER = 45000,
- AV_MINE_RECLAIM_TIMER = 1200000, /// @todo: get the right value.. this is currently 20 minutes
- AV_NEUTRAL_TEAM = 0 //this is the neutral owner of snowfall
+ BG_AV_CREATURE_VANNDAR = 11948,
+ BG_AV_CREATURE_DREKTHAR = 11946,
+ BG_AV_CREATURE_BALINDA = 11949,
+ BG_AV_CREATURE_GALVANGAR = 11947,
+ BG_AV_CREATURE_MORLOCH = 11657,
+ BG_AV_CREATURE_UMI_THORSON = 13078,
+ BG_AV_CREATURE_KEETAR = 13079,
+ BG_AV_CREATURE_TASKMASTER_SNIVVLE = 11677,
+ BG_AV_CREATURE_AGI_RUMBLESTOMP = 13086,
+ BG_AV_CREATURE_MASHA_SWIFTCUT = 13088,
+ BG_AV_CREATURE_HERALD = 14848,
+
+ BG_AV_CREATURE_STORMPIKE_DEFENDER = 12050,
+ BG_AV_CREATURE_FROSTWOLF_GUARDIAN = 12053,
+ BG_AV_CREATURE_SEASONED_DEFENDER = 13326,
+ BG_AV_CREATURE_SEASONED_GUARDIAN = 13328,
+ BG_AV_CREATURE_VETERAN_DEFENDER = 13331,
+ BG_AV_CREATURE_VETERAN_GUARDIAN = 13332,
+ BG_AV_CREATURE_CHAMPION_DEFENDER = 13422,
+ BG_AV_CREATURE_CHAMPION_GUARDIAN = 13421
};
+
enum BG_AV_ObjectIds
{
//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
@@ -156,15 +158,93 @@ enum BG_AV_ObjectIds
BG_AV_OBJECTID_AURA_H_S = 180101,
BG_AV_OBJECTID_AURA_N_S = 180102,
- BG_AV_OBJECTID_GATE_A = 180424,
- BG_AV_OBJECTID_GATE_H = 180424,
+ BG_AV_OBJECTID_GATE = 180424,
+ BG_AV_GHOST_GATE = 180322,
//mine supplies
BG_AV_OBJECTID_MINE_N = 178785,
BG_AV_OBJECTID_MINE_S = 178784,
BG_AV_OBJECTID_FIRE = 179065,
- BG_AV_OBJECTID_SMOKE = 179066
+ BG_AV_OBJECTID_SMOKE = 179066,
+
+ // Towers
+ BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_TOWER_BANNER = 178927,
+ BG_AV_OBJECTID_SOUTH_BUNKER_CONTROLLED_BANNER = 178925,
+ BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_BANNER = 179435,
+ BG_AV_OBJECTID_SOUTH_BUNKER_CONTESTED_TOWER_BANNER = 179436,
+
+ BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_TOWER_BANNER = 178932,
+ BG_AV_OBJECTID_NORTH_BUNKER_CONTROLLED_BANNER = 178929,
+ BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_BANNER = 179439,
+ BG_AV_OBJECTID_NORTH_BUNKER_CONTESTED_TOWER_BANNER = 179440,
+
+ BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_TOWER_BANNER = 178956,
+ BG_AV_OBJECTID_EAST_TOWER_CONTROLLED_BANNER = 178944,
+ BG_AV_OBJECTID_EAST_TOWER_CONTESTED_BANNER = 179449,
+ BG_AV_OBJECTID_EAST_TOWER_CONTESTED_TOWER_BANNER = 179450,
+
+ BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_TOWER_BANNER = 178955,
+ BG_AV_OBJECTID_WEST_TOWER_CONTROLLED_BANNER = 178943,
+ BG_AV_OBJECTID_WEST_TOWER_CONTESTED_BANNER = 179445,
+ BG_AV_OBJECTID_WEST_TOWER_CONTESTED_TOWER_BANNER = 179446,
+
+ BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_TOWER_BANNER = 178957,
+ BG_AV_OBJECTID_TOWER_POINT_CONTROLLED_BANNER = 178945,
+ BG_AV_OBJECTID_TOWER_POINT_CONTESTED_BANNER = 179453,
+ BG_AV_OBJECTID_TOWER_POINT_CONTESTED_TOWER_BANNER = 179454,
+
+ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_TOWER_BANNER = 178958,
+ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTROLLED_BANNER = 178946,
+ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_BANNER = 178940,
+ BG_AV_OBJECTID_ICEBLOOD_TOWER_CONTESTED_TOWER_BANNER = 179458,
+
+ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_TOWER_BANNER = 178948,
+ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTROLLED_BANNER = 178936,
+ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_BANNER = 179443,
+ BG_AV_OBJECTID_STONEHEARTH_BUNKER_CONTESTED_TOWER_BANNER = 179444,
+
+ BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_TOWER_BANNER = 178947,
+ BG_AV_OBJECTID_ICEWING_BUNKER_CONTROLLED_BANNER = 178935,
+ BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_BANNER = 179441,
+ BG_AV_OBJECTID_ICEWING_BUNKER_CONTESTED_TOWER_BANNER = 179442,
+
+ // Graveyards
+ BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTROLLED = 179465,
+ BG_AV_OBJECTID_AID_STATION_HORDE_CONTESTED = 179468,
+ BG_AV_OBJECTID_AID_STATION_HORDE_CONTROLLED = 179467,
+ BG_AV_OBJECTID_AID_STATION_ALLIANCE_CONTESTED = 179466,
+
+ BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTROLLED = 178389,
+ BG_AV_OBJECTID_STORMPIKE_HORDE_CONTESTED = 179287,
+ BG_AV_OBJECTID_STORMPIKE_HORDE_CONTROLLED = 178388,
+ BG_AV_OBJECTID_STORMPIKE_ALLIANCE_CONTESTED = 179286,
+
+ BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTESTED = 179310,
+ BG_AV_OBJECTID_STONEHEARTH_HORDE_CONTROLLED = 179285,
+ BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTESTED = 179308,
+ BG_AV_OBJECTID_STONEHEARTH_ALLIANCE_CONTROLLED = 179284,
+
+ BG_AV_OBJECTID_SNOWFALL_NEUTRAL = 180418,
+ BG_AV_OBJECTID_SNOWFALL_HORDE_CONTESTED = 180420,
+ BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTESTED = 180419,
+ BG_AV_OBJECTID_SNOWFALL_HORDE_CONTROLLED = 178364,
+ BG_AV_OBJECTID_SNOWFALL_ALLIANCE_CONTROLLED = 178365,
+
+ BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTROLLED = 179483,
+ BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTESTED = 179482,
+ BG_AV_OBJECTID_ICEBLOOD_ALLIANCE_CONTROLLED = 179481,
+ BG_AV_OBJECTID_ICEBLOOD_HORDE_CONTESTED = 179484,
+
+ BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTROLLED = 178393,
+ BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTESTED = 179304,
+ BG_AV_OBJECTID_FROSTWOLF_ALLIANCE_CONTROLLED = 178394,
+ BG_AV_OBJECTID_FROSTWOLF_HORDE_CONTESTED = 179305,
+
+ BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTROLLED = 179472,
+ BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTESTED = 179471,
+ BG_AV_OBJECTID_FROSTWOLF_HUT_ALLIANCE_CONTROLLED = 179470,
+ BG_AV_OBJECTID_FROSTWOLF_HUT_HORDE_CONTESTED = 179473
};
enum BG_AV_Nodes
@@ -188,1145 +268,6 @@ enum BG_AV_Nodes
BG_AV_NODES_MAX = 15
};
-enum BG_AV_ObjectTypes
-{
- BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION = 0,
- BG_AV_OBJECT_FLAG_A_STORMPIKE_GRAVE = 1,
- BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE = 2,
- BG_AV_OBJECT_FLAG_A_SNOWFALL_GRAVE = 3,
- BG_AV_OBJECT_FLAG_A_ICEBLOOD_GRAVE = 4,
- BG_AV_OBJECT_FLAG_A_FROSTWOLF_GRAVE = 5,
- BG_AV_OBJECT_FLAG_A_FROSTWOLF_HUT = 6,
- BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH = 7,
- BG_AV_OBJECT_FLAG_A_DUNBALDAR_NORTH = 8,
- BG_AV_OBJECT_FLAG_A_ICEWING_BUNKER = 9,
- BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER = 10,
-
- BG_AV_OBJECT_FLAG_C_A_FIRSTAID_STATION = 11,
- BG_AV_OBJECT_FLAG_C_A_STORMPIKE_GRAVE = 12,
- BG_AV_OBJECT_FLAG_C_A_STONEHEART_GRAVE = 13,
- BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE = 14,
- BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_GRAVE = 15,
- BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_GRAVE = 16,
- BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT = 17,
- BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_TOWER = 18,
- BG_AV_OBJECT_FLAG_C_A_TOWER_POINT = 19,
- BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_ETOWER = 20,
- BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER = 21,
-
- BG_AV_OBJECT_FLAG_C_H_FIRSTAID_STATION = 22,
- BG_AV_OBJECT_FLAG_C_H_STORMPIKE_GRAVE = 23,
- BG_AV_OBJECT_FLAG_C_H_STONEHEART_GRAVE = 24,
- BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE = 25,
- BG_AV_OBJECT_FLAG_C_H_ICEBLOOD_GRAVE = 26,
- BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_GRAVE = 27,
- BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_HUT = 28,
- BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_SOUTH = 29,
- BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_NORTH = 30,
- BG_AV_OBJECT_FLAG_C_H_ICEWING_BUNKER = 31,
- BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER = 32,
-
- BG_AV_OBJECT_FLAG_H_FIRSTAID_STATION = 33,
- BG_AV_OBJECT_FLAG_H_STORMPIKE_GRAVE = 34,
- BG_AV_OBJECT_FLAG_H_STONEHEART_GRAVE = 35,
- BG_AV_OBJECT_FLAG_H_SNOWFALL_GRAVE = 36,
- BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE = 37,
- BG_AV_OBJECT_FLAG_H_FROSTWOLF_GRAVE = 38,
- BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT = 39,
- BG_AV_OBJECT_FLAG_H_ICEBLOOD_TOWER = 40,
- BG_AV_OBJECT_FLAG_H_TOWER_POINT = 41,
- BG_AV_OBJECT_FLAG_H_FROSTWOLF_ETOWER = 42,
- BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER = 43,
-
- BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE = 44,
-
- BG_AV_OBJECT_DOOR_H = 45,
- BG_AV_OBJECT_DOOR_A = 46,
-//auras for graveyards (3auras per graveyard neutral, alliance, horde)
- BG_AV_OBJECT_AURA_N_FIRSTAID_STATION = 47,
- BG_AV_OBJECT_AURA_A_FIRSTAID_STATION = 48,
- BG_AV_OBJECT_AURA_H_FIRSTAID_STATION = 49,
- BG_AV_OBJECT_AURA_N_STORMPIKE_GRAVE = 50,
- BG_AV_OBJECT_AURA_A_STORMPIKE_GRAVE = 51,
- BG_AV_OBJECT_AURA_H_STORMPIKE_GRAVE = 52,
- BG_AV_OBJECT_AURA_N_STONEHEART_GRAVE = 53,
- BG_AV_OBJECT_AURA_A_STONEHEART_GRAVE = 54,
- BG_AV_OBJECT_AURA_H_STONEHEART_GRAVE = 55,
- BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE = 56,
- BG_AV_OBJECT_AURA_A_SNOWFALL_GRAVE = 57,
- BG_AV_OBJECT_AURA_H_SNOWFALL_GRAVE = 58,
- BG_AV_OBJECT_AURA_N_ICEBLOOD_GRAVE = 59,
- BG_AV_OBJECT_AURA_A_ICEBLOOD_GRAVE = 60,
- BG_AV_OBJECT_AURA_H_ICEBLOOD_GRAVE = 61,
- BG_AV_OBJECT_AURA_N_FROSTWOLF_GRAVE = 62,
- BG_AV_OBJECT_AURA_A_FROSTWOLF_GRAVE = 63,
- BG_AV_OBJECT_AURA_H_FROSTWOLF_GRAVE = 64,
- BG_AV_OBJECT_AURA_N_FROSTWOLF_HUT = 65,
- BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT = 66,
- BG_AV_OBJECT_AURA_H_FROSTWOLF_HUT = 67,
-
- //big flags on top of towers 2 flags on each (contested, (alliance | horde)) + 2 auras
- BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH = 67,
- BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH = 68,
- BG_AV_OBJECT_TFLAG_A_DUNBALDAR_NORTH = 69,
- BG_AV_OBJECT_TFLAG_H_DUNBALDAR_NORTH = 70,
- BG_AV_OBJECT_TFLAG_A_ICEWING_BUNKER = 71,
- BG_AV_OBJECT_TFLAG_H_ICEWING_BUNKER = 72,
- BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER = 73,
- BG_AV_OBJECT_TFLAG_H_STONEHEART_BUNKER = 74,
- BG_AV_OBJECT_TFLAG_A_ICEBLOOD_TOWER = 75,
- BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER = 76,
- BG_AV_OBJECT_TFLAG_A_TOWER_POINT = 77,
- BG_AV_OBJECT_TFLAG_H_TOWER_POINT = 78,
- BG_AV_OBJECT_TFLAG_A_FROSTWOLF_ETOWER = 79,
- BG_AV_OBJECT_TFLAG_H_FROSTWOLF_ETOWER = 80,
- BG_AV_OBJECT_TFLAG_A_FROSTWOLF_WTOWER = 81,
- BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER = 82,
- BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH = 83,
- BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH = 84,
- BG_AV_OBJECT_TAURA_A_DUNBALDAR_NORTH = 85,
- BG_AV_OBJECT_TAURA_H_DUNBALDAR_NORTH = 86,
- BG_AV_OBJECT_TAURA_A_ICEWING_BUNKER = 87,
- BG_AV_OBJECT_TAURA_H_ICEWING_BUNKER = 88,
- BG_AV_OBJECT_TAURA_A_STONEHEART_BUNKER = 89,
- BG_AV_OBJECT_TAURA_H_STONEHEART_BUNKER = 90,
- BG_AV_OBJECT_TAURA_A_ICEBLOOD_TOWER = 91,
- BG_AV_OBJECT_TAURA_H_ICEBLOOD_TOWER = 92,
- BG_AV_OBJECT_TAURA_A_TOWER_POINT = 93,
- BG_AV_OBJECT_TAURA_H_TOWER_POINT = 94,
- BG_AV_OBJECT_TAURA_A_FROSTWOLF_ETOWER = 95,
- BG_AV_OBJECT_TAURA_H_FROSTWOLF_ETOWER = 96,
- BG_AV_OBJECT_TAURA_A_FROSTWOLF_WTOWER = 97,
- BG_AV_OBJECT_TAURA_H_FROSTWOLF_WTOWER = 98,
-
- BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH = 99,
- BG_AV_OBJECT_BURN_DUNBALDAR_NORTH = 109,
- BG_AV_OBJECT_BURN_ICEWING_BUNKER = 119,
- BG_AV_OBJECT_BURN_STONEHEART_BUNKER = 129,
- BG_AV_OBJECT_BURN_ICEBLOOD_TOWER = 139,
- BG_AV_OBJECT_BURN_TOWER_POINT = 149,
- BG_AV_OBJECT_BURN_FROSTWOLF_ETWOER = 159,
- BG_AV_OBJECT_BURN_FROSTWOLF_WTOWER = 169,
- BG_AV_OBJECT_BURN_BUILDING_ALLIANCE = 179,
- BG_AV_OBJECT_BURN_BUILDING_HORDE = 189,
- BG_AV_OBJECT_SNOW_EYECANDY_A = 199,
- BG_AV_OBJECT_SNOW_EYECANDY_PA = 203,
- BG_AV_OBJECT_SNOW_EYECANDY_H = 207,
- BG_AV_OBJECT_SNOW_EYECANDY_PH = 211,
- BG_AV_OBJECT_MINE_SUPPLY_N_MIN = 215,
- BG_AV_OBJECT_MINE_SUPPLY_N_MAX = 224,
- BG_AV_OBJECT_MINE_SUPPLY_S_MIN = 225,
- BG_AV_OBJECT_MINE_SUPPLY_S_MAX = 236,
-
- BG_AV_OBJECT_MAX = 237
-};
-
-enum BG_AV_OBJECTS
-{
- AV_OPLACE_FIRSTAID_STATION = 0,
- AV_OPLACE_STORMPIKE_GRAVE = 1,
- AV_OPLACE_STONEHEART_GRAVE = 2,
- AV_OPLACE_SNOWFALL_GRAVE = 3,
- AV_OPLACE_ICEBLOOD_GRAVE = 4,
- AV_OPLACE_FROSTWOLF_GRAVE = 5,
- AV_OPLACE_FROSTWOLF_HUT = 6,
- AV_OPLACE_DUNBALDAR_SOUTH = 7,
- AV_OPLACE_DUNBALDAR_NORTH = 8,
- AV_OPLACE_ICEWING_BUNKER = 9,
- AV_OPLACE_STONEHEART_BUNKER = 10,
- AV_OPLACE_ICEBLOOD_TOWER = 11,
- AV_OPLACE_TOWER_POINT = 12,
- AV_OPLACE_FROSTWOLF_ETOWER = 13,
- AV_OPLACE_FROSTWOLF_WTOWER = 14,
- AV_OPLACE_BIGBANNER_DUNBALDAR_SOUTH = 15,
- AV_OPLACE_BIGBANNER_DUNBALDAR_NORTH = 16,
- AV_OPLACE_BIGBANNER_ICEWING_BUNKER = 17,
- AV_OPLACE_BIGBANNER_STONEHEART_BUNKER = 18,
- AV_OPLACE_BIGBANNER_ICEBLOOD_TOWER = 19,
- AV_OPLACE_BIGBANNER_TOWER_POINT = 20,
- AV_OPLACE_BIGBANNER_FROSTWOLF_ETOWER = 21,
- AV_OPLACE_BIGBANNER_FROSTWOLF_WTOWER = 22,
-
- AV_OPLACE_BURN_DUNBALDAR_SOUTH = 23,
- AV_OPLACE_BURN_DUNBALDAR_NORTH = 33,
- AV_OPLACE_BURN_ICEWING_BUNKER = 43,
- AV_OPLACE_BURN_STONEHEART_BUNKER = 53,
- AV_OPLACE_BURN_ICEBLOOD_TOWER = 63,
- AV_OPLACE_BURN_TOWER_POINT = 73,
- AV_OPLACE_BURN_FROSTWOLF_ETOWER = 83,
- AV_OPLACE_BURN_FROSTWOLF_WTOWER = 93,
- AV_OPLACE_BURN_BUILDING_A = 103,
- AV_OPLACE_BURN_BUILDING_H = 113,
- AV_OPLACE_SNOW_1 = 123,
- AV_OPLACE_SNOW_2 = 124,
- AV_OPLACE_SNOW_3 = 125,
- AV_OPLACE_SNOW_4 = 126,
- AV_OPLACE_MINE_SUPPLY_N_MIN = 127,
- AV_OPLACE_MINE_SUPPLY_N_MAX = 136,
- AV_OPLACE_MINE_SUPPLY_S_MIN = 137,
- AV_OPLACE_MINE_SUPPLY_S_MAX = 148,
-
- AV_OPLACE_MAX = 149
-};
-
-Position const BG_AV_ObjectPos[AV_OPLACE_MAX] =
-{
- {638.592f, -32.422f, 46.0608f, -1.62316f }, //firstaid station
- {669.007f, -294.078f, 30.2909f, 2.77507f }, //stormpike
- {77.8013f, -404.7f, 46.7549f, -0.872665f }, //stone grave
- {-202.581f, -112.73f, 78.4876f, -0.715585f }, //snowfall
- {-611.962f, -396.17f, 60.8351f, 2.53682f}, //iceblood grave
- {-1082.45f, -346.823f, 54.9219f, -1.53589f }, //frostwolf grave
- {-1402.21f, -307.431f, 89.4424f, 0.191986f }, //frostwolf hut
- {553.779f, -78.6566f, 51.9378f, -1.22173f }, //dunnbaldar south
- {674.001f, -143.125f, 63.6615f, 0.994838f }, //dunbaldar north
- {203.281f, -360.366f, 56.3869f, -0.925024f }, //icew
- {-152.437f, -441.758f, 40.3982f, -1.95477f }, //stone
- {-571.88f, -262.777f, 75.0087f, -0.802851f }, //ice tower
- {-768.907f, -363.71f, 90.8949f, 1.07991f}, //tower point
- {-1302.9f, -316.981f, 113.867f, 2.00713f }, //frostwolf etower
- {-1297.5f, -266.767f, 114.15f, 3.31044f}, //frostwolf wtower
- //bigbanner:
- {555.848f, -84.4151f, 64.4397f, 3.12414f }, //duns
- {679.339f, -136.468f, 73.9626f, -2.16421f }, //dunn
- {208.973f, -365.971f, 66.7409f, -0.244346f }, //icew
- {-155.832f, -449.401f, 52.7306f, 0.610865f }, //stone
- {-572.329f, -262.476f, 88.6496f, -0.575959f }, //icetower
- {-768.199f, -363.105f, 104.537f, 0.10472f }, //towerp
- {-1302.84f, -316.582f, 127.516f, 0.122173f }, //etower
- {-1297.87f, -266.762f, 127.796f, 0.0698132f }, //wtower
- //burning auras towers have 9*179065 captain-buildings have 5*179066+5*179065
- //dunns
- {562.632f, -88.1815f, 61.993f, 0.383972f },
- {562.523f, -74.5028f, 37.9474f, -0.0523599f },
- {558.097f, -70.9842f, 52.4876f, 0.820305f },
- {578.167f, -71.8191f, 38.1514f, 2.72271f },
- {556.028f, -94.9242f, 44.8191f, 3.05433f },
- {572.451f, -94.3655f, 37.9443f, -1.72788f },
- {549.263f, -79.3645f, 44.8191f, 0.436332f },
- {543.513f, -94.4006f, 52.4819f, 0.0349066f },
- {572.149f, -93.7862f, 52.5726f, 0.541052f },
- {582.162f, -81.2375f, 37.9216f, 0.0872665f },
- //dunn
- {664.797f, -143.65f, 64.1784f, -0.453786f},
- {664.505f, -139.452f, 49.6696f, -0.0349067f},
- {676.067f, -124.319f, 49.6726f, -1.01229f},
- {693.004f, -144.025f, 64.1755f, 2.44346f},
- {661.175f, -117.691f, 49.645f, 1.91986f},
- {684.423f, -146.582f, 63.6662f, 0.994838f},
- {682.791f, -127.769f, 62.4155f, 1.09956f},
- {674.576f, -147.101f, 56.5425f, -1.6057f},
- {655.719f, -126.673f, 49.8138f, 2.80998f},
- {0, 0, 0, 0},
- //icew
- {231.503f, -356.688f, 42.3704f, 0.296706f},
- {224.989f, -348.175f, 42.5607f, 1.50098f},
- {205.782f, -351.335f, 56.8998f, 1.01229f},
- {196.605f, -369.187f, 56.3914f, 2.46091f},
- {210.619f, -376.938f, 49.2677f, 2.86234f},
- {209.647f, -352.632f, 42.3959f, -0.698132f},
- {220.65f, -368.132f, 42.3978f, -0.2618f},
- {224.682f, -374.031f, 57.0679f, 0.541052f},
- {200.26f, -359.968f, 49.2677f, -2.89725f},
- {196.619f, -378.016f, 56.9131f, 1.01229f},
- //stone
- {-155.488f, -437.356f, 33.2796f, 2.60054f},
- {-163.441f, -454.188f, 33.2796f, 1.93732f},
- {-143.977f, -445.148f, 26.4097f, -1.8675f},
- {-135.764f, -464.708f, 26.3823f, 2.25147f},
- {-154.076f, -466.929f, 41.0636f, -1.8675f},
- {-149.908f, -460.332f, 26.4083f, -2.09439f},
- {-151.638f, -439.521f, 40.3797f, 0.436332f},
- {-131.301f, -454.905f, 26.5771f, 2.93215f},
- {-171.291f, -444.684f, 40.9211f, 2.30383f},
- {-143.591f, -439.75f, 40.9275f, -1.72788f},
- //iceblood
- {-572.667f, -267.923f, 56.8542f, 2.35619f},
- {-561.021f, -262.689f, 68.4589f, 1.37881f},
- {-572.538f, -262.649f, 88.6197f, 1.8326f},
- {-574.77f, -251.45f, 74.9422f, -1.18682f},
- {-578.625f, -267.571f, 68.4696f, 0.506145f},
- {-571.476f, -257.234f, 63.3223f, 3.10669f},
- {-566.035f, -273.907f, 52.9582f, -0.890118f},
- {-580.948f, -259.77f, 68.4696f, 1.46608f},
- {-568.318f, -267.1f, 75.0008f, 1.01229f},
- {-559.621f, -268.597f, 52.8986f, 0.0523599f},
- //towerp
- {-776.072f, -368.046f, 84.3558f, 2.63545f},
- {-777.564f, -368.521f, 90.6701f, 1.72788f},
- {-765.461f, -357.711f, 90.888f, 0.314159f},
- {-768.763f, -362.735f, 104.612f, 1.81514f},
- {-760.356f, -358.896f, 84.3558f, 2.1293f},
- {-771.967f, -352.838f, 84.3484f, 1.74533f},
- {-773.333f, -364.653f, 79.2351f, -1.64061f},
- {-764.109f, -366.069f, 70.0934f, 0.383972f},
- {-767.103f, -350.737f, 68.7933f, 2.80998f},
- {-760.115f, -353.845f, 68.8633f, 1.79769f},
- //froste
- {-1304.87f, -304.525f, 91.8366f, -0.680679f},
- {-1301.77f, -310.974f, 95.8252f, 0.907571f},
- {-1305.58f, -320.625f, 102.166f, -0.558505f},
- {-1294.27f, -323.468f, 113.893f, -1.67552f},
- {-1302.65f, -317.192f, 127.487f, 2.30383f},
- {-1293.89f, -313.478f, 107.328f, 1.6057f},
- {-1312.41f, -312.999f, 107.328f, 1.5708f},
- {-1311.57f, -308.08f, 91.7666f, -1.85005f},
- {-1314.7f, -322.131f, 107.36f, 0.645772f},
- {-1304.6f, -310.754f, 113.859f, -0.401426f},
- //frostw
- {-1308.24f, -273.26f, 92.0514f, -0.139626f},
- {-1302.26f, -262.858f, 95.9269f, 0.418879f},
- {-1297.28f, -267.773f, 126.756f, 2.23402f},
- {-1299.08f, -256.89f, 114.108f, -2.44346f},
- {-1303.41f, -268.237f, 114.151f, -1.23918f},
- {-1304.43f, -273.682f, 107.612f, 0.244346f},
- {-1309.53f, -265.951f, 92.1418f, -2.49582f},
- {-1295.55f, -263.865f, 105.033f, 0.925024f},
- {-1294.71f, -281.466f, 107.664f, -1.50098f},
- {-1289.69f, -259.521f, 107.612f, -2.19912f},
-
- //the two buildings of the captains
- //alliance
- {-64.4987f, -289.33f, 33.4616f, -2.82743f},
- {-5.98025f, -326.144f, 38.8538f, 0},
- {-2.67893f, -306.998f, 33.4165f, 0},
- {-60.25f, -309.232f, 50.2408f, -1.46608f},
- {-48.7941f, -266.533f, 47.7916f, 2.44346f},
- {-3.40929f, -306.288f, 33.34f, 0},
- {-48.619f, -266.917f, 47.8168f, 0},
- {-62.9474f, -286.212f, 66.7288f, 0},
- {-5.05132f, -325.323f, 38.8536f, 0},
- {-64.2677f, -289.412f, 33.469f, 0},
-//horde
- {-524.276f, -199.6f, 82.8733f, -1.46608f},
- {-518.196f, -173.085f, 102.43f, 0},
- {-500.732f, -145.358f, 88.5337f, 2.44346f},
- {-501.084f, -150.784f, 80.8506f, 0},
- {-518.309f, -163.963f, 102.521f, 2.96706f},
- {-517.053f, -200.429f, 80.759f, 0},
- {-514.361f, -163.864f, 104.163f, 0},
- {-568.04f, -188.707f, 81.55f, 0},
- {-501.775f, -151.581f, 81.2027f, 0},
- {-509.975f, -191.652f, 83.2978f, 0},
-
-//snowfall eyecandy
- {-191.153f, -129.868f, 78.5595f, -1.25664f },
- {-201.282f, -134.319f, 78.6753f, -0.942478f },
- {-215.981f, -91.4101f, 80.8702f, -1.74533f },
- {-200.465f, -96.418f, 79.7587f, 1.36136f },
- //mine supplies
- //irondeep
- {870.899f, -388.434f, 61.6406f, -1.22173f},
- {825.214f, -320.174f, 63.712f, -2.82743f},
- {837.117f, -452.556f, 47.2331f, -3.12414f},
- {869.755f, -448.867f, 52.5448f, -0.855212f},
- {949.877f, -458.198f, 56.4874f, 0.314159f},
- {900.35f, -479.024f, 58.3553f, 0.122173f},
- {854.449f, -442.255f, 50.6589f, 0.401426f},
- {886.685f, -442.358f, 54.6962f, -1.22173f},
- {817.509f, -457.331f, 48.4666f, 2.07694f},
- {793.411f, -326.281f, 63.1117f, -2.79253f},
- //coldtooth
- {-934.212f, -57.3517f, 80.277f, -0.0174535f},
- {-916.281f, -36.8579f, 77.0227f, 0.122173f},
- {-902.73f, -103.868f, 75.4378f, -1.58825f},
- {-900.514f, -143.527f, 75.9686f, 1.8675f},
- {-862.882f, -0.353299f, 72.1526f, -2.51327f},
- {-854.932f, -85.9184f, 68.6056f, -2.04204f},
- {-851.833f, -118.959f, 63.8672f, -0.0698131f},
- {-849.832f, -20.8421f, 70.4672f, -1.81514f},
- {-844.25f, -60.0374f, 72.1031f, -2.19912f},
- {-820.644f, -136.043f, 63.1977f, 2.40855f},
- {-947.642f, -208.807f, 77.0101f, 1.36136f},
- {-951.394f, -193.695f, 67.634f, 0.802851f}
-};
-
-Position const BG_AV_DoorPositons[2] =
-{
- {794.64310f, -493.4745f, 99.77789f, -0.122173f}, //alliance
- {-1382.057f, -545.9169f, 54.90467f, 0.7679439f} //horde
-};
-
-QuaternionData const BG_AV_DoorRotation[2] =
-{
- {0.0f, 0.0f, -0.06104851f, 0.9981348f}, //alliance
- {0.0f, 0.0f, 0.374606100f, 0.9271840f} //horde
-};
-
-//creaturestuff starts here
-//is related to BG_AV_CreaturePos
-enum BG_AV_CreaturePlace
-{
- AV_CPLACE_SPIRIT_STORM_AID = 0,
- AV_CPLACE_SPIRIT_STORM_GRAVE = 1,
- AV_CPLACE_SPIRIT_STONE_GRAVE = 2,
- AV_CPLACE_SPIRIT_SNOWFALL = 3,
- AV_CPLACE_SPIRIT_ICE_GRAVE = 4,
- AV_CPLACE_SPIRIT_FROSTWOLF = 5,
- AV_CPLACE_SPIRIT_FROST_HUT = 6,
- AV_CPLACE_SPIRIT_MAIN_ALLIANCE = 7,
- AV_CPLACE_SPIRIT_MAIN_HORDE = 8,
-//I don't add a variable for all 4 positions... I think one is enough to compute the rest
- AV_CPLACE_DEFENSE_STORM_AID = 9,
- AV_CPLACE_DEFEMSE_STORM_GRAVE = 13,
- AV_CPLACE_DEFENSE_STONE_GRAVE = 17,
- AV_CPLACE_DEFENSE_SNOWFALL = 21,
- AV_CPLACE_DEFENSE_FROSTWOLF = 25,
- AV_CPLACE_DEFENSE_ICE_GRAVE = 29,
- AV_CPLACE_DEFENSE_FROST_HUT = 33,
-
- AV_CPLACE_DEFENSE_DUN_S = 37,
- AV_CPLACE_DEFENSE_DUN_N = 41,
- AV_CPLACE_DEFENSE_ICEWING = 45,
- AV_CPLACE_DEFENSE_STONE_TOWER = 49,
- AV_CPLACE_DEFENSE_ICE_TOWER = 53,
- AV_CPLACE_DEFENSE_TOWERPOINT = 57,
- AV_CPLACE_DEFENSE_FROST_E = 61,
- AV_CPLACE_DEFENSE_FROST_t = 65,
-
- AV_CPLACE_A_MARSHAL_SOUTH = 69,
- AV_CPLACE_A_MARSHAL_NORTH = 70,
- AV_CPLACE_A_MARSHAL_ICE = 71,
- AV_CPLACE_A_MARSHAL_STONE = 72,
- AV_CPLACE_H_MARSHAL_ICE = 73,
- AV_CPLACE_H_MARSHAL_TOWER = 74,
- AV_CPLACE_H_MARSHAL_ETOWER = 75,
- AV_CPLACE_H_MARSHAL_WTOWER = 76,
- //irondeep
- //miner:
- AV_CPLACE_MINE_N_1_MIN = 77,
- AV_CPLACE_MINE_N_1_MAX = 136,
- //special types
- AV_CPLACE_MINE_N_2_MIN = 137,
- AV_CPLACE_MINE_N_2_MAX = 192,
- //boss
- AV_CPLACE_MINE_N_3 = 193,
- //coldtooth
- //miner:
- AV_CPLACE_MINE_S_1_MIN = 194,
- AV_CPLACE_MINE_S_1_MAX = 250,
- //special types
- AV_CPLACE_MINE_S_2_MIN = 251,
- AV_CPLACE_MINE_S_2_MAX = 289,
- //vermin
- AV_CPLACE_MINE_S_S_MIN = 290,
- AV_CPLACE_MINE_S_S_MAX = 299,
- //boss
- AV_CPLACE_MINE_S_3 = 300,
-
- //herald
- AV_CPLACE_HERALD = 301,
-
- //node aura triggers
- AV_CPLACE_TRIGGER01 = 302,
- AV_CPLACE_TRIGGER02 = 303,
- AV_CPLACE_TRIGGER03 = 304,
- AV_CPLACE_TRIGGER04 = 305,
- AV_CPLACE_TRIGGER05 = 306,
- AV_CPLACE_TRIGGER06 = 307,
- AV_CPLACE_TRIGGER07 = 308,
- AV_CPLACE_TRIGGER08 = 309,
- AV_CPLACE_TRIGGER09 = 310,
- AV_CPLACE_TRIGGER10 = 311,
- AV_CPLACE_TRIGGER11 = 312,
- AV_CPLACE_TRIGGER12 = 313,
- AV_CPLACE_TRIGGER13 = 314,
- AV_CPLACE_TRIGGER14 = 315,
- AV_CPLACE_TRIGGER15 = 316,
-
- //boss, captain triggers
- AV_CPLACE_TRIGGER16 = 317,
- AV_CPLACE_TRIGGER17 = 318,
- AV_CPLACE_TRIGGER18 = 319,
- AV_CPLACE_TRIGGER19 = 320,
-
- AV_CPLACE_MAX = 321
-};
-
-Position const BG_AV_CreaturePos[AV_CPLACE_MAX] =
-{
- //spiritguides
- {643.000000f, 44.000000f, 69.740196f, -0.001854f},
- {676.000000f, -374.000000f, 30.000000f, -0.001854f},
- {73.417755f, -496.433105f, 48.731918f, -0.001854f},
- {-157.409195f, 31.206272f, 77.050598f, -0.001854f},
- {-531.217834f, -405.231384f, 49.551376f, -0.001854f},
- {-1090.476807f, -253.308670f, 57.672371f, -0.001854f},
- {-1496.065063f, -333.338409f, 101.134804f, -0.001854f},
- {873.001770f, -491.283630f, 96.541931f, -0.001854f},
- {-1437.670044f, -610.088989f, 51.161900f, -0.001854f},
- //grave
- //firstaid
- {635.17f, -29.5594f, 46.5056f, 4.81711f},
- {642.488f, -32.9437f, 46.365f, 4.67748f},
- {642.326f, -27.9442f, 46.9211f, 4.59022f},
- {635.945f, -33.6171f, 45.7164f, 4.97419f},
- //stormpike
- {669.272f, -297.304f, 30.291f, 4.66604f},
- {674.08f, -292.328f, 30.4817f, 0.0918785f},
- {667.01f, -288.532f, 29.8809f, 1.81583f},
- {664.153f, -294.042f, 30.2851f, 3.28531f},
- //stone
- {81.7027f, -406.135f, 47.7843f, 0.598464f},
- {78.1431f, -409.215f, 48.0401f, 5.05953f},
- {73.4135f, -407.035f, 46.7527f, 3.34736f},
- {78.2258f, -401.859f, 46.4202f, 2.05852f},
- //snowfall
- {-207.412f, -110.616f, 78.7959f, 2.43251f},
- {-197.95f, -112.205f, 78.5686f, 6.22441f},
- {-202.709f, -116.829f, 78.4358f, 5.13742f},
- {-202.059f, -108.314f, 78.5783f, 5.91968f},
- //ice
- {-615.501f, -393.802f, 60.4299f, 3.06147f},
- {-608.513f, -392.717f, 62.5724f, 2.06323f},
- {-609.769f, -400.072f, 60.7174f, 5.22367f},
- {-616.093f, -398.293f, 60.5628f, 3.73613f},
- //frost
- {-1077.7f, -340.21f, 55.4682f, 6.25569f},
- {-1082.74f, -333.821f, 54.7962f, 2.05459f},
- {-1090.66f, -341.267f, 54.6768f, 3.27746f},
- {-1081.58f, -344.63f, 55.256f, 4.75636f},
- //frost hut
- {-1408.95f, -311.69f, 89.2536f, 4.49954f},
- {-1407.15f, -305.323f, 89.1993f, 2.86827f},
- {-1400.64f, -304.3f, 89.7008f, 1.0595f},
- {-1400.4f, -311.35f, 89.3028f, 4.99434f},
- //towers
- //dun south - OK
- {569.395f, -101.064f, 52.8296f, 2.34974f},
- {574.85f, -92.9842f, 52.5869f, 3.09325f},
- {575.411f, -83.597f, 52.3626f, 6.26573f},
- {571.352f, -75.6582f, 52.479f, 0.523599f},
- //dun north - OK
- {668.60f, -122.53f, 64.12f, 2.34f}, /// @todo: To be confirm - Not completely okay
- {662.253f, -129.105f, 64.1794f, 2.77507f},
- {661.209f, -138.877f, 64.2251f, 3.38594f},
- {665.481f, -146.857f, 64.1271f, 3.75246f},
- //icewing - OK
- {225.228f, -368.909f, 56.9983f, 6.23806f},
- {191.36f, -369.899f, 57.1524f, 3.24631f},
- {215.518f, -384.019f, 56.9889f, 5.09636f},
- {199.625f, -382.177f, 56.8691f, 4.08407f},
- //stone
- {-172.851f, -452.366f, 40.8725f, 3.31829f},
- {-147.147f, -435.053f, 40.8022f, 0.599238f},
- {-169.456f, -440.325f, 40.985f, 2.59101f},
- {-163.494f, -434.904f, 41.0725f, 1.84174f},
- //ice - OK
- {-573.522f, -271.854f, 75.0078f, 3.9619f},
- {-565.616f, -269.051f, 74.9952f, 5.02655f},
- {-562.825f, -261.087f, 74.9898f, 5.95157f},
- {-569.176f, -254.446f, 74.8771f, 0.820305f},
- //towerpoint
- {-763.04f, -371.032f, 90.7933f, 5.25979f},
- {-759.764f, -358.264f, 90.8681f, 0.289795f},
- {-768.808f, -353.056f, 90.8811f, 1.52601f},
- {-775.944f, -362.639f, 90.8949f, 2.59573f},
- //frost etower
- {-1294.13f, -313.045f, 107.328f, 0.270162f},
- {-1306.5f, -308.105f, 113.767f, 1.78755f},
- {-1294.78f, -319.966f, 113.79f, 5.94545f},
- {-1294.83f, -312.241f, 113.799f, 0.295293f},
- //frost wtower
- {-1300.96f, -275.111f, 114.058f, 4.12804f},
- {-1302.41f, -259.256f, 114.065f, 1.67602f},
- {-1287.97f, -262.087f, 114.165f, 6.18264f},
- {-1291.59f, -271.166f, 114.151f, 5.28257f},
-
- //alliance marshall
- {721.104f, -7.64155f, 50.7046f, 3.45575f}, // south
- {723.058f, -14.1548f, 50.7046f, 3.40339f}, // north
- {715.691f, -4.72233f, 50.2187f, 3.47321f}, // icewing
- {720.046f, -19.9413f, 50.2187f, 3.36849f}, // stone
-/// horde @todo: Confirm positions
- {-1363.99f, -221.99f, 98.4053f, 4.93012f},
- {-1370.96f, -223.532f, 98.4266f, 4.93012f},
- {-1378.37f, -228.614f, 99.3546f, 5.38565f},
- {-1358.02f, -228.998f, 98.868f, 3.87768f},
-
- //irondeep mine
- //Irondeep Trogg
- {971.671f, -442.657f, 57.6951f, 3.1765f},
- {969.979f, -457.148f, 58.1119f, 4.5204f},
- {958.692f, -333.477f, 63.2276f, 5.77704f},
- {957.113f, -325.92f, 61.7589f, 1.13446f},
- {948.25f, -448.268f, 56.9009f, 5.60251f},
- {934.727f, -385.802f, 63.0344f, 3.75246f},
- {931.751f, -403.458f, 59.6737f, 5.63741f},
- {931.146f, -359.666f, 66.0294f, 3.9619f},
- {929.702f, -412.401f, 56.8776f, 5.89921f},
- {926.849f, -379.074f, 63.5286f, 2.0944f},
- {921.972f, -358.597f, 66.4313f, 2.93215f},
- {921.449f, -341.981f, 67.1264f, 3.4383f},
- {921.1f, -395.812f, 60.4615f, 2.71695f},
- {919.274f, -394.986f, 60.3478f, 2.71696f},
- {916.852f, -393.891f, 60.1726f, 2.71695f},
- {914.568f, -326.21f, 66.1733f, 2.25147f},
- {913.064f, -395.773f, 60.1364f, 4.41568f},
- {909.246f, -474.576f, 58.2067f, 0.226893f},
- {909.246f, -474.576f, 58.2901f, 0.226893f},
- {907.209f, -428.267f, 59.8065f, 1.8675f},
- {905.973f, -459.528f, 58.7594f, 1.37189f},
- {905.067f, -396.074f, 60.2085f, 5.07891f},
- {901.809f, -457.709f, 59.0116f, 3.52557f},
- {900.962f, -427.44f, 59.0842f, 1.50098f},
- {897.929f, -471.742f, 59.7729f, 2.54818f},
- {893.376f, -343.171f, 68.1499f, 5.35816f},
- {890.584f, -406.049f, 61.1925f, 5.67232f},
- {888.208f, -332.564f, 68.148f, 1.93732f},
- {887.647f, -391.537f, 61.8734f, 1.37881f},
- {885.109f, -343.338f, 67.0867f, 3.78979f},
- {881.618f, -419.948f, 53.5228f, 0.593412f},
- {878.675f, -345.36f, 66.1052f, 3.45651f},
- {877.127f, -351.8f, 66.5296f, 5.74213f},
- {876.778f, -345.97f, 65.7724f, 3.45262f},
- {874.577f, -414.786f, 52.7817f, 1.67552f},
- {868.247f, -343.136f, 64.9894f, 1.6057f},
- {859.03f, -367.231f, 47.4655f, 0.0174533f},
- {857.513f, -351.817f, 65.1867f, 4.39823f},
- {852.632f, -372.416f, 48.1657f, 3.66519f},
- {849.86f, -340.944f, 66.2447f, 0.401426f},
- {847.99f, -386.287f, 60.9277f, 2.32374f},
- {847.601f, -423.072f, 50.0852f, 4.57276f},
- {847.135f, -411.307f, 50.2106f, 1.5708f},
- {835.077f, -379.418f, 48.2755f, 5.93412f},
- {834.87f, -453.304f, 47.9075f, 0.226893f},
- {834.634f, -365.981f, 62.8801f, 1.32645f},
- {834.354f, -355.526f, 48.1491f, 6.07375f},
- {833.702f, -327.506f, 65.0439f, 0.331613f},
- {833.151f, -374.228f, 63.0938f, 3.66519f},
- {831.711f, -346.785f, 47.2975f, 0.226893f},
- {827.874f, -413.624f, 48.5818f, 1.49241f},
- {827.728f, -415.483f, 48.5593f, 1.49238f},
- {827.016f, -424.543f, 48.2856f, 1.49236f},
- {823.222f, -334.283f, 65.6306f, 4.88692f},
- {821.892f, -464.723f, 48.9451f, 4.66003f},
- {821.006f, -387.635f, 49.0728f, 3.15905f},
- {817.26f, -447.432f, 49.4308f, 2.18166f},
- {805.399f, -320.146f, 52.7712f, 0.296706f},
- {801.405f, -328.055f, 53.0195f, 4.31096f},
- //irondeep skullthumber irondeep shaman
- {955.812f, -440.302f, 55.3411f, 3.19395f},
- {937.378f, -377.816f, 65.3919f, 3.56047f},
- {925.059f, -331.347f, 65.7564f, 3.66519f},
- {922.918f, -396.634f, 60.3942f, 2.71695f},
- {909.99f, -462.154f, 59.0811f, 3.7001f},
- {907.893f, -388.787f, 61.7923f, 5.74213f},
- {898.801f, -437.105f, 58.5266f, 0.959931f},
- {884.237f, -407.597f, 61.566f, 0.820305f},
- {880.744f, -344.683f, 66.4086f, 3.4644f},
- {876.047f, -341.857f, 65.8743f, 4.45059f},
- {874.674f, -402.077f, 61.7573f, 0.26341f},
- {871.914f, -404.209f, 62.1269f, 6.06163f},
- {871.606f, -403.665f, 62.0795f, 0.765774f},
- {871.561f, -404.114f, 62.1297f, 0.00981727f},
- {871.528f, -404.248f, 62.1455f, 0.498032f},
- {871.493f, -404.122f, 62.1331f, 5.65727f},
- {871.282f, -403.843f, 62.1108f, 0.788382f},
- {868.294f, -392.395f, 61.4772f, 4.38685f},
- {868.256f, -392.363f, 61.4803f, 0.732738f},
- {867.804f, -392.51f, 61.5089f, 2.30167f},
- {867.612f, -392.371f, 61.524f, 2.86149f},
- {858.593f, -439.614f, 50.2184f, 0.872665f},
- {851.471f, -362.52f, 47.314f, 4.06662f},
- {846.939f, -347.279f, 66.2876f, 0.942478f},
- {842.08f, -421.775f, 48.2659f, 1.0821f},
- {838.358f, -371.212f, 63.3299f, 4.04916f},
- {827.57f, -417.483f, 48.4538f, 1.49237f},
- {827.012f, -457.397f, 48.9331f, 2.35619f},
- {825.535f, -322.373f, 63.9357f, 4.76475f},
- {867.635f, -443.605f, 51.3347f, 1.38626f},
- {957.293f, -455.039f, 56.7395f, 5.79449f},
- {950.077f, -326.672f, 61.6552f, 5.48033f},
- {936.692f, -356.78f, 65.9835f, 2.75762f},
- {926.475f, -419.345f, 56.1833f, 2.0944f},
- {924.729f, -397.453f, 60.213f, 2.71695f},
- {902.195f, -475.891f, 58.312f, 1.39626f},
- {897.464f, -338.758f, 68.1715f, 2.94961f},
- {884.237f, -407.597f, 61.566f, 0.820305f},
- {882.517f, -344.111f, 66.7887f, 3.46962f},
- {881.437f, -400.254f, 61.2028f, 0.263427f},
- {880.156f, -400.678f, 61.3113f, 3.41373f},
- {877.989f, -418.051f, 52.9753f, 4.46804f},
- {871.212f, -404.12f, 62.1433f, 3.6554f},
- {871.036f, -404.119f, 62.2237f, 4.50295f},
- {857.396f, -395.766f, 61.263f, 4.78684f},
- {857.276f, -395.395f, 61.2418f, 0.0845553f},
- {857.231f, -394.577f, 61.2174f, 1.96817f},
- {857.108f, -395.682f, 61.2317f, 4.87022f},
- {856.709f, -395.28f, 61.1814f, 2.54913f},
- {850.922f, -390.399f, 60.8771f, 2.85405f},
- {847.556f, -388.228f, 60.9438f, 2.56872f},
- {842.031f, -384.663f, 61.6028f, 2.56871f},
- {832.035f, -389.301f, 47.5567f, 2.11185f},
- {827.415f, -419.468f, 48.3322f, 1.49232f},
- {826.402f, -349.454f, 47.2722f, 1.51844f},
- {817.83f, -455.715f, 48.4207f, 0.925025f},
- {808.953f, -325.964f, 52.4043f, 3.01942f},
- // Morloch
- {865.554f, -438.735f, 50.7333f, 2.12431f},
- //coldtooth mine
- //miner/digger
- {-917.648f, -46.8922f, 77.0872f, 5.27089f},
- {-912.689f, -45.4494f, 76.2277f, 4.60767f},
- {-905.455f, -84.5179f, 75.3642f, 3.29867f},
- {-904.332f, -111.509f, 75.5925f, 2.47837f},
- {-904.27f, -160.419f, 61.9876f, 3.61192f},
- {-904.023f, -90.4558f, 75.3706f, 3.40339f},
- {-978.678f, -37.3136f, 75.8364f, 2.84489f},
- {-973.076f, -36.5013f, 77.5047f, 1.0821f},
- {-963.951f, -87.734f, 81.5555f, 0.575959f},
- {-961.941f, -90.7252f, 81.6629f, 0.820305f},
- {-957.623f, -186.582f, 66.6021f, 1.95477f},
- {-952.476f, -179.778f, 78.6771f, 4.5204f},
- {-950.427f, -115.007f, 79.6127f, 3.68264f},
- {-950.25f, -151.95f, 79.4598f, -1.81423f},
- {-950.169f, -188.099f, 66.6184f, 5.55015f},
- {-949.944f, -142.977f, 80.5382f, 2.70526f},
- {-947.854f, -170.5f, 79.7618f, 0.942478f},
- {-946.738f, -139.567f, 80.0904f, 2.3911f},
- {-945.503f, -65.0654f, 79.7907f, 5.02655f},
- {-943.678f, -110.986f, 80.2557f, 0.959931f},
- {-942.993f, -56.9881f, 79.8915f, 5.65487f},
- {-938.197f, -155.838f, 61.3111f, 1.65806f},
- {-930.488f, -214.524f, 72.1431f, 2.1236f},
- {-929.947f, -154.449f, 61.5084f, 1.67552f},
- {-927.412f, -135.313f, 61.1987f, 3.29867f},
- {-920.677f, -156.859f, 62.8033f, 3.15306f},
- {-916.75f, -136.094f, 62.2357f, 0.0698132f},
- {-915.319f, -132.718f, 62.562f, 1.16984f},
- {-913.589f, -146.794f, 76.9366f, 1.8675f},
- {-907.572f, -148.937f, 76.6898f, 4.76475f},
- {-902.02f, -64.6174f, 73.9707f, 1.19169f},
- {-899.489f, -61.7252f, 73.2498f, 5.09636f},
- {-894.792f, -127.141f, 75.3834f, 6.14356f},
- {-892.408f, -162.525f, 64.1212f, 2.69884f},
- {-892.326f, -123.158f, 76.0318f, 5.5676f},
- {-888.468f, -148.462f, 61.8012f, 1.65806f},
- {-883.268f, -159.738f, 63.5311f, 5.20108f},
- {-877.76f, -118.07f, 65.215f, 2.94961f},
- {-876.792f, -128.646f, 64.1045f, 3.40339f},
- {-874.901f, -36.6579f, 69.4246f, 2.00713f},
- {-874.856f, -151.351f, 62.7537f, 3.57875f},
- {-872.135f, -150.08f, 62.7513f, 3.57201f},
- {-870.288f, -149.217f, 62.5413f, 3.56624f},
- {-870.03f, -6.27443f, 70.3867f, 2.3911f},
- {-869.023f, -82.2118f, 69.5848f, 3.22886f},
- {-866.354f, -40.2455f, 70.842f, 0.0698132f},
- {-865.305f, -152.302f, 63.5044f, 4.86947f},
- {-861.926f, -79.0519f, 71.4178f, 0.20944f},
- {-857.292f, -152.277f, 63.2114f, 4.18879f},
- {-853.357f, -0.696194f, 72.0655f, 0.994838f},
- {-850.685f, -14.2596f, 70.2298f, 0.20944f},
- {-839.987f, -67.7695f, 72.7916f, 4.93928f},
- {-839.199f, -57.0558f, 73.4891f, 1.67552f},
- {-836.963f, -153.224f, 63.3821f, 4.46804f},
- {-832.721f, -67.7555f, 72.9062f, 4.99164f},
- {-821.496f, -143.095f, 63.1292f, 0.541052f},
- {-818.829f, -153.004f, 62.1757f, 6.12611f},
- //special
- {-954.622f, -110.958f, 80.7911f, 6.24828f},
- {-951.477f, -53.9647f, 80.0235f, 5.32325f},
- {-946.812f, -126.04f, 78.8601f, 5.15265f},
- {-940.689f, -140.707f, 79.9225f, 2.79253f},
- {-933.954f, -159.632f, 60.778f, 2.56563f},
- {-922.537f, -130.291f, 61.3756f, 4.95674f},
- {-915.862f, -151.74f, 76.9427f, 0.942478f},
- {-888.321f, -159.831f, 62.5303f, 1.20428f},
- {-874.361f, -42.4751f, 69.4316f, 0.785398f},
- {-873.19f, -50.4899f, 70.0568f, -2.41288f},
- {-868.511f, -148.386f, 62.3547f, 3.57875f},
- {-868.44f, -121.649f, 64.5056f, 3.33358f},
- {-868.324f, -77.7196f, 71.4768f, 5.41052f},
- {-859.846f, -19.6549f, 70.7304f, 1.97222f},
- {-828.05f, -150.508f, 62.2019f, 2.14675f},
- {-826.254f, -58.6911f, 72.0041f, 3.68264f},
- {-976.086f, -44.1775f, 76.029f, 1.46608f},
- {-971.864f, -87.4223f, 81.4954f, 5.8294f},
- {-966.551f, -74.1111f, 80.0243f, 4.2129f},
- {-958.509f, -173.652f, 77.9013f, 6.24828f},
- {-951.511f, -181.242f, 65.529f, 4.39823f},
- {-940.967f, -186.243f, 77.698f, 1.28164f},
- {-930.004f, -65.0898f, 79.077f, 0.0581657f},
- {-920.864f, -40.2009f, 78.256f, 5.16617f},
- {-919.089f, -148.021f, 62.0317f, 2.59327f},
- {-901.516f, -116.329f, 75.6876f, 0.471239f},
- {-897.864f, -84.4348f, 74.083f, 3.00197f},
- {-897.617f, -52.0457f, 71.9503f, 4.36332f},
- {-894.891f, -153.951f, 61.6827f, 3.23569f},
- {-893.933f, -111.625f, 75.6591f, 4.22536f},
- {-883.265f, -152.854f, 61.8384f, 0.0941087f},
- {-868.293f, -147.243f, 62.1097f, 3.2056f},
- {-867.501f, -11.8709f, 70.018f, 6.14356f},
- {-866.699f, -147.54f, 62.1646f, 3.57878f},
- {-866.566f, -91.1916f, 67.4414f, 4.56707f},
- {-857.272f, -141.142f, 61.7356f, 4.17134f},
- {-847.446f, -98.0061f, 68.5131f, 3.24631f},
- {-837.026f, -140.729f, 62.5141f, 5.51524f},
- {-824.204f, -65.053f, 72.3381f, 3.01942f},
- //vermin (s.th special for this mine)
- {-951.955f, -197.5f, 77.212f, 5.63741f},
- {-944.837f, -199.608f, 77.0737f, 4.97419f},
- {-933.494f, -209.063f, 73.7803f, 5.88176f},
- {-929.666f, -201.308f, 73.7032f, 5.02655f},
- {-978.997f, -249.356f, 65.4345f, 5.05464f},
- {-974.565f, -224.828f, 69.5858f, 4.88846f},
- {-946.514f, -259.239f, 66.0874f, 3.78132f},
- {-918.402f, -250.439f, 69.5271f, 2.21352f},
- {-910.14f, -229.959f, 72.9279f, 0.27677f},
- {-851.563f, -88.6527f, 68.5983f, 3.61896f},
- //boss
- {-848.902f, -92.931f, 68.6325f, 3.33350f},
- //herald
- {-48.459f, -288.802f, 55.47f, 1.0f},
- //triggers
- {637.083f, -32.6603f, 45.9715f, 1.14353f}, //firstaid_station
- {669.007f, -294.078f, 30.2909f, 2.77507f}, //stormpike_grave
- {77.8013f, -404.7f, 46.7549f, -0.872665f}, //stoneheart_grave
- {-202.581f, -112.73f, 78.4876f, -0.715585f}, //snowfall_grave
- {-611.962f, -396.17f, 60.8351f, 2.53682f}, //iceblood_grave
- {-1082.45f, -346.823f, 54.9219f, -1.53589f}, //frostwolf_grave
- {-1402.21f, -307.431f, 89.4424f, 0.191986f}, //frostwolf_hut
- {553.779f, -78.6566f, 51.9378f, -1.22173f}, //dunbaldar_south
- {674.001f, -143.125f, 63.6615f, 0.994838f}, //dunbaldar_north
- {203.281f, -360.366f, 56.3869f, -0.925024f}, //icewing_bunker
- {-152.437f, -441.758f, 40.3982f, -1.95477f}, //stoneheart_bunker
- {-571.88f, -262.777f, 75.0087f, -0.802851f}, //iceblood_tower
- {-768.907f, -363.71f, 90.8949f, 1.07991f}, //tower_point
- {-1302.9f, -316.981f, 113.867f, 2.00713f}, //frostwolf_etower
- {-1297.5f, -266.767f, 114.15f, 3.31044f}, //frostwolf_wtower
- {-57.7891f, -286.597f, 15.6479f, 6.02139f}, //AV_NPC_A_CAPTAIN balinda
- {722.43f, -10.9982f, 50.7046f, 3.42085f}, //AV_NPC_A_BOSS vanndar
- {-545.23f, -165.35f, 57.7886f, 3.01145f}, //AV_NPC_H_CAPTAIN galvangar
- {-1370.9f, -219.793f, 98.4258f, 5.04381f} //AV_NPC_H_BOSS drek thar
-};
-
-enum BG_AV_CreatureIds
-{
- AV_NPC_A_GRAVEDEFENSE0 = 0, // stormpike Defender
- AV_NPC_A_GRAVEDEFENSE1 = 1, // seasoned defender
- AV_NPC_A_GRAVEDEFENSE2 = 2, // veteran defender
- AV_NPC_A_GRAVEDEFENSE3 = 3, // champion defender
- AV_NPC_A_TOWERDEFENSE = 4, // stormpike bowman
- AV_NPC_A_CAPTAIN = 5, // balinda
- AV_NPC_A_BOSS = 6, // vanndar
-
- AV_NPC_H_GRAVEDEFENSE0 = 7, // frostwolf guardian
- AV_NPC_H_GRAVEDEFENSE1 = 8, // seasoned guardian
- AV_NPC_H_GRAVEDEFENSE2 = 9, // veteran guardian
- AV_NPC_H_GRAVEDEFENSE3 = 10, // champion guardian
- AV_NPC_H_TOWERDEFENSE = 11, // frostwolf bowman
- AV_NPC_H_CAPTAIN = 12, // galvangar
- AV_NPC_H_BOSS = 13, // drek thar
-
- AV_NPC_A_MARSHAL_SOUTH = 14,
- AV_NPC_MARSHAL_NORTH = 15,
- AV_NPC_A_MARSHAL_ICE = 16,
- AV_NPC_A_MARSHAL_STONE = 17,
- AV_NPC_H_MARSHAL_ICE = 18,
- AV_NPC_H_MARSHAL_TOWER = 19,
- AV_NPC_MARSHAL_ETOWER = 20,
- AV_NPC_H_MARSHAL_WTOWER= 21,
- AV_NPC_N_MINE_N_1 = 22,
- AV_NPC_N_MINE_N_2 = 23,
- AV_NPC_N_MINE_N_3 = 24,
- AV_NPC_N_MINE_N_4 = 25,
- AV_NPC_N_MINE_A_1 = 26,
- AV_NPC_N_MINE_A_2 = 27,
- AV_NPC_N_MINE_A_3 = 28,
- AV_NPC_N_MINE_A_4 = 29,
- AV_NPC_N_MINE_H_1 = 30,
- AV_NPC_N_MINE_H_2 = 31,
- AV_NPC_N_MINE_H_3 = 32,
- AV_NPC_N_MINE_H_4 = 33,
- AV_NPC_S_MINE_N_1 = 34,
- AV_NPC_S_MINE_N_2 = 35,
- AV_NPC_S_MINE_N_3 = 36,
- AV_NPC_S_MINE_N_4 = 37,
- AV_NPC_S_MINE_N_S = 38,
- AV_NPC_S_MINE_A_1 = 39,
- AV_NPC_S_MINE_A_2 = 40,
- AV_NPC_S_MINE_A_3 = 41,
- AV_NPC_S_MINE_A_4 = 42,
- AV_NPC_S_MINE_H_1 = 43,
- AV_NPC_S_MINE_H_2 = 44,
- AV_NPC_S_MINE_H_3 = 45,
- AV_NPC_S_MINE_H_4 = 46,
- AV_NPC_HERALD = 47,
- AV_NPC_INFO_MAX = 48
-};
-
-//entry, team, minlevel, maxlevel
-/// @todo: this array should be removed, the only needed things are the entrys (for spawning(?) and handlekillunit)
-const uint32 BG_AV_CreatureInfo[AV_NPC_INFO_MAX] =
-{
- 12050, // Stormpike Defender
- 13326, // Seasoned Defender
- 13331, // Veteran Defender
- 13422, // Champion Defender
- 13358, // Stormpike Bowman /// @todo: Confirm if this is correct. Author assumpted 60, 61 & 69, 70, but wouldn't work here
- 11949, // not spawned with this data, but used for handlekillunit
- 11948, // not spawned with this data, but used for handlekillunit
- 12053, // Frostwolf Guardian
- 13328, // Seasoned Guardian
- 13332, // Veteran Guardian
- 13421, // Champion Guardian
- 13359, // Frostwolf Bowman
- 11947, // not spawned with this data, but used for handlekillunit
- 11946, // not spawned with this data, but used for handlekillunit
- 14763, // Dun Baldar South Marshal
- 14762, // Dun Baldar North Marshal
- 14764, // Icewing Marshal
- 14765, // Stonehearth Marshal
-
- 14773, // Iceblood Warmaster
- 14776, // Tower Point Warmaster
- 14772, // East Frostwolf Warmaster
- 14777, // West Frostwolf Warmaster
-
- 10987, // Irondeep Trogg
- 11600, // Irondeep Shaman
- 11602, // Irondeep Skullthumper
- 11657, // Morloch
-
- 13396, // irondeep alliance /// @todo: Correct and give correct ids
- 13080,
- 13098,
- 13078,
-
- 13397, // irondeep horde
- 13099,
- 13081,
- 13079,
-
- 11603, // south mine neutral
- 11604,
- 11605,
- 11677,
- 10982, // vermin
-
- 13317, // alliance
- 13096, // explorer
- 13087, // invader
- 13086,
-
- 13316, // horde
- 13097, // surveypr
- 13089, // guard
- 13088,
- 14848 // Herald
-};
-
-//x, y, z, o, static_creature_info-id
-const float BG_AV_StaticCreaturePos[AV_STATICCPLACE_MAX][5] =
-{
- //static creatures
- {-1235.31f, -340.777f, 60.5088f, 3.31613f, 0 }, //2225 - Zora Guthrek
- {-1244.02f, -323.795f, 61.0485f, 5.21853f, 1 }, //3343 - Grelkor
- {-1235.16f, -332.302f, 60.2985f, 2.96706f, 2 }, //3625 - Rarck
- {587.303f, -42.8257f, 37.5615f, 5.23599f, 3 }, //4255 - Brogus Thunderbrew
- {643.635f, -58.3987f, 41.7405f, 4.72984f, 4 }, //4257 - Lana Thunderbrew
- {591.464f, -44.452f, 37.6166f, 5.65487f, 5 }, //5134 - Jonivera Farmountain
- {608.515f, -33.3935f, 42.0003f, 5.41052f, 6 }, //5135 - Svalbrad Farmountain
- {617.656f, -32.0701f, 42.7168f, 4.06662f, 7 }, //5139 - Kurdrum Barleybeard
- {-1183.76f, -268.295f, 72.8233f, 3.28122f, 8 }, //10364 - Yaelika Farclaw
- {-1187.86f, -275.31f, 73.0481f, 3.63028f, 9 }, //10367 - Shrye Ragefist
- {-1008.42f, -368.006f, 55.3426f, 5.95647f, 10 }, //10981 - Frostwolf
- {-1091.92f, -424.28f, 53.0139f, 2.93958f, 10 }, //10981 - Frostwolf
- {-558.455f, -198.768f, 58.1755f, 4.97946f, 10 }, //10981 - Frostwolf
- {-861.247f, -312.51f, 55.1427f, 3.35382f, 10 }, //10981 - Frostwolf
- {-1003.81f, -395.913f, 50.4736f, 2.85631f, 10 }, //10981 - Frostwolf
- {-904.5f, -289.815f, 65.1222f, 5.7847f, 10 }, //10981 - Frostwolf
- {-1064.41f, -438.839f, 51.3614f, 1.88857f, 10 }, //10981 - Frostwolf
- {258.814f, 76.2017f, 18.6468f, 6.19052f, 11 }, //10986 - Snowblind Harpy
- {265.838f, -315.846f, -16.5429f, 3.15917f, 11 }, //10986 - Snowblind Harpy
- {426.485f, -51.1927f, -5.66286f, 1.60347f, 11 }, //10986 - Snowblind Harpy
- {452.044f, -33.9594f, -0.044651f, 2.72815f, 11 }, //10986 - Snowblind Harpy
- {266.032f, -315.639f, -16.5429f, 4.67962f, 11 }, //10986 - Snowblind Harpy
- {532.64f, -54.5863f, 20.7024f, 2.93215f, 11 }, //10986 - Snowblind Harpy
- {295.183f, -299.908f, -34.6123f, 0.135851f, 12 }, //10990 - Alterac Ram
- {421.08f, -225.006f, -23.73f, 0.166754f, 12 }, //10990 - Alterac Ram
- {-55.7766f, -192.498f, 20.4352f, 6.12221f, 12 }, //10990 - Alterac Ram
- {527.887f, -477.223f, 62.3559f, 0.170935f, 12 }, //10990 - Alterac Ram
- {389.144f, -346.508f, -30.334f, 4.14117f, 12 }, //10990 - Alterac Ram
- {108.121f, -322.248f, 37.5655f, 4.46788f, 12 }, //10990 - Alterac Ram
- {507.479f, -67.9403f, 10.3571f, 3.26304f, 12 }, //10990 - Alterac Ram
- {329.071f, -185.016f, -29.1542f, 0.356943f, 12 }, //10990 - Alterac Ram
- {252.449f, -422.313f, 35.1404f, 4.53771f, 12 }, //10990 - Alterac Ram
- {358.882f, -118.061f, -24.9119f, 2.29257f, 12 }, //10990 - Alterac Ram
- {487.151f, -174.229f, 14.7558f, 4.73192f, 12 }, //10990 - Alterac Ram
- {449.652f, -123.561f, 6.14273f, 6.12029f, 12 }, //10990 - Alterac Ram
- {272.419f, -261.802f, -41.8835f, 3.66559f, 12 }, //10990 - Alterac Ram
- {359.021f, -210.954f, -29.3483f, 4.31339f, 12 }, //10990 - Alterac Ram
- {450.598f, -318.048f, -37.7548f, 0.655219f, 12 }, //10990 - Alterac Ram
- {509.333f, -218.2f, 3.05439f, 3.66292f, 12 }, //10990 - Alterac Ram
- {485.771f, -223.613f, -1.53f, 2.04862f, 12 }, //10990 - Alterac Ram
- {486.636f, -452.172f, 39.6592f, 2.3341f, 12 }, //10990 - Alterac Ram
- {702.783f, -257.494f, 25.9777f, 1.68329f, 12 }, //10990 - Alterac Ram
- {460.942f, -199.263f, -6.0149f, 0.380506f, 12 }, //10990 - Alterac Ram
- {483.108f, -115.307f, 10.1056f, 3.69701f, 12 }, //10990 - Alterac Ram
- {471.601f, -154.174f, 14.0702f, 5.5807f, 12 }, //10990 - Alterac Ram
- {213.938f, -420.793f, 41.2549f, 5.71394f, 12 }, //10990 - Alterac Ram
- {289.387f, -294.685f, -33.9073f, 0.555494f, 12 }, //10990 - Alterac Ram
- {155.649f, -402.891f, 43.3915f, 5.94838f, 12 }, //10990 - Alterac Ram
- {517.184f, -295.105f, -9.78195f, 6.05668f, 12 }, //10990 - Alterac Ram
- {102.334f, -332.165f, 38.9812f, 3.31445f, 12 }, //10990 - Alterac Ram
- {320.244f, -107.793f, -42.6357f, -1.00311f, 12 }, //10990 - Alterac Ram
- {217.976f, 110.774f, 15.7603f, 4.56793f, 13 }, //11675 - Snowblind Windcaller
- {269.872f, 6.66684f, 20.7592f, 0.381212f, 13 }, //11675 - Snowblind Windcaller
- {313.528f, -319.041f, -27.2373f, 0.554098f, 13 }, //11675 - Snowblind Windcaller
- {435.441f, -39.9289f, -0.169651f, 0.549454f, 13 }, //11675 - Snowblind Windcaller
- {315.115f, -317.62f, -29.1123f, 0.90111f, 13 }, //11675 - Snowblind Windcaller
- {428.091f, -122.731f, 3.40332f, 6.05901f, 14 }, //11678 - Snowblind Ambusher
- {235.05f, 85.5705f, 18.3079f, -0.914255f, 14 }, //11678 - Snowblind Ambusher
- {-1553.04f, -344.342f, 64.4163f, 6.09933f, 15 }, //11839 - Wildpaw Brute
- {-545.23f, -165.35f, 57.7886f, 3.01145f, 16 }, //11947 - Captain Galvangar
- {722.43f, -10.9982f, 50.7046f, 3.42085f, 17 }, //11948 - Vanndar Stormpike
- {-57.7891f, -286.597f, 15.6479f, 6.02139f, 18 }, //11949 - Captain Balinda Stonehearth
- {930.498f, -520.755f, 93.7334f, 1.8326f, 19 }, //11997 - Stormpike Herald
- {-776.092f, -345.161f, 67.4092f, 1.89257f, 20 }, //12051 - Frostwolf Legionnaire
- {-1224.63f, -308.144f, 65.0087f, 4.01139f, 20 }, //12051 - Frostwolf Legionnaire
- {-713.039f, -442.515f, 82.8638f, 0.68724f, 20 }, //12051 - Frostwolf Legionnaire
- {-711.783f, -444.061f, 82.7039f, 0.683494f, 20 }, //12051 - Frostwolf Legionnaire
- {587.633f, -45.9816f, 37.5438f, 5.81195f, 21 }, //12096 - Stormpike Quartermaster
- {-1293.79f, -194.407f, 72.4398f, 5.84685f, 22 }, //12097 - Frostwolf Quartermaster
- {446.163f, -377.119f, -1.12725f, 0.209526f, 23 }, //12127 - Stormpike Guardsman
- {549.348f, -399.254f, 53.3537f, 3.24729f, 23 }, //12127 - Stormpike Guardsman
- {549.801f, -401.217f, 53.8305f, 3.24729f, 23 }, //12127 - Stormpike Guardsman
- {192.704f, -406.874f, 42.9183f, 6.10696f, 23 }, //12127 - Stormpike Guardsman
- {441.305f, -435.765f, 28.2385f, 2.14472f, 23 }, //12127 - Stormpike Guardsman
- {192.982f, -404.891f, 43.0132f, 6.1061f, 23 }, //12127 - Stormpike Guardsman
- {355.342f, -391.989f, -0.486707f, 3.00643f, 23 }, //12127 - Stormpike Guardsman
- {446.035f, -375.104f, -1.12725f, 0.21033f, 23 }, //12127 - Stormpike Guardsman
- {697.864f, -433.238f, 62.7914f, 1.65776f, 23 }, //12127 - Stormpike Guardsman
- {610.74f, -331.585f, 30.8021f, 5.14253f, 23 }, //12127 - Stormpike Guardsman
- {609.815f, -329.775f, 30.9271f, -2.38829f, 23 }, //12127 - Stormpike Guardsman
- {695.874f, -433.434f, 62.8543f, 1.65776f, 23 }, //12127 - Stormpike Guardsman
- {443.337f, -435.283f, 28.6842f, 2.13768f, 23 }, //12127 - Stormpike Guardsman
- {-1251.5f, -316.327f, 62.6565f, 5.02655f, 24 }, //13176 - Smith Regzar
- {-1332.0f, -331.243f, 91.2631f, 1.50098f, 25 }, //13179 - Wing Commander Guse
- {569.983f, -94.9992f, 38.0325f, 1.39626f, 26 }, //13216 - Gaelden Hammersmith
- {-1244.92f, -308.916f, 63.2525f, 1.62316f, 27 }, //13218 - Grunnda Wolfheart
- {-1319.56f, -342.675f, 60.3404f, 1.20428f, 28 }, //13236 - Primalist Thurloga
- {647.61f, -61.1548f, 41.7405f, 4.24115f, 29 }, //13257 - Murgot Deepforge
- {-1321.64f, -343.73f, 60.4833f, 1.01229f, 30 }, //13284 - Frostwolf Shaman
- {-1317.61f, -342.853f, 60.3726f, 2.47837f, 30 }, //13284 - Frostwolf Shaman
- {-1319.31f, -344.475f, 60.3825f, 1.72788f, 30 }, //13284 - Frostwolf Shaman
- {569.963f, -42.0218f, 37.7581f, 4.27606f, 31 }, //13438 - Wing Commander Slidore
- {729.2f, -78.812f, 51.6335f, 3.97935f, 32 }, //13442 - Arch Druid Renferal
- {729.118f, -82.8713f, 51.6335f, 2.53073f, 33 }, //13443 - Druid of the Grove
- {725.554f, -79.4973f, 51.6335f, 5.27089f, 33 }, //13443 - Druid of the Grove
- {724.768f, -84.1642f, 51.6335f, 0.733038f, 33 }, //13443 - Druid of the Grove
- {596.68f, -83.0633f, 39.0051f, 6.24828f, 34 }, //13447 - Corporal Noreg Stormpike
- {600.032f, -2.92475f, 42.0788f, 5.00909f, 35 }, //13577 - Stormpike Ram Rider Commander
- {610.239f, -21.8454f, 43.272f, 4.90438f, 36 }, //13617 - Stormpike Stable Master
- {613.422f, -150.764f, 33.4517f, 5.55015f, 37 }, //13797 - Mountaineer Boombellow
- {-1213.91f, -370.619f, 56.4455f, 0.837758f, 38 }, //13798 - Jotek
- {704.35f, -22.9071f, 50.2187f, 0.785398f, 39 }, //13816 - Prospector Stonehewer
- {-1271.24f, -335.766f, 62.3971f, 5.75959f, 40 }, //14185 - Najak Hexxen
- {-1268.64f, -332.688f, 62.6171f, 5.28835f, 41 }, //14186 - Ravak Grimtotem
- {648.363f, -65.2233f, 41.7405f, 3.12414f, 42 }, //14187 - Athramanis
- {648.238f, -67.8931f, 41.7405f, 2.60054f, 43 }, //14188 - Dirk Swindle
- {-1223.44f, -309.833f, 64.9331f, 4.0131f, 44 }, //14282 - Frostwolf Bloodhound
- {-1226.4f, -307.136f, 64.9706f, 4.0145f, 44 }, //14282 - Frostwolf Bloodhound
- {356.001f, -389.969f, -0.438796f, 3.0334f, 45 }, //14283 - Stormpike Owl
- {355.835f, -394.005f, -0.60149f, 3.02498f, 45 }, //14283 - Stormpike Owl
- {882.266f, -496.378f, 96.7707f, 4.83248f, 45 }, //14283 - Stormpike Owl
- {878.649f, -495.917f, 96.6171f, 4.67693f, 45 }, //14283 - Stormpike Owl
- {932.851f, -511.017f, 93.6748f, 3.61004f, 45 }, //14283 - Stormpike Owl
- {935.806f, -513.983f, 93.7436f, 3.61788f, 45 }, //14283 - Stormpike Owl
- {947.412f, -509.982f, 95.1098f, 2.82743f, 46 }, //14284 - Stormpike Battleguard
- {934.557f, -512.395f, 93.662f, 3.61004f, 46 }, //14284 - Stormpike Battleguard
- {939.42f, -502.777f, 94.5887f, 5.14872f, 46 }, //14284 - Stormpike Battleguard
- {854.276f, -494.241f, 96.8017f, 5.44543f, 46 }, //14284 - Stormpike Battleguard
- {776.621f, -487.775f, 99.4049f, 3.50811f, 46 }, //14284 - Stormpike Battleguard
- {880.169f, -495.699f, 96.6204f, 4.8325f, 46 }, //14284 - Stormpike Battleguard
- {773.651f, -497.482f, 99.0408f, 2.11185f, 46 }, //14284 - Stormpike Battleguard
- {949.1f, -506.913f, 95.4237f, 3.31613f, 46 }, //14284 - Stormpike Battleguard
- {-1370.9f, -219.793f, 98.4258f, 5.04381f, 47}, //drek thar
-};
-
-const uint32 BG_AV_StaticCreatureInfo[51] =
-{
- 2225, // Zora Guthrek
- 3343, // Grelkor
- 3625, // Rarck
- 4255, // Brogus Thunderbrew
- 4257, // Lana Thunderbrew
- 5134, // Jonivera Farmountain
- 5135, // Svalbrad Farmountain
- 5139, // Kurdrum Barleybeard
- 10364, // Yaelika Farclaw
- 10367, // Shrye Ragefist
- 10981, // Frostwolf
- 10986, // Snowblind Harpy
- 10990, // Alterac Ram
- 11675, // Snowblind Windcaller
- 11678, // Snowblind Ambusher
- 11839, // Wildpaw Brute
- 11947, // Captain Galvangar
- 11948, // Vanndar Stormpike
- 11949, // Captain Balinda Stonehearth
- 11997, // Stormpike Herald
- 12051, // Frostwolf Legionnaire
- 12096, // Stormpike Quartermaster
- 12097, // Frostwolf Quartermaster
- 12127, // Stormpike Guardsman
- 13176, // Smith Regzar
- 13179, // Wing Commander Guse
- 13216, // Gaelden Hammersmith
- 13218, // Grunnda Wolfheart
- 13236, // Primalist Thurloga
- 13257, // Murgot Deepforge
- 13284, // Frostwolf Shaman
- 13438, // Wing Commander Slidore
- 13442, // Arch Druid Renferal
- 13443, // Druid of the Grove
- 13447, // Corporal Noreg Stormpike
- 13577, // Stormpike Ram Rider Commander
- 13617, // Stormpike Stable Master
- 13797, // Mountaineer Boombellow
- 13798, // Jotek
- 13816, // Prospector Stonehewer
- 14185, // Najak Hexxen
- 14186, // Ravak Grimtotem
- 14187, // Athramanis
- 14188, // Dirk Swindle
- 14282, // Frostwolf Bloodhound
- 14283, // Stormpike Owl
- 14284, // Stormpike Battleguard
- 11946, // Drek'Thar
- 11948, // Vanndar Stormpike
- 11947, // Captain Galvangar
- 11949, // Captain Balinda Stonehearth
-};
-
-enum BG_AV_Graveyards
-{
- AV_GRAVE_STORM_AID = 751,
- AV_GRAVE_STORM_GRAVE = 689,
- AV_GRAVE_STONE_GRAVE = 729,
- AV_GRAVE_SNOWFALL = 169,
- AV_GRAVE_ICE_GRAVE = 749,
- AV_GRAVE_FROSTWOLF = 690,
- AV_GRAVE_FROST_HUT = 750,
- AV_GRAVE_MAIN_ALLIANCE = 611,
- AV_GRAVE_MAIN_HORDE = 610
-};
-
-const uint32 BG_AV_GraveyardIds[9]=
-{
- AV_GRAVE_STORM_AID,
- AV_GRAVE_STORM_GRAVE,
- AV_GRAVE_STONE_GRAVE,
- AV_GRAVE_SNOWFALL,
- AV_GRAVE_ICE_GRAVE,
- AV_GRAVE_FROSTWOLF,
- AV_GRAVE_FROST_HUT,
- AV_GRAVE_MAIN_ALLIANCE,
- AV_GRAVE_MAIN_HORDE
-};
-
enum BG_AV_BUFF
{ /// @todo: Add all other buffs here
AV_BUFF_ARMOR = 21163,
@@ -1468,13 +409,6 @@ enum BG_AV_WorldStates
AV_WS_BALINDA_ALIVE = 1351,
};
-//alliance_control neutral_control horde_control
-const uint32 BG_AV_MineWorldStates[2][4] =
-{
- {AV_WS_IRONDEEP_MINE_ALLIANCE_CONTROLLED, AV_WS_IRONDEEP_MINE_TROGG_CONTROLLED, AV_WS_IRONDEEP_MINE_HORDE_CONTROLLED, AV_WS_IRONDEEP_MINE_OWNER},
- {AV_WS_COLDTOOTH_MINE_ALLIANCE_CONTROLLED, AV_WS_COLDTOOTH_MINE_KOBOLD_CONTROLLED, AV_WS_COLDTOOTH_MINE_HORDE_CONTROLLED, AV_WS_COLDTOOTH_MINE_OWNER}
-};
-
enum BG_AV_QuestIds
{
AV_QUEST_A_SCRAPS1 = 7223,
@@ -1501,6 +435,23 @@ enum BG_AV_QuestIds
AV_QUEST_H_RIDER_TAME = 7001
};
+struct StaticMineInfo
+{
+ int32 WorldStateOwner;
+ int32 WorldStateAllianceControlled;
+ int32 WorldStateHordeControlled;
+ int32 WorldStateNeutralControlled;
+ uint8 TextIdAlliance;
+ uint8 TextIdHorde;
+};
+
+struct AlteracValleyMineInfo
+{
+ Team Owner;
+
+ StaticMineInfo StaticInfo;
+};
+
struct StaticNodeInfo
{
BG_AV_Nodes NodeId;
@@ -1521,25 +472,31 @@ struct StaticNodeInfo
int32 HordeAssault;
int32 Owner;
} WorldStateIds;
+
+ struct
+ {
+ std::string AllianceOrDefend;
+ std::string HordeOrDestroy;
+ } StringIds;
};
static StaticNodeInfo const BGAVNodeInfo[] =
{
- { BG_AV_NODES_FIRSTAID_STATION, { 47, 48, 45, 46 }, { 1325, 1326, 1327, 1328, 0 } }, // Stormpike First Aid Station
- { BG_AV_NODES_STORMPIKE_GRAVE, { 1, 2, 3, 4 }, { 1333, 1335, 1334, 1336, 0 } }, // Stormpike Graveyard
- { BG_AV_NODES_STONEHEART_GRAVE, { 55, 56, 53, 54 }, { 1302, 1304, 1301, 1303, 0 } }, // Stoneheart Graveyard
- { BG_AV_NODES_SNOWFALL_GRAVE, { 5, 6, 7, 8 }, { 1341, 1343, 1342, 1344, 0 } }, // Snowfall Graveyard
- { BG_AV_NODES_ICEBLOOD_GRAVE, { 59, 60, 57, 58 }, { 1346, 1348, 1347, 1349, 0 } }, // Iceblood Graveyard
- { BG_AV_NODES_FROSTWOLF_GRAVE, { 9, 10, 11, 12 }, { 1337, 1339, 1338, 1340, 0 } }, // Frostwolf Graveyard
- { BG_AV_NODES_FROSTWOLF_HUT, { 51, 52, 49, 50 }, { 1329, 1331, 1330, 1332, 0 } }, // Frostwolf Hut
- { BG_AV_NODES_DUNBALDAR_SOUTH, { 16, 15, 14, 13 }, { 1361, 1375, 1370, 1378, 1181 } }, // Dunbaldar South Bunker
- { BG_AV_NODES_DUNBALDAR_NORTH, { 20, 19, 18, 17 }, { 1362, 1374, 1371, 1379, 1182 } }, // Dunbaldar North Bunker
- { BG_AV_NODES_ICEWING_BUNKER, { 24, 23, 22, 21 }, { 1363, 1376, 1372, 1380, 1183 } }, // Icewing Bunker
- { BG_AV_NODES_STONEHEART_BUNKER, { 28, 27, 26, 25 }, { 1364, 1377, 1373, 1381, 1184 } }, // Stoneheart Bunker
- { BG_AV_NODES_ICEBLOOD_TOWER, { 44, 43, 42, 41 }, { 1368, 1390, 1385, 1395, 1188 } }, // Iceblood Tower
- { BG_AV_NODES_TOWER_POINT, { 40, 39, 38, 37 }, { 1367, 1389, 1384, 1394, 1187 } }, // Tower Point
- { BG_AV_NODES_FROSTWOLF_ETOWER, { 36, 35, 34, 33 }, { 1366, 1388, 1383, 1393, 1186 } }, // Frostwolf East Tower
- { BG_AV_NODES_FROSTWOLF_WTOWER, { 32, 31, 30, 29 }, { 1365, 1387, 1382, 1392, 1185 } }, // Frostwolf West Tower
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
+ { 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
};
enum Texts
@@ -1569,7 +526,6 @@ struct BG_AV_NodeInfo
{
BG_AV_States State;
BG_AV_States PrevState;
- uint32 Timer;
uint16 TotalOwner;
Team Owner;
uint16 PrevOwner;
@@ -1578,54 +534,68 @@ struct BG_AV_NodeInfo
inline BG_AV_Nodes &operator++(BG_AV_Nodes& i) { return i = BG_AV_Nodes(i + 1); }
+enum BG_AV_Data : uint32
+{
+ DATA_DEFENDER_TIER_HORDE = 1,
+ DATA_DEFENDER_TIER_ALLIANCE = 2,
+};
+
+enum BG_AV_DefenderTier : uint32
+{
+ BG_AV_DEFENDER_TIER_DEFENDER,
+ BG_AV_DEFENDER_TIER_SEASONED,
+ BG_AV_DEFENDER_TIER_VETERAN,
+ BG_AV_DEFENDER_TIER_CHAMPION
+};
+
class BattlegroundAV : public Battleground
{
public:
BattlegroundAV(BattlegroundTemplate const* battlegroundTemplate);
- ~BattlegroundAV();
+ ~BattlegroundAV() = default;
/* inherited from BattlegroundClass */
- void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override;
void HandleAreaTrigger(Player* player, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
- void Reset() override;
/*general stuff*/
void UpdateScore(Team team, int16 points);
- /*handlestuff*/ //these are functions which get called from extern
- void EventPlayerClickedOnFlag(Player* source, GameObject* target_obj) override;
+ // Handle Stuff
+ void HandleInteractCapturableObject(Player* player, GameObject* target);
+ //these are functions which get called from extern
void HandleKillPlayer(Player* player, Player* killer) override;
void HandleKillUnit(Creature* unit, Unit* killer) override;
void HandleQuestComplete(uint32 questid, Player* player) override;
- bool CanActivateGO(int32 GOId, uint32 team) const override;
void EndBattleground(Team winner) override;
- WorldSafeLocsEntry const* GetClosestGraveyard(Player* player) override;
WorldSafeLocsEntry const* GetExploitTeleportLocation(Team team) override;
Team GetPrematureWinner() override;
+ void OnGameObjectCreate(GameObject* gameObject) override;
+ void OnCreatureCreate(Creature* creature) override;
+
+ uint32 GetData(uint32 dataId) const override;
private:
void PostUpdateImpl(uint32 diff) override;
+ bool IsCaptainAlive(TeamId teamId) const;
/* Nodes occupying */
void EventPlayerAssaultsPoint(Player* player, uint32 object);
void EventPlayerDefendsPoint(Player* player, uint32 object);
- void EventPlayerDestroyedPoint(BG_AV_Nodes node);
+ void EventPlayerDestroyedPoint(GameObject* gameobject);
+ void DoAction([[maybe_unused]] uint32 actionId, [[maybe_unused]] WorldObject* source = nullptr, [[maybe_unused]] WorldObject* target = nullptr) override;
void AssaultNode(BG_AV_Nodes node, Team team);
void DestroyNode(BG_AV_Nodes node);
void InitNode(BG_AV_Nodes node, Team team, bool tower);
void DefendNode(BG_AV_Nodes node, Team team);
- void PopulateNode(BG_AV_Nodes node);
- void DePopulateNode(BG_AV_Nodes node);
-
StaticNodeInfo const* GetStaticNodeInfo(BG_AV_Nodes node) const
{
for (uint8 i = 0; i < BG_AV_NODES_MAX; ++i)
@@ -1635,33 +605,34 @@ class BattlegroundAV : public Battleground
}
BG_AV_Nodes GetNodeThroughObject(uint32 object);
- uint32 GetObjectThroughNode(BG_AV_Nodes node);
- bool IsTower(BG_AV_Nodes node) { return m_Nodes[node].Tower; }
+ bool IsTower(BG_AV_Nodes node) const { return _nodes[node].Tower; }
/*mine*/
- void ChangeMineOwner(uint8 mine, Team team, bool initial = false);
+ void ChangeMineOwner(AlteracValleyMine mine, Team team, bool initial = false);
/*worldstates*/
- void SendMineWorldStates(uint32 mine);
+ void SendMineWorldStates(AlteracValleyMine mine);
void UpdateNodeWorldState(BG_AV_Nodes node);
- /*general */
- Creature* AddAVCreature(uint16 cinfoid, uint16 type);
+ Creature* FindHerald(std::string_view stringId) const;
/*variables */
- int32 m_Team_Scores[2];
- uint32 m_Team_QuestStatus[2][9]; //[x][y] x=team y=questcounter
+ std::array<int32, PVP_TEAMS_COUNT> _teamResources;
+ uint32 m_Team_QuestStatus[PVP_TEAMS_COUNT][9]; //[x][y] x=team y=questcounter
+
+ std::array<BG_AV_NodeInfo, BG_AV_NODES_MAX> _nodes;
+
+ TimeTracker _mineResourceTimer; //ticks for both teams
- BG_AV_NodeInfo m_Nodes[BG_AV_NODES_MAX];
+ std::array<AlteracValleyMineInfo, 2> _mineInfo;
- Team m_Mine_Owner[2];
- uint32 m_Mine_PrevOwner[2]; //only for worldstates needed
- int32 m_Mine_Timer; //ticks for both teams
- uint32 m_Mine_Reclaim_Timer[2];
- uint32 m_CaptainBuffTimer[2];
- bool m_CaptainAlive[2];
+ std::array<TimeTracker, PVP_TEAMS_COUNT> _captainBuffTimer;
- bool m_IsInformedNearVictory[2];
+ std::array<bool, PVP_TEAMS_COUNT> _isInformedNearVictory;
+ GuidUnorderedSet _doorGUIDs;
+ ObjectGuid _balindaGUID;
+ ObjectGuid _galvangarGUID;
+ GuidUnorderedSet _heraldGUIDs;
};
#endif
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index f4b8ecc9be7..2f3d4e266e5 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1580,8 +1580,8 @@ void Spell::EffectOpenLock()
return;
// Arathi Basin banner opening. /// @todo Verify correctness of this check
- if ((goInfo->type == GAMEOBJECT_TYPE_BUTTON && goInfo->button.noDamageImmune) ||
- (goInfo->type == GAMEOBJECT_TYPE_GOOBER && goInfo->goober.requireLOS))
+ if (gameObjTarget->GetMapId() != 30 && ((goInfo->type == GAMEOBJECT_TYPE_BUTTON && goInfo->button.noDamageImmune) ||
+ (goInfo->type == GAMEOBJECT_TYPE_GOOBER && goInfo->goober.requireLOS)))
{
//CanUseBattlegroundObject() already called in CheckCast()
// in battleground check
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
index 79bddc01009..b189434b495 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
@@ -16,24 +16,21 @@
*/
#include "ScriptMgr.h"
+#include "BattlegroundAV.h"
+#include "GameObject.h"
+#include "GameObjectAI.h"
+#include "Player.h"
#include "ScriptedCreature.h"
+#include <chrono>
+
enum Spells
{
SPELL_CHARGE = 22911,
SPELL_CLEAVE = 40504,
SPELL_DEMORALIZING_SHOUT = 23511,
SPELL_ENRAGE = 8599,
- SPELL_WHIRLWIND = 13736,
-
- SPELL_NORTH_MARSHAL = 45828,
- SPELL_SOUTH_MARSHAL = 45829,
- SPELL_STONEHEARTH_MARSHAL = 45830,
- SPELL_ICEWING_MARSHAL = 45831,
- SPELL_ICEBLOOD_WARMASTER = 45822,
- SPELL_TOWER_POINT_WARMASTER = 45823,
- SPELL_WEST_FROSTWOLF_WARMASTER = 45824,
- SPELL_EAST_FROSTWOLF_WARMASTER = 45826
+ SPELL_WHIRLWIND = 13736
};
enum Creatures
@@ -58,41 +55,12 @@ enum Events
EVENT_CHECK_RESET = 6
};
-struct SpellPair
-{
- uint32 npcEntry;
- uint32 spellId;
-};
-
-uint8 const MAX_SPELL_PAIRS = 8;
-SpellPair const _auraPairs[MAX_SPELL_PAIRS] =
-{
- { NPC_NORTH_MARSHAL, SPELL_NORTH_MARSHAL },
- { NPC_SOUTH_MARSHAL, SPELL_SOUTH_MARSHAL },
- { NPC_STONEHEARTH_MARSHAL, SPELL_STONEHEARTH_MARSHAL },
- { NPC_ICEWING_MARSHAL, SPELL_ICEWING_MARSHAL },
- { NPC_EAST_FROSTWOLF_WARMASTER, SPELL_EAST_FROSTWOLF_WARMASTER },
- { NPC_WEST_FROSTWOLF_WARMASTER, SPELL_WEST_FROSTWOLF_WARMASTER },
- { NPC_TOWER_POINT_WARMASTER, SPELL_TOWER_POINT_WARMASTER },
- { NPC_ICEBLOOD_WARMASTER, SPELL_ICEBLOOD_WARMASTER }
-};
-
struct npc_av_marshal_or_warmaster : public ScriptedAI
{
- npc_av_marshal_or_warmaster(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _hasAura = false;
- }
+ npc_av_marshal_or_warmaster(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
- Initialize();
-
events.Reset();
events.ScheduleEvent(EVENT_CHARGE_TARGET, 2s, 12s);
events.ScheduleEvent(EVENT_CLEAVE, 1s, 11s);
@@ -109,16 +77,6 @@ struct npc_av_marshal_or_warmaster : public ScriptedAI
void UpdateAI(uint32 diff) override
{
- // I have a feeling this isn't blizzlike, but owell, I'm only passing by and cleaning up.
- if (!_hasAura)
- {
- for (uint8 i = 0; i < MAX_SPELL_PAIRS; ++i)
- if (_auraPairs[i].npcEntry == me->GetEntry())
- DoCast(me, _auraPairs[i].spellId);
-
- _hasAura = true;
- }
-
if (!UpdateVictim())
return;
@@ -172,10 +130,58 @@ struct npc_av_marshal_or_warmaster : public ScriptedAI
private:
EventMap events;
- bool _hasAura;
+};
+
+struct go_av_capturable_object : public GameObjectAI
+{
+ go_av_capturable_object(GameObject* go) : GameObjectAI(go) { }
+
+ void Reset() override
+ {
+ me->setActive(true);
+ }
+
+ bool OnGossipHello(Player* player) override
+ {
+ if (me->GetGoState() != GO_STATE_READY)
+ return true;
+
+ if (ZoneScript* zonescript = me->GetZoneScript())
+ {
+ zonescript->DoAction(ACTION_AV_INTERACT_CAPTURABLE_OBJECT, player, me);
+ return false;
+ }
+
+ return true;
+ }
+};
+
+struct go_av_contested_object : public go_av_capturable_object
+{
+ go_av_contested_object(GameObject* go) : go_av_capturable_object(go) { }
+
+ void Reset() override
+ {
+ go_av_capturable_object::Reset();
+ _scheduler.Schedule(4min, [&](TaskContext)
+ {
+ if (ZoneScript* zonescript = me->GetZoneScript())
+ zonescript->DoAction(ACTION_AV_CAPTURE_CAPTURABLE_OBJECT, me, me);
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
};
void AddSC_alterac_valley()
{
RegisterCreatureAI(npc_av_marshal_or_warmaster);
+ RegisterGameObjectAI(go_av_capturable_object);
+ RegisterGameObjectAI(go_av_contested_object);
}