From 7069d99dca92ef21eaf9cb34a72a825470a78414 Mon Sep 17 00:00:00 2001 From: daobashun <49193927+fangshun2004@users.noreply.github.com> Date: Sun, 26 Jul 2026 03:47:25 +0800 Subject: [PATCH] fix(Scripts/ScarletMonastery): Scarlet Monastery Forgiveness Spell Visual (#26454) --- .../rev_1783128746972420200.sql | 13 ++++ .../instance_scarlet_monastery.cpp | 71 +++++++++++++++---- 2 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1783128746972420200.sql diff --git a/data/sql/updates/pending_db_world/rev_1783128746972420200.sql b/data/sql/updates/pending_db_world/rev_1783128746972420200.sql new file mode 100644 index 000000000..bc5e22aa6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783128746972420200.sql @@ -0,0 +1,13 @@ +-- SPELL_TRANSFORM_GHOST and SPELL_FORGIVENESS + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (28443, 28697); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(28443, 'spell_transform_ghost_visual'), +(28697, 'spell_forgiveness_dummy_visual'); + +-- Smartscript +-- Deleted 28 due to SPELL_FORGIVENESS attack death +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 3976) AND (`source_type` = 0) AND (`id` IN (24, 28, 29)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(3976, 0, 24, 28, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Commander Mograine - On Reached Point 1 - Start Attacking'),-- Change link 29 to 28 +(3976, 0, 28, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Commander Mograine - On Reached Point 1 - Enable Evade');-- Change id 29 to 28 diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp index 04e2e1337..ba72ead37 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp @@ -18,6 +18,8 @@ #include "InstanceMapScript.h" #include "scarletmonastery.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellScriptLoader.h" enum AshbringerEventMisc { @@ -39,17 +41,6 @@ enum AshbringerEventMisc GO_HIGH_INQUISITOR_DOOR = 104600 }; -enum AshbringerSpell -{ - //Highlord Mograine Spells - //Needs Fix: Increased the visual effect of spells on hit - SPELL_FORGIVENESS = 28697, - - //High Inquisitor Fairbanks - //Needs Fix: Increased the visual effect of spells on hit - SPELL_TRANSFORM_GHOST = 28443 -}; - enum DataTypes { TYPE_MOGRAINE_AND_WHITE_EVENT = 1, @@ -66,7 +57,7 @@ enum DataTypes GAMEOBJECT_PUMPKIN_SHRINE = 10 }; -float const CATHEDRAL_PULL_RANGE = 80.0f; // Distance from the Cathedral doors to where Mograine is standing +float constexpr CATHEDRAL_PULL_RANGE = 80.0f; // Distance from the Cathedral doors to where Mograine is standing class instance_scarlet_monastery : public InstanceMapScript { @@ -271,7 +262,63 @@ public: }; }; +enum AshbringerSpell +{ + SPELL_FORGIVENESS = 28697, + SPELL_FORGIVENESS_IMPACTKIT = 317, + SPELL_TRANSFORM_GHOST = 28443, + SPELL_TRANSFORM_IMPACTKIT=500 +}; + +// SPELL_FORGIVENESS = 28697 +class spell_forgiveness_dummy_visual : public SpellScript +{ + PrepareSpellScript(spell_forgiveness_dummy_visual); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + if (!target) + return; + + target->SendPlaySpellVisual(SPELL_FORGIVENESS_IMPACTKIT);//SPELL_FORGIVENESS IMPACTKIT 317 SpellVisualEntry.ImpactKit can't be used + + //Delay death to prevent the death of the creature from interrupting the animation display + target->m_Events.AddEventAtOffset([target]() -> void + { + target->KillSelf(); + }, 500ms); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_forgiveness_dummy_visual::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// SPELL_TRANSFORM_GHOST = 28443 +class spell_transform_ghost_visual: public SpellScript +{ + PrepareSpellScript(spell_transform_ghost_visual); + + void HandleAfterHit() + { + Unit* target = GetHitUnit(); + if (!target) + return; + + target->SendPlaySpellVisual(SPELL_TRANSFORM_IMPACTKIT); //SPELL_TRANSFORM_GHOST IMPACTKIT 500 + } + + void Register() override + { + AfterHit += SpellHitFn(spell_transform_ghost_visual::HandleAfterHit); + } +}; + void AddSC_instance_scarlet_monastery() { new instance_scarlet_monastery(); + RegisterSpellScript(spell_forgiveness_dummy_visual); + RegisterSpellScript(spell_transform_ghost_visual); }