aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2025_03_20_00_world.sql15
-rw-r--r--src/server/game/Spells/SpellMgr.cpp9
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp164
3 files changed, 187 insertions, 1 deletions
diff --git a/sql/updates/world/master/2025_03_20_00_world.sql b/sql/updates/world/master/2025_03_20_00_world.sql
new file mode 100644
index 00000000000..b5cc91ee35f
--- /dev/null
+++ b/sql/updates/world/master/2025_03_20_00_world.sql
@@ -0,0 +1,15 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_sha_doom_winds','spell_sha_hailstorm','spell_sha_fire_nova','spell_sha_flame_shock_fire_nova_enabler','spell_sha_ashen_catalyst');
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(466772,'spell_sha_doom_winds'),
+(334196,'spell_sha_hailstorm'),
+(333974,'spell_sha_fire_nova'),
+(466620,'spell_sha_flame_shock_fire_nova_enabler'),
+(390370,'spell_sha_ashen_catalyst');
+
+DELETE FROM `spell_proc` WHERE `SpellId` IN (334196,382888,382889,390370,390371);
+INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
+(334196,0x00,11,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x0,0x4,0x0,0x8,0x0,0,0,0,1), -- Hailstorm
+(382888,0x00,11,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x2,0x0,0x0,0,0,0,0), -- Flurry
+(382889,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x0,0x0,0x25F7,0x0,0x0,0,0,0,0), -- Flurry
+(390370,0x00,11,0x10000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0,0,0,0), -- Ashen Catalyst
+(390371,0x00,11,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x0,0x4,0x0,0x8,0x0,0,0,0,1); -- Ashen Catalyst
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 92914cec369..02914e4e163 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -5014,6 +5014,15 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->NegativeEffects[EFFECT_2] = true;
});
+ // Sundering
+ ApplySpellFix({ 197214 }, [](SpellInfo* spellInfo)
+ {
+ ApplySpellEffectFix(spellInfo, EFFECT_2, [](SpellEffectInfo* spellEffectInfo)
+ {
+ spellEffectInfo->TargetB = SpellImplicitTargetInfo();
+ });
+ });
+
// Headless Horseman Climax - Return Head (Hallow End)
// Headless Horseman Climax - Body Regen (confuse only - removed on death)
// Headless Horseman Climax - Head Is Dead
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 2d949cc2a4c..729b4accb30 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -52,6 +52,7 @@ enum ShamanSpells
SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE = 218558,
SPELL_SHAMAN_CHAINED_HEAL = 70809,
SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE = 187878,
+ SPELL_SHAMAN_DOOM_WINDS_DAMAGE = 469270,
SPELL_SHAMAN_DOOM_WINDS_LEGENDARY_COOLDOWN = 335904,
SPELL_SHAMAN_EARTHQUAKE = 61882,
SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN = 77505,
@@ -70,6 +71,8 @@ enum ShamanSpells
SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD = 120588,
SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166,
SPELL_SHAMAN_ENERGY_SURGE = 40465,
+ SPELL_SHAMAN_FIRE_NOVA_DAMAGE = 333977,
+ SPELL_SHAMAN_FIRE_NOVA_ENABLER = 466622,
SPELL_SHAMAN_FLAME_SHOCK = 188389,
SPELL_SHAMAN_FLAMETONGUE_ATTACK = 10444,
SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT = 334294,
@@ -81,6 +84,8 @@ enum ShamanSpells
SPELL_SHAMAN_GATHERING_STORMS = 198299,
SPELL_SHAMAN_GATHERING_STORMS_BUFF = 198300,
SPELL_SHAMAN_GHOST_WOLF = 2645,
+ SPELL_SHAMAN_HAILSTORM_BUFF = 334196,
+ SPELL_SHAMAN_HAILSTORM_TALENT = 334195,
SPELL_SHAMAN_HEALING_RAIN_VISUAL = 147490,
SPELL_SHAMAN_HEALING_RAIN_HEAL = 73921,
SPELL_SHAMAN_ICE_STRIKE_OVERRIDE_AURA = 466469,
@@ -96,6 +101,7 @@ enum ShamanSpells
SPELL_SHAMAN_LAVA_BURST = 51505,
SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE = 71824,
SPELL_SHAMAN_LAVA_BURST_OVERLOAD = 77451,
+ SPELL_SHAMAN_LAVA_LASH = 60103,
SPELL_SHAMAN_LAVA_SURGE = 77762,
SPELL_SHAMAN_LIGHTNING_BOLT = 188196,
SPELL_SHAMAN_LIGHTNING_BOLT_ENERGIZE = 214815,
@@ -302,6 +308,25 @@ private:
uint32 _healToDistribute = 0;
};
+// 390370 - Ashen Catalyst
+class spell_sha_ashen_catalyst : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_LASH });
+ }
+
+ void ReduceLavaLashCooldown(AuraEffect const* aurEff, ProcEventInfo const& /*procInfo*/) const
+ {
+ GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_SHAMAN_LAVA_LASH, -aurEff->GetAmount() * 100ms);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_ashen_catalyst::ReduceLavaLashCooldown, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+};
+
// 188443 - Chain Lightning
class spell_sha_chain_lightning : public SpellScript
{
@@ -451,6 +476,28 @@ class spell_sha_deeply_rooted_elements : public AuraScript
int32 _procAttempts = 0;
};
+// 466772 - Doom Winds
+class spell_sha_doom_winds : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHAMAN_DOOM_WINDS_DAMAGE });
+ }
+
+ void PeriodicTick(AuraEffect const* aurEff) const
+ {
+ GetTarget()->CastSpell(GetTarget()->GetPosition(), SPELL_SHAMAN_DOOM_WINDS_DAMAGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringAura = aurEff
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_doom_winds::PeriodicTick, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
// 335902 - Doom Winds
class spell_sha_doom_winds_legendary : public AuraScript
{
@@ -793,6 +840,78 @@ class spell_sha_elemental_blast : public SpellScript
}
};
+struct FireNovaTargetCheck
+{
+ static constexpr float MaxSearchRange = 40.0f;
+
+ Unit const* Shaman;
+
+ bool operator()(Unit const* candidate) const
+ {
+ return candidate->IsWithinDist3d(Shaman, MaxSearchRange) && candidate->HasAura(SPELL_SHAMAN_FLAME_SHOCK, Shaman->GetGUID());
+ }
+};
+
+// 333974 - Fire Nova
+class spell_sha_fire_nova : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHAMAN_FIRE_NOVA_DAMAGE });
+ }
+
+ void TriggerDamage(SpellEffIndex /*effIndex*/) const
+ {
+ Unit* shaman = GetCaster();
+ std::vector<Unit*> targets;
+ FireNovaTargetCheck check{ .Shaman = shaman };
+ Trinity::UnitListSearcher searcher(shaman, targets, check);
+ Cell::VisitAllObjects(shaman, searcher, FireNovaTargetCheck::MaxSearchRange);
+
+ CastSpellExtraArgs args;
+ args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ args.SetTriggeringSpell(GetSpell());
+
+ for (Unit* target : targets)
+ shaman->CastSpell(target, SPELL_SHAMAN_FIRE_NOVA_DAMAGE, args);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova::TriggerDamage, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 466620 - Flame Shock
+class spell_sha_flame_shock_fire_nova_enabler : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHAMAN_FLAME_SHOCK, SPELL_SHAMAN_FIRE_NOVA_ENABLER });
+ }
+
+ void CheckFlameShocks(AuraEffect const* aurEff) const
+ {
+ Unit* shaman = GetTarget();
+ Unit* target = nullptr;
+ FireNovaTargetCheck check{ .Shaman = shaman };
+ Trinity::UnitSearcher searcher(shaman, target, check);
+ Cell::VisitAllObjects(shaman, searcher, FireNovaTargetCheck::MaxSearchRange);
+ if (target)
+ shaman->CastSpell(shaman, SPELL_SHAMAN_FIRE_NOVA_ENABLER, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringAura = aurEff
+ });
+ else
+ shaman->RemoveAurasDueToSpell(SPELL_SHAMAN_FIRE_NOVA_ENABLER);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_flame_shock_fire_nova_enabler::CheckFlameShocks, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
// 318038 - Flametongue Weapon
class spell_sha_flametongue_weapon : public SpellScript
{
@@ -850,6 +969,35 @@ class spell_sha_flametongue_weapon_aura : public AuraScript
}
};
+// 334196 - Hailstorm
+class spell_sha_hailstorm : public AuraScript
+{
+ void CalcCleaveMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ {
+ if (!spellMod)
+ {
+ SpellModifierByClassMask* mod = new SpellModifierByClassMask(GetAura());
+ mod->op = SpellModOp::ChainTargets;
+ mod->type = SPELLMOD_FLAT;
+ mod->spellId = GetId();
+ mod->mask = { 0x80000000, 0x00000000, 0x00000000, 0x00000000 };
+
+ spellMod = mod;
+ }
+
+ if (AuraEffect const* hailstormPassive = GetUnitOwner()->GetAuraEffect(SPELL_SHAMAN_HAILSTORM_TALENT, EFFECT_0))
+ {
+ int32 targetCap = hailstormPassive->GetAmount() / aurEff->GetBaseAmount();
+ static_cast<SpellModifierByClassMask*>(spellMod)->value = std::min<int32>(targetCap, GetStackAmount()) + 1;
+ }
+ }
+
+ void Register() override
+ {
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_sha_hailstorm::CalcCleaveMod, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+};
+
// 73920 - Healing Rain (Aura)
class spell_sha_healing_rain_aura : public AuraScript
{
@@ -1401,7 +1549,9 @@ struct spell_sha_maelstrom_weapon_base
SPELL_SHAMAN_OVERFLOWING_MAELSTROM_TALENT,
SPELL_SHAMAN_OVERFLOWING_MAELSTROM_AURA,
SPELL_SHAMAN_STORMWEAVER_PVP_TALENT_BUFF,
- SPELL_SHAMAN_ICE_STRIKE_PROC
+ SPELL_SHAMAN_ICE_STRIKE_PROC,
+ SPELL_SHAMAN_HAILSTORM_BUFF,
+ SPELL_SHAMAN_HAILSTORM_TALENT
}) && SpellScriptBase::ValidateSpellEffect
({
{ SPELL_SHAMAN_MAELSTROM_WEAPON_MOD_AURA, EFFECT_1 },
@@ -1455,6 +1605,13 @@ struct spell_sha_maelstrom_weapon_base
if (spell_sha_ice_strike_proc* script = iceStrike->GetScript<spell_sha_ice_strike_proc>())
script->AttemptProc();
+ if (shaman->HasAura(SPELL_SHAMAN_HAILSTORM_TALENT))
+ shaman->CastSpell(shaman, SPELL_SHAMAN_HAILSTORM_BUFF, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = consumingSpell,
+ .SpellValueOverrides = { { SPELLVALUE_AURA_STACK, std::min<int32>(stacks, maelstromWeaponVisibleAura->GetStackAmount()) } }
+ });
+
if (maelstromWeaponVisibleAura->ModStackAmount(-stacks))
return;
@@ -2469,10 +2626,12 @@ void AddSC_shaman_spell_scripts()
RegisterSpellScript(spell_sha_ancestral_guidance_heal);
RegisterSpellScript(spell_sha_arctic_snowstorm);
RegisterSpellScript(spell_sha_ascendance_restoration);
+ RegisterSpellScript(spell_sha_ashen_catalyst);
RegisterSpellScript(spell_sha_chain_lightning);
RegisterSpellScript(spell_sha_chain_lightning_overload);
RegisterSpellScript(spell_sha_crash_lightning);
RegisterSpellScript(spell_sha_deeply_rooted_elements);
+ RegisterSpellScript(spell_sha_doom_winds);
RegisterSpellScript(spell_sha_doom_winds_legendary);
RegisterSpellScript(spell_sha_downpour);
RegisterSpellScript(spell_sha_earth_shield);
@@ -2483,8 +2642,11 @@ void AddSC_shaman_spell_scripts()
RegisterSpellScript(spell_sha_earthquake);
RegisterSpellScript(spell_sha_earthquake_tick);
RegisterSpellScript(spell_sha_elemental_blast);
+ RegisterSpellScript(spell_sha_fire_nova);
+ RegisterSpellScript(spell_sha_flame_shock_fire_nova_enabler);
RegisterSpellScript(spell_sha_flametongue_weapon);
RegisterSpellScript(spell_sha_flametongue_weapon_aura);
+ RegisterSpellScript(spell_sha_hailstorm);
RegisterSpellAndAuraScriptPair(spell_sha_healing_rain, spell_sha_healing_rain_aura);
RegisterSpellScript(spell_sha_healing_rain_target_limit);
RegisterSpellScript(spell_sha_healing_stream_totem_heal);