From 22d976002deaa9138384f6a9e18958500fdfad52 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sat, 12 Nov 2022 17:42:13 +0100 Subject: [PATCH] Core/Spells: reworked Ignite DoT calculation * each crit will now increase an existing Ignite DoT effect's damage for two ticks. If the two ticks have expired, the damage will be removed. This means if a 2nd crit is being stacked after the Ignite DoT has ticked for the first time, it will only deal combined damage on the next tick --- .../world/4.3.4/2022_11_12_00_world.sql | 3 ++ src/server/scripts/Spells/spell_mage.cpp | 54 ++++++++++++++++--- 2 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 sql/updates/world/4.3.4/2022_11_12_00_world.sql diff --git a/sql/updates/world/4.3.4/2022_11_12_00_world.sql b/sql/updates/world/4.3.4/2022_11_12_00_world.sql new file mode 100644 index 0000000000..e4fb9711eb --- /dev/null +++ b/sql/updates/world/4.3.4/2022_11_12_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_mage_ignite_periodic'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(12654, 'spell_mage_ignite_periodic'); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 36671d5329..aba00ded62 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -822,15 +822,12 @@ class spell_mage_ignite : public AuraScript { PreventDefaultAction(); Unit* target = GetTarget(); + DamageInfo* damage = eventInfo.GetDamageInfo(); int32 bp = CalculatePct(damage->GetDamage(), aurEff->GetAmount()) * 0.5f; - - if (AuraEffect const* ignite = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_MAGE_IGNITE, EFFECT_0, target->GetGUID())) - if (!ignite->GetTickNumber()) - bp += ignite->GetAmount(); - - target->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, CastSpellExtraArgs(aurEff).AddSpellBP0(bp)); + if (bp > 0) + target->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, CastSpellExtraArgs(aurEff).AddSpellBP0(bp)); } void Register() override @@ -839,6 +836,50 @@ class spell_mage_ignite : public AuraScript OnEffectProc.Register(&spell_mage_ignite::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; + +// 12654 - Ignite +class spell_mage_ignite_periodic : public AuraScript +{ + void CalculateRefreshedDot(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + _critDamageValues.emplace_back(std::make_pair(2, amount)); + + amount = 0; + for (auto const& damageValuePair : _critDamageValues) + amount += damageValuePair.second; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + int32 newDotValue = 0; + bool changed = false; + for (std::vector>::iterator itr = _critDamageValues.begin(); itr != _critDamageValues.end();) + { + --itr->first; + newDotValue += itr->second; + if (itr->first == 0) + { + itr = _critDamageValues.erase(itr); + changed = true; + } + else + ++itr; + } + + if (changed) + const_cast(aurEff)->SetAmount(newDotValue); + } + + void Register() override + { + DoEffectCalcAmount.Register(&spell_mage_ignite_periodic::CalculateRefreshedDot, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectPeriodic.Register(&spell_mage_ignite_periodic::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +private: + std::vector> _critDamageValues; +}; + // 543 - Mage Ward /// Updated 4.3.4 class spell_mage_mage_ward : public SpellScriptLoader @@ -2175,6 +2216,7 @@ void AddSC_mage_spell_scripts() new spell_mage_hot_streak(); new spell_mage_ice_barrier(); RegisterSpellScript(spell_mage_ignite); + RegisterSpellScript(spell_mage_ignite_periodic); RegisterSpellScript(spell_mage_impact); RegisterSpellScript(spell_mage_impact_triggered); new spell_mage_improved_hot_streak();