diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-07-05 16:08:55 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-05 15:08:55 +0200 |
commit | c867a1ad42dd02f4625beaa1c4a631503efeff17 (patch) | |
tree | b00fe4b8c21a018cab0110cb04eb0417ec8873c9 /src | |
parent | bb4424c77cc5ca658584c7ba7274c767bd722847 (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.cpp | 290 | ||||
-rw-r--r-- | src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp | 36 |
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 |