aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-07-05 16:08:55 +0300
committerGitHub <noreply@github.com>2025-07-05 15:08:55 +0200
commitc867a1ad42dd02f4625beaa1c4a631503efeff17 (patch)
treeb00fe4b8c21a018cab0110cb04eb0417ec8873c9 /src
parentbb4424c77cc5ca658584c7ba7274c767bd722847 (diff)
Scripts/Gruul's Lair: Create base AI for Maulgar's ogres (#31119)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp290
-rw-r--r--src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp36
2 files changed, 111 insertions, 215 deletions
diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
index dc1a29955ba..2c43f0df34b 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
@@ -171,44 +171,32 @@ private:
bool _enraged;
};
-// 18834 - Olm the Summoner
-struct boss_olm_the_summoner : public ScriptedAI
+struct OgreBaseAI : public ScriptedAI
{
- boss_olm_the_summoner(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+ OgreBaseAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
void Reset() override
{
- _scheduler.CancelAll();
+ scheduler.CancelAll();
+ scheduler.SetValidator([this]
+ {
+ return !me->HasUnitState(UNIT_STATE_CASTING);
+ });
}
void JustEngagedWith(Unit* /*who*/) override
{
- _scheduler.Schedule(10s, [this](TaskContext task)
- {
- DoCastVictim(SPELL_DARK_DECAY);
- task.Repeat(20s);
- });
-
- _scheduler.Schedule(0s, 10s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_SUMMON_WILD_FELHUNTER);
- task.Repeat(50s, 60s);
- });
-
- _scheduler.Schedule(20s, [this](TaskContext task)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_DEATH_COIL);
- task.Repeat(20s);
- });
+ ScheduleEvents();
}
+ virtual void ScheduleEvents() = 0;
+
void JustDied(Unit* /*killer*/) override
{
- if (Creature* maulgar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MAULGAR)))
+ if (Creature* maulgar = instance->GetCreature(DATA_MAULGAR))
maulgar->AI()->DoAction(ACTION_ADD_DEATH);
- _instance->SetBossState(DATA_MAULGAR, DONE);
+ instance->SetBossState(DATA_MAULGAR, DONE);
}
void UpdateAI(uint32 diff) override
@@ -216,200 +204,130 @@ struct boss_olm_the_summoner : public ScriptedAI
if (!UpdateVictim())
return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- _scheduler.Update(diff);
+ scheduler.Update(diff);
DoMeleeAttackIfReady();
}
-private:
- TaskScheduler _scheduler;
- InstanceScript* _instance;
+protected:
+ InstanceScript* instance;
+ TaskScheduler scheduler;
};
-// 18835 - Kiggler the Crazed
-struct boss_kiggler_the_crazed : public ScriptedAI
+// 18834 - Olm the Summoner
+struct boss_olm_the_summoner : public OgreBaseAI
{
- boss_kiggler_the_crazed(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+ boss_olm_the_summoner(Creature* creature) : OgreBaseAI(creature) { }
- void Reset() override
+ void ScheduleEvents() override
{
- _scheduler.CancelAll();
+ scheduler
+ .Schedule(10s, [this](TaskContext task)
+ {
+ DoCastVictim(SPELL_DARK_DECAY);
+ task.Repeat(20s);
+ })
+ .Schedule(0s, 10s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_SUMMON_WILD_FELHUNTER);
+ task.Repeat(50s, 60s);
+ })
+ .Schedule(20s, [this](TaskContext task)
+ {
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_DEATH_COIL);
+ task.Repeat(20s);
+ });
}
+};
+
+// 18835 - Kiggler the Crazed
+struct boss_kiggler_the_crazed : public OgreBaseAI
+{
+ boss_kiggler_the_crazed(Creature* creature) : OgreBaseAI(creature) { }
void AttackStart(Unit* who) override
{
ScriptedAI::AttackStartCaster(who, 40.0f);
}
- void JustEngagedWith(Unit* /*who*/) override
- {
- _scheduler.Schedule(5s, [this](TaskContext task)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_GREATER_POLYMORPH);
- task.Repeat(15s, 20s);
- });
-
- _scheduler.Schedule(0s, [this](TaskContext task)
- {
- DoCastVictim(SPELL_LIGHTNING_BOLT);
- task.Repeat(2s);
- });
-
- _scheduler.Schedule(20s, [this](TaskContext task)
- {
- DoCastVictim(SPELL_ARCANE_SHOCK);
- task.Repeat(20s);
- });
-
- _scheduler.Schedule(30s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_ARCANE_EXPLOSION);
- task.Repeat(30s);
- });
- }
-
- void JustDied(Unit* /*killer*/) override
+ void ScheduleEvents() override
{
- if (Creature* maulgar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MAULGAR)))
- maulgar->AI()->DoAction(ACTION_ADD_DEATH);
-
- _instance->SetBossState(DATA_MAULGAR, DONE);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- _scheduler.Update(diff);
-
- DoMeleeAttackIfReady();
+ scheduler
+ .Schedule(5s, [this](TaskContext task)
+ {
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_GREATER_POLYMORPH);
+ task.Repeat(15s, 20s);
+ })
+ .Schedule(0s, [this](TaskContext task)
+ {
+ DoCastVictim(SPELL_LIGHTNING_BOLT);
+ task.Repeat(2s);
+ })
+ .Schedule(20s, [this](TaskContext task)
+ {
+ DoCastVictim(SPELL_ARCANE_SHOCK);
+ task.Repeat(20s);
+ })
+ .Schedule(30s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_ARCANE_EXPLOSION);
+ task.Repeat(30s);
+ });
}
-
-private:
- TaskScheduler _scheduler;
- InstanceScript* _instance;
};
// 18836 - Blindeye the Seer
-struct boss_blindeye_the_seer : public ScriptedAI
+struct boss_blindeye_the_seer : public OgreBaseAI
{
- boss_blindeye_the_seer(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override
- {
- _scheduler.CancelAll();
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _scheduler.Schedule(5s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_GREATER_PW_SHIELD);
- task.Repeat(40s);
- });
-
- _scheduler.Schedule(25s, 40s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_HEAL);
- task.Repeat(25s, 40s);
- });
-
- _scheduler.Schedule(45s, 55s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_PRAYER_OH);
- task.Repeat(35s, 50s);
- });
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- if (Creature* maulgar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MAULGAR)))
- maulgar->AI()->DoAction(ACTION_ADD_DEATH);
+ boss_blindeye_the_seer(Creature* creature) : OgreBaseAI(creature) { }
- _instance->SetBossState(DATA_MAULGAR, DONE);
- }
-
- void UpdateAI(uint32 diff) override
+ void ScheduleEvents() override
{
- if (!UpdateVictim())
- return;
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- _scheduler.Update(diff);
-
- DoMeleeAttackIfReady();
+ scheduler
+ .Schedule(5s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_GREATER_PW_SHIELD);
+ task.Repeat(40s);
+ })
+ .Schedule(25s, 40s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_HEAL);
+ task.Repeat(25s, 40s);
+ })
+ .Schedule(45s, 55s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_PRAYER_OH);
+ task.Repeat(35s, 50s);
+ });
}
-
-private:
- TaskScheduler _scheduler;
- InstanceScript* _instance;
};
// 18832 - Krosh Firehand
-struct boss_krosh_firehand : public ScriptedAI
+struct boss_krosh_firehand : public OgreBaseAI
{
- boss_krosh_firehand(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override
- {
- _scheduler.CancelAll();
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _scheduler.Schedule(0s, 5s, [this](TaskContext task)
- {
- DoCastVictim(SPELL_GREATER_FIREBALL);
- task.Repeat(2s, 5s);
- });
-
- _scheduler.Schedule(0s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_SPELLSHIELD);
- task.Repeat(30s);
- });
-
- _scheduler.Schedule(10s, 20s, [this](TaskContext task)
- {
- DoCastSelf(SPELL_BLAST_WAVE);
- task.Repeat(5s, 15s);
- });
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- if (Creature* maulgar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MAULGAR)))
- maulgar->AI()->DoAction(ACTION_ADD_DEATH);
-
- _instance->SetBossState(DATA_MAULGAR, DONE);
- }
+ boss_krosh_firehand(Creature* creature) : OgreBaseAI(creature) { }
- void UpdateAI(uint32 diff) override
+ void ScheduleEvents() override
{
- if (!UpdateVictim())
- return;
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- _scheduler.Update(diff);
-
- DoMeleeAttackIfReady();
+ scheduler
+ .Schedule(0s, 5s, [this](TaskContext task)
+ {
+ DoCastVictim(SPELL_GREATER_FIREBALL);
+ task.Repeat(2s, 5s);
+ })
+ .Schedule(0s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_SPELLSHIELD);
+ task.Repeat(30s);
+ })
+ .Schedule(10s, 20s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_BLAST_WAVE);
+ task.Repeat(5s, 15s);
+ });
}
-
-private:
- TaskScheduler _scheduler;
- InstanceScript* _instance;
};
void AddSC_boss_high_king_maulgar()
diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
index 592720e410b..f025b14e1d7 100644
--- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
+++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
@@ -37,6 +37,12 @@ MinionData const minionData[] =
{ 0, 0 }
};
+ObjectData const creatureData[] =
+{
+ { NPC_MAULGAR, DATA_MAULGAR },
+ { 0, 0 } // END
+};
+
class instance_gruuls_lair : public InstanceMapScript
{
public:
@@ -50,36 +56,8 @@ class instance_gruuls_lair : public InstanceMapScript
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
LoadMinionData(minionData);
+ LoadObjectData(creatureData, nullptr);
}
-
- void OnCreatureCreate(Creature* creature) override
- {
- InstanceScript::OnCreatureCreate(creature);
-
- switch (creature->GetEntry())
- {
- case NPC_MAULGAR:
- MaulgarGUID = creature->GetGUID();
- break;
- default:
- break;
- }
- }
-
- ObjectGuid GetGuidData(uint32 type) const override
- {
- switch (type)
- {
- case DATA_MAULGAR:
- return MaulgarGUID;
- default:
- break;
- }
- return ObjectGuid::Empty;
- }
-
- protected:
- ObjectGuid MaulgarGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override