Core/Auras:

Make Aura::ModStackAmount(1) an equivalent of reapplying the aura
    Recalculate periodic aura timers on aura reapply.
This commit is contained in:
QAston
2011-06-11 10:55:17 +02:00
parent 23d43c72b2
commit 3ec587e21e
6 changed files with 43 additions and 23 deletions
@@ -377,7 +377,7 @@ m_baseAmount(baseAmount ? *baseAmount : m_spellProto->EffectBasePoints[m_effInde
m_canBeRecalculated(true), m_spellmod(NULL), m_isPeriodic(false),
m_periodicTimer(0), m_tickNumber(0)
{
CalculatePeriodic(caster, true);
CalculatePeriodic(caster, true, false);
m_amount = CalculateAmount(caster);
@@ -766,7 +766,7 @@ int32 AuraEffect::CalculateAmount(Unit * caster)
return amount;
}
void AuraEffect::CalculatePeriodic(Unit * caster, bool create)
void AuraEffect::CalculatePeriodic(Unit * caster, bool create, bool load)
{
m_amplitude = m_spellProto->EffectAmplitude[m_effIndex];
@@ -790,9 +790,7 @@ void AuraEffect::CalculatePeriodic(Unit * caster, bool create)
break;
case SPELL_AURA_PERIODIC_TRIGGER_SPELL:
if (GetId() == 51912)
{
m_amplitude = 3000;
}
m_isPeriodic = true;
break;
case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE:
@@ -840,19 +838,30 @@ void AuraEffect::CalculatePeriodic(Unit * caster, bool create)
}
}
if (create)
if (load) // aura loaded from db
{
// Start periodic on next tick or at aura apply
if (m_amplitude && !(m_spellProto->AttributesEx5 & SPELL_ATTR5_START_PERIODIC_AT_APPLY))
m_periodicTimer += m_amplitude;
}
else if (m_amplitude) // load aura from character_aura
{
m_tickNumber = GetBase()->GetDuration() / m_amplitude;
m_periodicTimer = GetBase()->GetDuration() % m_amplitude;
m_tickNumber = m_amplitude ? GetBase()->GetDuration() / m_amplitude : 0;
m_periodicTimer = m_amplitude ? GetBase()->GetDuration() % m_amplitude : 0;
if (m_spellProto->AttributesEx5 & SPELL_ATTR5_START_PERIODIC_AT_APPLY)
++m_tickNumber;
}
else // aura just created or reapplied
{
m_tickNumber = 0;
// reset periodic timer on aura create or on reapply when aura isn't dot
// possibly we should not reset periodic timers only when aura is triggered by proc
// or maybe there's a spell attribute somewhere
bool resetPeriodicTimer = create
|| ((GetAuraType() != SPELL_AURA_PERIODIC_DAMAGE) && (GetAuraType() != SPELL_AURA_PERIODIC_DAMAGE_PERCENT));
if (resetPeriodicTimer)
{
m_periodicTimer = 0;
// Start periodic on next tick or at aura apply
if (m_amplitude && !(m_spellProto->AttributesEx5 & SPELL_ATTR5_START_PERIODIC_AT_APPLY))
m_periodicTimer += m_amplitude;
}
}
}
void AuraEffect::CalculateSpellMod()