diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-07-28 21:28:32 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-28 20:28:32 +0200 |
commit | b75d047a33597a9f576632d07a4f3ba2546c5e6e (patch) | |
tree | 64b0fe6bbe849a08e069a4cf213ebea496d7bdf1 /src | |
parent | 994b1df1158a5f4a6c045f8c5b470be04b7ac46f (diff) |
Scripts/Spells: Implement Cataclysm Breath & Chaos Breath & Death Count (#31172)
* Implement Cataclysm Breath (forces creature to cast 4 of 8 random spells)
* Implement Chaos Breath (forces creature to cast 3 of 8 random spells)
* Implement Death Count remover spell (replace SAI implementation with spell script)
Closes #30320
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp | 79 | ||||
-rw-r--r-- | src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp | 84 |
2 files changed, 125 insertions, 38 deletions
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp index a583555a460..97d507884f9 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp @@ -15,51 +15,54 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Sunwell_Plateau -SD%Complete: 0 -SDComment: Placeholder, Epilogue after Kil'jaeden, Captain Selana Gossips -EndScriptData */ - -/* ContentData -npc_prophet_velen -npc_captain_selana -EndContentData */ - #include "ScriptMgr.h" -#include "ScriptedCreature.h" +#include "Containers.h" +#include "SpellScript.h" +#include "Unit.h" #include "sunwell_plateau.h" -/*###### -## npc_prophet_velen -######*/ - -enum ProphetSpeeches +enum CataclysmBreath { - PROPHET_SAY1 = -1580099, - PROPHET_SAY2 = -1580100, - PROPHET_SAY3 = -1580101, - PROPHET_SAY4 = -1580102, - PROPHET_SAY5 = -1580103, - PROPHET_SAY6 = -1580104, - PROPHET_SAY7 = -1580105, - PROPHET_SAY8 = -1580106 + SPELL_CORROSIVE_POISON = 46293, + SPELL_FEVERED_FATIGUE = 46294, + SPELL_HEX = 46295, + SPELL_NECROTIC_POISON = 46296, + SPELL_PIERCING_SHADOW = 46297, + SPELL_SHRINK = 46298, + SPELL_WAVERING_WILL = 46299, + SPELL_WITHERED_TOUCH = 46300 }; -enum LiadrinnSpeeches +// 46292 - Cataclysm Breath +class spell_sunwell_plateau_cataclysm_breath : public SpellScript { - LIADRIN_SAY1 = -1580107, - LIADRIN_SAY2 = -1580108, - LIADRIN_SAY3 = -1580109 -}; + PrepareSpellScript(spell_sunwell_plateau_cataclysm_breath); + + static constexpr std::array<uint32, 8> PossibleSpells = { SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_HEX, SPELL_NECROTIC_POISON, SPELL_PIERCING_SHADOW, SPELL_SHRINK, SPELL_WAVERING_WILL, SPELL_WITHERED_TOUCH }; -/*###### -## npc_captain_selana -######*/ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo(PossibleSpells); + } -#define CS_GOSSIP1 "Give me a situation report, Captain." -#define CS_GOSSIP2 "What went wrong?" -#define CS_GOSSIP3 "Why did they stop?" -#define CS_GOSSIP4 "Your insight is appreciated." + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + std::array<uint32, 8> spellsToCast = PossibleSpells; -void AddSC_sunwell_plateau() { } + Trinity::Containers::RandomShuffle(spellsToCast); + + for (uint32 i = 0; i < 4; ++i) + caster->CastSpell(caster, spellsToCast[i]); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_sunwell_plateau_cataclysm_breath::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +void AddSC_sunwell_plateau() +{ + RegisterSpellScript(spell_sunwell_plateau_cataclysm_breath); +} diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index 4ec8b22c8a5..3da8b09b26c 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -21,10 +21,12 @@ #include "ScriptMgr.h" #include "arcatraz.h" +#include "Containers.h" #include "InstanceScript.h" #include "MotionMaster.h" #include "ScriptedCreature.h" #include "SpellInfo.h" +#include "SpellScript.h" enum MillhouseTexts { @@ -680,8 +682,90 @@ private: bool _inProgress; }; +enum ChaosBreath +{ + SPELL_NECROTIC_POISON = 36693, + SPELL_CORROSIVE_POISON = 36694, + SPELL_FEVERED_FATIGUE = 36695, + SPELL_WITHERED_TOUCH = 36696, + SPELL_SHRINK = 36697, + SPELL_PIERCING_SHADOW = 36698, + SPELL_WAVERING_WILL = 36699, + SPELL_HEX = 36700 +}; + +// 36677 - Chaos Breath +class spell_arcatraz_chaos_breath : public SpellScript +{ + PrepareSpellScript(spell_arcatraz_chaos_breath); + + static constexpr std::array<uint32, 8> PossibleSpells = { SPELL_NECROTIC_POISON, SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_WITHERED_TOUCH, SPELL_SHRINK, SPELL_PIERCING_SHADOW, SPELL_WAVERING_WILL, SPELL_HEX }; + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo(PossibleSpells); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + std::array<uint32, 8> spellsToCast = PossibleSpells; + + Trinity::Containers::RandomShuffle(spellsToCast); + + for (uint32 i = 0; i < 3; ++i) + caster->CastSpell(caster, spellsToCast[i]); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_arcatraz_chaos_breath::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +enum DeathCountRemover +{ + SPELL_DEATH_COUNT_DAMAGE = 36657, + SPELL_DEATH_COUNT_DAMAGE_H = 38818, + SPELL_DEATH_COUNT_REMOVER = 36660, + SPELL_DEATH_COUNT_REMOVER_H = 38820 +}; + +// 36660, 38820 - Death Count +class spell_arcatraz_death_count : public AuraScript +{ + PrepareAuraScript(spell_arcatraz_death_count); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_DEATH_COUNT_DAMAGE, SPELL_DEATH_COUNT_DAMAGE_H }); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + switch (GetId()) + { + case SPELL_DEATH_COUNT_REMOVER: + GetTarget()->RemoveAurasDueToSpell(SPELL_DEATH_COUNT_DAMAGE); + break; + case SPELL_DEATH_COUNT_REMOVER_H: + GetTarget()->RemoveAurasDueToSpell(SPELL_DEATH_COUNT_DAMAGE_H); + break; + default: + break; + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_arcatraz_death_count::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_arcatraz() { RegisterArcatrazCreatureAI(npc_millhouse_manastorm); RegisterArcatrazCreatureAI(npc_warden_mellichar); + RegisterSpellScript(spell_arcatraz_chaos_breath); + RegisterSpellScript(spell_arcatraz_death_count); } |