Core/Spells: implement SpellInfo helper to filter for relevant mechanic immunities in spell_start packet

Port From (https://github.com/TrinityCore/TrinityCore/commit/60119ba8503e1b8e17d7163baf990022b2d25d41)
This commit is contained in:
hondacrx
2022-05-26 16:30:18 -04:00
parent 3cacc1ff68
commit 80fb973080
2 changed files with 22 additions and 5 deletions
+2 -2
View File
@@ -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)
+20 -3
View File
@@ -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));
}