From 601d0362959c618b0c4993abf5f7625e6236d2b8 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Sat, 15 Jul 2023 14:13:08 -0600 Subject: [PATCH] refactor(Scripts/Karazhan): Update The Curator (#16754) * init * . * . --- .../EasternKingdoms/Karazhan/boss_curator.cpp | 225 ++++++++---------- 1 file changed, 99 insertions(+), 126 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp index 6ab065280..dc219e8a3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp @@ -19,15 +19,18 @@ #include "ScriptedCreature.h" #include "karazhan.h" -enum Curator +enum Text { SAY_AGGRO = 0, SAY_SUMMON = 1, SAY_EVOCATE = 2, SAY_ENRAGE = 3, SAY_KILL = 4, - SAY_DEATH = 5, + SAY_DEATH = 5 +}; +enum Spells +{ SPELL_HATEFUL_BOLT = 30383, SPELL_EVOCATION = 30254, SPELL_ARCANE_INFUSION = 30403, @@ -36,140 +39,110 @@ enum Curator SPELL_SUMMON_ASTRAL_FLARE1 = 30236, SPELL_SUMMON_ASTRAL_FLARE2 = 30239, SPELL_SUMMON_ASTRAL_FLARE3 = 30240, - SPELL_SUMMON_ASTRAL_FLARE4 = 30241, - - EVENT_KILL_TALK = 1, - EVENT_SPELL_HATEFUL_BOLT = 2, - EVENT_SPELL_EVOCATION = 3, - EVENT_SPELL_ASTRAL_FLARE = 4, - EVENT_SPELL_BERSERK = 5, - EVENT_CHECK_HEALTH = 6 + SPELL_SUMMON_ASTRAL_FLARE4 = 30241 }; -class boss_curator : public CreatureScript +struct boss_curator : public BossAI { -public: - boss_curator() : CreatureScript("boss_curator") { } + boss_curator(Creature* creature) : BossAI(creature, DATA_CURATOR) { } - struct boss_curatorAI : public BossAI + void Reset() override { - boss_curatorAI(Creature* creature) : BossAI(creature, DATA_CURATOR) { } + BossAI::Reset(); + me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_POWER_BURN, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_BURN, true); + ScheduleHealthCheckEvent(15, [&] { + DoCastSelf(SPELL_ARCANE_INFUSION, true); + Talk(SAY_ENRAGE); + }); + } - void Reset() override - { - BossAI::Reset(); - me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_POWER_BURN, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_BURN, true); - } - - void KilledUnit(Unit* /*victim*/) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 5000); - } - } - - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, 10000); - events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - DoZoneInCombat(); - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - if (Unit* target = summon->SelectNearbyTarget(nullptr, 40.0f)) - { - summon->AI()->AttackStart(target); - summon->AddThreat(target, 1000.0f); - } - - summon->SetInCombatWithZone(); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(16)) - { - events.CancelEvent(EVENT_SPELL_ASTRAL_FLARE); - me->CastSpell(me, SPELL_ARCANE_INFUSION, true); - Talk(SAY_ENRAGE); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_BERSERK: - Talk(SAY_ENRAGE); - me->InterruptNonMeleeSpells(true); - me->CastSpell(me, SPELL_ASTRAL_DECONSTRUCTION, true); - break; - case EVENT_SPELL_HATEFUL_BOLT: - if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, urand(1, 2), 40.0f)) - me->CastSpell(target, SPELL_HATEFUL_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, urand(5000, 7500) * (events.GetNextEventTime(EVENT_SPELL_BERSERK) == 0 ? 1 : 2)); - break; - case EVENT_SPELL_ASTRAL_FLARE: - { - me->CastSpell(me, RAND(SPELL_SUMMON_ASTRAL_FLARE1, SPELL_SUMMON_ASTRAL_FLARE2, SPELL_SUMMON_ASTRAL_FLARE3, SPELL_SUMMON_ASTRAL_FLARE4), false); - int32 mana = CalculatePct(me->GetMaxPower(POWER_MANA), 10); - me->ModifyPower(POWER_MANA, -mana); - if (me->GetPowerPct(POWER_MANA) < 10.0f) - { - Talk(SAY_EVOCATE); - me->CastSpell(me, SPELL_EVOCATION, false); - - events.DelayEvents(20000); - events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 20000); - } - else - { - if (roll_chance_i(50)) - Talk(SAY_SUMMON); - - events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 10000); - } - - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void KilledUnit(Unit* victim) override { - return GetKarazhanAI(creature); + BossAI::KilledUnit(victim); + Talk(SAY_KILL); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + DoZoneInCombat(); + scheduler.Schedule(10min, [this](TaskContext /*context*/) + { + Talk(SAY_ENRAGE); + me->InterruptNonMeleeSpells(true); + DoCastSelf(SPELL_ASTRAL_DECONSTRUCTION, true); + }).Schedule(10s, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0, 45.0f, true, false)) + { + DoCast(target, SPELL_HATEFUL_BOLT); + } + else + { + DoCastVictim(SPELL_HATEFUL_BOLT); + } + context.Repeat(7s, 15s); + }).Schedule(6s, [this](TaskContext context) + { + if (me->HealthAbovePct(15)) + { + if (roll_chance_i(50)) + { + Talk(SAY_SUMMON); + } + DoCastSelf(RAND(SPELL_SUMMON_ASTRAL_FLARE1, SPELL_SUMMON_ASTRAL_FLARE2, SPELL_SUMMON_ASTRAL_FLARE3, SPELL_SUMMON_ASTRAL_FLARE4)); + int32 mana = CalculatePct(me->GetMaxPower(POWER_MANA), 10); + me->ModifyPower(POWER_MANA, -mana); + if (me->GetPowerPct(POWER_MANA) < 10.0f) + { + Talk(SAY_EVOCATE); + DoCastSelf(SPELL_EVOCATION); + scheduler.DelayAll(20s); + context.Repeat(20s); + } + else + { + context.Repeat(10s); + } + } + }); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + if (Unit* target = summon->SelectNearbyTarget(nullptr, 40.0f)) + { + summon->AI()->AttackStart(target); + summon->AddThreat(target, 1000.0f); + } + summon->SetInCombatWithZone(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + scheduler.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + DoMeleeAttackIfReady(); } }; void AddSC_boss_curator() { - new boss_curator(); + RegisterKarazhanCreatureAI(boss_curator); }