diff options
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 5 | ||||
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 38 | ||||
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.cpp | 6 | 
4 files changed, 34 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9347c8ddf04..04b285ef334 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3113,7 +3113,10 @@ void Unit::DeMorph()  Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellEntry const* newAura, uint8 effMask, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, uint64 casterGUID /*= 0*/)  { -    ASSERT(casterGUID); +    ASSERT(casterGUID || caster); +    if (!casterGUID) +        casterGUID = caster->GetGUID(); +      // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times      if (!IsPassiveSpell(newAura) && newAura->Id != 44413)      { diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 9ca8cd3ffa4..592eb08a1c9 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -334,23 +334,12 @@ m_isRemoved(false), m_isSingleTarget(false)      if (m_spellProto->manaPerSecond || m_spellProto->manaPerSecondPerLevel)          m_timeCla = 1 * IN_MILLISECONDS; -    Player* modOwner = NULL; +    m_maxDuration = CalcMaxDuration(caster); +    m_duration = m_maxDuration; +    Player* modOwner = NULL;      if (caster) -    {          modOwner = caster->GetSpellModOwner(); -        m_maxDuration = caster->CalcSpellDuration(m_spellProto); -    } -    else -        m_maxDuration = GetSpellDuration(m_spellProto); - -    if (IsPassive() && m_spellProto->DurationIndex == 0) -        m_maxDuration = -1; - -    if (!IsPermanent() && modOwner) -        modOwner->ApplySpellMod(GetId(), SPELLMOD_DURATION, m_maxDuration); - -    m_duration = m_maxDuration;      m_procCharges = m_spellProto->procCharges;      if (modOwner) @@ -700,6 +689,27 @@ void Aura::Update(uint32 diff, Unit * caster)      }  } +int32 Aura::CalcMaxDuration(Unit* caster) const +{ +    Player* modOwner = NULL; +    int32 maxDuration; + +    if (caster) +    { +        modOwner = caster->GetSpellModOwner(); +        maxDuration = caster->CalcSpellDuration(m_spellProto); +    } +    else +        maxDuration = GetSpellDuration(m_spellProto); + +    if (IsPassive() && m_spellProto->DurationIndex == 0) +        maxDuration = -1; + +    if (!IsPermanent() && modOwner) +        modOwner->ApplySpellMod(GetId(), SPELLMOD_DURATION, maxDuration); +    return maxDuration; +} +  void Aura::SetDuration(int32 duration, bool withMods)  {      if (withMods) diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index d022fc3d85f..67f4eb30b27 100755 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -121,6 +121,8 @@ class Aura          time_t GetApplyTime() const { return m_applyTime; }          int32 GetMaxDuration() const { return m_maxDuration; }          void SetMaxDuration(int32 duration) { m_maxDuration = duration; } +        int32 CalcMaxDuration() const { return CalcMaxDuration(GetCaster()); }  +        int32 CalcMaxDuration(Unit * caster) const;          int32 GetDuration() const { return m_duration; }          void SetDuration(int32 duration, bool withMods = false);          void RefreshDuration(); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index b8bd908cd65..5b8d4cd42a6 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1427,8 +1427,9 @@ 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); +                m_originalCaster, (aurSpellInfo == m_spellInfo)? &m_spellValue->EffectBasePoints[0] : &basePoints[0], m_CastItem, 0, &refresh);              if (m_spellAura)              {                  // Set aura stack amount to desired value @@ -1436,7 +1437,8 @@ 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 -                int32 duration = m_spellAura->GetMaxDuration(); +                // if we're refreshing aura, recalculate max duration, to avoid applying mods twice +                int32 duration = refresh ? m_spellAura->CalcMaxDuration() : m_spellAura->GetMaxDuration();                  int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup, aurSpellInfo);                  float diminishMod = unit->ApplyDiminishingToDuration(m_diminishGroup, duration, m_originalCaster, m_diminishLevel, limitduration);  | 
