From a498584adf7af2c8203205d496b6c317c6882edd Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 25 Jul 2022 20:55:44 -0300 Subject: [PATCH] fix(Scripts/RuinsOfAhnQiraj): Script Anubisath Guardians (#12537) --- .../rev_1658788379158805300.sql | 2 + .../RuinsOfAhnQiraj/boss_ossirian.cpp | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1658788379158805300.sql diff --git a/data/sql/updates/pending_db_world/rev_1658788379158805300.sql b/data/sql/updates/pending_db_world/rev_1658788379158805300.sql new file mode 100644 index 000000000..c0052d560 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1658788379158805300.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `ScriptName` = 'npc_anubisath_guardian' WHERE `entry` = 15355; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index ceae706d1..a085e99c5 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -22,6 +22,7 @@ #include "ScriptedCreature.h" #include "SpellInfo.h" #include "ruins_of_ahnqiraj.h" +#include "TaskScheduler.h" enum Texts { @@ -290,8 +291,84 @@ public: } }; +enum AnubisathGuardian +{ + SPELL_METEOR = 24340, + SPELL_PLAGUE = 22997, + SPELL_SHADOW_STORM = 2148, + SPELL_THUNDER_CLAP = 2834, + SPELL_REFLECT_ARCANE_FIRE = 13022, + SPELL_REFLECT_FROST_SHADOW = 19595, + SPELL_ENRAGE = 8599, + SPELL_EXPLODE = 25698, + + SPELL_SUMMON_ANUB_SWARMGUARD = 17430, + SPELL_SUMMON_ANUB_WARRIOR = 17431, +}; + +struct npc_anubisath_guardian : public ScriptedAI +{ + npc_anubisath_guardian(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + _enraged = false; + _spells[0] = RAND(SPELL_SHADOW_STORM, SPELL_THUNDER_CLAP); + _spells[1] = RAND(SPELL_REFLECT_ARCANE_FIRE, SPELL_REFLECT_FROST_SHADOW); + + _scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void EnterCombat(Unit* /*who*/) override + { + DoCastSelf(_spells[0]); + DoCastSelf(_spells[1]); + + _scheduler.CancelAll(); + + uint32 spell = RAND(SPELL_METEOR, SPELL_PLAGUE); + _scheduler.Schedule(10s, [this, spell](TaskContext context) { + DoCastRandomTarget(spell); + context.Repeat(10s, 15s); + }); + + spell = RAND(SPELL_SUMMON_ANUB_SWARMGUARD, SPELL_SUMMON_ANUB_WARRIOR); + _scheduler.Schedule(10s, [this, spell](TaskContext context) { + DoCastAOE(spell); + context.Repeat(10s, 15s); + }); + } + + void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType /* damagetype */, SpellSchoolMask /*damageSchoolMask*/) override + { + if (!_enraged && me->HealthBelowPctDamaged(10, damage)) + { + _enraged = true; + DoCastSelf(RAND(SPELL_ENRAGE, SPELL_EXPLODE), true); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _scheduler.Update(diff, + std::bind(&ScriptedAI::DoMeleeAttackIfReady, this)); + } + +private: + bool _enraged; + uint32 _spells[2]; + TaskScheduler _scheduler; +}; + void AddSC_boss_ossirian() { new boss_ossirian(); new go_ossirian_crystal(); + RegisterCreatureAI(npc_anubisath_guardian); }