From bafac46639de2d2625f3aa32c7ad2e427487d201 Mon Sep 17 00:00:00 2001 From: Nefertumm Date: Sat, 9 Jul 2022 16:49:35 -0300 Subject: [PATCH] fix(Core/ZulGurub): Hakkar hardmode (#12333) --- .../rev_1657371029609597700.sql | 4 ++ .../EasternKingdoms/ZulGurub/boss_hakkar.cpp | 42 +++++++++++++++---- .../ZulGurub/instance_zulgurub.cpp | 30 +++++++++++++ .../EasternKingdoms/ZulGurub/zulgurub.h | 6 +++ 4 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1657371029609597700.sql diff --git a/data/sql/updates/pending_db_world/rev_1657371029609597700.sql b/data/sql/updates/pending_db_world/rev_1657371029609597700.sql new file mode 100644 index 000000000..423fa6945 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1657371029609597700.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hakkar_power_down'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(24693, 'spell_hakkar_power_down'); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp index 0d2d5624d..b63fb4780 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp @@ -90,9 +90,19 @@ public: return true; } + void ApplyHakkarPowerStacks() + { + me->RemoveAurasDueToSpell(SPELL_HAKKAR_POWER); + for (int i = DATA_JEKLIK; i < DATA_HAKKAR; i++) + if (instance->GetBossState(i) != DONE) + DoCastSelf(SPELL_HAKKAR_POWER, true); + } + void Reset() override { _Reset(); + + ApplyHakkarPowerStacks(); } void JustDied(Unit* /*killer*/) override @@ -108,13 +118,13 @@ public: events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000); events.ScheduleEvent(EVENT_ENRAGE, 600000); if (instance->GetBossState(DATA_JEKLIK) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000); + events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 21000); if (instance->GetBossState(DATA_VENOXIS) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 7000); + events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 14000); if (instance->GetBossState(DATA_MARLI) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 15000); if (instance->GetBossState(DATA_THEKAL) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 8000); + events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 10000); if (instance->GetBossState(DATA_ARLOKK) != DONE) events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, 18000); Talk(SAY_AGGRO); @@ -166,11 +176,11 @@ public: break; case EVENT_ASPECT_OF_JEKLIK: DoCastVictim(SPELL_ASPECT_OF_JEKLIK, true); - events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, urand(10000, 14000)); + events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 24000); break; case EVENT_ASPECT_OF_VENOXIS: DoCastVictim(SPELL_ASPECT_OF_VENOXIS, true); - events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000); + events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, urand(16000, 18000)); break; case EVENT_ASPECT_OF_MARLI: if (Unit* victim = SelectTarget(SelectTargetMethod::MaxThreat, 0, 5.f, true)) @@ -178,7 +188,7 @@ public: DoCast(victim, SPELL_ASPECT_OF_MARLI, true); me->GetThreatMgr().modifyThreatPercent(victim, -100.f); } - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 45000); break; case EVENT_ASPECT_OF_THEKAL: DoCastVictim(SPELL_ASPECT_OF_THEKAL, true); @@ -374,6 +384,23 @@ class spell_blood_siphon : public SpellScript } }; +class spell_hakkar_power_down : public SpellScript +{ + PrepareSpellScript(spell_hakkar_power_down); + + void HandleOnHit() + { + if (Unit* caster = GetCaster()) + if (caster->HasAura(SPELL_HAKKAR_POWER)) + caster->RemoveAuraFromStack(SPELL_HAKKAR_POWER); + } + + void Register() override + { + OnHit += SpellHitFn(spell_hakkar_power_down::HandleOnHit); + } +}; + void AddSC_boss_hakkar() { new boss_hakkar(); @@ -383,4 +410,5 @@ void AddSC_boss_hakkar() new at_zulgurub_bloodfire_pit_speech(); new at_zulgurub_edge_of_madness_speech(); RegisterSpellScript(spell_blood_siphon); + RegisterSpellScript(spell_hakkar_power_down); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index bbd5c1e8d..a99c4ad5f 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -142,6 +142,36 @@ public: return 0; } + void RemoveHakkarPowerStack() + { + if (Creature* hakkar = instance->GetCreature(_hakkarGUID)) + { + hakkar->CastSpell(hakkar, SPELL_HAKKAR_POWER_DOWN, true); + } + } + + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_JEKLIK: + case DATA_VENOXIS: + case DATA_MARLI: + case DATA_ARLOKK: + case DATA_THEKAL: + if (state == DONE) + RemoveHakkarPowerStack(); + break; + default: + break; + } + + return true; + } + std::string GetSaveData() override { OUT_SAVE_INST_DATA; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 232328acf..7c88c3fa0 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -76,6 +76,12 @@ enum GameobjectIds GO_GONG_OF_BETHEKK = 180526 // Arlokk Event }; +enum SpellIds +{ + SPELL_HAKKAR_POWER = 24692, + SPELL_HAKKAR_POWER_DOWN = 24693 +}; + template inline AI* GetZulGurubAI(T* obj) {