diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index 9855abce9..3fce92845 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -48,37 +48,36 @@ enum Spells enum Misc { - NPC_PURE_ENERGY = 24745, - - INTERVAL_MODIFIER = 15, - INTERVAL_SWITCH = 6, - - EVENT_SPELL_CHAIN_LIGHTNING = 1, - EVENT_SPELL_ARCANE_SHOCK = 2, - EVENT_HEALTH_CHECK = 3, + NPC_PURE_ENERGY = 24745 }; -struct boss_vexallus : public ScriptedAI +struct boss_vexallus : public BossAI { - boss_vexallus(Creature* creature) : ScriptedAI(creature), summons(me) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - EventMap events; - SummonList summons; - - uint8 IntervalHealthAmount; - bool Enraged; + boss_vexallus(Creature* creature) : BossAI(creature, DATA_VEXALLUS) { } void Reset() override { - summons.DespawnAll(); - IntervalHealthAmount = 1; + _Reset(); - instance->SetBossState(DATA_VEXALLUS, NOT_STARTED); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); + ScheduleHealthCheckEvent({ 85, 70, 55, 40 }, [&] + { + Talk(SAY_ENERGY); + Talk(EMOTE_DISCHARGE_ENERGY); + + if (IsHeroic()) + { + DoCastSelf(SPELL_SUMMON_PURE_ENERGY_H1); + DoCastSelf(SPELL_SUMMON_PURE_ENERGY_H2); + } + else + DoCastSelf(SPELL_SUMMON_PURE_ENERGY_N); + }); + + ScheduleHealthCheckEvent(20, [&] + { + scheduler.CancelAll(); + DoCastSelf(SPELL_OVERLOAD, true); + }); } void KilledUnit(Unit* victim) override @@ -87,21 +86,20 @@ struct boss_vexallus : public ScriptedAI Talk(SAY_KILL); } - void JustDied(Unit* /*killer*/) override - { - summons.DespawnAll(); - instance->SetBossState(DATA_VEXALLUS, DONE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); - } - void JustEngagedWith(Unit* /*who*/) override { + _JustEngagedWith(); Talk(SAY_AGGRO); - instance->SetBossState(DATA_VEXALLUS, IN_PROGRESS); - events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000); - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + ScheduleTimedEvent(8s, [&] + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H)); + }, 8s, 8s); + + ScheduleTimedEvent(5s, [&] + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H)); + }, 8s, 8s); } void JustSummoned(Creature* summon) override @@ -121,56 +119,6 @@ struct boss_vexallus : public ScriptedAI if (killer) killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID()); } - - 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: - //used for check, when Vexallus cast adds 85%, 70%, 55%, 40% - if (!HealthAbovePct(100 - INTERVAL_MODIFIER * IntervalHealthAmount)) - { - if (IntervalHealthAmount++ == INTERVAL_SWITCH) - { - events.Reset(); - me->CastSpell(me, SPELL_OVERLOAD, true); - return; - } - - Talk(SAY_ENERGY); - Talk(EMOTE_DISCHARGE_ENERGY); - - if (IsHeroic()) - { - me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H1, false); - me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H2, false); - } - else - me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_N, false); - } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 0); - break; - case EVENT_SPELL_CHAIN_LIGHTNING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H), false); - events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); - break; - case EVENT_SPELL_ARCANE_SHOCK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f)) - me->CastSpell(target, DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H), false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 8000); - break; - } - - DoMeleeAttackIfReady(); - } }; void AddSC_boss_vexallus()