Implemented school immunity for creature from database
The code is checking the database value against 1 << spellInfo->School so it should match the spell schools defined in the code (SharedDefines.h). Or translated into bits and mask values you can use in the database: SPELL_SCHOOL_NORMAL = bit 0 (0x00000001) SPELL_SCHOOL_HOLY = bit 1 (0x00000002) SPELL_SCHOOL_FIRE = bit 2 (0x00000004) SPELL_SCHOOL_NATURE = bit 3 (0x00000008) SPELL_SCHOOL_FROST = bit 4 (0x00000010) SPELL_SCHOOL_SHADOW = bit 5 (0x00000020) SPELL_SCHOOL_ARCANE = bit 6 (0x00000040)
This commit is contained in:
parent
bf3052b22b
commit
2c4cc00df2
@ -1750,12 +1750,26 @@ bool Creature::IsImmuneToSpell(SpellEntry const* spellInfo, bool castOnSelf)
|
|||||||
if (!spellInfo)
|
if (!spellInfo)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
if (!castOnSelf && GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
|
if (!castOnSelf)
|
||||||
|
{
|
||||||
|
if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
|
||||||
{ return true; }
|
{ return true; }
|
||||||
|
|
||||||
|
if (GetCreatureInfo()->SchoolImmuneMask & (1 << spellInfo->School))
|
||||||
|
{ return true; }
|
||||||
|
}
|
||||||
|
|
||||||
return Unit::IsImmuneToSpell(spellInfo, castOnSelf);
|
return Unit::IsImmuneToSpell(spellInfo, castOnSelf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Creature::IsImmuneToDamage(SpellSchoolMask meleeSchoolMask)
|
||||||
|
{
|
||||||
|
if (GetCreatureInfo()->SchoolImmuneMask & meleeSchoolMask)
|
||||||
|
{ return true; }
|
||||||
|
|
||||||
|
return Unit::IsImmuneToDamage(meleeSchoolMask);
|
||||||
|
}
|
||||||
|
|
||||||
bool Creature::IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const
|
bool Creature::IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const
|
||||||
{
|
{
|
||||||
if (!castOnSelf && GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->EffectMechanic[index] - 1)))
|
if (!castOnSelf && GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->EffectMechanic[index] - 1)))
|
||||||
|
@ -129,6 +129,7 @@ struct CreatureInfo
|
|||||||
uint32 SkinningLootId;
|
uint32 SkinningLootId;
|
||||||
uint32 KillCredit[MAX_KILL_CREDIT];
|
uint32 KillCredit[MAX_KILL_CREDIT];
|
||||||
uint32 MechanicImmuneMask;
|
uint32 MechanicImmuneMask;
|
||||||
|
uint32 SchoolImmuneMask;
|
||||||
int32 ResistanceHoly;
|
int32 ResistanceHoly;
|
||||||
int32 ResistanceFire;
|
int32 ResistanceFire;
|
||||||
int32 ResistanceNature;
|
int32 ResistanceNature;
|
||||||
@ -546,6 +547,7 @@ class Creature : public Unit
|
|||||||
void FillGuidsListFromThreatList(GuidVector& guids, uint32 maxamount = 0);
|
void FillGuidsListFromThreatList(GuidVector& guids, uint32 maxamount = 0);
|
||||||
|
|
||||||
bool IsImmuneToSpell(SpellEntry const* spellInfo, bool castOnSelf) override;
|
bool IsImmuneToSpell(SpellEntry const* spellInfo, bool castOnSelf) override;
|
||||||
|
bool IsImmuneToDamage(SpellSchoolMask meleeSchoolMask) override;
|
||||||
bool IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const override;
|
bool IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const override;
|
||||||
|
|
||||||
bool IsElite() const
|
bool IsElite() const
|
||||||
|
@ -19362,7 +19362,7 @@ void Player::HandleFall(MovementInfo const& movementInfo)
|
|||||||
// 14.57 can be calculated by resolving damageperc formula below to 0
|
// 14.57 can be calculated by resolving damageperc formula below to 0
|
||||||
if (z_diff >= 14.57f && !IsDead() && !isGameMaster() && !HasMovementFlag(MOVEFLAG_ONTRANSPORT) &&
|
if (z_diff >= 14.57f && !IsDead() && !isGameMaster() && !HasMovementFlag(MOVEFLAG_ONTRANSPORT) &&
|
||||||
!HasAuraType(SPELL_AURA_HOVER) && !HasAuraType(SPELL_AURA_FEATHER_FALL) &&
|
!HasAuraType(SPELL_AURA_HOVER) && !HasAuraType(SPELL_AURA_FEATHER_FALL) &&
|
||||||
!IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL))
|
!IsImmuneToDamage(SPELL_SCHOOL_MASK_NORMAL))
|
||||||
{
|
{
|
||||||
// Safe fall, fall height reduction
|
// Safe fall, fall height reduction
|
||||||
int32 safe_fall = GetTotalAuraModifier(SPELL_AURA_SAFE_FALL);
|
int32 safe_fall = GetTotalAuraModifier(SPELL_AURA_SAFE_FALL);
|
||||||
|
@ -1505,7 +1505,7 @@ void Unit::CalculateMeleeDamage(Unit* pVictim, CalcDamageInfo* damageInfo, Weapo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Physical Immune check
|
// Physical Immune check
|
||||||
if (damageInfo->target->IsImmunedToDamage(damageInfo->damageSchoolMask))
|
if (damageInfo->target->IsImmuneToDamage(damageInfo->damageSchoolMask))
|
||||||
{
|
{
|
||||||
damageInfo->HitInfo |= HITINFO_NORMALSWING;
|
damageInfo->HitInfo |= HITINFO_NORMALSWING;
|
||||||
damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
|
damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
|
||||||
@ -2719,7 +2719,7 @@ SpellMissInfo Unit::SpellHitResult(Unit* pVictim, SpellEntry const* spell, bool
|
|||||||
{ return SPELL_MISS_NONE; }
|
{ return SPELL_MISS_NONE; }
|
||||||
|
|
||||||
// Check for immune (use charges)
|
// Check for immune (use charges)
|
||||||
if (pVictim->IsImmunedToDamage(GetSpellSchoolMask(spell)) && !spell->HasAttribute(SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY))
|
if (pVictim->IsImmuneToDamage(GetSpellSchoolMask(spell)) && !spell->HasAttribute(SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY))
|
||||||
{ return SPELL_MISS_IMMUNE; }
|
{ return SPELL_MISS_IMMUNE; }
|
||||||
|
|
||||||
// Try victim reflect spell
|
// Try victim reflect spell
|
||||||
@ -6050,7 +6050,7 @@ int32 Unit::SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
|
|||||||
return AdvertisedBenefit;
|
return AdvertisedBenefit;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::IsImmunedToDamage(SpellSchoolMask shoolMask)
|
bool Unit::IsImmuneToDamage(SpellSchoolMask shoolMask)
|
||||||
{
|
{
|
||||||
// If m_immuneToSchool type contain this school type, IMMUNE damage.
|
// If m_immuneToSchool type contain this school type, IMMUNE damage.
|
||||||
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
||||||
@ -7312,7 +7312,7 @@ bool Unit::IsSecondChoiceTarget(Unit* pTarget, bool checkThreatArea)
|
|||||||
MANGOS_ASSERT(pTarget && GetTypeId() == TYPEID_UNIT);
|
MANGOS_ASSERT(pTarget && GetTypeId() == TYPEID_UNIT);
|
||||||
|
|
||||||
return
|
return
|
||||||
pTarget->IsImmunedToDamage(GetMeleeDamageSchoolMask()) ||
|
pTarget->IsImmuneToDamage(GetMeleeDamageSchoolMask()) ||
|
||||||
pTarget->hasNegativeAuraWithInterruptFlag(AURA_INTERRUPT_FLAG_DAMAGE) ||
|
pTarget->hasNegativeAuraWithInterruptFlag(AURA_INTERRUPT_FLAG_DAMAGE) ||
|
||||||
(checkThreatArea && ((Creature*)this)->IsOutOfThreatArea(pTarget));
|
(checkThreatArea && ((Creature*)this)->IsOutOfThreatArea(pTarget));
|
||||||
}
|
}
|
||||||
|
@ -3597,7 +3597,7 @@ class Unit : public WorldObject
|
|||||||
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply);
|
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply);
|
||||||
void ApplySpellDispelImmunity(const SpellEntry* spellProto, DispelType type, bool apply);
|
void ApplySpellDispelImmunity(const SpellEntry* spellProto, DispelType type, bool apply);
|
||||||
virtual bool IsImmuneToSpell(SpellEntry const* spellInfo, bool castOnSelf);
|
virtual bool IsImmuneToSpell(SpellEntry const* spellInfo, bool castOnSelf);
|
||||||
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask);
|
virtual bool IsImmuneToDamage(SpellSchoolMask meleeSchoolMask);
|
||||||
virtual bool IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const;
|
virtual bool IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const;
|
||||||
|
|
||||||
uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage);
|
uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage);
|
||||||
|
@ -43,8 +43,8 @@
|
|||||||
// DBC_FF_LOGIC = 'l' // Logical (boolean)
|
// DBC_FF_LOGIC = 'l' // Logical (boolean)
|
||||||
// };
|
// };
|
||||||
//
|
//
|
||||||
const char CreatureInfosrcfmt[] = "issiiiiiiiifiiiiliiiiiffiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
|
const char CreatureInfosrcfmt[] = "issiiiiiiiifiiiiliiiiiffiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
|
||||||
const char CreatureInfodstfmt[] = "issiiiiiiiifiiiiliiiiiffiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
|
const char CreatureInfodstfmt[] = "issiiiiiiiifiiiiliiiiiffiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
|
||||||
const char CreatureDataAddonInfofmt[] = "iiibbiis";
|
const char CreatureDataAddonInfofmt[] = "iiibbiis";
|
||||||
const char CreatureModelfmt[] = "iffbii";
|
const char CreatureModelfmt[] = "iffbii";
|
||||||
const char CreatureInfoAddonInfofmt[] = "iiibbiis";
|
const char CreatureInfoAddonInfofmt[] = "iiibbiis";
|
||||||
|
@ -1131,7 +1131,7 @@ void Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool isReflected)
|
|||||||
// Recheck immune (only for delayed spells)
|
// Recheck immune (only for delayed spells)
|
||||||
float speed = m_spellInfo->speed == 0.0f && m_triggeredBySpellInfo ? m_triggeredBySpellInfo->speed : m_spellInfo->speed;
|
float speed = m_spellInfo->speed == 0.0f && m_triggeredBySpellInfo ? m_triggeredBySpellInfo->speed : m_spellInfo->speed;
|
||||||
if (speed && (
|
if (speed && (
|
||||||
unit->IsImmunedToDamage(GetSpellSchoolMask(m_spellInfo)) ||
|
unit->IsImmuneToDamage(GetSpellSchoolMask(m_spellInfo)) ||
|
||||||
unit->IsImmuneToSpell(m_spellInfo, unit == realCaster)))
|
unit->IsImmuneToSpell(m_spellInfo, unit == realCaster)))
|
||||||
{
|
{
|
||||||
if (realCaster)
|
if (realCaster)
|
||||||
|
@ -4343,7 +4343,7 @@ void Aura::PeriodicTick()
|
|||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune (not use charges)
|
||||||
if (target->IsImmunedToDamage(GetSpellSchoolMask(spellProto)))
|
if (target->IsImmuneToDamage(GetSpellSchoolMask(spellProto)))
|
||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
uint32 absorb = 0;
|
uint32 absorb = 0;
|
||||||
@ -4434,7 +4434,7 @@ void Aura::PeriodicTick()
|
|||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
// Check for immune
|
// Check for immune
|
||||||
if (target->IsImmunedToDamage(GetSpellSchoolMask(spellProto)))
|
if (target->IsImmuneToDamage(GetSpellSchoolMask(spellProto)))
|
||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
uint32 absorb = 0;
|
uint32 absorb = 0;
|
||||||
@ -4591,7 +4591,7 @@ void Aura::PeriodicTick()
|
|||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune (not use charges)
|
||||||
if (target->IsImmunedToDamage(GetSpellSchoolMask(spellProto)))
|
if (target->IsImmuneToDamage(GetSpellSchoolMask(spellProto)))
|
||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
// ignore non positive values (can be result apply spellmods to aura damage
|
// ignore non positive values (can be result apply spellmods to aura damage
|
||||||
@ -4704,7 +4704,7 @@ void Aura::PeriodicTick()
|
|||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune (not use charges)
|
||||||
if (target->IsImmunedToDamage(GetSpellSchoolMask(spellProto)))
|
if (target->IsImmuneToDamage(GetSpellSchoolMask(spellProto)))
|
||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
int32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
|
int32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
#define CHAR_DB_UPDATE_DESCRIPTION "Remove field from dbDocs"
|
#define CHAR_DB_UPDATE_DESCRIPTION "Remove field from dbDocs"
|
||||||
|
|
||||||
#define WORLD_DB_VERSION_NR 21
|
#define WORLD_DB_VERSION_NR 21
|
||||||
#define WORLD_DB_STRUCTURE_NR 12
|
#define WORLD_DB_STRUCTURE_NR 13
|
||||||
#define WORLD_DB_CONTENT_NR 1
|
#define WORLD_DB_CONTENT_NR 1
|
||||||
#define WORLD_DB_UPDATE_DESCRIPTION "AutoBroadcast"
|
#define WORLD_DB_UPDATE_DESCRIPTION "SchoolImmuneMask"
|
||||||
#endif // __REVISION_H__
|
#endif // __REVISION_H__
|
||||||
|
Loading…
x
Reference in New Issue
Block a user