diff options
author | QAston <qaston@gmail.com> | 2011-06-09 17:04:52 +0200 |
---|---|---|
committer | QAston <qaston@gmail.com> | 2011-06-11 10:55:17 +0200 |
commit | 3ec587e21e748ecd3f8f514a82580c1690ba30f8 (patch) | |
tree | 9408e53944d950448f66432eab1a0bf69fe5e550 /src | |
parent | 23d43c72b2f429b057351a7be18c0cc0ace03525 (diff) |
Core/Auras:
Make Aura::ModStackAmount(1) an equivalent of reapplying the aura
Recalculate periodic aura timers on aura reapply.
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 3 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 35 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 2 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 19 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.h | 1 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 6 |
6 files changed, 43 insertions, 23 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index cca3227ff92..53bcd21cdf9 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3158,9 +3158,6 @@ Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellEntry const* newAura, uint *oldGUID = castItemGUID; } - // refresh charges - foundAura->SetCharges(foundAura->CalcMaxCharges(caster)); - // try to increase stack amount foundAura->ModStackAmount(1); return foundAura; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 38c33d0a030..00ee8aa1e4f 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -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() diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 3f6c6b5587c..2a5a0e72805 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -42,7 +42,7 @@ class AuraEffect void SetPeriodicTimer(int32 periodicTimer) { m_periodicTimer = periodicTimer; } int32 CalculateAmount(Unit * caster); - void CalculatePeriodic(Unit * caster, bool create = false); + void CalculatePeriodic(Unit * caster, bool create = false, bool load = false); void CalculateSpellMod(); void ChangeAmount(int32 newAmount, bool mark = true, bool onStackOrReapply = false); void RecalculateAmount() { if (!CanBeRecalculated()) return; ChangeAmount(CalculateAmount(GetCaster()), false); } diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index fe62d786689..4ceaa689a69 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -726,6 +726,16 @@ void Aura::RefreshDuration() m_timeCla = 1 * IN_MILLISECONDS; } +void Aura::RefreshTimers() +{ + m_maxDuration = CalcMaxDuration(); + RefreshDuration(); + Unit * caster = GetCaster(); + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + if (HasEffect(i)) + GetEffect(i)->CalculatePeriodic(caster, false, false); +} + void Aura::SetCharges(uint8 charges) { if (m_procCharges == charges) @@ -802,7 +812,12 @@ bool Aura::ModStackAmount(int32 num, AuraRemoveMode removeMode) SetStackAmount(stackAmount); if (refresh) - RefreshDuration(); + { + RefreshTimers(); + + // reset charges + SetCharges(CalcMaxCharges()); + } SetNeedClientUpdateForTargets(); return false; } @@ -871,7 +886,7 @@ void Aura::SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint { m_effects[i]->SetAmount(amount[i]); m_effects[i]->SetCanBeRecalculated(recalculateMask & (1<<i)); - m_effects[i]->CalculatePeriodic(caster); + m_effects[i]->CalculatePeriodic(caster, false, true); m_effects[i]->CalculateSpellMod(); m_effects[i]->RecalculateAmount(caster); } diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 342ff59b02c..cd805757ecb 100755 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -127,6 +127,7 @@ class Aura int32 GetDuration() const { return m_duration; } void SetDuration(int32 duration, bool withMods = false); void RefreshDuration(); + void RefreshTimers(); bool IsExpired() const { return !GetDuration();} bool IsPermanent() const { return GetMaxDuration() == -1; } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 0402c9bd8fe..6e23fe35f26 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1427,9 +1427,8 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool if (m_originalCaster) { - bool refresh; m_spellAura = Aura::TryRefreshStackOrCreate(aurSpellInfo, effectMask, unit, - m_originalCaster, (aurSpellInfo == m_spellInfo)? &m_spellValue->EffectBasePoints[0] : &basePoints[0], m_CastItem, 0, &refresh); + m_originalCaster, (aurSpellInfo == m_spellInfo)? &m_spellValue->EffectBasePoints[0] : &basePoints[0], m_CastItem); if (m_spellAura) { // Set aura stack amount to desired value @@ -1437,8 +1436,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool m_spellAura->SetStackAmount(m_spellValue->AuraStackAmount); // Now Reduce spell duration using data received at spell hit - // if we're refreshing aura, recalculate max duration, to avoid applying mods twice - int32 duration = refresh ? m_spellAura->CalcMaxDuration() : m_spellAura->GetMaxDuration(); + int32 duration = m_spellAura->GetMaxDuration(); int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup, aurSpellInfo); float diminishMod = unit->ApplyDiminishingToDuration(m_diminishGroup, duration, m_originalCaster, m_diminishLevel, limitduration); |