diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-09-30 14:18:47 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-09-30 14:18:47 +0200 |
commit | a21152e78f851d457253efbbf828e452ae28b24d (patch) | |
tree | 33f6059064c45b1ae6419787a63610404846e40b | |
parent | 71feb514546060889527a8a3e8c0974ebe190d8d (diff) |
-rw-r--r-- | sql/updates/world/master/2025_09_30_01_world.sql | 3 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 31 |
2 files changed, 31 insertions, 3 deletions
diff --git a/sql/updates/world/master/2025_09_30_01_world.sql b/sql/updates/world/master/2025_09_30_01_world.sql new file mode 100644 index 00000000000..1128f7d63ba --- /dev/null +++ b/sql/updates/world/master/2025_09_30_01_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (77756); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(77756,0x00,11,0x10000000,0x00000000,0x00000000,0x00000000,0x40000,0x0,0x1,0x2,0x0,0x0,0x0,0,100,0,0); -- Lava Surge diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 9a88a31425d..c8d37c85acd 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -1757,17 +1757,40 @@ class spell_sha_lava_surge : public AuraScript return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_SURGE, SPELL_SHAMAN_IGNEOUS_POTENTIAL }); } - bool CheckProcChance(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) const + bool CheckProcChance(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) { - int32 procChance = aurEff->GetAmount(); + Unit* caster = GetTarget(); + float flameShocks = 0.0f; + auto work = [&, shaman = caster->GetGUID()](Unit const* target) + { + if (target->HasAuraEffect(SPELL_SHAMAN_FLAME_SHOCK, EFFECT_1, shaman)) + flameShocks += 1.0f; + }; + Trinity::UnitWorker worker(caster, work); + Cell::VisitAllObjects(caster, worker, 100.0f); + + // Proc uptime is not supposed to scale with the number of applied flame shocks + _normalizedTicks += 1.0f / flameShocks; + + // first 6 ticks after last proc fail to prevent overwriting + if (_normalizedTicks < 6.0f) + return false; + + float procChance = aurEff->GetAmount(); if (AuraEffect const* igneousPotential = GetTarget()->GetAuraEffect(SPELL_SHAMAN_IGNEOUS_POTENTIAL, EFFECT_0)) procChance += igneousPotential->GetAmount(); - return roll_chance_i(procChance); + float missChance = std::max(100 - procChance, 0.0f) / 100.0f; + + procChance = (1.0f - std::pow(missChance, _normalizedTicks)) * 100.0f; + + return roll_chance_f(procChance); } void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) { + _normalizedTicks = 0.0f; + PreventDefaultAction(); GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_LAVA_SURGE, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK }); } @@ -1777,6 +1800,8 @@ class spell_sha_lava_surge : public AuraScript DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_lava_surge::CheckProcChance, EFFECT_0, SPELL_AURA_DUMMY); OnEffectProc += AuraEffectProcFn(spell_sha_lava_surge::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); } + + float _normalizedTicks = 0.0f; }; // 77762 - Lava Surge |