aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellInfo.cpp')
-rw-r--r--src/server/game/Spells/SpellInfo.cpp60
1 files changed, 28 insertions, 32 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 5f6748e93e8..cb2875edd8e 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -231,7 +231,7 @@ struct SpellEffectInfo::ImmunityInfo
uint32 SchoolImmuneMask = 0;
uint32 ApplyHarmfulAuraImmuneMask = 0;
uint64 MechanicImmuneMask = 0;
- uint32 DispelImmune = 0;
+ uint32 DispelImmuneMask = 0;
uint32 DamageSchoolMask = 0;
Trinity::Containers::FlatSet<AuraType> AuraTypeImmune;
@@ -2275,6 +2275,11 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co
if (HasAttribute(SPELL_ATTR5_NOT_ON_PLAYER_CONTROLLED_NPC) && unitTarget->IsControlledByPlayer())
return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;
+
+ if (HasAttribute(SPELL_ATTR3_NOT_ON_AOE_IMMUNE))
+ if (CreatureImmunities const* immunities = SpellMgr::GetCreatureImmunities(unitTarget->ToCreature()->GetCreatureTemplate()->CreatureImmunitiesId))
+ if (immunities->ImmuneAoE)
+ return SPELL_FAILED_BAD_TARGETS;
}
else if (HasAttribute(SPELL_ATTR5_NOT_ON_PLAYER))
return SPELL_FAILED_TARGET_IS_PLAYER;
@@ -3309,7 +3314,7 @@ void SpellInfo::_LoadImmunityInfo()
uint32 schoolImmunityMask = 0;
uint32 applyHarmfulAuraImmunityMask = 0;
uint64 mechanicImmunityMask = 0;
- uint32 dispelImmunity = 0;
+ uint32 dispelImmunityMask = 0;
uint32 damageImmunityMask = 0;
int32 miscVal = effect.MiscValue;
@@ -3321,6 +3326,17 @@ void SpellInfo::_LoadImmunityInfo()
{
case SPELL_AURA_MECHANIC_IMMUNITY_MASK:
{
+ if (CreatureImmunities const* creatureImmunities = SpellMgr::GetCreatureImmunities(miscVal))
+ {
+ schoolImmunityMask |= creatureImmunities->School.to_ulong();
+ dispelImmunityMask |= creatureImmunities->DispelType.to_ulong();
+ mechanicImmunityMask |= creatureImmunities->Mechanic.to_ullong();
+ for (SpellEffectName effectType : creatureImmunities->Effect)
+ immuneInfo.SpellEffectImmune.insert(effectType);
+ for (AuraType aura : creatureImmunities->Aura)
+ immuneInfo.AuraTypeImmune.insert(aura);
+ }
+
switch (miscVal)
{
case 96: // Free Friend, Uncontrollable Frenzy, Warlord's Presence
@@ -3460,29 +3476,6 @@ void SpellInfo::_LoadImmunityInfo()
default:
break;
}
-
- if (immuneInfo.AuraTypeImmune.empty())
- {
- if (miscVal & (1 << 10))
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_STUN);
- if (miscVal & (1 << 1))
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_TRANSFORM);
-
- // These flag can be recognized wrong:
- if (miscVal & (1 << 6))
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_DECREASE_SPEED);
- if (miscVal & (1 << 0))
- {
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_ROOT);
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_ROOT_2);
- }
- if (miscVal & (1 << 2))
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_CONFUSE);
- if (miscVal & (1 << 9))
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_FEAR);
- if (miscVal & (1 << 7))
- immuneInfo.AuraTypeImmune.insert(SPELL_AURA_MOD_DISARM);
- }
break;
}
case SPELL_AURA_MECHANIC_IMMUNITY:
@@ -3544,7 +3537,7 @@ void SpellInfo::_LoadImmunityInfo()
}
case SPELL_AURA_DISPEL_IMMUNITY:
{
- dispelImmunity = uint32(miscVal);
+ dispelImmunityMask = 1u << miscVal;
break;
}
default:
@@ -3554,7 +3547,7 @@ void SpellInfo::_LoadImmunityInfo()
immuneInfo.SchoolImmuneMask = schoolImmunityMask;
immuneInfo.ApplyHarmfulAuraImmuneMask = applyHarmfulAuraImmunityMask;
immuneInfo.MechanicImmuneMask = mechanicImmunityMask;
- immuneInfo.DispelImmune = dispelImmunity;
+ immuneInfo.DispelImmuneMask = dispelImmunityMask;
immuneInfo.DamageSchoolMask = damageImmunityMask;
immuneInfo.AuraTypeImmune.shrink_to_fit();
@@ -3563,7 +3556,7 @@ void SpellInfo::_LoadImmunityInfo()
if (immuneInfo.SchoolImmuneMask
|| immuneInfo.ApplyHarmfulAuraImmuneMask
|| immuneInfo.MechanicImmuneMask
- || immuneInfo.DispelImmune
+ || immuneInfo.DispelImmuneMask
|| immuneInfo.DamageSchoolMask
|| !immuneInfo.AuraTypeImmune.empty()
|| !immuneInfo.SpellEffectImmune.empty())
@@ -3704,16 +3697,19 @@ void SpellInfo::ApplyAllSpellImmunitiesTo(Unit* target, SpellEffectInfo const& s
}
}
- if (uint32 dispelImmunity = immuneInfo->DispelImmune)
+ if (uint32 dispelImmunity = immuneInfo->DispelImmuneMask)
{
- target->ApplySpellImmune(Id, IMMUNITY_DISPEL, dispelImmunity, apply);
+ for (uint32 i = 0; i < DISPEL_MAX; ++i)
+ if (dispelImmunity & (1 << i))
+ target->ApplySpellImmune(Id, IMMUNITY_DISPEL, i, apply);
if (apply && HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
{
target->RemoveAppliedAuras([dispelImmunity](AuraApplication const* aurApp) -> bool
{
SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo();
- if (spellInfo->Dispel == dispelImmunity)
+ uint32 dispelMask = spellInfo->GetDispelMask();
+ if ((dispelMask & dispelImmunity) == dispelMask)
return true;
return false;
@@ -3769,7 +3765,7 @@ bool SpellInfo::CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInf
if ((mechanicImmunity & (UI64LIT(1) << auraSpellInfo->Mechanic)) != 0)
return true;
- if (uint32 dispelImmunity = immuneInfo->DispelImmune)
+ if (uint32 dispelImmunity = immuneInfo->DispelImmuneMask)
if (auraSpellInfo->Dispel == dispelImmunity)
return true;