diff options
-rw-r--r-- | src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp | 199 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h | 2 |
2 files changed, 97 insertions, 104 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp index 8e1d37e0af2..d32fa758d7e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp @@ -31,13 +31,14 @@ EndScriptData */ enum Spells { // Garr - SPELL_ANTIMAGIC_PULSE = 19492, - SPELL_MAGMA_SHACKLES = 19496, - SPELL_ENRAGE = 19516, + SPELL_ANTIMAGIC_PULSE = 19492, + SPELL_MAGMA_SHACKLES = 19496, + SPELL_ENRAGE = 19516, + SPELL_SEPARATION_ANXIETY = 23492, // Adds SPELL_ERUPTION = 19497, - SPELL_IMMOLATE = 20294, + SPELL_IMMOLATE = 15732, }; enum Events @@ -46,126 +47,116 @@ enum Events EVENT_MAGMA_SHACKLES = 2, }; -class boss_garr : public CreatureScript +struct boss_garr : public BossAI { - public: - boss_garr() : CreatureScript("boss_garr") { } + boss_garr(Creature* creature) : BossAI(creature, BOSS_GARR) { } - struct boss_garrAI : public BossAI - { - boss_garrAI(Creature* creature) : BossAI(creature, BOSS_GARR) - { - } + void JustEngagedWith(Unit* victim) override + { + BossAI::JustEngagedWith(victim); + events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25s); + events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15s); + } - void JustEngagedWith(Unit* victim) override - { - BossAI::JustEngagedWith(victim); - events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25s); - events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15s); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ANTIMAGIC_PULSE: - DoCast(me, SPELL_ANTIMAGIC_PULSE); - events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 10s, 15s); - break; - case EVENT_MAGMA_SHACKLES: - DoCast(me, SPELL_MAGMA_SHACKLES); - events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 8s, 12s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + case EVENT_ANTIMAGIC_PULSE: + DoCast(me, SPELL_ANTIMAGIC_PULSE); + events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 10s, 15s); + break; + case EVENT_MAGMA_SHACKLES: + DoCast(me, SPELL_MAGMA_SHACKLES); + events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 8s, 12s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetMoltenCoreAI<boss_garrAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class npc_firesworn : public CreatureScript +struct npc_firesworn : public ScriptedAI { - public: - npc_firesworn() : CreatureScript("npc_firesworn") { } + npc_firesworn(Creature* creature) : ScriptedAI(creature) { } - struct npc_fireswornAI : public ScriptedAI + void ScheduleTasks() + { + // Timers for this are probably wrong + _scheduler.Schedule(4s, [this](TaskContext context) { - npc_fireswornAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - immolateTimer = 4000; //These times are probably wrong - } + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_IMMOLATE); - uint32 immolateTimer; + context.Repeat(5s, 10s); + }); - void Reset() override - { - Initialize(); - } + // Separation Anxiety - Periodically check if Garr is nearby + // ...and enrage if he is not. + _scheduler.Schedule(3s, [this](TaskContext context) + { + if (!me->FindNearestCreature(NPC_GARR, 20.0f)) + DoCastSelf(SPELL_SEPARATION_ANXIETY); + else if (me->HasAura(SPELL_SEPARATION_ANXIETY)) + me->RemoveAurasDueToSpell(SPELL_SEPARATION_ANXIETY); + + context.Repeat(); + }); + } + + void Reset() override + { + _scheduler.CancelAll(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + ScheduleTasks(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + uint32 const health10pct = me->CountPctFromMaxHealth(10); + uint32 health = me->GetHealth(); + if (int32(health) - int32(damage) < int32(health10pct)) + { + damage = 0; + DoCastVictim(SPELL_ERUPTION); + me->DespawnOrUnsummon(); + } + } - void DamageTaken(Unit* /*attacker*/, uint32& damage) override - { - uint32 const health10pct = me->CountPctFromMaxHealth(10); - uint32 health = me->GetHealth(); - if (int32(health) - int32(damage) < int32(health10pct)) - { - damage = 0; - DoCastVictim(SPELL_ERUPTION); - me->DespawnOrUnsummon(); - } - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (immolateTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_IMMOLATE); - immolateTimer = urand(5000, 10000); - } - else - immolateTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; + _scheduler.Update(diff, + std::bind(&ScriptedAI::DoMeleeAttackIfReady, this)); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetMoltenCoreAI<npc_fireswornAI>(creature); - } +private: + TaskScheduler _scheduler; }; void AddSC_boss_garr() { - new boss_garr(); - new npc_firesworn(); + RegisterMoltenCoreCreatureAI(boss_garr); + RegisterMoltenCoreCreatureAI(npc_firesworn); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h index c5925731d57..a614caf71d9 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h @@ -82,4 +82,6 @@ inline AI* GetMoltenCoreAI(T* obj) return GetInstanceAI<AI>(obj, MCScriptName); } +#define RegisterMoltenCoreCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetMoltenCoreAI) + #endif |