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)
This commit is contained in:
hondacrx
2021-03-17 16:56:24 -04:00
parent 4fa6122106
commit 1be0e4a685
2 changed files with 42 additions and 24 deletions
+33 -19
View File
@@ -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<AuraApplication> effectApplications);
// tick on targets of effects
foreach (var appt in effectApplications)
if (appt.HasEffect(GetEffIndex()))
PeriodicTick(appt, caster);
}
GetApplicationList(out List<AuraApplication> 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; }
+9 -5
View File
@@ -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()