diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-12-18 19:30:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-18 19:30:35 +0200 |
commit | a8464d34bb0f77e0d616e6f21aaf7d7a79276180 (patch) | |
tree | 6d6d9eb17eee87b51dac5e2ff23029197bbf0091 | |
parent | 8ac63c7952bf74066abbbe981b5168bc02ad3efb (diff) |
Scripts/Quest: Rework 'The Cleansing' (11317,11322) (#27413)
-rw-r--r-- | sql/updates/world/3.3.5/2021_12_18_08_world.sql | 93 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_howling_fjord.cpp | 137 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 24 | ||||
-rw-r--r-- | src/server/scripts/World/go_scripts.cpp | 43 |
4 files changed, 253 insertions, 44 deletions
diff --git a/sql/updates/world/3.3.5/2021_12_18_08_world.sql b/sql/updates/world/3.3.5/2021_12_18_08_world.sql new file mode 100644 index 00000000000..0c1561926b4 --- /dev/null +++ b/sql/updates/world/3.3.5/2021_12_18_08_world.sql @@ -0,0 +1,93 @@ +-- +UPDATE `gameobject_template` SET `ScriptName` = '' WHERE `entry` = 186649; + +UPDATE `conditions` SET `SourceGroup` = 7 WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 50218; +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = -43351; + +DELETE FROM `spell_script_names` WHERE +(`spell_id` = 43365 AND `ScriptName` = 'spell_the_cleansing_shrine_cast') OR +(`spell_id` = 43351 AND `ScriptName` = 'spell_the_cleansing_cleansing_soul') OR +(`spell_id` = 50217 AND `ScriptName` = 'spell_the_cleansing_mirror_image_script_effect') OR +(`spell_id` = 50238 AND `ScriptName` = 'spell_the_cleansing_on_death_cast_on_master') OR +(`spell_id` = 39823 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 39825 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40201 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40203 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40204 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40205 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40206 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40207 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40208 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40210 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40213 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40217 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40218 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40233 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40252 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 40352 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 50014 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 50023 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 50219 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 50221 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 50222 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 50223 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 53374 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 60807 AND `ScriptName` = 'spell_gen_whisper_to_controller') OR +(`spell_id` = 60811 AND `ScriptName` = 'spell_gen_whisper_to_controller'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(43365,'spell_the_cleansing_shrine_cast'), +(43351,'spell_the_cleansing_cleansing_soul'), +(50217,'spell_the_cleansing_mirror_image_script_effect'), +(50238,'spell_the_cleansing_on_death_cast_on_master'), +(39823,'spell_gen_whisper_to_controller'), +(39825,'spell_gen_whisper_to_controller'), +(40201,'spell_gen_whisper_to_controller'), +(40203,'spell_gen_whisper_to_controller'), +(40204,'spell_gen_whisper_to_controller'), +(40205,'spell_gen_whisper_to_controller'), +(40206,'spell_gen_whisper_to_controller'), +(40207,'spell_gen_whisper_to_controller'), +(40208,'spell_gen_whisper_to_controller'), +(40210,'spell_gen_whisper_to_controller'), +(40213,'spell_gen_whisper_to_controller'), +(40217,'spell_gen_whisper_to_controller'), +(40218,'spell_gen_whisper_to_controller'), +(40233,'spell_gen_whisper_to_controller'), +(40252,'spell_gen_whisper_to_controller'), +(40352,'spell_gen_whisper_to_controller'), +(50014,'spell_gen_whisper_to_controller'), +(50023,'spell_gen_whisper_to_controller'), +(50219,'spell_gen_whisper_to_controller'), +(50221,'spell_gen_whisper_to_controller'), +(50222,'spell_gen_whisper_to_controller'), +(50223,'spell_gen_whisper_to_controller'), +(53374,'spell_gen_whisper_to_controller'), +(60807,'spell_gen_whisper_to_controller'), +(60811,'spell_gen_whisper_to_controller'); + +DELETE FROM `smart_scripts` WHERE `entryorguid` = 27959 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 2795900 AND `source_type` = 9; +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`,`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 +(27959,0,0,0,37,0,100,0,0,0,0,0,0,116,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On AI Initialize - Set Corpse Delay"), +(27959,0,1,0,11,0,100,0,0,0,0,0,0,80,2795900,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Spawn - Run Script"), +(27959,0,2,0,2,0,100,1,0,50,0,0,0,11,50222,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - Between 0-50% Health - Cast 'The Cleansing: Your Inner Turmoil's Whisper to Controller - On Health 50%' (No Repeat)"), +(27959,0,3,0,6,0,100,0,0,0,0,0,0,11,50223,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Death - Cast 'The Cleansing: Your Inner Turmoil's Whisper to Controller - On Death'"), +(27959,0,4,0,6,0,100,0,0,0,0,0,0,11,50238,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Death - Cast 'The Cleansing: Your Inner Turmoil's On Death Cast on Master'"), +-- It has SPELL_ATTR3_DEATH_PERSISTENT but actually is removed after death, maybe not manually +-- Kinda odd because it makes creature invisible, but Copy Weapon auras are not removed, so only weapons are visible without body +(27959,0,5,0,6,0,100,0,0,0,0,0,0,28,50218,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Death - Remove Aura 'The Cleansing: Your Inner Turmoil's Mirror Image Aura'"), + +(2795900,9,0,0,0,0,100,0,0,0,0,0,0,11,50217,0,0,0,0,0,23,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Cast 'The Cleansing: Script Effect Player Cast Mirror Image'"), +(2795900,9,1,0,0,0,100,0,0,0,0,0,0,11,41408,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Cast 'Shadowform'"), +(2795900,9,2,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Set Orientation Summoner"), +(2795900,9,3,0,0,0,100,0,0,0,0,0,0,11,50219,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Cast 'The Cleansing: Your Inner Turmoil's Whisper to Controller - Spawn 01'"), +(2795900,9,4,0,0,0,100,0,0,0,0,0,0,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Play Emote 1"), +(2795900,9,5,0,0,0,100,0,6000,6000,0,0,0,66,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Set Orientation Summoner"), +(2795900,9,6,0,0,0,100,0,0,0,0,0,0,11,50221,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Cast 'The Cleansing: Your Inner Turmoil's Whisper to Controller - Spawn 02'"), +(2795900,9,7,0,0,0,100,0,0,0,0,0,0,5,25,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Play Emote 25"), +-- Yes, again +(2795900,9,8,0,0,0,100,0,6000,6000,0,0,0,11,50217,0,0,0,0,0,23,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Cast 'The Cleansing: Script Effect Player Cast Mirror Image'"), +(2795900,9,9,0,0,0,100,0,0,0,0,0,0,144,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Set ImmunePC Off"), +(2795900,9,10,0,0,0,100,0,0,0,0,0,0,49,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,"Your Inner Turmoil - On Script - Start Attack Summoner"); + +DELETE FROM `creature_text` WHERE `CreatureID` = 27959; diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 166bf51967b..13def298a0f 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -18,11 +18,13 @@ #include "ScriptMgr.h" #include "MotionMaster.h" #include "ObjectAccessor.h" +#include "ObjectMgr.h" #include "Player.h" #include "QuestDef.h" #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" +#include "Spell.h" #include "SpellInfo.h" #include "SpellScript.h" #include "TemporarySummon.h" @@ -362,6 +364,135 @@ class spell_rivenwood_captives_on_quest : public SpellScript } }; +/*###### +## Quest 11317, 11322: The Cleansing +######*/ + +enum TheCleansing +{ + SPELL_CLEANSING_SOUL = 43351, + SPELL_SUMMON_INNER_TURMOIL = 50167, + SPELL_RECENT_MEDITATION = 61720, + SPELL_MIRROR_IMAGE_AURA = 50218, + + QUEST_THE_CLEANSING_H = 11317, + QUEST_THE_CLEANSING_A = 11322 +}; + +// 43365 - The Cleansing: Shrine Cast +class spell_the_cleansing_shrine_cast : public SpellScript +{ + PrepareSpellScript(spell_the_cleansing_shrine_cast); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_RECENT_MEDITATION, SPELL_CLEANSING_SOUL }) && + sObjectMgr->GetQuestTemplate(QUEST_THE_CLEANSING_H) && + sObjectMgr->GetQuestTemplate(QUEST_THE_CLEANSING_A); + } + + SpellCastResult CheckCast() + { + // Error is correct for quest check but may be not correct for aura and this may be a wrong place to send error + if (Player* target = GetExplTargetUnit()->ToPlayer()) + { + if (target->HasAura(SPELL_RECENT_MEDITATION) || (!(target->GetQuestStatus(QUEST_THE_CLEANSING_H) == QUEST_STATUS_INCOMPLETE || + target->GetQuestStatus(QUEST_THE_CLEANSING_A) == QUEST_STATUS_INCOMPLETE))) + { + Spell::SendCastResult(target, GetSpellInfo(), 0, SPELL_FAILED_FIZZLE); + return SPELL_FAILED_FIZZLE; + } + } + return SPELL_CAST_OK; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_CLEANSING_SOUL, true); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_the_cleansing_shrine_cast::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_the_cleansing_shrine_cast::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 43351 - Cleansing Soul +class spell_the_cleansing_cleansing_soul : public AuraScript +{ + PrepareAuraScript(spell_the_cleansing_cleansing_soul); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_INNER_TURMOIL, SPELL_RECENT_MEDITATION }); + } + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetStandState(UNIT_STAND_STATE_SIT); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->SetStandState(UNIT_STAND_STATE_STAND); + target->CastSpell(target, SPELL_SUMMON_INNER_TURMOIL, true); + target->CastSpell(target, SPELL_RECENT_MEDITATION, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_the_cleansing_cleansing_soul::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_cleansing_cleansing_soul::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 50217 - The Cleansing: Script Effect Player Cast Mirror Image +class spell_the_cleansing_mirror_image_script_effect : public SpellScript +{ + PrepareSpellScript(spell_the_cleansing_mirror_image_script_effect); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MIRROR_IMAGE_AURA }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_MIRROR_IMAGE_AURA, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_the_cleansing_mirror_image_script_effect::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 50238 - The Cleansing: Your Inner Turmoil's On Death Cast on Master +class spell_the_cleansing_on_death_cast_on_master : public SpellScript +{ + PrepareSpellScript(spell_the_cleansing_on_death_cast_on_master); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + if (TempSummon* casterSummon = caster->ToTempSummon()) + if (Unit* summoner = casterSummon->GetSummonerUnit()) + summoner->CastSpell(summoner, GetEffectInfo().CalcValue(), true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_the_cleansing_on_death_cast_on_master::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_howling_fjord() { RegisterCreatureAI(npc_daegarn); @@ -369,4 +500,8 @@ void AddSC_howling_fjord() RegisterSpellScript(spell_mindless_abomination_explosion_fx_master); RegisterSpellScript(spell_rivenwood_captives_not_on_quest); RegisterSpellScript(spell_rivenwood_captives_on_quest); - } + RegisterSpellScript(spell_the_cleansing_shrine_cast); + RegisterSpellScript(spell_the_cleansing_cleansing_soul); + RegisterSpellScript(spell_the_cleansing_mirror_image_script_effect); + RegisterSpellScript(spell_the_cleansing_on_death_cast_on_master); +} diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 6134db00e95..a2f72fd420d 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3680,6 +3680,29 @@ class spell_gen_whisper_gulch_yogg_saron_whisper : public AuraScript } }; +class spell_gen_whisper_to_controller : public SpellScript +{ + PrepareSpellScript(spell_gen_whisper_to_controller); + + bool Validate(SpellInfo const* spellInfo) override + { + return sObjectMgr->GetBroadcastText(uint32(spellInfo->GetEffect(EFFECT_0).CalcValue())); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + if (TempSummon* casterSummon = caster->ToTempSummon()) + if (Player* target = casterSummon->GetSummonerUnit()->ToPlayer()) + casterSummon->Unit::Whisper(uint32(GetEffectValue()), target, false); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_whisper_to_controller::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + class spell_gen_eject_all_passengers : public SpellScript { PrepareSpellScript(spell_gen_eject_all_passengers); @@ -4572,6 +4595,7 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_vendor_bark_trigger); RegisterSpellScript(spell_gen_wg_water); RegisterSpellScript(spell_gen_whisper_gulch_yogg_saron_whisper); + RegisterSpellScript(spell_gen_whisper_to_controller); RegisterSpellScript(spell_gen_eject_all_passengers); RegisterSpellScript(spell_gen_eject_passenger); RegisterSpellScriptWithArgs(spell_gen_eject_passenger_with_seatId, "spell_gen_eject_passenger_1", 0); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 09c86e6222a..e28384c8d4d 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -640,48 +640,6 @@ class go_veil_skith_cage : public GameObjectScript }; /*###### -## go_frostblade_shrine -######*/ - -enum TheCleansing -{ - QUEST_THE_CLEANSING_HORDE = 11317, - QUEST_THE_CLEANSING_ALLIANCE = 11322, - SPELL_CLEANSING_SOUL = 43351, - SPELL_RECENT_MEDITATION = 61720, -}; - -class go_frostblade_shrine : public GameObjectScript -{ -public: - go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } - - struct go_frostblade_shrineAI : public GameObjectAI - { - go_frostblade_shrineAI(GameObject* go) : GameObjectAI(go) { } - - bool OnGossipHello(Player* player) override - { - me->UseDoorOrButton(10); - if (!player->HasAura(SPELL_RECENT_MEDITATION)) - { - if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) - { - player->CastSpell(player, SPELL_CLEANSING_SOUL); - player->SetStandState(UNIT_STAND_STATE_SIT); - } - } - return true; - } - }; - - GameObjectAI* GetAI(GameObject* go) const override - { - return new go_frostblade_shrineAI(go); - } -}; - -/*###### ## go_midsummer_bonfire ######*/ @@ -1270,7 +1228,6 @@ void AddSC_go_scripts() new go_amberpine_outhouse(); new go_massive_seaforium_charge(); new go_veil_skith_cage(); - new go_frostblade_shrine(); new go_midsummer_bonfire(); new go_midsummer_ribbon_pole(); new go_brewfest_music(); |