diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 202 |
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); |