diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index 361c232865..c51b29683e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -30,6 +30,7 @@ enum LokenSpells SPELL_LIGHTNING_NOVA_THUNDERS = 52663, SPELL_PULSING_SHOCKWAVE = 52961, + SPELL_PULSING_SHOCKWAVE_AURA = 59414, // Achievement ACHIEVEMENT_TIMELY_DEATH = 20384 @@ -49,15 +50,6 @@ enum Yells EMOTE_NOVA = 9 }; -enum LokenEvents -{ - EVENT_LIGHTNING_NOVA = 1, - EVENT_SHOCKWAVE = 2, - EVENT_ARC_LIGHTNING = 3, - EVENT_CHECK_HEALTH = 4, - EVENT_AURA_REMOVE = 5 -}; - struct boss_loken : public BossAI { boss_loken(Creature* creature) : BossAI(creature, DATA_LOKEN), _introDone(false) { } @@ -94,18 +86,42 @@ struct boss_loken : public BossAI _introDone = true; } + void OnAuraRemove(AuraApplication* auraApp, AuraRemoveMode /*mode*/) override + { + if (auraApp->GetBase()->GetId() == SPELL_LIGHTNING_NOVA_VISUAL) + me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS); + } + + void ScheduleTasks() override + { + me->m_Events.AddEventAtOffset([&] { + DoCastAOE(SPELL_PULSING_SHOCKWAVE_AURA, true); + me->ClearUnitState(UNIT_STATE_CASTING); // the aura above is a channeled spell, so we need this + DoCastSelf(SPELL_PULSING_SHOCKWAVE); + }, 3s); + + ScheduleTimedEvent(15s, [&] { + Talk(SAY_NOVA); + DoCastSelf(SPELL_LIGHTNING_NOVA_VISUAL, true); + DoCastSelf(SPELL_LIGHTNING_NOVA_THUNDERS, true); + DoCastAOE(SPELL_LIGHTNING_NOVA); + }, 15s); + + if (IsHeroic()) + { + ScheduleTimedEvent(10s, [&] { + DoCastRandomTarget(SPELL_ARC_LIGHTNING, 0, 100.0f, false); + }, 12s); + + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH); + } + } + void JustEngagedWith(Unit*) override { me->m_Events.KillAllEvents(false); _JustEngagedWith(); Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_ARC_LIGHTNING, 10s); - events.ScheduleEvent(EVENT_SHOCKWAVE, 3s); - events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 15s); - - if (IsHeroic()) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH); } void JustDied(Unit*) override @@ -122,46 +138,6 @@ struct boss_loken : public BossAI Talk(SAY_SLAY); } - void UpdateAI(uint32 diff) override - { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_LIGHTNING_NOVA: - Talk(SAY_NOVA); - events.Repeat(15s); - me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true); - me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true); - - events.DelayEvents(5s); - events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4s : 5s); - - me->CastSpell(me, SPELL_LIGHTNING_NOVA, false); - break; - case EVENT_SHOCKWAVE: - me->CastSpell(me, SPELL_PULSING_SHOCKWAVE, false); - break; - case EVENT_ARC_LIGHTNING: - if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING)) - me->CastSpell(target, SPELL_ARC_LIGHTNING, false); - - events.Repeat(12s); - break; - case EVENT_AURA_REMOVE: - me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS); - break; - } - - DoMeleeAttackIfReady(); - } private: bool _introDone; };