From 87b2cd129977016f3cd9157fc2d5513b87b55209 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sat, 31 Jul 2021 15:31:00 +0200 Subject: [PATCH] fix(Core/Spell): Make use of SPELL_ATTR2_NO_SCHOOL_IMMUNITIES (#5880) --- src/server/game/Entities/Unit/Unit.cpp | 37 +++++++++++++++++++------- src/server/game/Spells/SpellInfo.cpp | 34 ++++++++++++++--------- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 943a3a7f2..ca684c310 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12147,8 +12147,20 @@ bool Unit::IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) const { - if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) + if (!spellInfo) + { return false; + } + + if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) + { + return false; + } + + if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) + { + return false; + } uint32 schoolMask = spellInfo->GetSchoolMask(); // If m_immuneToDamage type contain magic, IMMUNE damage. @@ -12314,14 +12326,21 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling return true; - // Check for immune to application of harmful magical effects - AuraEffectList const& immuneAuraApply = GetAuraEffectsByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL); - for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter) - if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds? - ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school - !spellInfo->IsPositiveEffect(index) && // Harmful - spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras - return true; + if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) + { + // Check for immune to application of harmful magical effects + AuraEffectList const& immuneAuraApply = GetAuraEffectsByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL); + for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter) + { + if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds? + ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school + !spellInfo->IsPositiveEffect(index) && // Harmful + spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras + { + return true; + } + } + } } return false; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index cc09962ad..49af948b9 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1289,15 +1289,27 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const bool SpellInfo::CanPierceImmuneAura(SpellInfo const* aura) const { + // aura can't be pierced + if (!aura || aura->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) + { + return false; + } + // these spells pierce all avalible spells (Resurrection Sickness for example) if (HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) return true; // these spells (Cyclone for example) can pierce all... - if ((AttributesEx & SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) - // ...but not these (Divine shield for example) // xinef: banish exception, banish can override banish to cancel itself - && !(aura && (aura->Mechanic == MECHANIC_IMMUNE_SHIELD || aura->Mechanic == MECHANIC_INVULNERABILITY || (aura->Mechanic == MECHANIC_BANISH && (Mechanic != MECHANIC_BANISH || !(AttributesEx2 & SPELL_ATTR2_CANNOT_CAST_ON_TAPPED)))))) - return true; + if (HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) + { + if (aura->Mechanic != MECHANIC_IMMUNE_SHIELD && + aura->Mechanic != MECHANIC_INVULNERABILITY && + aura->Mechanic != MECHANIC_BANISH) + { + return true; + } + + } return false; } @@ -1308,22 +1320,20 @@ bool SpellInfo::CanDispelAura(SpellInfo const* aura) const if (aura->IsPassive()) return false; - // Xinef: At frist we check non-player auras, that should be never dispellable - // Xinef: Eg. Mark of the Fallen Champion - if (aura->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && aura->SpellFamilyName == SPELLFAMILY_GENERIC) + // These auras (like Divine Shield) can't be dispelled + if (aura->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) return false; // These spells (like Mass Dispel) can dispell all auras if (HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) return true; - // These auras (like Divine Shield) can't be dispelled - if (aura->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) - return false; - // These auras (Cyclone for example) are not dispelable - if (aura->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS)) + if ((aura->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) && aura->Mechanic != MECHANIC_NONE) + || aura->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) + { return false; + } return true; }