aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp3
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp35
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h2
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp19
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.h1
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp6
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);