Compare commits

...

2 Commits

View File

@ -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;
};