refactor(Scripts/Naxxramas): Modernize Anubrekhan script (#20596)
* refactor(Scripts/Naxxramas): Modernize Anubrekhan script * Update boss_anubrekhan.cpp
This commit is contained in:
@@ -44,14 +44,6 @@ enum Spells
|
|||||||
SPELL_BERSERK = 26662
|
SPELL_BERSERK = 26662
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Events
|
|
||||||
{
|
|
||||||
EVENT_IMPALE = 1,
|
|
||||||
EVENT_LOCUST_SWARM = 2,
|
|
||||||
EVENT_BERSERK = 3,
|
|
||||||
EVENT_SPAWN_GUARD = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
enum Misc
|
enum Misc
|
||||||
{
|
{
|
||||||
NPC_CORPSE_SCARAB = 16698,
|
NPC_CORPSE_SCARAB = 16698,
|
||||||
@@ -72,17 +64,11 @@ public:
|
|||||||
|
|
||||||
struct boss_anubrekhanAI : public BossAI
|
struct boss_anubrekhanAI : public BossAI
|
||||||
{
|
{
|
||||||
explicit boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUB), summons(me)
|
boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUB)
|
||||||
{
|
{
|
||||||
pInstance = c->GetInstanceScript();
|
|
||||||
sayGreet = false;
|
sayGreet = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceScript* pInstance;
|
|
||||||
EventMap events;
|
|
||||||
SummonList summons;
|
|
||||||
bool sayGreet;
|
|
||||||
|
|
||||||
void SummonCryptGuards()
|
void SummonCryptGuards()
|
||||||
{
|
{
|
||||||
if (Is25ManRaid())
|
if (Is25ManRaid())
|
||||||
@@ -95,16 +81,8 @@ public:
|
|||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
BossAI::Reset();
|
BossAI::Reset();
|
||||||
events.Reset();
|
|
||||||
summons.DespawnAll();
|
|
||||||
SummonCryptGuards();
|
SummonCryptGuards();
|
||||||
if (pInstance)
|
me->m_Events.KillAllEvents(false);
|
||||||
{
|
|
||||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE)))
|
|
||||||
{
|
|
||||||
go->SetGoState(GO_STATE_ACTIVE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* cr) override
|
void JustSummoned(Creature* cr) override
|
||||||
@@ -113,9 +91,7 @@ public:
|
|||||||
{
|
{
|
||||||
cr->SetInCombatWithZone();
|
cr->SetInCombatWithZone();
|
||||||
if (cr->GetEntry() == NPC_CRYPT_GUARD)
|
if (cr->GetEntry() == NPC_CRYPT_GUARD)
|
||||||
{
|
|
||||||
cr->AI()->Talk(EMOTE_SPAWN, me);
|
cr->AI()->Talk(EMOTE_SPAWN, me);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
summons.Summon(cr);
|
summons.Summon(cr);
|
||||||
}
|
}
|
||||||
@@ -129,19 +105,10 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SummonedCreatureDespawn(Creature* cr) override
|
|
||||||
{
|
|
||||||
summons.Despawn(cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
void JustDied(Unit* killer) override
|
||||||
{
|
{
|
||||||
BossAI::JustDied(killer);
|
BossAI::JustDied(killer);
|
||||||
summons.DespawnAll();
|
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||||
if (pInstance)
|
|
||||||
{
|
|
||||||
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KilledUnit(Unit* victim) override
|
void KilledUnit(Unit* victim) override
|
||||||
@@ -151,10 +118,7 @@ public:
|
|||||||
|
|
||||||
Talk(SAY_SLAY);
|
Talk(SAY_SLAY);
|
||||||
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID());
|
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID());
|
||||||
if (pInstance)
|
instance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||||
{
|
|
||||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustEngagedWith(Unit* who) override
|
void JustEngagedWith(Unit* who) override
|
||||||
@@ -162,24 +126,36 @@ public:
|
|||||||
BossAI::JustEngagedWith(who);
|
BossAI::JustEngagedWith(who);
|
||||||
me->CallForHelp(30.0f);
|
me->CallForHelp(30.0f);
|
||||||
Talk(SAY_AGGRO);
|
Talk(SAY_AGGRO);
|
||||||
if (pInstance)
|
|
||||||
{
|
|
||||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE)))
|
|
||||||
{
|
|
||||||
go->SetGoState(GO_STATE_READY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_IMPALE, 15s);
|
|
||||||
events.ScheduleEvent(EVENT_LOCUST_SWARM, 70s, 120s);
|
|
||||||
events.ScheduleEvent(EVENT_BERSERK, 10min);
|
|
||||||
if (!summons.HasEntry(NPC_CRYPT_GUARD))
|
if (!summons.HasEntry(NPC_CRYPT_GUARD))
|
||||||
{
|
|
||||||
SummonCryptGuards();
|
SummonCryptGuards();
|
||||||
}
|
|
||||||
if (!Is25ManRaid())
|
if (!Is25ManRaid())
|
||||||
{
|
{
|
||||||
events.ScheduleEvent(EVENT_SPAWN_GUARD, 15s, 20s);
|
me->m_Events.AddEventAtOffset([&]
|
||||||
|
{
|
||||||
|
me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
|
||||||
|
}, Milliseconds(urand(15000, 20000)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScheduleTimedEvent(15s, [&] {
|
||||||
|
DoCastRandomTarget(RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25));
|
||||||
|
}, 20s);
|
||||||
|
|
||||||
|
ScheduleTimedEvent(70s, 2min, [&] {
|
||||||
|
Talk(EMOTE_LOCUST);
|
||||||
|
DoCastSelf(RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25));
|
||||||
|
|
||||||
|
me->m_Events.AddEventAtOffset([&]
|
||||||
|
{
|
||||||
|
me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
|
||||||
|
}, 3s);
|
||||||
|
|
||||||
|
}, 90s);
|
||||||
|
|
||||||
|
me->m_Events.AddEventAtOffset([&]
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_BERSERK, true);
|
||||||
|
}, 10min);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveInLineOfSight(Unit* who) override
|
void MoveInLineOfSight(Unit* who) override
|
||||||
@@ -192,54 +168,8 @@ public:
|
|||||||
ScriptedAI::MoveInLineOfSight(who);
|
ScriptedAI::MoveInLineOfSight(who);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
private:
|
||||||
{
|
bool sayGreet;
|
||||||
if (!me->IsInCombat() && sayGreet)
|
|
||||||
{
|
|
||||||
for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
|
||||||
{
|
|
||||||
if (pInstance)
|
|
||||||
{
|
|
||||||
if (Creature* cr = pInstance->instance->GetCreature(*itr))
|
|
||||||
{
|
|
||||||
if (cr->IsInCombat())
|
|
||||||
DoZoneInCombat();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_IMPALE:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
|
||||||
{
|
|
||||||
me->CastSpell(target, RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false);
|
|
||||||
}
|
|
||||||
events.Repeat(20s);
|
|
||||||
break;
|
|
||||||
case EVENT_LOCUST_SWARM:
|
|
||||||
Talk(EMOTE_LOCUST);
|
|
||||||
me->CastSpell(me, RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25), false);
|
|
||||||
events.ScheduleEvent(EVENT_SPAWN_GUARD, 3s);
|
|
||||||
events.Repeat(90s);
|
|
||||||
break;
|
|
||||||
case EVENT_SPAWN_GUARD:
|
|
||||||
me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
|
|
||||||
break;
|
|
||||||
case EVENT_BERSERK:
|
|
||||||
me->CastSpell(me, SPELL_BERSERK, true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,12 @@ inline uint8 GetEruptionSection(float x, float y)
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DoorData const doorData[] =
|
||||||
|
{
|
||||||
|
{ GO_ANUB_GATE, BOSS_ANUB, DOOR_TYPE_ROOM },
|
||||||
|
{ 0, 0, DOOR_TYPE_ROOM },
|
||||||
|
};
|
||||||
|
|
||||||
ObjectData const creatureData[] =
|
ObjectData const creatureData[] =
|
||||||
{
|
{
|
||||||
{ NPC_RAZUVIOUS, DATA_RAZUVIOUS },
|
{ NPC_RAZUVIOUS, DATA_RAZUVIOUS },
|
||||||
@@ -79,6 +85,7 @@ public:
|
|||||||
{
|
{
|
||||||
SetHeaders(DataHeader);
|
SetHeaders(DataHeader);
|
||||||
SetBossNumber(MAX_ENCOUNTERS);
|
SetBossNumber(MAX_ENCOUNTERS);
|
||||||
|
LoadDoorData(doorData);
|
||||||
LoadObjectData(creatureData, gameObjectData);
|
LoadObjectData(creatureData, gameObjectData);
|
||||||
for (auto& i : HeiganEruption)
|
for (auto& i : HeiganEruption)
|
||||||
i.clear();
|
i.clear();
|
||||||
@@ -115,7 +122,6 @@ public:
|
|||||||
ObjectGuid _heiganGateGUID;
|
ObjectGuid _heiganGateGUID;
|
||||||
ObjectGuid _heiganGateExitGUID;
|
ObjectGuid _heiganGateExitGUID;
|
||||||
ObjectGuid _loathebGateGUID;
|
ObjectGuid _loathebGateGUID;
|
||||||
ObjectGuid _anubGateGUID;
|
|
||||||
ObjectGuid _anubNextGateGUID;
|
ObjectGuid _anubNextGateGUID;
|
||||||
ObjectGuid _faerlinaWebGUID;
|
ObjectGuid _faerlinaWebGUID;
|
||||||
ObjectGuid _faerlinaGateGUID;
|
ObjectGuid _faerlinaGateGUID;
|
||||||
@@ -328,13 +334,6 @@ public:
|
|||||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GO_ANUB_GATE:
|
|
||||||
_anubGateGUID = pGo->GetGUID();
|
|
||||||
if (GetBossState(BOSS_ANUB) == DONE)
|
|
||||||
{
|
|
||||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GO_ANUB_NEXT_GATE:
|
case GO_ANUB_NEXT_GATE:
|
||||||
_anubNextGateGUID = pGo->GetGUID();
|
_anubNextGateGUID = pGo->GetGUID();
|
||||||
if (GetBossState(BOSS_ANUB) == DONE)
|
if (GetBossState(BOSS_ANUB) == DONE)
|
||||||
@@ -880,10 +879,6 @@ public:
|
|||||||
events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6s);
|
events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6s);
|
||||||
break;
|
break;
|
||||||
case BOSS_ANUB:
|
case BOSS_ANUB:
|
||||||
if (GameObject* go = instance->GetGameObject(_anubGateGUID))
|
|
||||||
{
|
|
||||||
go->SetGoState(GO_STATE_ACTIVE);
|
|
||||||
}
|
|
||||||
if (GameObject* go = instance->GetGameObject(_anubNextGateGUID))
|
if (GameObject* go = instance->GetGameObject(_anubNextGateGUID))
|
||||||
{
|
{
|
||||||
go->SetGoState(GO_STATE_ACTIVE);
|
go->SetGoState(GO_STATE_ACTIVE);
|
||||||
@@ -1074,8 +1069,6 @@ public:
|
|||||||
return _heiganGateGUID;
|
return _heiganGateGUID;
|
||||||
case DATA_LOATHEB_GATE:
|
case DATA_LOATHEB_GATE:
|
||||||
return _loathebGateGUID;
|
return _loathebGateGUID;
|
||||||
case DATA_ANUB_GATE:
|
|
||||||
return _anubGateGUID;
|
|
||||||
case DATA_FAERLINA_WEB:
|
case DATA_FAERLINA_WEB:
|
||||||
return _faerlinaWebGUID;
|
return _faerlinaWebGUID;
|
||||||
case DATA_MAEXXNA_GATE:
|
case DATA_MAEXXNA_GATE:
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ enum NXData
|
|||||||
DATA_HEIGAN_ERUPTION = 101,
|
DATA_HEIGAN_ERUPTION = 101,
|
||||||
DATA_HEIGAN_ENTER_GATE = 102,
|
DATA_HEIGAN_ENTER_GATE = 102,
|
||||||
DATA_LOATHEB_GATE = 103,
|
DATA_LOATHEB_GATE = 103,
|
||||||
DATA_ANUB_GATE = 104,
|
|
||||||
DATA_FAERLINA_WEB = 105,
|
DATA_FAERLINA_WEB = 105,
|
||||||
DATA_MAEXXNA_GATE = 106,
|
DATA_MAEXXNA_GATE = 106,
|
||||||
DATA_THADDIUS_BOSS = 107,
|
DATA_THADDIUS_BOSS = 107,
|
||||||
|
|||||||
Reference in New Issue
Block a user