From 298b08c9a593b3ab638dbf4261589bc42391dac5 Mon Sep 17 00:00:00 2001 From: Nefertumm Date: Fri, 1 Jul 2022 15:22:13 -0300 Subject: [PATCH] fix(Core/ZulGurub): Hazza'rah improvements (#12236) * fix(Core/ZulGurub): Hazza'rah improvements * dumb --- .../rev_1656487501551472500.sql | 2 + .../game/Spells/SpellInfoCorrections.cpp | 6 + .../ZulGurub/boss_hazzarah.cpp | 153 +++++++++--------- 3 files changed, 80 insertions(+), 81 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1656487501551472500.sql diff --git a/data/sql/updates/pending_db_world/rev_1656487501551472500.sql b/data/sql/updates/pending_db_world/rev_1656487501551472500.sql new file mode 100644 index 000000000..65ee0b67c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1656487501551472500.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `DamageModifier` = 26 WHERE `entry` = 15163; diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 985ead07c..95de9e7cb 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4295,6 +4295,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Dispel = DISPEL_NONE; }); + // Summon Nightmare Illusions + ApplySpellFix({ 24681, 24728, 24729 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].MiscValueB = 64; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index d475bd966..be9b57e66 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -15,13 +15,6 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Hazzarah -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" @@ -45,100 +38,98 @@ enum Events EVENT_ILLUSIONS = 4 }; -class boss_hazzarah : public CreatureScript +struct boss_hazzarah : public BossAI { -public: - boss_hazzarah() : CreatureScript("boss_hazzarah") { } + boss_hazzarah(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } - struct boss_hazzarahAI : public BossAI + void JustSummoned(Creature* summon) override { - boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } + summons.Summon(summon); - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - - summon->SetCorpseDelay(10); - summon->SetReactState(REACT_PASSIVE); - summon->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); - summon->SetVisible(false); - summon->m_Events.AddEventAtOffset([summon]() + summon->SetCorpseDelay(10); + summon->SetReactState(REACT_PASSIVE); + summon->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); + summon->SetVisible(false); + summon->m_Events.AddEventAtOffset([summon]() { summon->SetVisible(true); }, 2s); - summon->m_Events.AddEventAtOffset([summon]() + summon->m_Events.AddEventAtOffset([summon]() { summon->RemoveUnitFlag(UNIT_FLAG_DISABLE_MOVE); summon->SetReactState(REACT_AGGRESSIVE); summon->SetInCombatWithZone(); - }, 3500ms); - } + }, 5s); + } - void EnterCombat(Unit* /*who*/) override + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + summons.Despawn(summon); + summon->DespawnOrUnsummon(); + } + + void EnterCombat(Unit* /*who*/) override + { + _EnterCombat(); + events.ScheduleEvent(EVENT_SLEEP, 12s, 15s); + events.ScheduleEvent(EVENT_EARTH_SHOCK, 8s, 18s); + events.ScheduleEvent(EVENT_CHAIN_BURN, 12s, 28s); + events.ScheduleEvent(EVENT_ILLUSIONS, 16s, 24s); + } + + bool CanAIAttack(Unit const* target) const override + { + if (me->GetThreatMgr().getThreatList().size() > 1 && me->GetThreatMgr().getOnlineContainer().getMostHated()->getTarget() == target) + return !target->HasAura(SPELL_SLEEP); + + return true; + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - _EnterCombat(); - events.ScheduleEvent(EVENT_SLEEP, 12s, 15s); - events.ScheduleEvent(EVENT_EARTH_SHOCK, 8s, 18s); - events.ScheduleEvent(EVENT_CHAIN_BURN, 12s, 28s); - events.ScheduleEvent(EVENT_ILLUSIONS, 16s, 24s); - } - - bool CanAIAttack(Unit const* target) const override - { - if (me->GetThreatMgr().getThreatList().size() > 1 && me->GetThreatMgr().getOnlineContainer().getMostHated()->getTarget() == target) - return !target->HasAura(SPELL_SLEEP); - - return true; - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SLEEP: - DoCastVictim(SPELL_SLEEP, true); - events.ScheduleEvent(EVENT_SLEEP, 24s, 32s); - return; - case EVENT_EARTH_SHOCK: - DoCastVictim(SPELL_EARTH_SHOCK); - events.ScheduleEvent(EVENT_EARTH_SHOCK, 8s, 18s); - break; - case EVENT_CHAIN_BURN: + case EVENT_SLEEP: + DoCastVictim(SPELL_SLEEP, true); + events.ScheduleEvent(EVENT_SLEEP, 24s, 32s); + return; + case EVENT_EARTH_SHOCK: + DoCastVictim(SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_EARTH_SHOCK, 8s, 18s); + break; + case EVENT_CHAIN_BURN: + if (me->GetPowerPct(POWER_MANA) > 5.f) // totally guessed + { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, [&](Unit* u) { return u && !u->IsPet() && u->getPowerType() == POWER_MANA; })) { - DoCast(target, SPELL_CHAIN_BURN, false); + DoCast(target, SPELL_CHAIN_BURN); } - events.ScheduleEvent(EVENT_CHAIN_BURN, 12s, 28s); - break; - case EVENT_ILLUSIONS: - DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_LEFT, true); - DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_BACK, true); - DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_RIGHT, true); - events.ScheduleEvent(EVENT_ILLUSIONS, 16s, 24s); - break; - default: - break; - } + } + events.ScheduleEvent(EVENT_CHAIN_BURN, 12s, 28s); + break; + case EVENT_ILLUSIONS: + DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_LEFT, true); + DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_BACK, true); + DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_RIGHT, true); + events.ScheduleEvent(EVENT_ILLUSIONS, 15s, 25s); + break; + default: + break; } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI(creature); + DoMeleeAttackIfReady(); } }; @@ -164,6 +155,6 @@ class spell_chain_burn : public SpellScript void AddSC_boss_hazzarah() { - new boss_hazzarah(); + RegisterZulGurubCreatureAI(boss_hazzarah); RegisterSpellScript(spell_chain_burn); }