Files
CypherCore/Source/Game/BattleGrounds/Zones/AlteracValley.cs
T

1413 lines
62 KiB
C#

// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Framework.Constants;
using Game.Entities;
using System;
using System.Collections.Generic;
namespace Game.BattleGrounds.Zones.AlteracValley
{
class BgAlteracValley : Battleground
{
int[] _teamResources = new int[SharedConst.PvpTeamsCount];
uint[][] m_Team_QuestStatus = new uint[SharedConst.PvpTeamsCount][]; //[x][y] x=team y=questcounter
AVNodeInfo[] _nodes = new AVNodeInfo[(int)AVNodes.Max];
TimeTracker _mineResourceTimer; //ticks for both teams
AlteracValleyMineInfo[] _mineInfo = new AlteracValleyMineInfo[2];
TimeTracker[] _captainBuffTimer = new TimeTracker[SharedConst.PvpTeamsCount];
bool[] _isInformedNearVictory = new bool[SharedConst.PvpTeamsCount];
List<ObjectGuid> _doorGUIDs = new();
ObjectGuid _balindaGUID;
ObjectGuid _galvangarGUID;
List<ObjectGuid> _heraldGUIDs = new();
public BgAlteracValley(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate)
{
_teamResources = [MiscConst.ScoreInitialPoints, MiscConst.ScoreInitialPoints];
_isInformedNearVictory = [false, false];
for (byte 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 (byte j = 0; j < 9; j++)
m_Team_QuestStatus[i][j] = 0;
_captainBuffTimer[i] = new(120000 + RandomHelper.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
}
_mineInfo[(byte)AlteracValleyMine.North] = new AlteracValleyMineInfo(Team.Other, new StaticMineInfo(WorldStateIds.IrondeepMineOwner, WorldStateIds.IrondeepMineAllianceControlled, WorldStateIds.IrondeepMineHordeControlled, WorldStateIds.IrondeepMineTroggControlled, (byte)TextIds.IrondeepMineAllianceTaken, (byte)TextIds.IrondeepMineHordeTaken));
_mineInfo[(byte)AlteracValleyMine.South] = new AlteracValleyMineInfo(Team.Other, new StaticMineInfo(WorldStateIds.ColdtoothMineOwner, WorldStateIds.ColdtoothMineAllianceControlled, WorldStateIds.ColdtoothMineHordeControlled, WorldStateIds.ColdtoothMineKoboldControlled, (byte)TextIds.ColdtoothMineAllianceTaken, (byte)TextIds.ColdtoothMineHordeTaken));
for (AVNodes i = AVNodes.FirstaidStation; i <= AVNodes.StoneheartGrave; ++i) //alliance graves
InitNode(i, Team.Alliance, false);
for (AVNodes i = AVNodes.DunbaldarSouth; i <= AVNodes.StoneheartBunker; ++i) //alliance towers
InitNode(i, Team.Alliance, true);
for (AVNodes i = AVNodes.IcebloodGrave; i <= AVNodes.FrostwolfHut; ++i) //horde graves
InitNode(i, Team.Horde, false);
for (AVNodes i = AVNodes.IcebloodTower; i <= AVNodes.FrostwolfWtower; ++i) //horde towers
InitNode(i, Team.Horde, true);
InitNode(AVNodes.SnowfallGrave, Team.Other, false); //give snowfall neutral owner
_mineResourceTimer = new(MiscConst.MineResourceTimer);
StartMessageIds[BattlegroundConst.EventIdSecond] = (uint)BroadcastTextIds.StartOneMinute;
StartMessageIds[BattlegroundConst.EventIdThird] = (uint)BroadcastTextIds.StartHalfMinute;
StartMessageIds[BattlegroundConst.EventIdFourth] = (uint)BroadcastTextIds.BattleHasBegun;
}
public override void HandleKillPlayer(Player player, Player killer)
{
if (GetStatus() != BattlegroundStatus.InProgress)
return;
base.HandleKillPlayer(player, killer);
UpdateScore(GetPlayerTeam(player.GetGUID()), -1);
}
public override void HandleKillUnit(Creature unit, Unit killer)
{
Log.outDebug(LogFilter.Battleground, "bg_av HandleKillUnit {}", unit.GetEntry());
if (GetStatus() != BattlegroundStatus.InProgress)
return;
switch ((CreatureIds)unit.GetEntry())
{
case CreatureIds.Vanndar:
{
UpdateWorldState((int)WorldStateIds.VandaarAlive, 0);
CastSpellOnTeam(MiscConst.SpellCompleteAlteracValleyQuest, Team.Horde); //this is a spell which finishes a quest where a player has to kill the boss
RewardReputationToTeam(MiscConst.FactionFrostwolfClan, MiscConst.RepGainBoss, Team.Horde);
RewardHonorToTeam(GetBonusHonorFromKill(MiscConst.HonorKillBonusBoss), Team.Horde);
EndBattleground(Team.Horde);
break;
}
case CreatureIds.Drekthar:
{
UpdateWorldState((int)WorldStateIds.DrektharAlive, 0);
CastSpellOnTeam(MiscConst.SpellCompleteAlteracValleyQuest, Team.Alliance); //this is a spell which finishes a quest where a player has to kill the boss
RewardReputationToTeam(MiscConst.FactionStormpikeGuard, MiscConst.RepGainBoss, Team.Alliance);
RewardHonorToTeam(GetBonusHonorFromKill(MiscConst.HonorKillBonusBoss), Team.Alliance);
EndBattleground(Team.Alliance);
break;
}
case CreatureIds.Balinda:
{
UpdateWorldState((int)WorldStateIds.BalindaAlive, 0);
RewardReputationToTeam(MiscConst.FactionFrostwolfClan, MiscConst.RepGainCaptain, Team.Horde);
RewardHonorToTeam(GetBonusHonorFromKill(MiscConst.HonorKillBonusCaptain), Team.Horde);
UpdateScore(Team.Alliance, MiscConst.ResourceLossCaptain);
Creature herald = FindHerald("bg_av_herald_horde_win");
if (herald != null)
herald.GetAI().Talk((uint)TextIds.StormpikeGeneralDead);
break;
}
case CreatureIds.Galvangar:
{
UpdateWorldState((int)WorldStateIds.GalvagarAlive, 0);
RewardReputationToTeam(MiscConst.FactionStormpikeGuard, MiscConst.RepGainCaptain, Team.Alliance);
RewardHonorToTeam(GetBonusHonorFromKill(MiscConst.HonorKillBonusCaptain), Team.Alliance);
UpdateScore(Team.Horde, MiscConst.ResourceLossCaptain);
Creature herald = FindHerald("bg_av_herald_alliance_win");
if (herald != null)
herald.GetAI().Talk((uint)TextIds.FrostwolfGeneralDead);
break;
}
case CreatureIds.Morloch:
{
// if mine is not owned by morloch, then nothing happens
if (_mineInfo[(byte)AlteracValleyMine.North].Owner != Team.Other)
break;
Team killerTeam = GetPlayerTeam((killer.GetCharmerOrOwnerPlayerOrPlayerItself() ?? killer).GetGUID());
ChangeMineOwner(AlteracValleyMine.North, killerTeam);
break;
}
case CreatureIds.TaskmasterSnivvle:
{
if (_mineInfo[(byte)AlteracValleyMine.South].Owner != Team.Other)
break;
Team killerTeam = GetPlayerTeam((killer.GetCharmerOrOwnerPlayerOrPlayerItself() ?? killer).GetGUID());
ChangeMineOwner(AlteracValleyMine.South, killerTeam);
break;
}
case CreatureIds.UmiThorson:
case CreatureIds.Keetar:
{
Team killerTeam = GetPlayerTeam((killer.GetCharmerOrOwnerPlayerOrPlayerItself() ?? killer).GetGUID());
ChangeMineOwner(AlteracValleyMine.North, killerTeam);
break;
}
case CreatureIds.AgiRumblestomp:
case CreatureIds.MashaSwiftcut:
{
Team killerTeam = GetPlayerTeam((killer.GetCharmerOrOwnerPlayerOrPlayerItself() ?? killer).GetGUID());
ChangeMineOwner(AlteracValleyMine.South, killerTeam);
break;
}
}
}
public override void HandleQuestComplete(uint questid, Player player)
{
if (GetStatus() != BattlegroundStatus.InProgress)
return;//maybe we should log this, cause this must be a cheater or a big bug
Team team = GetPlayerTeam(player.GetGUID());
int teamIndex = GetTeamIndexByTeamId(team);
/// @todo add reputation, events (including quest not available anymore, next quest available, go/npc de/spawning)and maybe honor
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed", questid);
switch ((QuestIds)questid)
{
case QuestIds.AScraps1:
case QuestIds.AScraps2:
case QuestIds.HScraps1:
case QuestIds.HScraps2:
m_Team_QuestStatus[teamIndex][0] += 20;
break;
case QuestIds.ACommander1:
case QuestIds.HCommander1:
m_Team_QuestStatus[teamIndex][1]++;
RewardReputationToTeam((uint)team, 1, team);
if (m_Team_QuestStatus[teamIndex][1] == 30)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
break;
case QuestIds.ACommander2:
case QuestIds.HCommander2:
m_Team_QuestStatus[teamIndex][2]++;
RewardReputationToTeam((uint)team, 1, team);
if (m_Team_QuestStatus[teamIndex][2] == 60)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
break;
case QuestIds.ACommander3:
case QuestIds.HCommander3:
m_Team_QuestStatus[teamIndex][3]++;
RewardReputationToTeam((uint)team, 1, team);
if (m_Team_QuestStatus[teamIndex][3] == 120)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
break;
case QuestIds.ABoss1:
case QuestIds.HBoss1:
m_Team_QuestStatus[teamIndex][4] += 4; //you can turn in 5 or 1 item..
goto case QuestIds.ABoss2;
case QuestIds.ABoss2:
case QuestIds.HBoss2:
m_Team_QuestStatus[teamIndex][4]++;
if (m_Team_QuestStatus[teamIndex][4] >= 200)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
UpdateWorldState((int)(teamIndex == BattleGroundTeamId.Alliance ? WorldStateIds.IvusStormCrystalCount : WorldStateIds.LokholarStormpikeSoldiersBloodCount), (int)m_Team_QuestStatus[teamIndex][4]);
break;
case QuestIds.ANearMine:
case QuestIds.HNearMine:
m_Team_QuestStatus[teamIndex][5]++;
if (m_Team_QuestStatus[teamIndex][5] == 28)
{
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIndex][6] == 7)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here - ground assault ready", questid);
}
break;
case QuestIds.AOtherMine:
case QuestIds.HOtherMine:
m_Team_QuestStatus[teamIndex][6]++;
if (m_Team_QuestStatus[teamIndex][6] == 7)
{
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIndex][5] == 20)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here - ground assault ready", questid);
}
break;
case QuestIds.ARiderHide:
case QuestIds.HRiderHide:
m_Team_QuestStatus[teamIndex][7]++;
if (m_Team_QuestStatus[teamIndex][7] == 25)
{
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIndex][8] == 25)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here - rider assault ready", questid);
}
break;
case QuestIds.ARiderTame:
case QuestIds.HRiderTame:
m_Team_QuestStatus[teamIndex][8]++;
if (m_Team_QuestStatus[teamIndex][8] == 25)
{
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIndex][7] == 25)
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed (need to implement some events here - rider assault ready", questid);
}
break;
default:
Log.outDebug(LogFilter.Battleground, "BG_AV Quest {} completed but is not interesting at all", questid);
break;
}
}
void UpdateScore(Team team, short points)
{
Cypher.Assert(team == Team.Alliance || team == Team.Horde);
int teamindex = GetTeamIndexByTeamId(team);
_teamResources[teamindex] += points;
UpdateWorldState((int)(teamindex == BattleGroundTeamId.Horde ? WorldStateIds.HordeReinforcements : WorldStateIds.AllianceReinforcements), _teamResources[teamindex]);
if (points < 0)
{
if (_teamResources[teamindex] < 1)
{
_teamResources[teamindex] = 0;
EndBattleground(teamindex == BattleGroundTeamId.Horde ? Team.Alliance : Team.Horde);
}
else if (!_isInformedNearVictory[teamindex] && _teamResources[teamindex] < MiscConst.NearLosePoints)
{
if (teamindex == BattleGroundTeamId.Alliance)
SendBroadcastText((uint)BroadcastTextIds.AllianceNearLose, ChatMsg.BgSystemAlliance);
else
SendBroadcastText((uint)BroadcastTextIds.HordeNearLose, ChatMsg.BgSystemHorde);
PlaySoundToAll((uint)SoundsId.NearVictory);
_isInformedNearVictory[teamindex] = true;
}
}
}
public override void PostUpdateImpl(uint diff)
{
if (GetStatus() != BattlegroundStatus.InProgress)
return;
_mineResourceTimer.Update(diff);
if (_mineResourceTimer.Passed())
{
foreach (AlteracValleyMineInfo info in _mineInfo)
{
if (info.Owner == Team.Other)
continue;
UpdateScore(info.Owner, 1);
}
_mineResourceTimer.Reset(MiscConst.MineResourceTimer);
}
for (byte i = BattleGroundTeamId.Alliance; i <= BattleGroundTeamId.Horde; i++)
{
if (!IsCaptainAlive(i))
continue;
_captainBuffTimer[i].Update(diff);
if (_captainBuffTimer[i].Passed())
{
if (i == 0)
{
CastSpellOnTeam((uint)AVBuffs.ACaptain, Team.Alliance);
Creature creature = GetBgMap().GetCreature(_balindaGUID);
if (creature != null)
creature.GetAI().DoAction(MiscConst.ActionBuffYell);
}
else
{
CastSpellOnTeam((uint)AVBuffs.HCaptain, Team.Horde);
Creature creature = GetBgMap().GetCreature(_galvangarGUID);
if (creature != null)
creature.GetAI().DoAction(MiscConst.ActionBuffYell);
}
_captainBuffTimer[i].Reset(120000 + RandomHelper.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
}
}
}
bool IsCaptainAlive(uint teamId)
{
if (teamId == BattleGroundTeamId.Horde)
return GetBgMap().GetWorldStateValue((int)WorldStateIds.GalvagarAlive) == 1;
else if (teamId == BattleGroundTeamId.Alliance)
return GetBgMap().GetWorldStateValue((int)WorldStateIds.BalindaAlive) == 1;
return false;
}
public override void StartingEventOpenDoors()
{
Log.outDebug(LogFilter.Battleground, "BG_AV: start spawning mine stuff");
UpdateWorldState((int)WorldStateIds.ShowHordeReinforcements, 1);
UpdateWorldState((int)WorldStateIds.ShowAllianceReinforcements, 1);
// Achievement: The Alterac Blitz
TriggerGameEvent(MiscConst.EventStartBattle);
foreach (ObjectGuid guid in _doorGUIDs)
{
GameObject gameObject = GetBgMap().GetGameObject(guid);
if (gameObject != null)
{
gameObject.UseDoorOrButton();
TimeSpan delay = gameObject.GetEntry() == (uint)GameObjectIds.GhostGate ? TimeSpan.Zero : TimeSpan.FromSeconds(3);
gameObject.DespawnOrUnsummon(delay);
}
}
}
public override void EndBattleground(Team winner)
{
//calculate bonuskills for both teams:
//first towers:
uint[] kills = [0, 0];
uint[] rep = [0, 0];
for (int i = (int)AVNodes.DunbaldarSouth; i <= (int)AVNodes.FrostwolfWtower; ++i)
{
if (_nodes[i].State == AVStates.PointControled)
{
if (_nodes[i].Owner == Team.Alliance)
{
rep[BattleGroundTeamId.Alliance] += MiscConst.RepGainSurvivingTower;
kills[BattleGroundTeamId.Alliance] += MiscConst.HonorKillBonusSurvivingTower;
}
else
{
rep[BattleGroundTeamId.Horde] += MiscConst.RepGainSurvivingTower;
kills[BattleGroundTeamId.Horde] += MiscConst.HonorKillBonusSurvivingTower;
}
}
}
for (byte i = BattleGroundTeamId.Alliance; i <= BattleGroundTeamId.Horde; ++i)
{
if (IsCaptainAlive(i))
{
kills[i] += MiscConst.HonorKillBonusSurvivingCaptain;
rep[i] += MiscConst.RepGainSurvivingCaptain;
}
if (rep[i] != 0)
RewardReputationToTeam(i == 0 ? MiscConst.FactionStormpikeGuard : MiscConst.FactionFrostwolfClan, rep[i], i == 0 ? Team.Alliance : Team.Horde);
if (kills[i] != 0)
RewardHonorToTeam(GetBonusHonorFromKill(kills[i]), i == 0 ? Team.Alliance : Team.Horde);
}
/// @todo add enterevademode for all attacking creatures
base.EndBattleground(winner);
}
void RemovePlayer(Player player, ObjectGuid guid, uint team)
{
if (player == null)
{
Log.outError(LogFilter.Battleground, "bg_AV no player at remove");
return;
}
/// @todo search more buffs
player.RemoveAurasDueToSpell((uint)AVBuffs.Armor);
}
void EventPlayerDestroyedPoint(GameObject gameobject)
{
if (gameobject == null)
return;
AVNodes node = GetNodeThroughObject(gameobject.GetEntry());
DestroyNode(node);
UpdateNodeWorldState(node);
Team owner = _nodes[(int)node].Owner;
if (IsTower(node))
{
UpdateScore((owner == Team.Alliance) ? Team.Horde : Team.Alliance, MiscConst.ResourceLossTower);
RewardReputationToTeam(owner == Team.Alliance ? MiscConst.FactionStormpikeGuard : MiscConst.FactionFrostwolfClan, MiscConst.RepGainDestroyTower, owner);
RewardHonorToTeam(GetBonusHonorFromKill(MiscConst.HonorKillBonusDestroyTower), owner);
}
StaticNodeInfo nodeInfo = GetStaticNodeInfo(node);
if (nodeInfo != null)
{
Creature herald = FindHerald(nodeInfo.HordeOrDestroy);
if (herald != null)
herald.GetAI().Talk(owner == Team.Alliance ? nodeInfo.AllianceCapture : nodeInfo.HordeCapture);
}
GetBgMap().UpdateSpawnGroupConditions();
}
public override void DoAction(uint actionId, WorldObject source, WorldObject target)
{
switch (actionId)
{
case MiscConst.ActionCaptureCaptuableObject:
EventPlayerDestroyedPoint(source.ToGameObject());
break;
case MiscConst.ActionInteractCapturableObject:
if (target != null && source != null && source.IsPlayer())
HandleInteractCapturableObject(source.ToPlayer(), target.ToGameObject());
break;
default:
Log.outError(LogFilter.Battleground, "BattlegroundAV::DoAction: {}. Unhandled action.", actionId);
break;
}
}
void ChangeMineOwner(AlteracValleyMine mine, Team team, bool initial = false)
{
if (team != Team.Alliance && team != Team.Horde)
team = Team.Other;
AlteracValleyMineInfo mineInfo = _mineInfo[(int)mine];
if (mineInfo.Owner == team && !initial)
return;
mineInfo.Owner = team;
SendMineWorldStates(mine);
byte textId = team == Team.Alliance ? mineInfo.StaticInfo.TextIdAlliance : mineInfo.StaticInfo.TextIdHorde;
string stringId = team == Team.Alliance ? "bg_av_herald_mine_alliance" : "bg_av_herald_mine_horde";
Creature herald = FindHerald(stringId);
if (herald != null)
herald.GetAI().Talk(textId);
}
AVNodes GetNodeThroughObject(uint objectId)
{
switch ((GameObjectIds)objectId)
{
case GameObjectIds.AidStationAllianceControlled:
case GameObjectIds.AidStationHordeContested:
case GameObjectIds.AidStationHordeControlled:
case GameObjectIds.AidStationAllianceContested:
return AVNodes.FirstaidStation;
case GameObjectIds.StormpikeAllianceControlled:
case GameObjectIds.StormpikeHordeContested:
case GameObjectIds.StormpikeHordeControlled:
case GameObjectIds.StormpikeAllianceContested:
return AVNodes.StormpikeGrave;
case GameObjectIds.StonehearthHordeContested:
case GameObjectIds.StonehearthHordeControlled:
case GameObjectIds.StonehearthAllianceContested:
case GameObjectIds.StonehearthAllianceControlled:
return AVNodes.StoneheartGrave;
case GameObjectIds.SnowfallNeutral:
case GameObjectIds.SnowfallHordeContested:
case GameObjectIds.SnowfallAllianceContested:
case GameObjectIds.SnowfallHordeControlled:
case GameObjectIds.SnowfallAllianceControlled:
return AVNodes.SnowfallGrave;
case GameObjectIds.IcebloodHordeControlled:
case GameObjectIds.IcebloodAllianceContested:
case GameObjectIds.IcebloodAllianceControlled:
case GameObjectIds.IcebloodHordeContested:
return AVNodes.IcebloodGrave;
case GameObjectIds.FrostwolfHordeControlled:
case GameObjectIds.FrostwolfAllianceContested:
case GameObjectIds.FrostwolfAllianceControlled:
case GameObjectIds.FrostwolfHordeContested:
return AVNodes.FrostwolfGrave;
case GameObjectIds.FrostwolfHutHordeControlled:
case GameObjectIds.FrostwolfHutAllianceContested:
case GameObjectIds.FrostwolfHutAllianceControlled:
case GameObjectIds.FrostwolfHutHordeContested:
return AVNodes.FrostwolfHut;
case GameObjectIds.SouthBunkerControlledTowerBanner:
case GameObjectIds.SouthBunkerControlledBanner:
case GameObjectIds.SouthBunkerContestedBanner:
case GameObjectIds.SouthBunkerContestedTowerBanner:
return AVNodes.DunbaldarSouth;
case GameObjectIds.NorthBunkerControlledTowerBanner:
case GameObjectIds.NorthBunkerControlledBanner:
case GameObjectIds.NorthBunkerContestedBanner:
case GameObjectIds.NorthBunkerContestedTowerBanner:
return AVNodes.DunbaldarNorth;
case GameObjectIds.EastTowerControlledTowerBanner:
case GameObjectIds.EastTowerControlledBanner:
case GameObjectIds.EastTowerContestedBanner:
case GameObjectIds.EastTowerContestedTowerBanner:
return AVNodes.FrostwolfEtower;
case GameObjectIds.WestTowerControlledTowerBanner:
case GameObjectIds.WestTowerControlledBanner:
case GameObjectIds.WestTowerContestedBanner:
case GameObjectIds.WestTowerContestedTowerBanner:
return AVNodes.FrostwolfWtower;
case GameObjectIds.TowerPointControlledTowerBanner:
case GameObjectIds.TowerPointControlledBanner:
case GameObjectIds.TowerPointContestedBanner:
case GameObjectIds.TowerPointContestedTowerBanner:
return AVNodes.TowerPoint;
case GameObjectIds.IcebloodTowerControlledTowerBanner:
case GameObjectIds.IcebloodTowerControlledBanner:
case GameObjectIds.IcebloodTowerContestedBanner:
case GameObjectIds.IcebloodTowerContestedTowerBanner:
return AVNodes.IcebloodTower;
case GameObjectIds.StonehearthBunkerControlledTowerBanner:
case GameObjectIds.StonehearthBunkerControlledBanner:
case GameObjectIds.StonehearthBunkerContestedBanner:
case GameObjectIds.StonehearthBunkerContestedTowerBanner:
return AVNodes.StoneheartBunker;
case GameObjectIds.IcewingBunkerControlledTowerBanner:
case GameObjectIds.IcewingBunkerControlledBanner:
case GameObjectIds.IcewingBunkerContestedBanner:
case GameObjectIds.IcewingBunkerContestedTowerBanner:
return AVNodes.IcewingBunker;
default:
Log.outError(LogFilter.Battleground, $"BattlegroundAV: ERROR! GetPlace got a wrong objectId {objectId}");
//ABORT();
return 0;
}
}
void HandleInteractCapturableObject(Player player, GameObject target)
{
if (player == null || target == null)
return;
switch ((GameObjectIds)target.GetEntry())
{
case GameObjectIds.AidStationAllianceControlled:
case GameObjectIds.AidStationHordeControlled:
case GameObjectIds.FrostwolfAllianceControlled:
case GameObjectIds.FrostwolfHordeControlled:
case GameObjectIds.FrostwolfHutAllianceControlled:
case GameObjectIds.FrostwolfHutHordeControlled:
case GameObjectIds.IcebloodAllianceControlled:
case GameObjectIds.IcebloodHordeControlled:
case GameObjectIds.StonehearthAllianceControlled:
case GameObjectIds.StonehearthHordeControlled:
case GameObjectIds.StormpikeAllianceControlled:
case GameObjectIds.StormpikeHordeControlled:
// Snowfall
case GameObjectIds.SnowfallNeutral:
case GameObjectIds.SnowfallAllianceControlled:
case GameObjectIds.SnowfallHordeControlled:
// Towers
case GameObjectIds.EastTowerControlledBanner:
case GameObjectIds.WestTowerControlledBanner:
case GameObjectIds.TowerPointControlledBanner:
case GameObjectIds.IcebloodTowerControlledBanner:
case GameObjectIds.StonehearthBunkerControlledBanner:
case GameObjectIds.IcewingBunkerControlledBanner:
case GameObjectIds.SouthBunkerControlledBanner:
case GameObjectIds.NorthBunkerControlledBanner:
EventPlayerAssaultsPoint(player, target.GetEntry());
break;
// Graveyards
case GameObjectIds.AidStationAllianceContested:
case GameObjectIds.AidStationHordeContested:
case GameObjectIds.FrostwolfAllianceContested:
case GameObjectIds.FrostwolfHordeContested:
case GameObjectIds.FrostwolfHutAllianceContested:
case GameObjectIds.FrostwolfHutHordeContested:
case GameObjectIds.IcebloodAllianceContested:
case GameObjectIds.IcebloodHordeContested:
case GameObjectIds.StonehearthAllianceContested:
case GameObjectIds.StonehearthHordeContested:
case GameObjectIds.StormpikeAllianceContested:
case GameObjectIds.StormpikeHordeContested:
// Towers
case GameObjectIds.EastTowerContestedBanner:
case GameObjectIds.WestTowerContestedBanner:
case GameObjectIds.TowerPointContestedBanner:
case GameObjectIds.IcebloodTowerContestedBanner:
case GameObjectIds.StonehearthBunkerContestedBanner:
case GameObjectIds.IcewingBunkerContestedBanner:
case GameObjectIds.SouthBunkerContestedBanner:
case GameObjectIds.NorthBunkerContestedBanner:
EventPlayerDefendsPoint(player, target.GetEntry());
break;
// Snowfall Special cases (Either Defend/Assault)
case GameObjectIds.SnowfallAllianceContested:
case GameObjectIds.SnowfallHordeContested:
{
AVNodes node = GetNodeThroughObject(target.GetEntry());
if (_nodes[(int)node].TotalOwner == Team.Other)
EventPlayerAssaultsPoint(player, target.GetEntry());
else
EventPlayerDefendsPoint(player, target.GetEntry());
break;
}
default:
break;
}
}
void EventPlayerDefendsPoint(Player player, uint obj)
{
AVNodes node = GetNodeThroughObject(obj);
Team owner = _nodes[(int)node].Owner;
Team team = GetPlayerTeam(player.GetGUID());
if (owner == team || _nodes[(int)node].State != AVStates.PointAssaulted)
return;
Log.outDebug(LogFilter.Battleground, "player defends point object: {} node: {}", obj, node);
if (_nodes[(int)node].PrevOwner != team)
{
Log.outError(LogFilter.Battleground, "BG_AV: player defends point which doesn't belong to his team {}", node);
return;
}
DefendNode(node, team);
UpdateNodeWorldState(node);
StaticNodeInfo nodeInfo = GetStaticNodeInfo(node);
if (nodeInfo != null)
{
string stringId;
if (IsTower(node))
stringId = nodeInfo.AllianceOrDefend;
else
stringId = team == Team.Alliance ? nodeInfo.AllianceOrDefend : nodeInfo.HordeOrDestroy;
Creature herald = FindHerald(stringId);
if (herald != null)
herald.GetAI().Talk(team == Team.Alliance ? nodeInfo.AllianceCapture : nodeInfo.HordeCapture);
}
// update the statistic for the defending player
UpdatePvpStat(player, IsTower(node) ? MiscConst.PvpStatTowersDefended : MiscConst.PvpStatGraveyardsDefended, 1);
GetBgMap().UpdateSpawnGroupConditions();
}
void EventPlayerAssaultsPoint(Player player, uint obj)
{
AVNodes node = GetNodeThroughObject(obj);
Team owner = _nodes[(int)node].Owner; //maybe name it prevowner
Team team = GetPlayerTeam(player.GetGUID());
Log.outDebug(LogFilter.Battleground, "bg_av: player assaults point object {} node {}", obj, node);
if (owner == team || team == _nodes[(int)node].TotalOwner)
return; //surely a gm used this object
AssaultNode(node, team);
UpdateNodeWorldState(node);
StaticNodeInfo nodeInfo = GetStaticNodeInfo(node);
if (nodeInfo != null)
{
string stringId;
if (IsTower(node))
stringId = nodeInfo.HordeOrDestroy;
else
stringId = team == Team.Alliance ? nodeInfo.AllianceOrDefend : nodeInfo.HordeOrDestroy;
Creature herald = FindHerald(stringId);
if (herald != null)
herald.GetAI().Talk(team == Team.Alliance ? nodeInfo.AllianceAttack : nodeInfo.HordeAttack);
}
// update the statistic for the assaulting player
UpdatePvpStat(player, IsTower(node) ? MiscConst.PvpStatTowersAssaulted : MiscConst.PvpStatGraveyardsAssaulted, 1);
GetBgMap().UpdateSpawnGroupConditions();
}
void UpdateNodeWorldState(AVNodes node)
{
StaticNodeInfo nodeInfo = GetStaticNodeInfo(node);
if (nodeInfo != null)
{
Team owner = _nodes[(int)node].Owner;
AVStates state = _nodes[(int)node].State;
UpdateWorldState(nodeInfo.AllianceAssault, owner == Team.Alliance && state == AVStates.PointAssaulted);
UpdateWorldState(nodeInfo.AllianceControl, owner == Team.Alliance && state >= AVStates.PointDestroyed);
UpdateWorldState(nodeInfo.HordeAssault, owner == Team.Horde && state == AVStates.PointAssaulted);
UpdateWorldState(nodeInfo.HordeControl, owner == Team.Horde && state >= AVStates.PointDestroyed);
if (nodeInfo.Owner != 0)
UpdateWorldState(nodeInfo.Owner, owner == Team.Horde ? 2 : owner == Team.Alliance ? 1 : 0);
}
if (node == AVNodes.SnowfallGrave)
UpdateWorldState((int)WorldStateIds.SnowfallGraveyardUncontrolled, _nodes[(int)node].Owner == Team.Other);
}
void SendMineWorldStates(AlteracValleyMine mine)
{
AlteracValleyMineInfo mineInfo = _mineInfo[(byte)mine];
UpdateWorldState(mineInfo.StaticInfo.WorldStateHordeControlled, mineInfo.Owner == Team.Horde);
UpdateWorldState(mineInfo.StaticInfo.WorldStateAllianceControlled, mineInfo.Owner == Team.Alliance);
UpdateWorldState(mineInfo.StaticInfo.WorldStateNeutralControlled, mineInfo.Owner == Team.Other);
UpdateWorldState(mineInfo.StaticInfo.WorldStateOwner, mineInfo.Owner == Team.Horde ? 2 : mineInfo.Owner == Team.Alliance ? 1 : 0);
}
public override WorldSafeLocsEntry GetExploitTeleportLocation(Team team)
{
return Global.ObjectMgr.GetWorldSafeLoc(team == Team.Alliance ? MiscConst.ExploitTeleportLocationAlliance : MiscConst.ExploitTeleportLocationHorde);
}
public override bool SetupBattleground()
{
return true;
}
void AssaultNode(AVNodes node, Team team)
{
_nodes[(int)node].PrevOwner = _nodes[(int)node].Owner;
_nodes[(int)node].Owner = team;
_nodes[(int)node].PrevState = _nodes[(int)node].State;
_nodes[(int)node].State = AVStates.PointAssaulted;
}
void DestroyNode(AVNodes node)
{
_nodes[(int)node].TotalOwner = _nodes[(int)node].Owner;
_nodes[(int)node].PrevOwner = _nodes[(int)node].Owner;
_nodes[(int)node].PrevState = _nodes[(int)node].State;
_nodes[(int)node].State = (_nodes[(int)node].Tower) ? AVStates.PointDestroyed : AVStates.PointControled;
}
void InitNode(AVNodes node, Team team, bool tower)
{
_nodes[(int)node].TotalOwner = team;
_nodes[(int)node].Owner = team;
_nodes[(int)node].PrevOwner = 0;
_nodes[(int)node].State = AVStates.PointControled;
_nodes[(int)node].PrevState = _nodes[(int)node].State;
_nodes[(int)node].State = AVStates.PointControled;
_nodes[(int)node].Tower = tower;
}
void DefendNode(AVNodes node, Team team)
{
_nodes[(int)node].PrevOwner = _nodes[(int)node].Owner;
_nodes[(int)node].Owner = team;
_nodes[(int)node].PrevState = _nodes[(int)node].State;
_nodes[(int)node].State = AVStates.PointControled;
}
public override Team GetPrematureWinner()
{
int allianceScore = _teamResources[GetTeamIndexByTeamId(Team.Alliance)];
int hordeScore = _teamResources[GetTeamIndexByTeamId(Team.Horde)];
if (allianceScore > hordeScore)
return Team.Alliance;
else if (hordeScore > allianceScore)
return Team.Horde;
return base.GetPrematureWinner();
}
public override void OnGameObjectCreate(GameObject gameObject)
{
switch ((GameObjectIds)gameObject.GetEntry())
{
case GameObjectIds.GhostGate:
case GameObjectIds.Gate:
_doorGUIDs.Add(gameObject.GetGUID());
break;
default:
break;
}
}
public override void OnCreatureCreate(Creature creature)
{
switch ((CreatureIds)creature.GetEntry())
{
case CreatureIds.Galvangar:
_galvangarGUID = creature.GetGUID();
break;
case CreatureIds.Balinda:
_balindaGUID = creature.GetGUID();
break;
case CreatureIds.Herald:
_heraldGUIDs.Add(creature.GetGUID());
break;
default:
break;
}
}
public override uint GetData(uint dataId)
{
var getDefenderTierForTeam = DefenderTier (int teamId) =>
{
if (m_Team_QuestStatus[teamId][0] < 500)
return DefenderTier.Defender;
if (m_Team_QuestStatus[teamId][0] < 1000)
return DefenderTier.Seasoned;
if (m_Team_QuestStatus[teamId][0] < 1500)
return DefenderTier.Veteran;
return DefenderTier.Champion;
};
switch (dataId)
{
case MiscConst.DataDefenderTierAlliance:
return (uint)getDefenderTierForTeam(BattleGroundTeamId.Alliance);
case MiscConst.DataDefenderTierHorde:
return (uint)getDefenderTierForTeam(BattleGroundTeamId.Horde);
default:
return base.GetData(dataId);
}
}
Creature FindHerald(string stringId)
{
foreach (ObjectGuid guid in _heraldGUIDs)
{
Creature creature = GetBgMap().GetCreature(guid);
if (creature != null && creature.HasStringId(stringId))
return creature;
}
return null;
}
StaticNodeInfo GetStaticNodeInfo(AVNodes node)
{
for (byte i = 0; i < (int)AVNodes.Max; ++i)
if (MiscConst.BGAVNodeInfo[i].NodeId == node)
return MiscConst.BGAVNodeInfo[i];
return null;
}
bool IsTower(AVNodes node) { return _nodes[(int)node].Tower; }
}
struct AVNodeInfo
{
public AVStates State;
public AVStates PrevState;
public Team TotalOwner;
public Team Owner;
public Team PrevOwner;
public bool Tower;
}
struct StaticMineInfo
{
public int WorldStateOwner;
public int WorldStateAllianceControlled;
public int WorldStateHordeControlled;
public int WorldStateNeutralControlled;
public byte TextIdAlliance;
public byte TextIdHorde;
public StaticMineInfo(WorldStateIds worldStateOwner, WorldStateIds worldStateAllianceControlled, WorldStateIds worldStateHordeControlled, WorldStateIds worldStateNeutralControlled, byte textIdAlliance, byte textIdHorde)
{
WorldStateOwner = (int)worldStateOwner;
WorldStateAllianceControlled = (int)worldStateAllianceControlled;
WorldStateHordeControlled = (int)worldStateHordeControlled;
WorldStateNeutralControlled = (int)worldStateNeutralControlled;
TextIdAlliance = textIdAlliance;
TextIdHorde = textIdHorde;
}
}
struct AlteracValleyMineInfo
{
public Team Owner;
public StaticMineInfo StaticInfo;
public AlteracValleyMineInfo(Team owner, StaticMineInfo staticMineInfo)
{
Owner = owner;
StaticInfo = staticMineInfo;
}
}
public class StaticNodeInfo
{
public AVNodes NodeId;
public byte AllianceCapture;
public byte AllianceAttack;
public byte HordeCapture;
public byte HordeAttack;
public int AllianceControl;
public int AllianceAssault;
public int HordeControl;
public int HordeAssault;
public int Owner;
public string AllianceOrDefend;
public string HordeOrDestroy;
public StaticNodeInfo(AVNodes nodeId, byte allianceCapture, byte allianceAttack, byte hordeCapture, byte hordeAttack, int allianceControl, int allianceAssault, int hordeControl, int hordeAssault, int owner, string allianceOrDefend, string hordeOrDestroy)
{
NodeId = nodeId;
AllianceCapture = allianceCapture;
AllianceAttack = allianceAttack;
HordeCapture = hordeCapture;
HordeAttack = hordeAttack;
AllianceControl = allianceControl;
AllianceAssault = allianceAssault;
HordeControl = hordeControl;
HordeAssault = hordeAssault;
Owner = owner;
AllianceOrDefend = allianceOrDefend;
HordeOrDestroy = hordeOrDestroy;
}
}
#region Constants
struct MiscConst
{
public const int ActionBuffYell = -30001;
public const int ActionInteractCapturableObject = 1;
public const int ActionCaptureCaptuableObject = 2;
public const uint ExploitTeleportLocationAlliance = 3664;
public const uint ExploitTeleportLocationHorde = 3665;
public const int DataDefenderTierHorde = 1;
public const int DataDefenderTierAlliance = 2;
public const int DefenderTierDefender = 0;
public const int DefenderTierSeasoned = 1;
public const int DefenderTierVeteran = 2;
public const int DefenderTierChampion = 3;
public const uint NearLosePoints = 140;
public const uint PvpStatTowersAssaulted = 61;
public const uint PvpStatGraveyardsAssaulted = 63;
public const uint PvpStatTowersDefended = 64;
public const uint PvpStatGraveyardsDefended = 65;
public const uint PvpStatSecondaryObjectives = 82;
public const uint HonorKillBonusBoss = 4;
public const uint HonorKillBonusCaptain = 3;
public const uint HonorKillBonusSurvivingTower = 2;
public const uint HonorKillBonusSurvivingCaptain = 2;
public const uint HonorKillBonusDestroyTower = 3;
public const uint RepGainBoss = 350;
public const uint RepGainCaptain = 125;
public const uint RepGainDestroyTower = 12;
public const uint RepGainSurvivingTower = 12;
public const uint RepGainSurvivingCaptain = 125;
public const int ResourceLossTower = -75;
public const int ResourceLossCaptain = -100;
public const uint SpellCompleteAlteracValleyQuest = 23658;
public const uint FactionFrostwolfClan = 729;
public const uint FactionStormpikeGuard = 730;
public const int ScoreInitialPoints = 700;
public const int EventStartBattle = 9166; // Achievement: The Alterac Blitz
public static TimeSpan MineResourceTimer = TimeSpan.FromSeconds(45);
public static StaticNodeInfo[] BGAVNodeInfo =
{
new(AVNodes.FirstaidStation, 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
new(AVNodes.StormpikeGrave, 1, 2, 3, 4, 1333, 1335, 1334, 1336, 0, "bg_av_herald_stormpike_alliance", "bg_av_herald_stormpike_horde"), // Stormpike Graveyard
new(AVNodes.StoneheartGrave, 55, 56, 53, 54, 1302, 1304, 1301, 1303, 0, "bg_av_herald_stonehearth_alliance", "bg_av_herald_stonehearth_horde"), // Stoneheart Graveyard
new(AVNodes.SnowfallGrave, 5, 6, 7, 8, 1341, 1343, 1342, 1344, 0, "bg_av_herald_snowfall_alliance", "bg_av_herald_snowfall_horde"), // Snowfall Graveyard
new(AVNodes.IcebloodGrave, 59, 60, 57, 58, 1346, 1348, 1347, 1349, 0, "bg_av_herald_iceblood_alliance", "bg_av_herald_iceblood_horde"), // Iceblood Graveyard
new(AVNodes.FrostwolfGrave, 9, 10, 11, 12, 1337, 1339, 1338, 1340, 0, "bg_av_herald_frostwolf_alliance", "bg_av_herald_frostwolf_horde"), // Frostwolf Graveyard
new(AVNodes.FrostwolfHut, 51, 52, 49, 50, 1329, 1331, 1330, 1332, 0, "bg_av_herald_frostwolf_hut_alliance", "bg_av_herald_frostwolf_hut_horde"), // Frostwolf Hut
new(AVNodes.DunbaldarSouth, 16, 15, 14, 13, 1361, 1375, 1370, 1378, 1181, "bg_av_herald_south_bunker_defend", "bg_av_herald_south_bunker_attack"), // Dunbaldar South Bunker
new(AVNodes.DunbaldarNorth, 20, 19, 18, 17, 1362, 1374, 1371, 1379, 1182, "bg_av_herald_north_bunker_defend", "bg_av_herald_south_bunker_attack"), // Dunbaldar North Bunker
new(AVNodes.IcewingBunker, 24, 23, 22, 21, 1363, 1376, 1372, 1380, 1183, "bg_av_herald_icewing_bunker_defend", "bg_av_herald_icewing_bunker_attack"), // Icewing Bunker
new(AVNodes.StoneheartBunker, 28, 27, 26, 25, 1364, 1377, 1373, 1381, 1184, "bg_av_herald_stonehearth_bunker_defend", "bg_av_herald_stonehearth_bunker_attack"), // Stoneheart Bunker
new(AVNodes.IcebloodTower, 44, 43, 42, 41, 1368, 1390, 1385, 1395, 1188, "bg_av_herald_iceblood_tower_defend", "bg_av_herald_iceblood_tower_attack"), // Iceblood Tower
new(AVNodes.TowerPoint, 40, 39, 38, 37, 1367, 1389, 1384, 1394, 1187, "bg_av_herald_tower_point_defend", "bg_av_herald_tower_point_attack"), // Tower Point
new(AVNodes.FrostwolfEtower, 36, 35, 34, 33, 1366, 1388, 1383, 1393, 1186, "bg_av_herald_east_tower_defend", "bg_av_herald_east_tower_attack"), // Frostwolf East Tower
new(AVNodes.FrostwolfWtower, 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 DefenderTier
{
Defender,
Seasoned,
Veteran,
Champion
}
enum BroadcastTextIds
{
StartOneMinute = 10638,
StartHalfMinute = 10639,
BattleHasBegun = 10640,
AllianceNearLose = 23210,
HordeNearLose = 23211
}
enum SoundsId
{
NearVictory = 8456, /// @Todo: Not Confirmed Yet
AllianceAssaults = 8212, //Tower, Grave + Enemy Boss If Someone Tries To Attack Him
HordeAssaults = 8174,
AllianceGood = 8173, //If Something Good Happens For The Team: Wins(Maybe Only Through Killing The Boss), Captures Mine Or Grave, Destroys Tower And Defends Grave
HordeGood = 8213,
BothTowerDefend = 8192,
AllianceCaptain = 8232, //Gets Called When Someone Attacks Them And At The Beginning After 5min+Rand(X)*10sec (Maybe Buff)
HordeCaptain = 8333
}
enum AlteracValleyMine
{
North = 0,
South
}
enum CreatureIds
{
Vanndar = 11948,
Drekthar = 11946,
Balinda = 11949,
Galvangar = 11947,
Morloch = 11657,
UmiThorson = 13078,
Keetar = 13079,
TaskmasterSnivvle = 11677,
AgiRumblestomp = 13086,
MashaSwiftcut = 13088,
Herald = 14848,
StormpikeDefender = 12050,
FrostwolfGuardian = 12053,
SeasonedDefender = 13326,
SeasonedGuardian = 13328,
VeteranDefender = 13331,
VeteranGuardian = 13332,
ChampionDefender = 13422,
ChampionGuardian = 13421
}
enum GameObjectIds
{
BannerA = 178925, // Can Only Be Used By Horde
BannerH = 178943, // Can Only Be Used By Alliance
BannerContA = 178940, // Can Only Be Used By Horde
BannerContH = 179435, // Can Only Be Used By Alliance
BannerAB = 178365,
BannerHB = 178364,
BannerContAB = 179286,
BannerContHB = 179287,
BannerSnowfallN = 180418,
//Snowfall Eyecandy Banner:
SnowfallCandyA = 179044,
SnowfallCandyPa = 179424,
SnowfallCandyH = 179064,
SnowfallCandyPh = 179425,
//Banners On Top Of Towers:
TowerBannerA = 178927, //[Ph] Alliance A1 Tower Banner Big
TowerBannerH = 178955, //[Ph] Horde H1 Tower Banner Big
TowerBannerPa = 179446, //[Ph] Alliance H1 Tower Pre-Banner Big
TowerBannerPh = 179436, //[Ph] Horde A1 Tower Pre-Banner Big
//Auras
AuraA = 180421,
AuraH = 180422,
AuraN = 180423,
AuraAS = 180100,
AuraHS = 180101,
AuraNS = 180102,
Gate = 180424,
GhostGate = 180322,
//Mine Supplies
MineN = 178785,
MineS = 178784,
Fire = 179065,
Smoke = 179066,
// Towers
SouthBunkerControlledTowerBanner = 178927,
SouthBunkerControlledBanner = 178925,
SouthBunkerContestedBanner = 179435,
SouthBunkerContestedTowerBanner = 179436,
NorthBunkerControlledTowerBanner = 178932,
NorthBunkerControlledBanner = 178929,
NorthBunkerContestedBanner = 179439,
NorthBunkerContestedTowerBanner = 179440,
EastTowerControlledTowerBanner = 178956,
EastTowerControlledBanner = 178944,
EastTowerContestedBanner = 179449,
EastTowerContestedTowerBanner = 179450,
WestTowerControlledTowerBanner = 178955,
WestTowerControlledBanner = 178943,
WestTowerContestedBanner = 179445,
WestTowerContestedTowerBanner = 179446,
TowerPointControlledTowerBanner = 178957,
TowerPointControlledBanner = 178945,
TowerPointContestedBanner = 179453,
TowerPointContestedTowerBanner = 179454,
IcebloodTowerControlledTowerBanner = 178958,
IcebloodTowerControlledBanner = 178946,
IcebloodTowerContestedBanner = 178940,
IcebloodTowerContestedTowerBanner = 179458,
StonehearthBunkerControlledTowerBanner = 178948,
StonehearthBunkerControlledBanner = 178936,
StonehearthBunkerContestedBanner = 179443,
StonehearthBunkerContestedTowerBanner = 179444,
IcewingBunkerControlledTowerBanner = 178947,
IcewingBunkerControlledBanner = 178935,
IcewingBunkerContestedBanner = 179441,
IcewingBunkerContestedTowerBanner = 179442,
// Graveyards
AidStationAllianceControlled = 179465,
AidStationHordeContested = 179468,
AidStationHordeControlled = 179467,
AidStationAllianceContested = 179466,
StormpikeAllianceControlled = 178389,
StormpikeHordeContested = 179287,
StormpikeHordeControlled = 178388,
StormpikeAllianceContested = 179286,
StonehearthHordeContested = 179310,
StonehearthHordeControlled = 179285,
StonehearthAllianceContested = 179308,
StonehearthAllianceControlled = 179284,
SnowfallNeutral = 180418,
SnowfallHordeContested = 180420,
SnowfallAllianceContested = 180419,
SnowfallHordeControlled = 178364,
SnowfallAllianceControlled = 178365,
IcebloodHordeControlled = 179483,
IcebloodAllianceContested = 179482,
IcebloodAllianceControlled = 179481,
IcebloodHordeContested = 179484,
FrostwolfHordeControlled = 178393,
FrostwolfAllianceContested = 179304,
FrostwolfAllianceControlled = 178394,
FrostwolfHordeContested = 179305,
FrostwolfHutHordeControlled = 179472,
FrostwolfHutAllianceContested = 179471,
FrostwolfHutAllianceControlled = 179470,
FrostwolfHutHordeContested = 179473
}
public enum AVNodes
{
FirstaidStation = 0,
StormpikeGrave = 1,
StoneheartGrave = 2,
SnowfallGrave = 3,
IcebloodGrave = 4,
FrostwolfGrave = 5,
FrostwolfHut = 6,
DunbaldarSouth = 7,
DunbaldarNorth = 8,
IcewingBunker = 9,
StoneheartBunker = 10,
IcebloodTower = 11,
TowerPoint = 12,
FrostwolfEtower = 13,
FrostwolfWtower = 14,
Max = 15
}
enum AVBuffs
{
Armor = 21163,
ACaptain = 23693, //the buff which the alliance captain does
HCaptain = 22751 //the buff which the horde captain does
}
enum AVStates
{
PointNeutral = 0,
PointAssaulted = 1,
PointDestroyed = 2,
PointControled = 3
}
enum WorldStateIds
{
AllianceReinforcements = 3127,
HordeReinforcements = 3128,
ShowHordeReinforcements = 3133,
ShowAllianceReinforcements = 3134,
MaxReinforcements = 3136,
// Graves
// Alliance
//Stormpike First Aid Station
StormpikeAidStationAllianceControlled = 1325,
StormpikeAidStationInConflictAllianceAttacking = 1326,
StormpikeAidStationHordeControlled = 1327,
StormpikeAidStationInConflictHordeAttacking = 1328,
//Stormpike Graveyard
StormpikeGraveyardAllianceControlled = 1333,
StormpikeGraveyardInConflictAllianceAttacking = 1335,
StormpikeGraveyardHordeControlled = 1334,
StormpikeGraveyardInConflictHordeAttacking = 1336,
//Stoneheart Grave
StonehearthGraveyardAllianceControlled = 1302,
StonehearthGraveyardInConflictAllianceAttacking = 1304,
StonehearthGraveyardHordeControlled = 1301,
StonehearthGraveyardInConflictHordeAttacking = 1303,
//Neutral
//Snowfall Grave
SnowfallGraveyardUncontrolled = 1966,
SnowfallGraveyardAllianceControlled = 1341,
SnowfallGraveyardInConflictAllianceAttacking = 1343,
SnowfallGraveyardHordeControlled = 1342,
SnowfallGraveyardInConflictHordeAttacking = 1344,
//Horde
//Iceblood Grave
IcebloodGraveyardAllianceControlled = 1346,
IcebloodGraveyardInConflictAllianceAttacking = 1348,
IcebloodGraveyardHordeControlled = 1347,
IcebloodGraveyardInConflictHordeAttacking = 1349,
//Frostwolf Grave
FrostwolfGraveyardAllianceControlled = 1337,
FrostwolfGraveyardInConflictAllianceAttacking = 1339,
FrostwolfGraveyardHordeControlled = 1338,
FrostwolfGraveyardInConflictHordeAttacking = 1340,
//Frostwolf Hut
FrostwolfReliefHutAllianceControlled = 1329,
FrostwolfReliefHutInConflictAllianceAttacking = 1331,
FrostwolfReliefHutHordeControlled = 1330,
FrostwolfReliefHutInConflictHordeAttacking = 1332,
//Towers
//Alliance
//Dunbaldar South Bunker
DunBaldarSouthBunkerOwner = 1181,
DunBaldarSouthBunkerAllianceControlled = 1361,
DunBaldarSouthBunkerDestroyed = 1370,
DunBaldarSouthBunkerInConflictHordeAttacking = 1378,
DunBaldarSouthBunkerInConflictAllianceAttacking = 1374, // Unused
//Dunbaldar North Bunker
DunBaldarNorthBunkerOwner = 1182,
DunBaldarNorthBunkerAllianceControlled = 1362,
DunBaldarNorthBunkerDestroyed = 1371,
DunBaldarNorthBunkerInConflictHordeAttacking = 1379,
DunBaldarNorthBunkerInConflictAllianceAttacking = 1375, // Unused
//Icewing Bunker
IcewingBunkerOwner = 1183,
IcewingBunkerAllianceControlled = 1363,
IcewingBunkerDestroyed = 1372,
IcewingBunkerInConflictHordeAttacking = 1380,
IcewingBunkerInConflictAllianceAttacking = 1376, // Unused
//Stoneheart Bunker
StonehearthBunkerOwner = 1184,
StonehearthBunkerAllianceControlled = 1364,
StonehearthBunkerDestroyed = 1373,
StonehearthBunkerInConflictHordeAttacking = 1381,
StonehearthBunkerInConflictAllianceAttacking = 1377, // Unused
//Horde
//Iceblood Tower
IcebloodTowerOwner = 1187,
IcebloodTowerDestroyed = 1368,
IcebloodTowerHordeControlled = 1385,
IcebloodTowerInConflictAllianceAttacking = 1390,
IcebloodTowerInConflictHordeAttacking = 1395, // Unused
//Tower Point
TowerPointOwner = 1188,
TowerPointDestroyed = 1367,
TowerPointHordeControlled = 1384,
TowerPointInConflictAllianceAttacking = 1389,
TowerPointInConflictHordeAttacking = 1394, // Unused
//Frostwolf West
WestFrostwolfTowerOwner = 1185,
WestFrostwolfTowerDestroyed = 1365,
WestFrostwolfTowerHordeControlled = 1382,
WestFrostwolfTowerInConflictAllianceAttacking = 1387,
WestFrostwolfTowerInConflictHordeAttacking = 1392, // Unused
//Frostwolf East
EastFrostwolfTowerOwner = 1186,
EastFrostwolfTowerDestroyed = 1366,
EastFrostwolfTowerHordeControlled = 1383,
EastFrostwolfTowerInConflictAllianceAttacking = 1388,
EastFrostwolfTowerInConflictHordeAttacking = 1393, // Unused
//Mines
IrondeepMineOwner = 801,
IrondeepMineTroggControlled = 1360,
IrondeepMineAllianceControlled = 1358,
IrondeepMineHordeControlled = 1359,
ColdtoothMineOwner = 804,
ColdtoothMineKoboldControlled = 1357,
ColdtoothMineAllianceControlled = 1355,
ColdtoothMineHordeControlled = 1356,
//Turnins
IvusStormCrystalCount = 1043,
IvusStormCrystalMax = 1044,
LokholarStormpikeSoldiersBloodCount = 923,
LokholarStormpikeSoldiersBloodMax = 922,
//Bosses
DrektharAlive = 601,
VandaarAlive = 602,
//Captains
GalvagarAlive = 1352,
BalindaAlive = 1351,
}
enum QuestIds
{
AScraps1 = 7223,
AScraps2 = 6781,
HScraps1 = 7224,
HScraps2 = 6741,
ACommander1 = 6942, //Soldier
HCommander1 = 6825,
ACommander2 = 6941, //Leutnant
HCommander2 = 6826,
ACommander3 = 6943, //Commander
HCommander3 = 6827,
ABoss1 = 7386, // 5 Cristal/Blood
HBoss1 = 7385,
ABoss2 = 6881, // 1
HBoss2 = 6801,
ANearMine = 5892, //The Mine Near Start Location Of Team
HNearMine = 5893,
AOtherMine = 6982, //The Other Mine ;)
HOtherMine = 6985,
ARiderHide = 7026,
HRiderHide = 7002,
ARiderTame = 7027,
HRiderTame = 7001
}
enum TextIds
{
// Herold
// Towers/Graveyards = 1 - 60
ColdtoothMineAllianceTaken = 61,
IrondeepMineAllianceTaken = 62,
ColdtoothMineHordeTaken = 63,
IrondeepMineHordeTaken = 64,
FrostwolfGeneralDead = 65, /// @Todo: Sound Is Missing
StormpikeGeneralDead = 66, /// @Todo: Sound Is Missing
AllianceWins = 67, // Nyi /// @Todo: Sound Is Missing
HordeWins = 68, // Nyi /// @Todo: Sound Is Missing
// Taskmaster Snivvle
SnivvleRandom = 0
}
#endregion
}