From be5db26d249f3e512e6cc8af7767a7dafb1d211f Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Sun, 17 Sep 2023 07:43:10 -0300 Subject: [PATCH] fix(Scripts/MagtheridonLair): Magtheridon Debris (#17249) * fix(Core/Scripts): Magtheridon Debris * unhack * cleanup * eof line * unused variable * more cleanup --- .../rev_1694652704784938400.sql | 10 ++ .../game/Spells/SpellInfoCorrections.cpp | 10 +- .../MagtheridonsLair/boss_magtheridon.cpp | 91 ++++++++++++++----- .../instance_magtheridons_lair.cpp | 10 +- .../MagtheridonsLair/magtheridons_lair.h | 3 +- 5 files changed, 85 insertions(+), 39 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1694652704784938400.sql diff --git a/data/sql/updates/pending_db_world/rev_1694652704784938400.sql b/data/sql/updates/pending_db_world/rev_1694652704784938400.sql new file mode 100644 index 000000000..818520e57 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1694652704784938400.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `spell_script_names` WHERE `spell_id` = 30629 AND `ScriptName` = 'spell_magtheridon_debris_target_selector'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(30629, 'spell_magtheridon_debris_target_selector'); + +UPDATE `creature_template` SET `unit_flags` = `unit_flags`|33554432, `AIName` = '', `ScriptName` = 'npc_target_trigger' WHERE `entry` = 17516; + +DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 17516); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(17516, 0, 0, 0, 1, 0, 0, 0); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 24019070a..3aff2bee8 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -1530,8 +1530,8 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->ChannelInterruptFlags |= AURA_INTERRUPT_FLAG_MOVE; }); - // Debris - ApplySpellFix({ 36449 }, [](SpellInfo* spellInfo) + // Debris - Debris Visual + ApplySpellFix({ 36449, 30632 }, [](SpellInfo* spellInfo) { spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF; }); @@ -1542,12 +1542,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); - // Debris Visual - ApplySpellFix({ 30632 }, [](SpellInfo* spellInfo) - { - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DYNOBJ_ALLY); - }); - // Activate Sunblade Protecto ApplySpellFix({ 46475, 46476 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index 580e51d84..c9602b38b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -55,8 +55,10 @@ enum Spells SPELL_QUAKE_KNOCKBACK = 30571, SPELL_COLLAPSE_DAMAGE = 36449, SPELL_CAMERA_SHAKE = 36455, + SPELL_DEBRIS_TARGET = 30629, + SPELL_DEBRIS_SPAWN = 30630, + SPELL_DEBRIS_DAMAGE = 30631, SPELL_DEBRIS_VISUAL = 30632, - SPELL_DEBRIS_DAMAGE = 30631 }; enum Groups @@ -70,26 +72,9 @@ enum Actions ACTION_INCREASE_HELLFIRE_CHANNELER_DEATH_COUNT = 1 }; -class DealDebrisDamage : public BasicEvent -{ -public: - DealDebrisDamage(Creature& creature, ObjectGuid targetGUID) : _owner(creature), _targetGUID(targetGUID) { } - - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override - { - if (Unit* target = ObjectAccessor::GetUnit(_owner, _targetGUID)) - target->CastSpell(target, SPELL_DEBRIS_DAMAGE, true, nullptr, nullptr, _owner.GetGUID()); - return true; - } - -private: - Creature& _owner; - ObjectGuid _targetGUID; -}; - struct boss_magtheridon : public BossAI { - boss_magtheridon(Creature* creature) : BossAI(creature, TYPE_MAGTHERIDON) + boss_magtheridon(Creature* creature) : BossAI(creature, DATA_MAGTHERIDON) { scheduler.SetValidator([this] { @@ -137,11 +122,7 @@ struct boss_magtheridon : public BossAI _currentPhase = 0; scheduler.Schedule(20s, [this](TaskContext context) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random)) - { - target->CastSpell(target, SPELL_DEBRIS_VISUAL, true, nullptr, nullptr, me->GetGUID()); - me->m_Events.AddEvent(new DealDebrisDamage(*me, target->GetGUID()), me->m_Events.CalculateTime(5000)); - } + DoCastAOE(SPELL_DEBRIS_TARGET); context.Repeat(20s); }); }); @@ -248,7 +229,7 @@ struct boss_magtheridon : public BossAI BossAI::JustEngagedWith(who); Talk(SAY_EMOTE_BEGIN); - instance->DoForAllMinions(TYPE_MAGTHERIDON, [&](Creature* creature) { + instance->DoForAllMinions(DATA_MAGTHERIDON, [&](Creature* creature) { creature->SetInCombatWithZone(); }); @@ -289,6 +270,37 @@ private: TaskScheduler _interruptScheduler; }; +struct npc_target_trigger : public ScriptedAI +{ + npc_target_trigger(Creature* creature) : ScriptedAI(creature), _cast(false) + { + me->SetReactState(REACT_PASSIVE); + } + + void Reset() override + { + if (!_cast) + { + DoCastSelf(SPELL_DEBRIS_VISUAL); + _cast = true; + _scheduler.Schedule(5s, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_DEBRIS_DAMAGE); + me->DespawnOrUnsummon(6000); + }); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +protected: + TaskScheduler _scheduler; + bool _cast; +}; + class spell_magtheridon_blaze : public SpellScript { PrepareSpellScript(spell_magtheridon_blaze); @@ -348,6 +360,33 @@ class spell_magtheridon_quake : public SpellScript } }; +class spell_magtheridon_debris_target_selector : public SpellScript +{ + PrepareSpellScript(spell_magtheridon_debris_target_selector); + + void FilterTargets(std::list& targets) + { + targets.remove_if([&](WorldObject* target) -> bool + { + return target->GetEntry() != NPC_TARGET_TRIGGER; + }); + + Acore::Containers::RandomResize(targets, 1); + } + + void HandleHit() + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_DEBRIS_SPAWN); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_magtheridon_debris_target_selector::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnHit += SpellHitFn(spell_magtheridon_debris_target_selector::HandleHit); + } +}; + class go_manticron_cube : public GameObjectScript { public: @@ -369,8 +408,10 @@ public: void AddSC_boss_magtheridon() { RegisterMagtheridonsLairCreatureAI(boss_magtheridon); + RegisterMagtheridonsLairCreatureAI(npc_target_trigger); RegisterSpellScript(spell_magtheridon_blaze); RegisterSpellScript(spell_magtheridon_shadow_grasp); RegisterSpellScript(spell_magtheridon_quake); + RegisterSpellScript(spell_magtheridon_debris_target_selector); new go_manticron_cube(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp index 454479e9c..33b1c1113 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -21,18 +21,18 @@ BossBoundaryData const boundaries = { - { TYPE_MAGTHERIDON, new CircleBoundary(Position(-18.70f, 2.24f), 52.30) } + { DATA_MAGTHERIDON, new CircleBoundary(Position(-18.70f, 2.24f), 52.30) } }; DoorData const doorData[] = { - { GO_MAGTHERIDON_DOORS, TYPE_MAGTHERIDON, DOOR_TYPE_ROOM }, + { GO_MAGTHERIDON_DOORS, DATA_MAGTHERIDON, DOOR_TYPE_ROOM }, { 0, 0, DOOR_TYPE_ROOM } // END }; MinionData const minionData[] = { - { NPC_HELLFIRE_CHANNELER, TYPE_MAGTHERIDON } + { NPC_HELLFIRE_CHANNELER, DATA_MAGTHERIDON } }; class instance_magtheridons_lair : public InstanceMapScript @@ -133,7 +133,7 @@ public: if (!InstanceScript::SetBossState(id, state)) return false; - if (id == TYPE_MAGTHERIDON) + if (id == DATA_MAGTHERIDON) { if (state == IN_PROGRESS) { @@ -163,7 +163,7 @@ public: switch (type) { case DATA_CHANNELER_COMBAT: - if (GetBossState(TYPE_MAGTHERIDON) != IN_PROGRESS) + if (GetBossState(DATA_MAGTHERIDON) != IN_PROGRESS) if (Creature* magtheridon = instance->GetCreature(_magtheridonGUID)) magtheridon->SetInCombatWithZone(); break; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h index a65282235..4e2828016 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h @@ -27,7 +27,7 @@ enum DataTypes { - TYPE_MAGTHERIDON = 0, + DATA_MAGTHERIDON = 0, MAX_ENCOUNTER = 1, DATA_CHANNELER_COMBAT = 10, @@ -41,6 +41,7 @@ enum NpcIds NPC_HELLFIRE_CHANNELER = 17256, NPC_HELLFIRE_WARDER = 18829, NPC_HELLFIRE_RAID_TRIGGER = 17376, + NPC_TARGET_TRIGGER = 17474 }; enum GoIds