From fdb18e0204665b3c5b1ea03a9e3fd306e9827590 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 26 Jul 2022 01:25:29 -0300 Subject: [PATCH] fix(Scripts/RuinsOfAhnQiraj): Rewrite Moam (#12539) * fix(Scripts/RuinsOfAhnQiraj): Rewrite Moam * serverside spell for summons, as well as summon phase handling * end stone phase if he reaches full mana * add missing emote * remove unused variable * move script to the new model * Update boss_moam.cpp * should not drain mana while stoned --- .../rev_1658801275458302100.sql | 12 + .../Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp | 233 ++++++++++-------- 2 files changed, 136 insertions(+), 109 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1658801275458302100.sql diff --git a/data/sql/updates/pending_db_world/rev_1658801275458302100.sql b/data/sql/updates/pending_db_world/rev_1658801275458302100.sql new file mode 100644 index 000000000..c3423a875 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1658801275458302100.sql @@ -0,0 +1,12 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_moam_mana_drain_filter'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(25676, 'spell_moam_mana_drain_filter'); + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_moam_summon_mana_fiends'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(25684, 'spell_moam_summon_mana_fiends'); + +DELETE FROM `creature_text` WHERE `CreatureID` = 15340 AND `GroupID` = 2; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(15340, 2, 0, '%s drains your mana and turns to stone.', 16, 0, 100, 0, 0, 0, 11474, 0, 'moam EMOTE_STONE_PHASE'); diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index f1908a381..a4f70a104 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -15,21 +15,26 @@ * with this program. If not, see . */ +#include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" #include "ruins_of_ahnqiraj.h" enum Texts { EMOTE_AGGRO = 0, - EMOTE_MANA_FULL = 1 + EMOTE_MANA_FULL = 1, + EMOTE_STONE_PHASE = 2 }; enum Spells { SPELL_TRAMPLE = 15550, + SPELL_DRAIN_MANA_SERVERSIDE = 25676, SPELL_DRAIN_MANA = 25671, SPELL_ARCANE_ERUPTION = 25672, + SPELL_SUMMON_MANA_FIENDS = 25684, SPELL_SUMMON_MANA_FIEND_1 = 25681, // TARGET_DEST_CASTER_FRONT SPELL_SUMMON_MANA_FIEND_2 = 25682, // TARGET_DEST_CASTER_LEFT SPELL_SUMMON_MANA_FIEND_3 = 25683, // TARGET_DEST_CASTER_RIGHT @@ -46,134 +51,144 @@ enum Events EVENT_STONE_PHASE_END = 4 }; -enum Actions +struct boss_moam : public BossAI { - ACTION_STONE_PHASE_START = 1, - ACTION_STONE_PHASE_END = 2 -}; + boss_moam(Creature* creature) : BossAI(creature, DATA_MOAM) {} -class boss_moam : public CreatureScript -{ -public: - boss_moam() : CreatureScript("boss_moam") { } - - struct boss_moamAI : public BossAI + void Reset() override { - boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM) {} + _Reset(); + me->SetPower(POWER_MANA, 0); + me->SetRegeneratingPower(false); + } - void Reset() override + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + Talk(EMOTE_AGGRO); + events.ScheduleEvent(EVENT_STONE_PHASE, 90000); + events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 9000); + events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 3000); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + DoCastAOE(SPELL_LARGE_OBSIDIAN_CHUNK, true); + } + + void SummonedCreatureDies(Creature* /*creature*/, Unit* /*killer*/) override + { + if (!summons.IsAnyCreatureAlive() && me->HasAura(SPELL_ENERGIZE)) { - _Reset(); - me->SetPower(POWER_MANA, 0); - me->SetRegeneratingPower(false); - _isStonePhase = false; + events.RescheduleEvent(EVENT_STONE_PHASE_END, 1s); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) + { + if (me->HasAura(SPELL_ENERGIZE)) + { + me->RemoveAurasDueToSpell(SPELL_ENERGIZE); + events.RescheduleEvent(EVENT_STONE_PHASE_END, 1s); + } + + Talk(EMOTE_MANA_FULL); + DoCastAOE(SPELL_ARCANE_ERUPTION); } - void DoAction(int32 action) override + while (uint32 eventId = events.ExecuteEvent()) { - switch (action) + switch (eventId) { - case ACTION_STONE_PHASE_END: - { - me->RemoveAurasDueToSpell(SPELL_ENERGIZE); - events.ScheduleEvent(EVENT_STONE_PHASE, 90000); - _isStonePhase = false; - break; - } - case ACTION_STONE_PHASE_START: - { - DoCastSelf(SPELL_SUMMON_MANA_FIEND_1); - DoCastSelf(SPELL_SUMMON_MANA_FIEND_2); - DoCastSelf(SPELL_SUMMON_MANA_FIEND_3); - DoCastSelf(SPELL_ENERGIZE); - events.ScheduleEvent(EVENT_STONE_PHASE_END, 90000); - break; - } + case EVENT_STONE_PHASE: + Talk(EMOTE_STONE_PHASE); + DoCastAOE(SPELL_SUMMON_MANA_FIENDS); + DoCastSelf(SPELL_ENERGIZE); + events.CancelEvent(EVENT_SPELL_DRAIN_MANA); + events.ScheduleEvent(EVENT_STONE_PHASE_END, 90000); + break; + case EVENT_STONE_PHASE_END: + me->RemoveAurasDueToSpell(SPELL_ENERGIZE); + events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, urand(2000, 6000)); + events.ScheduleEvent(EVENT_STONE_PHASE, 90000); + break; + case EVENT_SPELL_DRAIN_MANA: + DoCastAOE(SPELL_DRAIN_MANA_SERVERSIDE); + events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, urand(2000, 6000)); + break; + case EVENT_SPELL_TRAMPLE: + DoCastAOE(SPELL_TRAMPLE); + events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 15000); + break; default: break; } } - void EnterCombat(Unit* who) override - { - BossAI::EnterCombat(who); - Talk(EMOTE_AGGRO); - events.ScheduleEvent(EVENT_STONE_PHASE, 90000); - events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 9000); - events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 3000); - } + DoMeleeAttackIfReady(); + } +}; - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - DoCastAOE(SPELL_LARGE_OBSIDIAN_CHUNK, true); - } +// 25676 - Drain Mana (server-side) +class spell_moam_mana_drain_filter : public SpellScript +{ + PrepareSpellScript(spell_moam_mana_drain_filter); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) - { - Talk(EMOTE_MANA_FULL); - DoCastAOE(SPELL_ARCANE_ERUPTION, true); - me->SetPower(POWER_MANA, 0); - } - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_STONE_PHASE: - DoAction(ACTION_STONE_PHASE_START); - break; - case EVENT_STONE_PHASE_END: - DoAction(ACTION_STONE_PHASE_END); - break; - case EVENT_SPELL_DRAIN_MANA: - { - std::list targetList; - { - const std::list& threatlist = me->GetThreatMgr().getThreatList(); - for (std::list::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) - { - if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->getPowerType() == POWER_MANA) - { - targetList.push_back((*itr)->getTarget()); - } - } - } - Acore::Containers::RandomResize(targetList, 6); - for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - { - DoCast(*itr, SPELL_DRAIN_MANA); - } - events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, urand(2000, 6000)); - break; - } - case EVENT_SPELL_TRAMPLE: - DoCastVictim(SPELL_TRAMPLE); - events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 15000); - break; - default: - break; - } - } - DoMeleeAttackIfReady(); - } - private: - bool _isStonePhase; - }; - - CreatureAI* GetAI(Creature* creature) const override + void FilterTargets(std::list& targets) { - return GetRuinsOfAhnQirajAI(creature); + targets.remove_if([&](WorldObject* target) -> bool + { + return !target->IsPlayer() || target->ToPlayer()->getPowerType() != POWER_MANA; + }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + caster->CastSpell(GetHitUnit(), SPELL_DRAIN_MANA, true); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_moam_mana_drain_filter::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_moam_mana_drain_filter::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 25684 - Summon Mana Fiends (server-side) +class spell_moam_summon_mana_fiends : public SpellScript +{ + PrepareSpellScript(spell_moam_summon_mana_fiends); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + const uint32 spellIds[3] = { SPELL_SUMMON_MANA_FIEND_1, SPELL_SUMMON_MANA_FIEND_2, SPELL_SUMMON_MANA_FIEND_3 }; + + for (uint32 spellId : spellIds) + { + GetCaster()->CastSpell((Unit*)nullptr, spellId, true); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_moam_summon_mana_fiends::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_boss_moam() { - new boss_moam(); + RegisterRuinsOfAhnQirajCreatureAI(boss_moam); + RegisterSpellScript(spell_moam_mana_drain_filter); + RegisterSpellScript(spell_moam_summon_mana_fiends); }