diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 986fcd5a6..990a1d875 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -3644,8 +3644,8 @@ namespace Game.Spells Unit unitCaster = m_caster.ToUnit(); if (unitCaster != null) { - schoolImmunityMask = unitCaster.GetSchoolImmunityMask(); - mechanicImmunityMask = unitCaster.GetMechanicImmunityMask(); + schoolImmunityMask = m_timer != 0 ? unitCaster.GetSchoolImmunityMask() : 0; + mechanicImmunityMask = m_timer != 0 ? m_spellInfo.GetMechanicImmunityMask(unitCaster) : 0; } if (schoolImmunityMask != 0 || mechanicImmunityMask != 0) diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index 06ef96283..c0ce84890 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -2641,6 +2641,23 @@ namespace Game.Spells return _allowedMechanicMask; } + public uint GetMechanicImmunityMask(Unit caster) + { + uint casterMechanicImmunityMask = caster.GetMechanicImmunityMask(); + uint mechanicImmunityMask = 0; + + if (CanBeInterrupted(null, caster, true)) + { + if ((casterMechanicImmunityMask & (1 << (int)Mechanics.Silence)) != 0) + mechanicImmunityMask |= (1 << (int)Mechanics.Silence); + + if ((casterMechanicImmunityMask & (1 << (int)Mechanics.Interrupt)) != 0) + mechanicImmunityMask |= (1 << (int)Mechanics.Interrupt); + } + + return mechanicImmunityMask; + } + public float GetMinRange(bool positive = false) { if (RangeEntry == null) @@ -3888,14 +3905,14 @@ namespace Game.Spells public bool HasAttribute(SpellAttr14 attribute) { return Convert.ToBoolean(AttributesEx14 & attribute); } public bool HasAttribute(SpellCustomAttributes attribute) { return Convert.ToBoolean(AttributesCu & attribute); } - public bool CanBeInterrupted(WorldObject interruptCaster, Unit interruptTarget) + public bool CanBeInterrupted(WorldObject interruptCaster, Unit interruptTarget, bool ignoreImmunity = false) { return HasAttribute(SpellAttr7.CanAlwaysBeInterrupted) || HasChannelInterruptFlag(SpellAuraInterruptFlags.Damage | SpellAuraInterruptFlags.EnteringCombat) || (interruptTarget.IsPlayer() && InterruptFlags.HasFlag(SpellInterruptFlags.DamageCancelsPlayerOnly)) || InterruptFlags.HasFlag(SpellInterruptFlags.DamageCancels) - || interruptCaster.IsUnit() && interruptCaster.ToUnit().HasAuraTypeWithMiscvalue(AuraType.AllowInterruptSpell, (int)Id) - || ((interruptTarget.GetMechanicImmunityMask() & (1 << (int)Mechanics.Interrupt)) == 0 + || (interruptCaster != null && interruptCaster.IsUnit() && interruptCaster.ToUnit().HasAuraTypeWithMiscvalue(AuraType.AllowInterruptSpell, (int)Id)) + || (((interruptTarget.GetMechanicImmunityMask() & (1 << (int)Mechanics.Interrupt)) == 0 || ignoreImmunity) && !interruptTarget.HasAuraTypeWithAffectMask(AuraType.PreventInterrupt, this) && PreventionType.HasAnyFlag(SpellPreventionType.Silence)); }