aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-03-16 19:46:17 +0100
committerShauren <shauren.trinity@gmail.com>2025-03-16 19:46:17 +0100
commit521a357e248e57c7449ec2154780849d25f88e8e (patch)
treea7b00791985a2b2650d255bdd85b7075547e3b6d /src/server
parent79d12e90442914de5fc9a15f47bf4257b46bd3a2 (diff)
Scripts/Spells: Fixed shaman talents Hot Hand, Ice Strike, Molten Assault, Lava Lash, Elemental Blast, Forceful Winds, Unruly Winds, Tempest Strikes
Diffstat (limited to 'src/server')
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp202
1 files changed, 180 insertions, 22 deletions
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index edf5bff9680..e33bab1c47a 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -65,7 +65,6 @@ enum ShamanSpells
SPELL_SHAMAN_ELECTRIFIED = 64930,
SPELL_SHAMAN_ELEMENTAL_BLAST = 117014,
SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT = 118522,
- SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE = 344645,
SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE = 173183,
SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY = 173184,
SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD = 120588,
@@ -75,6 +74,8 @@ enum ShamanSpells
SPELL_SHAMAN_FLAMETONGUE_ATTACK = 10444,
SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT = 334294,
SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA = 319778,
+ SPELL_SHAMAN_FORCEFUL_WINDS_PROC = 262652,
+ SPELL_SHAMAN_FORCEFUL_WINDS_TALENT = 262647,
SPELL_SHAMAN_FROST_SHOCK = 196840,
SPELL_SHAMAN_FROST_SHOCK_ENERGIZE = 289439,
SPELL_SHAMAN_GATHERING_STORMS = 198299,
@@ -82,6 +83,8 @@ enum ShamanSpells
SPELL_SHAMAN_GHOST_WOLF = 2645,
SPELL_SHAMAN_HEALING_RAIN_VISUAL = 147490,
SPELL_SHAMAN_HEALING_RAIN_HEAL = 73921,
+ SPELL_SHAMAN_ICE_STRIKE_OVERRIDE_AURA = 466469,
+ SPELL_SHAMAN_ICE_STRIKE_PROC = 466467,
SPELL_SHAMAN_ICEFURY = 210714,
SPELL_SHAMAN_ICEFURY_OVERLOAD = 219271,
SPELL_SHAMAN_IGNEOUS_POTENTIAL = 279830,
@@ -105,6 +108,7 @@ enum ShamanSpells
SPELL_SHAMAN_MAELSTROM_WEAPON_OVERLAY = 187890,
SPELL_SHAMAN_MAELSTROM_WEAPON_OVERLAY_HEALS = 412692,
SPELL_SHAMAN_MASTERY_ELEMENTAL_OVERLOAD = 168534,
+ SPELL_SHAMAN_MOLTEN_ASSAULT = 334033,
SPELL_SHAMAN_OVERFLOWING_MAELSTROM_AURA = 384669,
SPELL_SHAMAN_OVERFLOWING_MAELSTROM_TALENT = 384149,
SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD = 210621,
@@ -129,6 +133,7 @@ enum ShamanSpells
SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER = 28825,
SPELL_SHAMAN_UNDULATION_PROC = 216251,
SPELL_SHAMAN_UNLIMITED_POWER_BUFF = 272737,
+ SPELL_SHAMAN_UNRULY_WINDS = 390288,
SPELL_SHAMAN_VOLCANIC_SURGE = 408572,
SPELL_SHAMAN_VOLTAIC_BLAZE_DAMAGE = 470057,
SPELL_SHAMAN_VOLTAIC_BLAZE_OVERRIDE = 470058,
@@ -738,7 +743,7 @@ class spell_sha_earthquake_tick : public SpellScript
// 120588 - Elemental Blast Overload
class spell_sha_elemental_blast : public SpellScript
{
- static constexpr uint32 BuffSpells[] = { SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT, SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE, SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY };
+ static constexpr std::array<uint32, 3> BuffSpells = { SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT, SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE, SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY };
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -746,29 +751,28 @@ class spell_sha_elemental_blast : public SpellScript
{
SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT,
SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE,
- SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY,
- SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE,
- SPELL_SHAMAN_MAELSTROM_CONTROLLER
+ SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY
}) && ValidateSpellEffect({
- { SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_10 },
{ SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF, EFFECT_0 }
});
}
- void HandleEnergize(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* energizeAmount = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MAELSTROM_CONTROLLER, GetSpellInfo()->Id == SPELL_SHAMAN_ELEMENTAL_BLAST ? EFFECT_9 : EFFECT_10))
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE, CastSpellExtraArgs(energizeAmount)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energizeAmount->GetAmount()));
- }
-
- void TriggerBuff()
+ void TriggerBuff() const
{
Unit* caster = GetCaster();
- uint32 spellId = *Trinity::Containers::SelectRandomWeightedContainerElement(BuffSpells, [caster](uint32 buffSpellId)
+ std::array<double, BuffSpells.size()> weights;
+ double total = 0.0;
+ for (std::size_t i = 0; i < BuffSpells.size(); ++i)
+ total += weights[i] = !caster->HasAura(BuffSpells[i]) ? 1.0 : 0.0;
+
+ uint32 spellId = [&]
{
- return !caster->HasAura(buffSpellId) ? 1.0 : 0.0;
- });
+ if (total > 0.0)
+ return *Trinity::Containers::SelectRandomWeightedContainerElement(BuffSpells, weights);
+
+ // refresh random one if we have them all
+ return Trinity::Containers::SelectRandomContainerElement(BuffSpells);
+ }();
GetCaster()->CastSpell(GetCaster(), spellId, TRIGGERED_FULL_MASK);
}
@@ -784,7 +788,6 @@ class spell_sha_elemental_blast : public SpellScript
void Register() override
{
- OnEffectLaunch += SpellEffectFn(spell_sha_elemental_blast::HandleEnergize, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
AfterCast += SpellCastFn(spell_sha_elemental_blast::TriggerBuff);
OnHit += SpellHitFn(spell_sha_elemental_blast::AddScriptedDamageMods);
}
@@ -935,6 +938,47 @@ class spell_sha_healing_stream_totem_heal : public SpellScript
}
};
+// 201900 - Hot Hand
+class spell_sha_hot_hand : public AuraScript
+{
+ static bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
+ {
+ return eventInfo.GetActor()->HasAura(SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA);
+ }
+
+ void Register() override
+ {
+ DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_hot_hand::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+};
+
+// 466467 - Ice Strike
+class spell_sha_ice_strike_proc : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHAMAN_ICE_STRIKE_OVERRIDE_AURA });
+ }
+
+ void Register() override { }
+
+public:
+ void AttemptProc()
+ {
+ if (!roll_chance_i(++_attemptCount * 7))
+ return;
+
+ _attemptCount = 0;
+ Unit* shaman = GetUnitOwner();
+ shaman->CastSpell(shaman, SPELL_SHAMAN_ICE_STRIKE_OVERRIDE_AURA, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+ }
+
+private:
+ int32 _attemptCount = 0;
+};
+
// 210714 - Icefury
class spell_sha_icefury : public AuraScript
{
@@ -1187,6 +1231,34 @@ class spell_sha_lava_crit_chance : public SpellScript
}
};
+// 60103 - Lava Lash
+class spell_sha_lava_lash : public SpellScript
+{
+ bool Validate(SpellInfo const* spellInfo) override
+ {
+ return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
+ && ValidateSpellInfo({ SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA });
+ }
+
+ bool Load() override
+ {
+ return GetCaster()->IsPlayer();
+ }
+
+ void AddBonusFlametongueDamage(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ ObjectGuid offhandItemGuid = Object::GetGUID(caster->GetWeaponForAttack(GetSpellInfo()->GetAttackType()));
+ if (GetCaster()->HasAura(SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA, ObjectGuid::Empty, offhandItemGuid))
+ AddPct(pctMod, GetSpell()->CalculateDamage(GetEffectInfo(EFFECT_1), victim));
+ }
+
+ void Register() override
+ {
+ CalcDamage += SpellCalcDamageFn(spell_sha_lava_lash::AddBonusFlametongueDamage);
+ }
+};
+
// 77756 - Lava Surge
class spell_sha_lava_surge : public AuraScript
{
@@ -1328,7 +1400,8 @@ struct spell_sha_maelstrom_weapon_base
SPELL_SHAMAN_MAELSTROM_WEAPON_OVERLAY_HEALS,
SPELL_SHAMAN_OVERFLOWING_MAELSTROM_TALENT,
SPELL_SHAMAN_OVERFLOWING_MAELSTROM_AURA,
- SPELL_SHAMAN_STORMWEAVER_PVP_TALENT_BUFF
+ SPELL_SHAMAN_STORMWEAVER_PVP_TALENT_BUFF,
+ SPELL_SHAMAN_ICE_STRIKE_PROC
}) && SpellScriptBase::ValidateSpellEffect
({
{ SPELL_SHAMAN_MAELSTROM_WEAPON_MOD_AURA, EFFECT_1 },
@@ -1378,6 +1451,10 @@ struct spell_sha_maelstrom_weapon_base
});
}
+ if (Aura const* iceStrike = shaman->GetAura(SPELL_SHAMAN_ICE_STRIKE_PROC))
+ if (spell_sha_ice_strike_proc* script = iceStrike->GetScript<spell_sha_ice_strike_proc>())
+ script->AttemptProc();
+
if (maelstromWeaponVisibleAura->ModStackAmount(-stacks))
return;
@@ -1590,6 +1667,54 @@ class spell_sha_mastery_elemental_overload_proc : public SpellScript
}
};
+// 334033 - Molten Assault (60103 - Lava Lash)
+class spell_sha_molten_assault : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHAMAN_FLAME_SHOCK });
+ }
+
+ bool Load() override
+ {
+ return GetCaster()->HasAura(SPELL_SHAMAN_MOLTEN_ASSAULT);
+ }
+
+ void TriggerFlameShocks(SpellEffIndex /*effIndex*/) const
+ {
+ Unit* caster = GetCaster();
+ Unit const* lavaLashTarget = GetHitUnit();
+ if (!lavaLashTarget->HasAura(SPELL_SHAMAN_FLAME_SHOCK, caster->GetGUID()))
+ return;
+
+ float range = 10.0f;
+ std::vector<WorldObject*> targets;
+ Trinity::WorldObjectSpellAreaTargetCheck check(range, lavaLashTarget, caster, caster, sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_FLAME_SHOCK, DIFFICULTY_NONE),
+ TARGET_CHECK_ENEMY, nullptr, TARGET_OBJECT_TYPE_UNIT, Trinity::WorldObjectSpellAreaTargetSearchReason::Area);
+ Trinity::WorldObjectListSearcher searcher(caster, targets, check, GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER);
+ Cell::VisitAllObjects(lavaLashTarget, searcher, range + EXTRA_CELL_SEARCH_RADIUS);
+
+ auto withoutFlameShock = std::ranges::partition(targets, Trinity::UnitAuraCheck(true, SPELL_SHAMAN_FLAME_SHOCK, GetCaster()->GetGUID()));
+ std::size_t flameShocksMissing = GetEffectValue() + 1 - std::ranges::distance(targets.begin(), withoutFlameShock.begin());
+
+ if (flameShocksMissing)
+ Trinity::Containers::RandomShuffle(withoutFlameShock);
+
+ CastSpellExtraArgs args;
+ args.SetTriggerFlags(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD | TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
+ args.SetTriggeringSpell(GetSpell());
+
+ // targets that already have flame shock are first in the list (and need to refresh it)
+ for (std::size_t i = 0; i < std::min<std::size_t>(targets.size(), GetEffectValue() + 1); ++i)
+ caster->CastSpell(targets[i], SPELL_SHAMAN_FLAME_SHOCK, args);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_molten_assault::TriggerFlameShocks, EFFECT_2, SPELL_EFFECT_DUMMY);
+ }
+};
+
// 30884 - Nature's Guardian
class spell_sha_natures_guardian : public AuraScript
{
@@ -2196,15 +2321,44 @@ class spell_sha_windfury_weapon_proc : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_SHAMAN_WINDFURY_ATTACK });
+ return ValidateSpellInfo({
+ SPELL_SHAMAN_WINDFURY_ATTACK,
+ SPELL_SHAMAN_UNRULY_WINDS,
+ SPELL_SHAMAN_FORCEFUL_WINDS_TALENT,
+ SPELL_SHAMAN_FORCEFUL_WINDS_PROC
+ });
}
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
{
PreventDefaultAction();
+ CastSpellExtraArgs args;
+ args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR;
+ args.TriggeringAura = aurEff;
+
+ Unit* shaman = eventInfo.GetActor();
+ Unit* target = eventInfo.GetActionTarget();
+
for (uint32 i = 0; i < 2; ++i)
- eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_WINDFURY_ATTACK, aurEff);
+ shaman->CastSpell(target, SPELL_SHAMAN_WINDFURY_ATTACK, args);
+
+ // Not a separate script because of ordering requirements for Forceful Winds
+ if (AuraEffect const* unrulyWinds = shaman->GetAuraEffect(SPELL_SHAMAN_UNRULY_WINDS, EFFECT_0); roll_chance_i(unrulyWinds->GetAmount()))
+ shaman->CastSpell(target, SPELL_SHAMAN_WINDFURY_ATTACK, args);
+
+ if (shaman->HasAuraEffect(SPELL_SHAMAN_FORCEFUL_WINDS_TALENT, EFFECT_0))
+ {
+ if (Aura* forcefulWinds = shaman->GetAura(SPELL_SHAMAN_FORCEFUL_WINDS_PROC))
+ {
+ // gaining a stack should not refresh duration
+ uint32 maxStack = forcefulWinds->CalcMaxStackAmount();
+ if (forcefulWinds->GetStackAmount() < maxStack)
+ forcefulWinds->SetStackAmount(forcefulWinds->GetStackAmount() + 1);
+ }
+ else
+ shaman->CastSpell(shaman, SPELL_SHAMAN_FORCEFUL_WINDS_PROC, args);
+ }
}
void Register() override
@@ -2334,6 +2488,8 @@ void AddSC_shaman_spell_scripts()
RegisterSpellAndAuraScriptPair(spell_sha_healing_rain, spell_sha_healing_rain_aura);
RegisterSpellScript(spell_sha_healing_rain_target_limit);
RegisterSpellScript(spell_sha_healing_stream_totem_heal);
+ RegisterSpellScript(spell_sha_hot_hand);
+ RegisterSpellScript(spell_sha_ice_strike_proc);
RegisterSpellScript(spell_sha_icefury);
RegisterSpellScript(spell_sha_item_lightning_shield);
RegisterSpellScript(spell_sha_item_lightning_shield_trigger);
@@ -2343,6 +2499,7 @@ void AddSC_shaman_spell_scripts()
RegisterSpellScript(spell_sha_item_t18_elemental_4p_bonus);
RegisterSpellScript(spell_sha_lava_burst);
RegisterSpellScript(spell_sha_lava_crit_chance);
+ RegisterSpellScript(spell_sha_lava_lash);
RegisterSpellScript(spell_sha_lava_surge);
RegisterSpellScript(spell_sha_lava_surge_proc);
RegisterSpellScript(spell_sha_lightning_bolt);
@@ -2352,6 +2509,7 @@ void AddSC_shaman_spell_scripts()
RegisterSpellScript(spell_sha_maelstrom_weapon_proc);
RegisterSpellScript(spell_sha_mastery_elemental_overload);
RegisterSpellScript(spell_sha_mastery_elemental_overload_proc);
+ RegisterSpellScript(spell_sha_molten_assault);
RegisterSpellScript(spell_sha_natures_guardian);
RegisterSpellScript(spell_sha_path_of_flames_spread);
RegisterSpellScript(spell_sha_restorative_mists);