diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp index ddd1628b8..572c67791 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp @@ -32,14 +32,6 @@ enum Spells SPELL_THRASH = 3391 }; -enum Events -{ - EVENT_MORTAL_WOUND = 1, - EVENT_SAND_TRAP = 2, - EVENT_WIDE_SLASH = 3, - EVENT_THRASH = 4 -}; - enum Texts { SAY_KURINNAXX_DEATH = 5 // Yell by 'Ossirian the Unscarred' @@ -52,26 +44,42 @@ struct boss_kurinnaxx : public BossAI void InitializeAI() override { me->m_CombatDistance = 50.0f; - Reset(); + + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } - void Reset() override + void JustEngagedWith(Unit* who) override { - BossAI::Reset(); - _enraged = false; - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s, 10s); - events.ScheduleEvent(EVENT_SAND_TRAP, 5s, 15s); - events.ScheduleEvent(EVENT_WIDE_SLASH, 10s, 15s); - events.ScheduleEvent(EVENT_THRASH, 16s); - } + BossAI::JustEngagedWith(who); - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override - { - if (!_enraged && HealthBelowPct(30)) + scheduler.Schedule(8s, 10s, [this](TaskContext context) + { + DoCastVictim(SPELL_MORTAL_WOUND); + context.Repeat(8s, 10s); + }).Schedule(5s, 15s, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.f, true)) + { + target->CastSpell(target, SPELL_SAND_TRAP, true, nullptr, nullptr, me->GetGUID()); + } + context.Repeat(5s, 15s); + }).Schedule(10s, 15s, [this](TaskContext context) + { + DoCastSelf(SPELL_WIDE_SLASH); + context.Repeat(12s, 15s); + }).Schedule(16s, [this](TaskContext context) + { + DoCastSelf(SPELL_THRASH); + context.Repeat(16s); + }); + + ScheduleHealthCheckEvent(30, [&] { DoCastSelf(SPELL_ENRAGE); - _enraged = true; - } + }); } void JustDied(Unit* killer) override @@ -94,49 +102,6 @@ struct boss_kurinnaxx : public BossAI } BossAI::JustDied(killer); } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MORTAL_WOUND: - DoCastVictim(SPELL_MORTAL_WOUND); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s, 10s); - break; - case EVENT_SAND_TRAP: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.f, true)) - { - target->CastSpell(target, SPELL_SAND_TRAP, true, nullptr, nullptr, me->GetGUID()); - } - events.ScheduleEvent(EVENT_SAND_TRAP, 5s, 15s); - break; - case EVENT_WIDE_SLASH: - DoCastSelf(SPELL_WIDE_SLASH); - events.ScheduleEvent(EVENT_WIDE_SLASH, 12s, 15s); - break; - case EVENT_THRASH: - DoCastSelf(SPELL_THRASH); - events.ScheduleEvent(EVENT_THRASH, 16s); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } -private: - bool _enraged; }; struct go_sand_trap : public GameObjectAI