refactor(Scripts/Nexus): Update creature scripts to new register method (#20728)

This commit is contained in:
Andrew
2024-11-25 03:15:49 -03:00
committed by GitHub
parent 7da3ab573c
commit 65ec5bbceb
7 changed files with 576 additions and 669 deletions
@@ -67,146 +67,131 @@ private:
Creature* _caster; Creature* _caster;
}; };
class boss_anomalus : public CreatureScript struct boss_anomalus : public BossAI
{ {
public: boss_anomalus(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) { }
boss_anomalus() : CreatureScript("boss_anomalus") { }
CreatureAI* GetAI(Creature* creature) const override bool achievement;
uint16 activeRifts;
void Reset() override
{ {
return GetNexusAI<boss_anomalusAI>(creature); BossAI::Reset();
achievement = true;
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
} }
struct boss_anomalusAI : public BossAI uint32 GetData(uint32 data) const override
{ {
boss_anomalusAI(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) if (data == me->GetEntry())
{ return achievement;
} return 0;
}
bool achievement; void SetData(uint32 type, uint32) override
uint16 activeRifts; {
if (type == me->GetEntry())
void Reset() override
{ {
BossAI::Reset(); if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD))
achievement = true;
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
}
uint32 GetData(uint32 data) const override
{
if (data == me->GetEntry())
return achievement;
return 0;
}
void SetData(uint32 type, uint32) override
{
if (type == me->GetEntry())
{ {
if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD)) events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000);
{ me->RemoveAura(SPELL_RIFT_SHIELD);
events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000); me->InterruptNonMeleeSpells(false);
me->RemoveAura(SPELL_RIFT_SHIELD);
me->InterruptNonMeleeSpells(false);
}
achievement = false;
} }
achievement = false;
} }
}
void JustSummoned(Creature* summon) override void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
activeRifts++;
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
activeRifts = 0;
events.SetTimer(45000);
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
if (IsHeroic())
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8s);
}
void JustDied(Unit* killer) override
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{ {
summons.Summon(summon); case EVENT_ANOMALUS_SPARK:
activeRifts++; me->CastSpell(me->GetVictim(), SPELL_SPARK, false);
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
activeRifts = 0;
events.SetTimer(45000);
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s); events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s); break;
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); case EVENT_ANOMALUS_HEALTH:
if (IsHeroic()) if (me->HealthBelowPct(51))
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8s);
}
void JustDied(Unit* killer) override
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{ {
case EVENT_ANOMALUS_SPARK: //First time we reach 51%, the next rift going to be empowered following timings.
me->CastSpell(me->GetVictim(), SPELL_SPARK, false); events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT);
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s); events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1s);
break; break;
case EVENT_ANOMALUS_HEALTH:
if (me->HealthBelowPct(51))
{
//First time we reach 51%, the next rift going to be empowered following timings.
events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT);
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1s);
break;
}
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
break;
case EVENT_ANOMALUS_ARCANE_ATTRACTION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true))
me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false);
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15s);
break;
case EVENT_ANOMALUS_SPAWN_RIFT:
Talk(SAY_RIFT);
Talk(EMOTE_RIFT);
me->CastSpell(me, SPELL_CREATE_RIFT, false);
//Once we hit 51% hp mark, after each rift we spawn an empowered
events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000);
break;
case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED:
Talk(SAY_RIFT);
Talk(EMOTE_RIFT);
me->CastSpell(me, SPELL_CREATE_RIFT, false);
me->CastSpell(me, SPELL_RIFT_SHIELD, true);
me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000));
events.DelayEvents(46s);
//As we just spawned an empowered spawn a normal one
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
break;
} }
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
break;
case EVENT_ANOMALUS_ARCANE_ATTRACTION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true))
me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false);
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15s);
break;
case EVENT_ANOMALUS_SPAWN_RIFT:
Talk(SAY_RIFT);
Talk(EMOTE_RIFT);
me->CastSpell(me, SPELL_CREATE_RIFT, false);
//Once we hit 51% hp mark, after each rift we spawn an empowered
events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000);
break;
case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED:
Talk(SAY_RIFT);
Talk(EMOTE_RIFT);
DoMeleeAttackIfReady(); me->CastSpell(me, SPELL_CREATE_RIFT, false);
me->CastSpell(me, SPELL_RIFT_SHIELD, true);
me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000));
events.DelayEvents(46s);
//As we just spawned an empowered spawn a normal one
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
break;
} }
bool CheckEvadeIfOutOfCombatArea() const override DoMeleeAttackIfReady();
{ }
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
} bool CheckEvadeIfOutOfCombatArea() const override
}; {
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
}
}; };
class achievement_chaos_theory : public AchievementCriteriaScript class achievement_chaos_theory : public AchievementCriteriaScript
{ {
public: public:
achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") { }
{
}
bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override
{ {
@@ -219,6 +204,6 @@ public:
void AddSC_boss_anomalus() void AddSC_boss_anomalus()
{ {
new boss_anomalus(); RegisterNexusCreatureAI(boss_anomalus);
new achievement_chaos_theory(); new achievement_chaos_theory();
} }
@@ -43,90 +43,77 @@ enum Says
SAY_KILL = 2 SAY_KILL = 2
}; };
class boss_commander_stoutbeard : public CreatureScript struct boss_commander_stoutbeard : public BossAI
{ {
public: boss_commander_stoutbeard(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) {}
boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { }
CreatureAI* GetAI(Creature* creature) const override void Reset() override
{ {
return GetNexusAI<boss_commander_stoutbeardAI>(creature); BossAI::Reset();
} }
struct boss_commander_stoutbeardAI : public BossAI void JustEngagedWith(Unit* who) override
{ {
boss_commander_stoutbeardAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0ms);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10s);
events.ScheduleEvent(EVENT_WHIRLWIND, 15s);
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1s);
me->RemoveAllAuras();
}
void KilledUnit(Unit*) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
}
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_BATTLE_SHOUT:
me->CastSpell(me, SPELL_BATTLE_SHOUT, true);
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 2min);
break;
case EVENT_FRIGHTENING_SHOUT:
me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 15s, 20s);
break;
case EVENT_WHIRLWIND:
me->CastSpell(me, SPELL_WHIRLWIND, false);
events.ScheduleEvent(EVENT_WHIRLWIND, 16s);
break;
case EVENT_COMMANDER_CHARGE:
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 25.0f))
me->CastSpell(target, SPELL_CHARGE, false);
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20s);
break;
} }
void Reset() override DoMeleeAttackIfReady();
{ }
BossAI::Reset();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0ms);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10s);
events.ScheduleEvent(EVENT_WHIRLWIND, 15s);
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1s);
me->RemoveAllAuras();
}
void KilledUnit(Unit*) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
}
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_BATTLE_SHOUT:
me->CastSpell(me, SPELL_BATTLE_SHOUT, true);
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 2min);
break;
case EVENT_FRIGHTENING_SHOUT:
me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 15s, 20s);
break;
case EVENT_WHIRLWIND:
me->CastSpell(me, SPELL_WHIRLWIND, false);
events.ScheduleEvent(EVENT_WHIRLWIND, 16s);
break;
case EVENT_COMMANDER_CHARGE:
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 25.0f))
me->CastSpell(target, SPELL_CHARGE, false);
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20s);
break;
}
DoMeleeAttackIfReady();
}
};
}; };
void AddSC_boss_commander_stoutbeard() void AddSC_boss_commander_stoutbeard()
{ {
new boss_commander_stoutbeard(); RegisterNexusCreatureAI(boss_commander_stoutbeard);
} }
@@ -55,152 +55,137 @@ enum Events
EVENT_KILL_TALK = 6 EVENT_KILL_TALK = 6
}; };
class boss_keristrasza : public CreatureScript struct boss_keristrasza : public BossAI
{ {
public: boss_keristrasza(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) {}
boss_keristrasza() : CreatureScript("boss_keristrasza") { }
CreatureAI* GetAI(Creature* creature) const override std::set<uint32> aGuids;
void Reset() override
{ {
return GetNexusAI<boss_keristraszaAI>(creature); BossAI::Reset();
RemovePrison(CanRemovePrison());
aGuids.clear();
} }
struct boss_keristraszaAI : public BossAI void JustEngagedWith(Unit* who) override
{ {
boss_keristraszaAI(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
me->CastSpell(me, SPELL_INTENSE_COLD, true);
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s);
}
void JustDied(Unit* killer) override
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
}
void KilledUnit(Unit*) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_SLAY);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
} }
}
std::set<uint32> aGuids; void SetData(uint32 type, uint32) override
{
if (type == me->GetEntry() && CanRemovePrison())
RemovePrison(true);
}
void Reset() override bool CanRemovePrison()
{
for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i)
if (instance->GetBossState(i) != DONE)
return false;
return true;
}
void RemovePrison(bool remove)
{
if (remove)
{ {
BossAI::Reset(); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
RemovePrison(CanRemovePrison()); me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
aGuids.clear();
} }
else
void JustEngagedWith(Unit* who) override
{ {
Talk(SAY_AGGRO); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
BossAI::JustEngagedWith(who); me->CastSpell(me, SPELL_FROZEN_PRISON, true);
}
}
me->CastSpell(me, SPELL_INTENSE_COLD, true); uint32 GetData(uint32 guid) const override
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s); {
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); return aGuids.find(guid) == aGuids.end();
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s); }
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_HEALTH_CHECK:
if (me->HealthBelowPct(26))
{
Talk(SAY_ENRAGE);
Talk(EMOTE_FRENZY);
me->CastSpell(me, SPELL_ENRAGE, true);
break;
}
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s); break;
} case EVENT_ACHIEVEMENT_CHECK:
void JustDied(Unit* killer) override
{ {
Talk(SAY_DEATH); Map::PlayerList const& pList = me->GetMap()->GetPlayers();
BossAI::JustDied(killer); for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER))
if (aur->GetStackAmount() > 2)
aGuids.insert(itr->GetSource()->GetGUID().GetCounter());
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500ms);
break;
}
case EVENT_CRYSTALFIRE_BREATH:
me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false);
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
break;
case EVENT_TAIL_SWEEP:
me->CastSpell(me, SPELL_TAIL_SWEEP, false);
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
break;
case EVENT_CRYSTAL_CHAINS:
Talk(SAY_CRYSTAL_NOVA);
if (IsHeroic())
me->CastSpell(me, SPELL_CRYSTALIZE, false);
else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false);
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
break;
} }
void KilledUnit(Unit*) override DoMeleeAttackIfReady();
{ }
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_SLAY);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
}
}
void SetData(uint32 type, uint32) override
{
if (type == me->GetEntry() && CanRemovePrison())
RemovePrison(true);
}
bool CanRemovePrison()
{
for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i)
if (instance->GetBossState(i) != DONE)
return false;
return true;
}
void RemovePrison(bool remove)
{
if (remove)
{
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
}
else
{
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_FROZEN_PRISON, true);
}
}
uint32 GetData(uint32 guid) const override
{
return aGuids.find(guid) == aGuids.end();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_HEALTH_CHECK:
if (me->HealthBelowPct(26))
{
Talk(SAY_ENRAGE);
Talk(EMOTE_FRENZY);
me->CastSpell(me, SPELL_ENRAGE, true);
break;
}
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
break;
case EVENT_ACHIEVEMENT_CHECK:
{
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER))
if (aur->GetStackAmount() > 2)
aGuids.insert(itr->GetSource()->GetGUID().GetCounter());
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500ms);
break;
}
case EVENT_CRYSTALFIRE_BREATH:
me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false);
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
break;
case EVENT_TAIL_SWEEP:
me->CastSpell(me, SPELL_TAIL_SWEEP, false);
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
break;
case EVENT_CRYSTAL_CHAINS:
Talk(SAY_CRYSTAL_NOVA);
if (IsHeroic())
me->CastSpell(me, SPELL_CRYSTALIZE, false);
else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false);
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
break;
}
DoMeleeAttackIfReady();
}
};
}; };
class achievement_intense_cold : public AchievementCriteriaScript class achievement_intense_cold : public AchievementCriteriaScript
{ {
public: public:
achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") { }
{
}
bool OnCheck(Player* player, Unit* target, uint32 /*criteria_id*/) override bool OnCheck(Player* player, Unit* target, uint32 /*criteria_id*/) override
{ {
@@ -213,6 +198,6 @@ public:
void AddSC_boss_keristrasza() void AddSC_boss_keristrasza()
{ {
new boss_keristrasza(); RegisterNexusCreatureAI(boss_keristrasza);
new achievement_intense_cold(); new achievement_intense_cold();
} }
@@ -79,159 +79,146 @@ enum Events
EVENT_KILL_TALK = 9 EVENT_KILL_TALK = 9
}; };
class boss_magus_telestra : public CreatureScript struct boss_magus_telestra : public BossAI
{ {
public: boss_magus_telestra(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) { }
boss_magus_telestra() : CreatureScript("boss_magus_telestra") { }
CreatureAI* GetAI(Creature* creature) const override uint8 copiesDied;
bool achievement;
void Reset() override
{ {
return GetNexusAI<boss_magus_telestraAI>(creature); BossAI::Reset();
copiesDied = 0;
achievement = true;
if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT))
me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me);
} }
struct boss_magus_telestraAI : public BossAI uint32 GetData(uint32 data) const override
{ {
boss_magus_telestraAI(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) if (data == me->GetEntry())
return achievement;
return 0;
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10s);
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0ms);
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20s);
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
if (IsHeroic())
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
}
void AttackStart(Unit* who) override
{
if (who && me->Attack(who, true))
me->GetMotionMaster()->MoveChase(who, 20.0f);
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void KilledUnit(Unit*) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
} }
}
uint8 copiesDied; void JustSummoned(Creature* summon) override
bool achievement; {
summons.Summon(summon);
summon->SetInCombatWithZone();
}
void Reset() override void SpellHit(Unit* caster, SpellInfo const* spellInfo) override
{
if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature())
{ {
BossAI::Reset(); events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s);
copiesDied = 0; caster->ToCreature()->DespawnOrUnsummon(1000);
achievement = true;
if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT)) if (++copiesDied >= 3)
me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me); {
copiesDied = 0;
events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT);
events.ScheduleEvent(EVENT_MAGUS_MERGED, 5s);
me->CastSpell(me, SPELL_BURNING_WINDS, true);
}
} }
}
uint32 GetData(uint32 data) const override void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{ {
if (data == me->GetEntry()) case EVENT_MAGUS_HEALTH1:
return achievement; if (me->HealthBelowPct(51))
return 0; {
} me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
void JustEngagedWith(Unit* who) override Talk(SAY_SPLIT);
{ break;
BossAI::JustEngagedWith(who); }
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10s);
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0ms);
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20s);
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s); events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
if (IsHeroic()) break;
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s); case EVENT_MAGUS_HEALTH2:
} if (me->HealthBelowPct(11))
void AttackStart(Unit* who) override
{
if (who && me->Attack(who, true))
me->GetMotionMaster()->MoveChase(who, 20.0f);
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void KilledUnit(Unit*) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_KILL); me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
events.ScheduleEvent(EVENT_KILL_TALK, 6s); events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
Talk(SAY_SPLIT);
break;
} }
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
break;
case EVENT_MAGUS_FIREBOMB:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
me->CastSpell(target, SPELL_FIREBOMB, false);
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3s);
break;
case EVENT_MAGUS_ICE_NOVA:
me->CastSpell(me, SPELL_ICE_NOVA, false);
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15s);
break;
case EVENT_MAGUS_GRAVITY_WELL:
me->CastSpell(me, SPELL_GRAVITY_WELL, false);
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15s);
break;
case EVENT_MAGUS_FAIL_ACHIEVEMENT:
achievement = false;
break;
case EVENT_MAGUS_RELOCATE:
me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f);
break;
case EVENT_MAGUS_MERGED:
me->CastSpell(me, SPELL_TELESTRA_BACK, true);
me->RemoveAllAuras();
Talk(SAY_MERGE);
break;
} }
void JustSummoned(Creature* summon) override DoMeleeAttackIfReady();
{ }
summons.Summon(summon);
summon->SetInCombatWithZone();
}
void SpellHit(Unit* caster, SpellInfo const* spellInfo) override
{
if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature())
{
events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s);
caster->ToCreature()->DespawnOrUnsummon(1000);
if (++copiesDied >= 3)
{
copiesDied = 0;
events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT);
events.ScheduleEvent(EVENT_MAGUS_MERGED, 5s);
me->CastSpell(me, SPELL_BURNING_WINDS, true);
}
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_MAGUS_HEALTH1:
if (me->HealthBelowPct(51))
{
me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
Talk(SAY_SPLIT);
break;
}
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
break;
case EVENT_MAGUS_HEALTH2:
if (me->HealthBelowPct(11))
{
me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
Talk(SAY_SPLIT);
break;
}
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
break;
case EVENT_MAGUS_FIREBOMB:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
me->CastSpell(target, SPELL_FIREBOMB, false);
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3s);
break;
case EVENT_MAGUS_ICE_NOVA:
me->CastSpell(me, SPELL_ICE_NOVA, false);
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15s);
break;
case EVENT_MAGUS_GRAVITY_WELL:
me->CastSpell(me, SPELL_GRAVITY_WELL, false);
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15s);
break;
case EVENT_MAGUS_FAIL_ACHIEVEMENT:
achievement = false;
break;
case EVENT_MAGUS_RELOCATE:
me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f);
break;
case EVENT_MAGUS_MERGED:
me->CastSpell(me, SPELL_TELESTRA_BACK, true);
me->RemoveAllAuras();
Talk(SAY_MERGE);
break;
}
DoMeleeAttackIfReady();
}
};
}; };
class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript
@@ -331,7 +318,7 @@ public:
void AddSC_boss_magus_telestra() void AddSC_boss_magus_telestra()
{ {
new boss_magus_telestra(); RegisterNexusCreatureAI(boss_magus_telestra);
RegisterSpellScript(spell_boss_magus_telestra_summon_telestra_clones_aura); RegisterSpellScript(spell_boss_magus_telestra_summon_telestra_clones_aura);
RegisterSpellScript(spell_boss_magus_telestra_gravity_well); RegisterSpellScript(spell_boss_magus_telestra_gravity_well);
new achievement_split_personality(); new achievement_split_personality();
@@ -60,173 +60,147 @@ enum Misc
GO_CRYSTAL_SPIKE = 188537 GO_CRYSTAL_SPIKE = 188537
}; };
class boss_ormorok : public CreatureScript struct boss_ormorok : public BossAI
{ {
public: boss_ormorok(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) {}
boss_ormorok() : CreatureScript("boss_ormorok") { }
CreatureAI* GetAI(Creature* creature) const override uint8 _spikesCount;
void Reset() override
{ {
return GetNexusAI<boss_ormorokAI>(creature); _spikesCount = 0;
BossAI::Reset();
} }
struct boss_ormorokAI : public BossAI void JustEngagedWith(Unit* who) override
{ {
boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12s);
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
if (IsHeroic())
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
}
void JustDied(Unit* killer) override
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
}
void KilledUnit(Unit* /*victim*/) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
} }
}
uint8 _spikesCount; void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
}
void Reset() override void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{ {
_spikesCount = 0; case EVENT_ORMOROK_HEALTH:
BossAI::Reset(); if (me->HealthBelowPct(26))
} {
me->CastSpell(me, SPELL_FRENZY, true);
void JustEngagedWith(Unit* who) override Talk(EMOTE_FRENZY);
{ break;
Talk(SAY_AGGRO); }
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12s);
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s); events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
if (IsHeroic()) break;
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s); case EVENT_ORMOROK_TRAMPLE:
} me->CastSpell(me, SPELL_TRAMPLE, false);
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
void JustDied(Unit* killer) override break;
{ case EVENT_ORMOROK_SPELL_REFLECTION:
Talk(SAY_DEATH); Talk(SAY_REFLECT);
BossAI::JustDied(killer); me->CastSpell(me, SPELL_SPELL_REFLECTION, false);
} events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
break;
void KilledUnit(Unit* /*victim*/) override case EVENT_ORMOROK_SUMMON:
{ if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 50.0f, true))
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true);
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
break;
case EVENT_ORMOROK_CRYSTAL_SPIKES:
Talk(SAY_CRYSTAL_SPIKES);
me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false);
_spikesCount = 0;
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300ms);
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20s);
break;
case EVENT_ORMOROK_SUMMON_SPIKES:
if (++_spikesCount > 9)
break;
for (uint8 i = 0; i < 4; ++i)
{ {
Talk(SAY_KILL); float o = rand_norm() * 2.0f * M_PI;
events.ScheduleEvent(EVENT_KILL_TALK, 6s); float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o);
float y = me->GetPositionY() + 5.0f * _spikesCount * std::sin(o);
float h = me->GetMapHeight(x, y, me->GetPositionZ());
if (h != INVALID_HEIGHT)
me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000);
} }
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200ms);
break;
} }
void JustSummoned(Creature* summon) override DoMeleeAttackIfReady();
{ }
summons.Summon(summon);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_ORMOROK_HEALTH:
if (me->HealthBelowPct(26))
{
me->CastSpell(me, SPELL_FRENZY, true);
Talk(EMOTE_FRENZY);
break;
}
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
break;
case EVENT_ORMOROK_TRAMPLE:
me->CastSpell(me, SPELL_TRAMPLE, false);
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
break;
case EVENT_ORMOROK_SPELL_REFLECTION:
Talk(SAY_REFLECT);
me->CastSpell(me, SPELL_SPELL_REFLECTION, false);
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
break;
case EVENT_ORMOROK_SUMMON:
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 50.0f, true))
me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true);
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
break;
case EVENT_ORMOROK_CRYSTAL_SPIKES:
Talk(SAY_CRYSTAL_SPIKES);
me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false);
_spikesCount = 0;
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300ms);
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20s);
break;
case EVENT_ORMOROK_SUMMON_SPIKES:
if (++_spikesCount > 9)
break;
for (uint8 i = 0; i < 4; ++i)
{
float o = rand_norm() * 2.0f * M_PI;
float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o);
float y = me->GetPositionY() + 5.0f * _spikesCount * std::sin(o);
float h = me->GetMapHeight(x, y, me->GetPositionZ());
if (h != INVALID_HEIGHT)
me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000);
}
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200ms);
break;
}
DoMeleeAttackIfReady();
}
};
}; };
class npc_crystal_spike : public CreatureScript struct npc_crystal_spike : public NullCreatureAI
{ {
public: npc_crystal_spike(Creature* c) : NullCreatureAI(c) { }
npc_crystal_spike() : CreatureScript("npc_crystal_spike") { }
CreatureAI* GetAI(Creature* pCreature) const override int32 _damageTimer;
ObjectGuid _gameObjectGUID;
void Reset() override
{ {
return GetNexusAI<npc_crystal_spikeAI>(pCreature); if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500))
_gameObjectGUID = gameobject->GetGUID();
_damageTimer = 1;
} }
struct npc_crystal_spikeAI : public NullCreatureAI void UpdateAI(uint32 diff) override
{ {
npc_crystal_spikeAI(Creature* c) : NullCreatureAI(c) if (_damageTimer)
{ {
} _damageTimer += diff;
if (_damageTimer >= 2000)
int32 _damageTimer;
ObjectGuid _gameObjectGUID;
void Reset() override
{
if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500))
_gameObjectGUID = gameobject->GetGUID();
_damageTimer = 1;
}
void UpdateAI(uint32 diff) override
{
if (_damageTimer)
{ {
_damageTimer += diff; if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID))
if (_damageTimer >= 2000) gameobject->SetGoState(GO_STATE_ACTIVE);
{
if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID))
gameobject->SetGoState(GO_STATE_ACTIVE);
me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false); me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false);
_damageTimer = 0; _damageTimer = 0;
}
} }
} }
}; }
}; };
void AddSC_boss_ormorok() void AddSC_boss_ormorok()
{ {
new boss_ormorok(); RegisterNexusCreatureAI(boss_ormorok);
new npc_crystal_spike(); RegisterNexusCreatureAI(npc_crystal_spike);
} }
@@ -166,110 +166,97 @@ enum eFrayer
SPELL_ENSNARE = 48053 SPELL_ENSNARE = 48053
}; };
class npc_crystalline_frayer : public CreatureScript struct npc_crystalline_frayer : public ScriptedAI
{ {
public: npc_crystalline_frayer(Creature* creature) : ScriptedAI(creature) { }
npc_crystalline_frayer() : CreatureScript("npc_crystalline_frayer") { }
CreatureAI* GetAI(Creature* creature) const override bool _allowDeath;
uint32 restoreTimer;
uint32 abilityTimer1;
uint32 abilityTimer2;
void Reset() override
{ {
return GetNexusAI<npc_crystalline_frayerAI>(creature); restoreTimer = 0;
abilityTimer1 = 0;
abilityTimer2 = 30000;
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
} }
struct npc_crystalline_frayerAI : public ScriptedAI void JustEngagedWith(Unit*) override
{ {
npc_crystalline_frayerAI(Creature* creature) : ScriptedAI(creature) _allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE;
}
void EnterEvadeMode(EvadeReason why) override
{
if (me->isRegeneratingHealth())
ScriptedAI::EnterEvadeMode(why);
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
if (damage >= me->GetHealth())
{ {
if (!_allowDeath)
{
me->RemoveAllAuras();
me->GetThreatMgr().ClearAllThreat();
me->CombatStop(true);
damage = 0;
me->SetReactState(REACT_PASSIVE);
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetRegeneratingHealth(false);
me->CastSpell(me, SPELL_SUMMON_SEED_POD, true);
me->CastSpell(me, SPELL_SEED_POD, true);
me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false);
restoreTimer = 1;
}
}
}
void UpdateAI(uint32 diff) override
{
if (restoreTimer)
{
restoreTimer += diff;
if (restoreTimer >= 90 * IN_MILLISECONDS)
{
Talk(0);
me->SetRegeneratingHealth(true);
restoreTimer = 0;
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
}
return;
} }
bool _allowDeath; if (!UpdateVictim())
uint32 restoreTimer; return;
uint32 abilityTimer1;
uint32 abilityTimer2;
void Reset() override abilityTimer1 += diff;
abilityTimer2 += diff;
if (abilityTimer1 >= 5000)
{ {
restoreTimer = 0; me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false);
abilityTimer1 = 0; abilityTimer1 = 0;
abilityTimer2 = 30000;
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
} }
void JustEngagedWith(Unit*) override if (abilityTimer2 >= 30000)
{ {
_allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE; me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false);
abilityTimer2 = 0;
} }
}
void EnterEvadeMode(EvadeReason why) override
{
if (me->isRegeneratingHealth())
ScriptedAI::EnterEvadeMode(why);
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
if (damage >= me->GetHealth())
{
if (!_allowDeath)
{
me->RemoveAllAuras();
me->GetThreatMgr().ClearAllThreat();
me->CombatStop(true);
damage = 0;
me->SetReactState(REACT_PASSIVE);
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetRegeneratingHealth(false);
me->CastSpell(me, SPELL_SUMMON_SEED_POD, true);
me->CastSpell(me, SPELL_SEED_POD, true);
me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false);
restoreTimer = 1;
}
}
}
void UpdateAI(uint32 diff) override
{
if (restoreTimer)
{
restoreTimer += diff;
if (restoreTimer >= 90 * IN_MILLISECONDS)
{
Talk(0);
me->SetRegeneratingHealth(true);
restoreTimer = 0;
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
}
return;
}
if (!UpdateVictim())
return;
abilityTimer1 += diff;
abilityTimer2 += diff;
if (abilityTimer1 >= 5000)
{
me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false);
abilityTimer1 = 0;
}
if (abilityTimer2 >= 30000)
{
me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false);
abilityTimer2 = 0;
}
}
};
}; };
void AddSC_instance_nexus() void AddSC_instance_nexus()
{ {
new instance_nexus(); new instance_nexus();
new npc_crystalline_frayer(); RegisterNexusCreatureAI(npc_crystalline_frayer);
} }
@@ -62,4 +62,6 @@ inline AI* GetNexusAI(T* obj)
return GetInstanceAI<AI>(obj, NexusScriptName); return GetInstanceAI<AI>(obj, NexusScriptName);
} }
#define RegisterNexusCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNexusAI)
#endif #endif