From 1be0e4a68573d112ff9f292a9c9ea578525ac2f2 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 17 Mar 2021 16:56:24 -0400 Subject: [PATCH] Core/Auras: fixed off by one error in counting SPELL_ATTR5_START_PERIODIC_AT_APPLY ticks Port From (https://github.com/TrinityCore/TrinityCore/commit/794a3e43887d3fea4bb9b1ec77a98ab596eea0be) --- Source/Game/Spells/Auras/AuraEffect.cs | 52 ++++++++++++++++---------- Source/Game/Spells/SpellInfo.cs | 14 ++++--- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 77d0c1523..077c65b5d 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -125,15 +125,29 @@ namespace Game.Spells amount *= GetBase().GetStackAmount(); return amount; } + + public uint GetTotalTicks() + { + uint totalTicks = 0; + if (_period != 0 && !GetBase().IsPermanent()) + { + totalTicks = (uint)(GetBase().GetMaxDuration() / _period); + if (m_spellInfo.HasAttribute(SpellAttr5.StartPeriodicAtApply)) + ++totalTicks; + } + + return totalTicks; + } + void ResetPeriodic(bool resetPeriodicTimer = false) { _ticksDone = 0; if (resetPeriodicTimer) { - _periodicTimer = _period; + _periodicTimer = 0; // Start periodic on next tick or at aura apply - if (!m_spellInfo.HasAttribute(SpellAttr5.StartPeriodicAtApply)) - _periodicTimer = 0; + if (m_spellInfo.HasAttribute(SpellAttr5.StartPeriodicAtApply)) + _periodicTimer = _period; } } public void CalculatePeriodic(Unit caster, bool resetPeriodicTimer = true, bool load = false) @@ -401,26 +415,27 @@ namespace Game.Spells public void Update(uint diff, Unit caster) { - if (m_isPeriodic && (GetBase().GetDuration() >= 0 || GetBase().IsPassive() || GetBase().IsPermanent())) + if (!m_isPeriodic || (GetBase().GetDuration() < 0 && !GetBase().IsPassive() && !GetBase().IsPermanent())) + return; + + uint totalTicks = GetTotalTicks(); + + _periodicTimer += (int)diff; + while (_periodicTimer >= _period) { - _periodicTimer += (int)diff; - while (_periodicTimer >= _period) - { - _periodicTimer -= _period; + _periodicTimer -= _period; - if (!GetBase().IsPermanent() && (_ticksDone + 1) > GetTotalTicks()) - break; + if (!GetBase().IsPermanent() && (_ticksDone + 1) > totalTicks) + break; - ++_ticksDone; + ++_ticksDone; - GetBase().CallScriptEffectUpdatePeriodicHandlers(this); + GetBase().CallScriptEffectUpdatePeriodicHandlers(this); - GetApplicationList(out List effectApplications); - // tick on targets of effects - foreach (var appt in effectApplications) - if (appt.HasEffect(GetEffIndex())) - PeriodicTick(appt, caster); - } + GetApplicationList(out List effectApplications); + // tick on targets of effects + foreach (var appt in effectApplications) + PeriodicTick(appt, caster); } } @@ -796,7 +811,6 @@ namespace Game.Spells public void ResetTicks() { _ticksDone = 0; } public uint GetTickNumber() { return _ticksDone; } public uint GetRemainingTicks() { return GetTotalTicks() - _ticksDone; } - public uint GetTotalTicks() { return (_period != 0 && !GetBase().IsPermanent()) ? (uint)(GetBase().GetMaxDuration() / _period) : 0u; } public bool IsPeriodic() { return m_isPeriodic; } public void SetPeriodic(bool isPeriodic) { m_isPeriodic = isPeriodic; } diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index a1c442c52..e7c48406a 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -2652,9 +2652,8 @@ namespace Game.Spells public uint GetMaxTicks() { + uint totalTicks = 0; int DotDuration = GetDuration(); - if (DotDuration == 0) - return 1; foreach (SpellEffectInfo effect in _effects) { @@ -2676,14 +2675,19 @@ namespace Game.Spells case AuraType.PeriodicTriggerSpell: case AuraType.PeriodicTriggerSpellWithValue: case AuraType.PeriodicHealthFunnel: - if (effect.ApplyAuraPeriod != 0) - return (uint)(DotDuration / effect.ApplyAuraPeriod); + // skip infinite periodics + if (effect.ApplyAuraPeriod > 0 && DotDuration > 0) + { + totalTicks = (uint)DotDuration / effect.ApplyAuraPeriod; + if (HasAttribute(SpellAttr5.StartPeriodicAtApply)) + ++totalTicks; + } break; } } } - return 6; + return totalTicks; } public uint GetRecoveryTime()