diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 124 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.h | 1 | 
3 files changed, 61 insertions, 78 deletions
| diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 00287b1f4b7..b276156cf72 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2528,6 +2528,13 @@ void UnitAura::FillTargetMap(std::unordered_map<Unit*, uint32>& targets, Unit* c              targets.emplace(target, targetPair.second);      } +    // skip area update if owner is not in world! +    if (!GetUnitOwner()->IsInWorld()) +        return; + +    if (GetUnitOwner()->HasAuraState(AURA_STATE_BANISHED, GetSpellInfo(), caster)) +        return; +      for (SpellEffectInfo const& spellEffectInfo : GetSpellInfo()->GetEffects())      {          if (!HasEffect(spellEffectInfo.EffectIndex)) @@ -2537,13 +2544,6 @@ void UnitAura::FillTargetMap(std::unordered_map<Unit*, uint32>& targets, Unit* c          if (spellEffectInfo.IsEffect(SPELL_EFFECT_APPLY_AURA))              continue; -        // skip area update if owner is not in world! -        if (!GetUnitOwner()->IsInWorld()) -            continue; - -        if (GetUnitOwner()->HasAuraState(AURA_STATE_BANISHED, GetSpellInfo(), caster)) -            continue; -          std::vector<WorldObject*> units;          ConditionContainer* condList = spellEffectInfo.ImplicitTargetConditions.get(); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 0d172cef5e6..5d653dc5a35 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -3608,11 +3608,9 @@ bool SpellInfo::CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInf              continue;          if (!auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) -        {              if (uint32 schoolImmunity = immuneInfo->SchoolImmuneMask)                  if ((auraSpellInfo->SchoolMask & schoolImmunity) != 0)                      return true; -        }          if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask)              if ((mechanicImmunity & (UI64LIT(1) << auraSpellInfo->Mechanic)) != 0) @@ -3625,48 +3623,25 @@ bool SpellInfo::CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInf          bool immuneToAllEffects = true;          for (SpellEffectInfo const& auraSpellEffectInfo : auraSpellInfo->GetEffects())          { -            if (!auraSpellEffectInfo.IsEffect()) +            if (!auraSpellEffectInfo.IsAura())                  continue; -            auto spellImmuneItr = immuneInfo->SpellEffectImmune.find(auraSpellEffectInfo.Effect); -            if (spellImmuneItr == immuneInfo->SpellEffectImmune.end()) -            { -                immuneToAllEffects = false; -                break; -            } - -            if (uint32 mechanic = auraSpellEffectInfo.Mechanic) -            { -                if (!(immuneInfo->MechanicImmuneMask & (UI64LIT(1) << mechanic))) -                { -                    immuneToAllEffects = false; -                    break; -                } -            } +            if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask) +                if ((mechanicImmunity & (UI64LIT(1) << auraSpellEffectInfo.Mechanic)) != 0) +                    continue; -            if (!auraSpellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) +            if (AuraType auraName = auraSpellEffectInfo.ApplyAuraName)              { -                if (AuraType auraName = auraSpellEffectInfo.ApplyAuraName) -                { -                    bool isImmuneToAuraEffectApply = false; -                    auto auraImmuneItr = immuneInfo->AuraTypeImmune.find(auraName); -                    if (auraImmuneItr != immuneInfo->AuraTypeImmune.end()) -                        isImmuneToAuraEffectApply = true; - -                    if (!isImmuneToAuraEffectApply && !auraSpellInfo->IsPositiveEffect(auraSpellEffectInfo.EffectIndex) && !auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) -                    { -                        if (uint32 applyHarmfulAuraImmunityMask = immuneInfo->ApplyHarmfulAuraImmuneMask) -                            if ((auraSpellInfo->GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0) -                                isImmuneToAuraEffectApply = true; -                    } +                if (immuneInfo->AuraTypeImmune.find(auraName) != immuneInfo->AuraTypeImmune.end()) +                    continue; -                    if (!isImmuneToAuraEffectApply) -                    { -                        immuneToAllEffects = false; -                        break; -                    } -                } +                if (!auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES) && !auraSpellInfo->IsPositiveEffect(auraSpellEffectInfo.EffectIndex)) +                    if (uint32 applyHarmfulAuraImmunityMask = immuneInfo->ApplyHarmfulAuraImmuneMask) +                        if ((auraSpellInfo->GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0) +                            continue;              } + +            immuneToAllEffects = false;          }          if (immuneToAllEffects) @@ -3676,6 +3651,41 @@ bool SpellInfo::CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInf      return false;  } +bool SpellInfo::CanSpellEffectProvideImmunityAgainstAuraEffect(SpellEffectInfo const& immunityEffectInfo, SpellInfo const* auraSpellInfo, SpellEffectInfo const& auraEffectInfo) const +{ +    SpellEffectInfo::ImmunityInfo const* immuneInfo = immunityEffectInfo.GetImmunityInfo(); +    if (!immuneInfo) +        return false; + +    if (!auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) +    { +        if (uint32 schoolImmunity = immuneInfo->SchoolImmuneMask) +            if ((auraSpellInfo->SchoolMask & schoolImmunity) != 0) +                return true; + +        if (uint32 applyHarmfulAuraImmunityMask = immuneInfo->ApplyHarmfulAuraImmuneMask) +            if ((auraSpellInfo->GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0) +                return true; +    } + +    if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask) +    { +        if ((mechanicImmunity & (UI64LIT(1) << auraSpellInfo->Mechanic)) != 0) +            return true; +        if ((mechanicImmunity & (UI64LIT(1) << auraEffectInfo.Mechanic)) != 0) +            return true; +    } + +    if (uint32 dispelImmunity = immuneInfo->DispelImmuneMask) +        if (auraSpellInfo->Dispel == dispelImmunity) +            return true; + +    if (immuneInfo->AuraTypeImmune.find(auraEffectInfo.ApplyAuraName) != immuneInfo->AuraTypeImmune.end()) +        return true; + +    return false; +} +  // based on client Spell_C::CancelsAuraEffect  bool SpellInfo::SpellCancelsAuraEffect(AuraEffect const* aurEff) const  { @@ -3685,40 +3695,12 @@ bool SpellInfo::SpellCancelsAuraEffect(AuraEffect const* aurEff) const      if (aurEff->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))          return false; -    for (SpellEffectInfo const& effect : GetEffects()) -    { -        if (!effect.IsEffect(SPELL_EFFECT_APPLY_AURA)) -            continue; - -        uint32 const miscValue = static_cast<uint32>(effect.MiscValue); -        switch (effect.ApplyAuraName) -        { -            case SPELL_AURA_STATE_IMMUNITY: -                if (miscValue != aurEff->GetAuraType()) -                    continue; -                break; -            case SPELL_AURA_SCHOOL_IMMUNITY: -            case SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL: -                if (aurEff->GetSpellInfo()->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES) || !(aurEff->GetSpellInfo()->SchoolMask & miscValue)) -                    continue; -                break; -            case SPELL_AURA_DISPEL_IMMUNITY: -                if (miscValue != aurEff->GetSpellInfo()->Dispel) -                    continue; -                break; -            case SPELL_AURA_MECHANIC_IMMUNITY: -                if (miscValue != aurEff->GetSpellInfo()->Mechanic) -                { -                    if (miscValue != aurEff->GetSpellEffectInfo().Mechanic) -                        continue; -                } -                break; -            default: -                continue; -        } +    if (aurEff->GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes::NoImmunity)) +        return false; -        return true; -    } +    for (SpellEffectInfo const& effect : GetEffects()) +        if (CanSpellEffectProvideImmunityAgainstAuraEffect(effect, aurEff->GetSpellInfo(), aurEff->GetSpellEffectInfo())) +            return true;      return false;  } diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index c66da5ccad4..dea9d265b8e 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -585,6 +585,7 @@ class TC_GAME_API SpellInfo          // spell immunities          void ApplyAllSpellImmunitiesTo(Unit* target, SpellEffectInfo const& spellEffectInfo, bool apply) const;          bool CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInfo) const; +        bool CanSpellEffectProvideImmunityAgainstAuraEffect(SpellEffectInfo const& immunityEffectInfo, SpellInfo const* auraSpellInfo, SpellEffectInfo const& auraEffectInfo) const;          bool SpellCancelsAuraEffect(AuraEffect const* aurEff) const;          uint64 GetAllowedMechanicMask() const; | 
