From 7946aa195895403dcb35b932caa1ac47a7e911ff Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 26 Aug 2024 16:24:24 -0400 Subject: [PATCH] Core/Spells: Fixed spell with SPELL_AURA_MECHANIC_IMMUNITY_MASK failing to cast if they were supposed to purge effect they are granting immunity to (CreatureImmunities was not checked) Port From (https://github.com/TrinityCore/TrinityCore/commit/e1e4aa7980a6e91a330d615467b2c25b60dcbcc1) --- Source/Game/Spells/Auras/Aura.cs | 14 ++-- Source/Game/Spells/SpellInfo.cs | 126 ++++++++++++++----------------- 2 files changed, 65 insertions(+), 75 deletions(-) diff --git a/Source/Game/Spells/Auras/Aura.cs b/Source/Game/Spells/Auras/Aura.cs index 4cc85005a..89f0bceed 100644 --- a/Source/Game/Spells/Auras/Aura.cs +++ b/Source/Game/Spells/Auras/Aura.cs @@ -2772,6 +2772,13 @@ namespace Game.Spells targets.Add(target, targetPair.Value); } + // skip area update if owner is not in world! + if (!GetUnitOwner().IsInWorld) + return; + + if (GetUnitOwner().HasAuraState(AuraStateType.Banished, GetSpellInfo(), caster)) + return; + foreach (var spellEffectInfo in GetSpellInfo().GetEffects()) { if (!HasEffect(spellEffectInfo.EffectIndex)) @@ -2781,13 +2788,6 @@ namespace Game.Spells if (spellEffectInfo.Effect == SpellEffectName.ApplyAura) continue; - // skip area update if owner is not in world! - if (!GetUnitOwner().IsInWorld) - continue; - - if (GetUnitOwner().HasAuraState(AuraStateType.Banished, GetSpellInfo(), caster)) - continue; - List units = new(); var condList = spellEffectInfo.ImplicitTargetConditions; diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index 4333e7c2a..f865ebf25 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -2435,49 +2435,29 @@ namespace Game.Spells bool immuneToAllEffects = true; foreach (var auraSpellEffectInfo in auraSpellInfo.GetEffects()) { - if (!auraSpellEffectInfo.IsEffect()) + if (!auraSpellEffectInfo.IsAura()) continue; - if (!immuneInfo.SpellEffectImmune.Contains(auraSpellEffectInfo.Effect)) - { - immuneToAllEffects = false; - break; - } + if (mechanicImmunity != 0) + if ((mechanicImmunity & (1ul << (int)auraSpellEffectInfo.Mechanic)) != 0) + continue; - uint mechanic = (uint)auraSpellEffectInfo.Mechanic; - if (mechanic != 0) + AuraType auraName = auraSpellEffectInfo.ApplyAuraName; + if (auraName != 0) { - if (!Convert.ToBoolean(immuneInfo.MechanicImmuneMask & (1ul << (int)mechanic))) + if (immuneInfo.AuraTypeImmune.Contains(auraName)) + continue; + + if (!auraSpellInfo.HasAttribute(SpellAttr2.NoSchoolImmunities) && !auraSpellInfo.IsPositiveEffect(auraSpellEffectInfo.EffectIndex)) { - immuneToAllEffects = false; - break; + uint applyHarmfulAuraImmunityMask = immuneInfo.ApplyHarmfulAuraImmuneMask; + if (applyHarmfulAuraImmunityMask != 0) + if (((uint)auraSpellInfo.GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0) + continue; } } - if (!auraSpellInfo.HasAttribute(SpellAttr3.AlwaysHit)) - { - AuraType auraName = auraSpellEffectInfo.ApplyAuraName; - if (auraName != 0) - { - bool isImmuneToAuraEffectApply = false; - if (!immuneInfo.AuraTypeImmune.Contains(auraName)) - isImmuneToAuraEffectApply = true; - - if (!isImmuneToAuraEffectApply && !auraSpellInfo.IsPositiveEffect(auraSpellEffectInfo.EffectIndex) && !auraSpellInfo.HasAttribute(SpellAttr2.NoSchoolImmunities)) - { - uint applyHarmfulAuraImmunityMask = immuneInfo.ApplyHarmfulAuraImmuneMask; - if (applyHarmfulAuraImmunityMask != 0) - if (((uint)auraSpellInfo.GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0) - isImmuneToAuraEffectApply = true; - } - - if (!isImmuneToAuraEffectApply) - { - immuneToAllEffects = false; - break; - } - } - } + immuneToAllEffects = false; } if (immuneToAllEffects) @@ -2487,6 +2467,44 @@ namespace Game.Spells return false; } + bool CanSpellEffectProvideImmunityAgainstAuraEffect(SpellEffectInfo immunityEffectInfo, SpellInfo auraSpellInfo, SpellEffectInfo auraEffectInfo) + { + ImmunityInfo immuneInfo = immunityEffectInfo.GetImmunityInfo(); + if (immuneInfo == null) + return false; + + if (!auraSpellInfo.HasAttribute(SpellAttr2.NoSchoolImmunities)) + { + uint schoolImmunity = immuneInfo.SchoolImmuneMask; + if (schoolImmunity != 0) + if (((uint)auraSpellInfo.SchoolMask & schoolImmunity) != 0) + return true; + + uint applyHarmfulAuraImmunityMask = immuneInfo.ApplyHarmfulAuraImmuneMask; + if (applyHarmfulAuraImmunityMask != 0) + if (((uint)auraSpellInfo.GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0) + return true; + } + + ulong mechanicImmunity = immuneInfo.MechanicImmuneMask; + if (mechanicImmunity != 0) + { + if ((mechanicImmunity & (1ul << (int)auraSpellInfo.Mechanic)) != 0) + return true; + if ((mechanicImmunity & (1ul << (int)auraEffectInfo.Mechanic)) != 0) + return true; + } + + uint dispelImmunity = immuneInfo.DispelImmuneMask; + if (dispelImmunity != 0 && (uint)auraSpellInfo.Dispel == dispelImmunity) + return true; + + if (immuneInfo.AuraTypeImmune.Contains(auraEffectInfo.ApplyAuraName)) + return true; + + return false; + } + public bool SpellCancelsAuraEffect(AuraEffect aurEff) { if (!HasAttribute(SpellAttr1.ImmunityPurgesEffect)) @@ -2495,40 +2513,12 @@ namespace Game.Spells if (aurEff.GetSpellInfo().HasAttribute(SpellAttr0.NoImmunities)) return false; - foreach (var effectInfo in GetEffects()) - { - if (!effectInfo.IsEffect(SpellEffectName.ApplyAura)) - continue; + if (aurEff.GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes.NoImmunity)) + return false; - uint miscValue = (uint)effectInfo.MiscValue; - switch (effectInfo.ApplyAuraName) - { - case AuraType.StateImmunity: - if (miscValue != (uint)aurEff.GetAuraType()) - continue; - break; - case AuraType.SchoolImmunity: - case AuraType.ModImmuneAuraApplySchool: - if (aurEff.GetSpellInfo().HasAttribute(SpellAttr2.NoSchoolImmunities) || !Convert.ToBoolean((uint)aurEff.GetSpellInfo().SchoolMask & miscValue)) - continue; - break; - case AuraType.DispelImmunity: - if (miscValue != (uint)aurEff.GetSpellInfo().Dispel) - continue; - break; - case AuraType.MechanicImmunity: - if (miscValue != (uint)aurEff.GetSpellInfo().Mechanic) - { - if (miscValue != (uint)aurEff.GetSpellEffectInfo().Mechanic) - continue; - } - break; - default: - continue; - } - - return true; - } + foreach (SpellEffectInfo effect in GetEffects()) + if (CanSpellEffectProvideImmunityAgainstAuraEffect(effect, aurEff.GetSpellInfo(), aurEff.GetSpellEffectInfo())) + return true; return false; }