Core/Creature: Load template immunities into m_spellImmune container.
Port From (https://github.com/TrinityCore/TrinityCore/commit/f4205b760eecce436af204d973f7876db8948407)
This commit is contained in:
@@ -355,6 +355,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
UpdateMovementFlags();
|
UpdateMovementFlags();
|
||||||
LoadCreaturesAddon();
|
LoadCreaturesAddon();
|
||||||
|
LoadMechanicTemplateImmunity();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1693,9 +1694,29 @@ namespace Game.Entities
|
|||||||
ForcedDespawn(msTimeToDespawn, forceRespawnTimer);
|
ForcedDespawn(msTimeToDespawn, forceRespawnTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasMechanicTemplateImmunity(uint mask)
|
void LoadMechanicTemplateImmunity()
|
||||||
{
|
{
|
||||||
return (!GetOwnerGUID().IsPlayer() || !IsHunterPet()) && GetCreatureTemplate().MechanicImmuneMask.HasAnyFlag(mask);
|
// uint32 max used for "spell id", the immunity system will not perform SpellInfo checks against invalid spells
|
||||||
|
// used so we know which immunities were loaded from template
|
||||||
|
uint placeholderSpellId = uint.MaxValue;
|
||||||
|
|
||||||
|
// unapply template immunities (in case we're updating entry)
|
||||||
|
for (uint i = 1; i < (int)Mechanics.Max; ++i)
|
||||||
|
ApplySpellImmune(placeholderSpellId, SpellImmunity.Mechanic, i, false);
|
||||||
|
|
||||||
|
// don't inherit immunities for hunter pets
|
||||||
|
if (GetOwnerGUID().IsPlayer() && IsHunterPet())
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint mask = GetCreatureTemplate().MechanicImmuneMask;
|
||||||
|
if (mask != 0)
|
||||||
|
{
|
||||||
|
for (uint i = 0 + 1; i < (int)Mechanics.Max; ++i)
|
||||||
|
{
|
||||||
|
if ((mask & (1u << ((int)i - 1))) != 0)
|
||||||
|
ApplySpellImmune(placeholderSpellId, SpellImmunity.Mechanic, i, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsImmunedToSpell(SpellInfo spellInfo, Unit caster)
|
public override bool IsImmunedToSpell(SpellInfo spellInfo, Unit caster)
|
||||||
@@ -1703,12 +1724,6 @@ namespace Game.Entities
|
|||||||
if (spellInfo == null)
|
if (spellInfo == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Creature is immune to main mechanic of the spell
|
|
||||||
if (spellInfo.Mechanic > Mechanics.None && HasMechanicTemplateImmunity(1u << ((int)spellInfo.Mechanic - 1)))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// This check must be done instead of 'if (GetCreatureTemplate().MechanicImmuneMask & (1 << (spellInfo.Mechanic - 1)))' for not break
|
|
||||||
// the check of mechanic immunity on DB (tested) because GetCreatureTemplate().MechanicImmuneMask and m_spellImmune[IMMUNITY_MECHANIC] don't have same data.
|
|
||||||
bool immunedToAllEffects = true;
|
bool immunedToAllEffects = true;
|
||||||
foreach (SpellEffectInfo effect in spellInfo.GetEffectsForDifficulty(GetMap().GetDifficultyID()))
|
foreach (SpellEffectInfo effect in spellInfo.GetEffectsForDifficulty(GetMap().GetDifficultyID()))
|
||||||
{
|
{
|
||||||
@@ -1734,9 +1749,6 @@ namespace Game.Entities
|
|||||||
if (effect == null)
|
if (effect == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (effect.Mechanic > Mechanics.None && HasMechanicTemplateImmunity(1u << ((int)effect.Mechanic - 1)))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (GetCreatureTemplate().CreatureType == CreatureType.Mechanical && effect.Effect == SpellEffectName.Heal)
|
if (GetCreatureTemplate().CreatureType == CreatureType.Mechanical && effect.Effect == SpellEffectName.Heal)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user