aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp199
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h2
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