fix(Scripts/BRD): Mobs in Manufactory should attack on Golem Lord Arg… (#7794)

- Closes #3077
This commit is contained in:
UltraNix
2021-09-13 16:09:40 +02:00
committed by GitHub
parent 177cc213f2
commit 15b346163d
5 changed files with 209 additions and 39 deletions

View File

@@ -24,39 +24,42 @@ enum BRDBosses
enum DataTypes
{
TYPE_RING_OF_LAW = 1,
TYPE_VAULT = 2,
TYPE_BAR = 3,
TYPE_TOMB_OF_SEVEN = 4,
TYPE_LYCEUM = 5,
TYPE_IRON_HALL = 6,
TYPE_RING_OF_LAW = 1,
TYPE_VAULT = 2,
TYPE_BAR = 3,
TYPE_TOMB_OF_SEVEN = 4,
TYPE_LYCEUM = 5,
TYPE_IRON_HALL = 6,
DATA_EMPEROR = 10,
DATA_PHALANX = 11,
DATA_EMPEROR = 10,
DATA_PHALANX = 11,
DATA_ARENA1 = 12,
DATA_ARENA2 = 13,
DATA_ARENA3 = 14,
DATA_ARENA4 = 15,
DATA_ARENA1 = 12,
DATA_ARENA2 = 13,
DATA_ARENA3 = 14,
DATA_ARENA4 = 15,
DATA_GO_BAR_KEG = 16,
DATA_GO_BAR_KEG_TRAP = 17,
DATA_GO_BAR_DOOR = 18,
DATA_GO_CHALICE = 19,
DATA_GO_BAR_KEG = 16,
DATA_GO_BAR_KEG_TRAP = 17,
DATA_GO_BAR_DOOR = 18,
DATA_GO_CHALICE = 19,
DATA_GHOSTKILL = 20,
DATA_EVENSTARTER = 21,
DATA_GHOSTKILL = 20,
DATA_EVENSTARTER = 21,
DATA_GOLEM_DOOR_N = 22,
DATA_GOLEM_DOOR_S = 23,
DATA_GOLEM_DOOR_N = 22,
DATA_GOLEM_DOOR_S = 23,
DATA_THRONE_DOOR = 24,
DATA_THRONE_DOOR = 24,
DATA_SF_BRAZIER_N = 25,
DATA_SF_BRAZIER_S = 26,
DATA_MOIRA = 27,
DATA_SF_BRAZIER_N = 25,
DATA_SF_BRAZIER_S = 26,
DATA_MOIRA = 27,
DATA_OPEN_COFFER_DOORS = 30
DATA_OPEN_COFFER_DOORS = 30,
DATA_GOLEM_LORD_ARGELMACH_INIT = 31,
DATA_GOLEM_LORD_ARGELMACH_ADDS = 32
};
template <class AI, class T>

View File

@@ -13,19 +13,25 @@
enum Creatures
{
NPC_EMPEROR = 9019,
NPC_PHALANX = 9502,
NPC_ANGERREL = 9035,
NPC_DOPEREL = 9040,
NPC_HATEREL = 9034,
NPC_VILEREL = 9036,
NPC_SEETHREL = 9038,
NPC_GLOOMREL = 9037,
NPC_DOOMREL = 9039,
NPC_MAGMUS = 9938,
NPC_MOIRA = 8929,
NPC_EMPEROR = 9019,
NPC_PHALANX = 9502,
NPC_ANGERREL = 9035,
NPC_DOPEREL = 9040,
NPC_HATEREL = 9034,
NPC_VILEREL = 9036,
NPC_SEETHREL = 9038,
NPC_GLOOMREL = 9037,
NPC_DOOMREL = 9039,
NPC_MAGMUS = 9938,
NPC_MOIRA = 8929,
NPC_WATCHMAN_DOOMGRIP = 9476,
NPC_WATCHMAN_DOOMGRIP = 9476,
NPC_WEAPON_TECHNICIAN = 8920,
NPC_DOOMFORGE_ARCANASMITH = 8900,
NPC_RAGEREAVER_GOLEM = 8906,
NPC_WRATH_HAMMER_CONSTRUCT = 8907,
NPC_GOLEM_LORD_ARGELMACH = 8983
};
enum GameObjects
@@ -53,6 +59,34 @@ enum GameObjects
GO_CHEST_SEVEN = 169243,
};
enum MiscData
{
SPELL_STONED = 10255
};
class RestoreAttack : public BasicEvent
{
public:
RestoreAttack(Creature* boss) : _boss(boss) {}
bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
{
_boss->SetReactState(REACT_AGGRESSIVE);
_boss->AI()->SetData(DATA_GOLEM_LORD_ARGELMACH_INIT, DONE);
if (Unit* victim = _boss->GetVictim())
{
_boss->SetTarget(victim->GetGUID());
_boss->GetMotionMaster()->MoveChase(victim);
}
return true;
}
private:
Creature* _boss;
};
class instance_blackrock_depths : public InstanceMapScript
{
public:
@@ -105,6 +139,9 @@ public:
uint32 TombEventCounter;
uint32 OpenedCoofers;
GuidList ArgelmachAdds;
ObjectGuid ArgelmachGUID;
void Initialize() override
{
memset(&encounter, 0, sizeof(encounter));
@@ -155,6 +192,20 @@ public:
if (!creature->IsAlive())
HandleGameObject(GetGuidData(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss
break;
case NPC_WEAPON_TECHNICIAN:
case NPC_DOOMFORGE_ARCANASMITH:
case NPC_RAGEREAVER_GOLEM:
case NPC_WRATH_HAMMER_CONSTRUCT:
if (creature->IsAlive() && creature->GetPositionZ() < -51.5f && creature->GetPositionZ() > -55.f)
{
ArgelmachAdds.push_back(creature->GetGUID());
}
break;
case NPC_GOLEM_LORD_ARGELMACH:
ArgelmachGUID = creature->GetGUID();
break;
default:
break;
}
}
@@ -232,6 +283,21 @@ public:
}
}
void OnUnitDeath(Unit* unit) override
{
switch (unit->GetEntry())
{
case NPC_WEAPON_TECHNICIAN:
case NPC_DOOMFORGE_ARCANASMITH:
case NPC_RAGEREAVER_GOLEM:
case NPC_WRATH_HAMMER_CONSTRUCT:
ArgelmachAdds.remove(unit->GetGUID());
break;
default:
break;
}
}
void SetGuidData(uint32 type, ObjectGuid data) override
{
switch (type)
@@ -285,6 +351,79 @@ public:
summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
}
break;
case DATA_GOLEM_LORD_ARGELMACH_INIT:
{
if (Creature* argelmach = instance->GetCreature(ArgelmachGUID))
{
GuidList adds = ArgelmachAdds;
for (GuidList::const_iterator itr = adds.begin(); itr != adds.end();)
{
if (Creature* argelmachAdd = instance->GetCreature(*itr))
{
if (argelmachAdd->GetEntry() == NPC_WRATH_HAMMER_CONSTRUCT)
{
argelmachAdd->RemoveAurasDueToSpell(SPELL_STONED);
argelmachAdd->AI()->AttackStart(argelmach->GetVictim());
itr = adds.erase(itr);
}
else if (argelmachAdd->GetEntry() == NPC_RAGEREAVER_GOLEM)
{
if (argelmachAdd->IsWithinDist2d(argelmach, 10.f))
{
argelmachAdd->RemoveAurasDueToSpell(SPELL_STONED);
argelmachAdd->AI()->AttackStart(argelmach->GetVictim());
itr = adds.erase(itr);
}
else
++itr;
}
else
{
++itr;
}
}
else
{
++itr;
}
}
if (!adds.empty())
{
argelmach->SetReactState(REACT_PASSIVE);
argelmach->SetTarget();
argelmach->AI()->SetData(DATA_GOLEM_LORD_ARGELMACH_INIT, IN_PROGRESS);
}
else
{
argelmach->AI()->SetData(DATA_GOLEM_LORD_ARGELMACH_INIT, DONE);
}
}
break;
}
case DATA_GOLEM_LORD_ARGELMACH_ADDS:
{
if (Creature* argelmach = instance->GetCreature(ArgelmachGUID))
{
argelmach->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT);
argelmach->m_Events.AddEvent(new RestoreAttack(argelmach), argelmach->m_Events.CalculateTime(3000));
for (ObjectGuid const& argelmachAddGUID : ArgelmachAdds)
{
if (Creature* argelmachAdd = instance->GetCreature(argelmachAddGUID))
{
if (!argelmachAdd->IsInCombat())
{
argelmachAdd->RemoveAurasDueToSpell(SPELL_STONED);
argelmachAdd->AI()->AttackStart(argelmach->GetVictim());
}
}
}
}
break;
}
default:
break;
}
if (data == DONE || GhostKillCount >= 7)

View File

@@ -156,6 +156,11 @@ public:
}
};
enum UldamanStonedEnum
{
MAP_ULDAMAN = 70
};
class spell_uldaman_stoned : public SpellScriptLoader
{
public:
@@ -167,7 +172,7 @@ public:
bool Load() override
{
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT && GetUnitOwner()->GetMapId() == MAP_ULDAMAN;
}
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)