diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index a1db1546e..c0be8fe2b 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -2681,11 +2681,11 @@ namespace Game.Entities ++diminish.HitCount; } - public float ApplyDiminishingToDuration(SpellInfo auraSpellInfo, ref int duration, Unit caster, DiminishingLevels previousLevel) + public bool ApplyDiminishingToDuration(SpellInfo auraSpellInfo, ref int duration, Unit caster, DiminishingLevels previousLevel) { DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell(); if (duration == -1 || group == DiminishingGroup.None) - return 1.0f; + return true; int limitDuration = auraSpellInfo.GetDiminishingReturnsLimitDuration(); @@ -2704,7 +2704,6 @@ namespace Game.Entities } float mod = 1.0f; - switch (group) { case DiminishingGroup.Taunt: @@ -2776,7 +2775,7 @@ namespace Game.Entities } duration = (int)(duration * mod); - return mod; + return duration != 0; } public void ApplyDiminishingAura(DiminishingGroup group, bool apply) diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index ff9e87de6..07b4d8456 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -2096,11 +2096,24 @@ namespace Game.Spells } // Now Reduce spell duration using data received at spell hit + // check whatever effects we're going to apply, diminishing returns only apply to negative aura effects + bool positive = true; + if (m_originalCaster == unit || !m_originalCaster.IsFriendlyTo(unit)) + { + for (uint i = 0; i < SpellConst.MaxEffects; ++i) + { + if ((effectMask & (1 << (int)i)) != 0 && !m_spellInfo.IsPositiveEffect(i)) + { + positive = false; + break; + } + } + } + int duration = m_spellAura.GetMaxDuration(); - float diminishMod = unit.ApplyDiminishingToDuration(m_spellInfo, ref duration, m_originalCaster, diminishLevel); // unit is immune to aura if it was diminished to 0 duration - if (diminishMod == 0.0f) + if (!positive && !unit.ApplyDiminishingToDuration(m_spellInfo, ref duration, m_originalCaster, diminishLevel)) { m_spellAura.Remove(); bool found = false; @@ -2114,13 +2127,7 @@ namespace Game.Spells { ((UnitAura)m_spellAura).SetDiminishGroup(diminishGroup); - bool positive = m_spellAura.GetSpellInfo().IsPositive(); - AuraApplication aurApp = m_spellAura.GetApplicationOfTarget(m_originalCaster.GetGUID()); - if (aurApp != null) - positive = aurApp.IsPositive(); - duration = m_originalCaster.ModSpellDuration(m_spellInfo, unit, duration, positive, effectMask); - if (duration > 0) { // Haste modifies duration of channeled spells