*Fix deadly brew.
*Some changes in flag SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY. --HG-- branch : trunk
This commit is contained in:
+4
-10
@@ -671,11 +671,6 @@ void Spell::prepareDataForTriggerSystem()
|
|||||||
// Create base triggers flags for Attacker and Victim ( m_procAttacker and m_procVictim)
|
// Create base triggers flags for Attacker and Victim ( m_procAttacker and m_procVictim)
|
||||||
//==========================================================================================
|
//==========================================================================================
|
||||||
|
|
||||||
m_canTrigger = true;
|
|
||||||
|
|
||||||
if (m_CastItem && m_spellInfo->SpellFamilyName != SPELLFAMILY_POTION)
|
|
||||||
m_canTrigger = false; // Do not trigger from item cast spell(except potions)
|
|
||||||
|
|
||||||
// Get data for type of attack and fill base info for trigger
|
// Get data for type of attack and fill base info for trigger
|
||||||
switch (m_spellInfo->DmgClass)
|
switch (m_spellInfo->DmgClass)
|
||||||
{
|
{
|
||||||
@@ -958,7 +953,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
|||||||
procEx |= PROC_EX_NORMAL_HIT;
|
procEx |= PROC_EX_NORMAL_HIT;
|
||||||
|
|
||||||
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
|
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
|
||||||
if (m_canTrigger && missInfo != SPELL_MISS_REFLECT)
|
if (missInfo != SPELL_MISS_REFLECT)
|
||||||
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, addhealth, m_attackType, m_spellInfo);
|
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, addhealth, m_attackType, m_spellInfo);
|
||||||
|
|
||||||
if (m_spellAura)
|
if (m_spellAura)
|
||||||
@@ -983,7 +978,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
|||||||
procVictim |= PROC_FLAG_TAKEN_ANY_DAMAGE;
|
procVictim |= PROC_FLAG_TAKEN_ANY_DAMAGE;
|
||||||
|
|
||||||
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
|
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
|
||||||
if (m_canTrigger && missInfo != SPELL_MISS_REFLECT)
|
if (missInfo != SPELL_MISS_REFLECT)
|
||||||
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, damageInfo.damage, m_attackType, m_spellInfo);
|
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, damageInfo.damage, m_attackType, m_spellInfo);
|
||||||
|
|
||||||
if (m_spellAura)
|
if (m_spellAura)
|
||||||
@@ -1005,7 +1000,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
|||||||
SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask);
|
SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask);
|
||||||
procEx |= createProcExtendMask(&damageInfo, missInfo);
|
procEx |= createProcExtendMask(&damageInfo, missInfo);
|
||||||
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
|
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
|
||||||
if (m_canTrigger && missInfo != SPELL_MISS_REFLECT)
|
if (missInfo != SPELL_MISS_REFLECT)
|
||||||
caster->ProcDamageAndSpell(unit, procAttacker, procVictim, procEx, 0, m_attackType, m_spellInfo);
|
caster->ProcDamageAndSpell(unit, procAttacker, procVictim, procEx, 0, m_attackType, m_spellInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1039,8 +1034,7 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
|||||||
|
|
||||||
// Recheck immune (only for delayed spells)
|
// Recheck immune (only for delayed spells)
|
||||||
if( m_spellInfo->speed &&
|
if( m_spellInfo->speed &&
|
||||||
!(m_spellInfo->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
|
(unit->IsImmunedToDamage(m_spellInfo) ||
|
||||||
&& (unit->IsImmunedToDamage(GetSpellSchoolMask(m_spellInfo)) ||
|
|
||||||
unit->IsImmunedToSpell(m_spellInfo)))
|
unit->IsImmunedToSpell(m_spellInfo)))
|
||||||
{
|
{
|
||||||
m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_IMMUNE);
|
m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_IMMUNE);
|
||||||
|
|||||||
@@ -542,7 +542,6 @@ class Spell
|
|||||||
//******************************************
|
//******************************************
|
||||||
// Spell trigger system
|
// Spell trigger system
|
||||||
//******************************************
|
//******************************************
|
||||||
bool m_canTrigger; // Can start trigger (m_IsTriggeredSpell can`t use for this)
|
|
||||||
uint32 m_procAttacker; // Attacker trigger flags
|
uint32 m_procAttacker; // Attacker trigger flags
|
||||||
uint32 m_procVictim; // Victim trigger flags
|
uint32 m_procVictim; // Victim trigger flags
|
||||||
void prepareDataForTriggerSystem();
|
void prepareDataForTriggerSystem();
|
||||||
|
|||||||
@@ -4102,8 +4102,7 @@ void AuraEffect::HandleModMechanicImmunity(bool apply, bool Real)
|
|||||||
for(Unit::AuraMap::iterator iter = Auras.begin(); iter != Auras.end();)
|
for(Unit::AuraMap::iterator iter = Auras.begin(); iter != Auras.end();)
|
||||||
{
|
{
|
||||||
SpellEntry const *spell = iter->second->GetSpellProto();
|
SpellEntry const *spell = iter->second->GetSpellProto();
|
||||||
if (!( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) && // spells unaffected by invulnerability
|
if (spell->Id != GetId())
|
||||||
spell->Id != GetId())
|
|
||||||
{
|
{
|
||||||
//check for mechanic mask
|
//check for mechanic mask
|
||||||
if(GetAllSpellMechanicMask(spell) & mechanic)
|
if(GetAllSpellMechanicMask(spell) & mechanic)
|
||||||
@@ -4228,7 +4227,7 @@ void AuraEffect::HandleAuraModSchoolImmunity(bool apply, bool Real)
|
|||||||
{
|
{
|
||||||
SpellEntry const *spell = iter->second->GetSpellProto();
|
SpellEntry const *spell = iter->second->GetSpellProto();
|
||||||
if((GetSpellSchoolMask(spell) & school_mask)//Check for school mask
|
if((GetSpellSchoolMask(spell) & school_mask)//Check for school mask
|
||||||
&& !( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) //Spells unaffected by invulnerability
|
&& IsDispelableBySpell(GetSpellProto(),spell->Id, true)
|
||||||
&& !iter->second->IsPositive() //Don't remove positive spells
|
&& !iter->second->IsPositive() //Don't remove positive spells
|
||||||
&& spell->Id != GetId() ) //Don't remove self
|
&& spell->Id != GetId() ) //Don't remove self
|
||||||
{
|
{
|
||||||
@@ -5650,7 +5649,7 @@ void AuraEffect::PeriodicTick()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune (not use charges)
|
||||||
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
|
if(m_target->IsImmunedToDamage(GetSpellProto()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// some auras remove at specific health level or more
|
// some auras remove at specific health level or more
|
||||||
@@ -5789,7 +5788,7 @@ void AuraEffect::PeriodicTick()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for immune
|
// Check for immune
|
||||||
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
|
if(m_target->IsImmunedToDamage(GetSpellProto()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32 absorb=0;
|
uint32 absorb=0;
|
||||||
@@ -5967,7 +5966,7 @@ void AuraEffect::PeriodicTick()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune (not use charges)
|
||||||
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
|
if(m_target->IsImmunedToDamage(GetSpellProto()))
|
||||||
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
|
||||||
@@ -6126,7 +6125,7 @@ void AuraEffect::PeriodicTick()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune (not use charges)
|
||||||
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
|
if(m_target->IsImmunedToDamage(GetSpellProto()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int32 pdamage = m_amount > 0 ? m_amount : 0;
|
int32 pdamage = m_amount > 0 ? m_amount : 0;
|
||||||
|
|||||||
@@ -338,14 +338,6 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
|
|||||||
|
|
||||||
switch(m_spellInfo->Id) // better way to check unknown
|
switch(m_spellInfo->Id) // better way to check unknown
|
||||||
{
|
{
|
||||||
case 35354: //Hand of Death
|
|
||||||
{
|
|
||||||
if(unitTarget && unitTarget->HasAura(38528)) //Protection of Elune
|
|
||||||
{
|
|
||||||
damage = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// percent from health with min
|
// percent from health with min
|
||||||
case 25599: // Thundercrash
|
case 25599: // Thundercrash
|
||||||
{
|
{
|
||||||
@@ -451,7 +443,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
|
|||||||
Unit::AuraEffectList const &mPeriodic = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
|
Unit::AuraEffectList const &mPeriodic = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
|
||||||
for(Unit::AuraEffectList::const_iterator i = mPeriodic.begin(); i != mPeriodic.end(); ++i)
|
for(Unit::AuraEffectList::const_iterator i = mPeriodic.begin(); i != mPeriodic.end(); ++i)
|
||||||
{
|
{
|
||||||
if( (*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && ((*i)->GetSpellProto()->SpellFamilyFlags[0] & 4) &&
|
if( (*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && ((*i)->GetSpellProto()->SpellFamilyFlags[0] & 4 || (*i)->GetSpellProto()->SpellFamilyFlags[2] & 2) &&
|
||||||
(*i)->GetCasterGUID()==m_caster->GetGUID() )
|
(*i)->GetCasterGUID()==m_caster->GetGUID() )
|
||||||
{
|
{
|
||||||
unitTarget->RemoveAurasDueToSpell((*i)->GetId(), m_caster->GetGUID());
|
unitTarget->RemoveAurasDueToSpell((*i)->GetId(), m_caster->GetGUID());
|
||||||
|
|||||||
+24
-7
@@ -751,6 +751,24 @@ bool IsPositiveSpell(uint32 spellId, bool deep)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsDispelableBySpell(SpellEntry const * dispelSpell, uint32 spellId, bool def)
|
||||||
|
{
|
||||||
|
if (!dispelSpell) return false;
|
||||||
|
SpellEntry const *spellproto = sSpellStore.LookupEntry(spellId);
|
||||||
|
if (!spellproto) return false;
|
||||||
|
|
||||||
|
if (spellproto->Mechanic == MECHANIC_IMMUNE_SHIELD)
|
||||||
|
{
|
||||||
|
if (dispelSpell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsSingleTargetSpell(SpellEntry const *spellInfo)
|
bool IsSingleTargetSpell(SpellEntry const *spellInfo)
|
||||||
{
|
{
|
||||||
// all other single target spells have if it has AttributesEx5
|
// all other single target spells have if it has AttributesEx5
|
||||||
@@ -1201,14 +1219,13 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellPr
|
|||||||
}
|
}
|
||||||
else // For spells need check school/spell family/family mask
|
else // For spells need check school/spell family/family mask
|
||||||
{
|
{
|
||||||
// Potions can trigger only if spellfamily given
|
// Item cast can trigger only with spells with spellfamily
|
||||||
if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
|
if (procExtra & PROC_EX_INTERNAL_ITEM_CAST && procSpell->SpellFamilyName)
|
||||||
{
|
{
|
||||||
if (procSpell->SpellFamilyName == spellProcEvent->spellFamilyName)
|
if (procSpell->SpellFamilyName == spellProcEvent->spellFamilyName)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check (if set) for school
|
// Check (if set) for school
|
||||||
if(spellProcEvent->schoolMask && (spellProcEvent->schoolMask & procSpell->SchoolMask) == 0)
|
if(spellProcEvent->schoolMask && (spellProcEvent->schoolMask & procSpell->SchoolMask) == 0)
|
||||||
return false;
|
return false;
|
||||||
@@ -1226,8 +1243,8 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellPr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// potions can trigger only if have spell_proc entry
|
// Item cast can trigger only with spells with spellfamily
|
||||||
else if (procSpell && procSpell->SpellFamilyName==SPELLFAMILY_POTION)
|
else if (procExtra & PROC_EX_INTERNAL_ITEM_CAST)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check for extra req (if none) and hit/crit
|
// Check for extra req (if none) and hit/crit
|
||||||
@@ -2310,10 +2327,10 @@ void SpellMgr::LoadSpellCustomAttr()
|
|||||||
spellInfo->speed = SPEED_CHARGE;
|
spellInfo->speed = SPEED_CHARGE;
|
||||||
mSpellCustomAttr[i] |= SPELL_ATTR_CU_CHARGE;
|
mSpellCustomAttr[i] |= SPELL_ATTR_CU_CHARGE;
|
||||||
case SPELL_EFFECT_TRIGGER_SPELL:
|
case SPELL_EFFECT_TRIGGER_SPELL:
|
||||||
//if(spellInfo->Targets & (TARGET_FLAG_SOURCE_LOCATION|TARGET_FLAG_DEST_LOCATION))
|
|
||||||
if (SpellTargetType[spellInfo->EffectImplicitTargetA[j]]== TARGET_TYPE_DEST_CASTER ||
|
if (SpellTargetType[spellInfo->EffectImplicitTargetA[j]]== TARGET_TYPE_DEST_CASTER ||
|
||||||
SpellTargetType[spellInfo->EffectImplicitTargetA[j]]== TARGET_TYPE_DEST_TARGET ||
|
SpellTargetType[spellInfo->EffectImplicitTargetA[j]]== TARGET_TYPE_DEST_TARGET ||
|
||||||
SpellTargetType[spellInfo->EffectImplicitTargetA[j]]== TARGET_TYPE_DEST_DEST)
|
SpellTargetType[spellInfo->EffectImplicitTargetA[j]]== TARGET_TYPE_DEST_DEST ||
|
||||||
|
spellInfo->Targets & (TARGET_FLAG_SOURCE_LOCATION|TARGET_FLAG_DEST_LOCATION))
|
||||||
spellInfo->Effect[j] = SPELL_EFFECT_TRIGGER_MISSILE;
|
spellInfo->Effect[j] = SPELL_EFFECT_TRIGGER_MISSILE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -240,6 +240,7 @@ inline bool IsNonCombatSpell(SpellEntry const *spellInfo)
|
|||||||
bool IsPositiveSpell(uint32 spellId, bool deep = false);
|
bool IsPositiveSpell(uint32 spellId, bool deep = false);
|
||||||
bool IsPositiveEffect(uint32 spellId, uint32 effIndex, bool deep = false);
|
bool IsPositiveEffect(uint32 spellId, uint32 effIndex, bool deep = false);
|
||||||
bool IsPositiveTarget(uint32 targetA, uint32 targetB);
|
bool IsPositiveTarget(uint32 targetA, uint32 targetB);
|
||||||
|
bool IsDispelableBySpell(SpellEntry const * dispelSpell, uint32 spellId, bool def = false);
|
||||||
|
|
||||||
bool IsSingleTargetSpell(SpellEntry const *spellInfo);
|
bool IsSingleTargetSpell(SpellEntry const *spellInfo);
|
||||||
bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellInfo2);
|
bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellInfo2);
|
||||||
@@ -436,7 +437,8 @@ enum ProcFlagsEx
|
|||||||
PROC_EX_AURA_REMOVE_EXPIRE = 0x0004000, // aura remove by default and by cancel
|
PROC_EX_AURA_REMOVE_EXPIRE = 0x0004000, // aura remove by default and by cancel
|
||||||
PROC_EX_EX_TRIGGER_ALWAYS = 0x0010000, // If set trigger always ( no matter another flags) used for drop charges
|
PROC_EX_EX_TRIGGER_ALWAYS = 0x0010000, // If set trigger always ( no matter another flags) used for drop charges
|
||||||
PROC_EX_EX_ONE_TIME_TRIGGER = 0x0020000, // If set trigger always but only one time (not used)
|
PROC_EX_EX_ONE_TIME_TRIGGER = 0x0020000, // If set trigger always but only one time (not used)
|
||||||
PROC_EX_INTERNAL_TRIGGERED = 0x4000000 // Only for internal use
|
PROC_EX_INTERNAL_TRIGGERED = 0x4000000, // Only for internal use
|
||||||
|
PROC_EX_INTERNAL_ITEM_CAST = 0x8000000
|
||||||
};
|
};
|
||||||
#define AURA_REMOVE_PROC_EX_MASK \
|
#define AURA_REMOVE_PROC_EX_MASK \
|
||||||
(PROC_EX_AURA_REMOVE_DESTROY | PROC_EX_AURA_REMOVE_EXPIRE)
|
(PROC_EX_AURA_REMOVE_DESTROY | PROC_EX_AURA_REMOVE_EXPIRE)
|
||||||
|
|||||||
+25
-10
@@ -2890,10 +2890,6 @@ SpellMissInfo Unit::SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool
|
|||||||
if (pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
|
if (pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
|
||||||
return SPELL_MISS_EVADE;
|
return SPELL_MISS_EVADE;
|
||||||
|
|
||||||
// If Spel has this flag cannot be resisted/immuned/etc
|
|
||||||
if (spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
|
|
||||||
return SPELL_MISS_NONE;
|
|
||||||
|
|
||||||
// Check for immune
|
// Check for immune
|
||||||
if (pVictim->IsImmunedToSpell(spell))
|
if (pVictim->IsImmunedToSpell(spell))
|
||||||
return SPELL_MISS_IMMUNE;
|
return SPELL_MISS_IMMUNE;
|
||||||
@@ -2903,9 +2899,8 @@ SpellMissInfo Unit::SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool
|
|||||||
if (IsPositiveSpell(spell->Id)
|
if (IsPositiveSpell(spell->Id)
|
||||||
&&(!IsHostileTo(pVictim))) //prevent from affecting enemy by "positive" spell
|
&&(!IsHostileTo(pVictim))) //prevent from affecting enemy by "positive" spell
|
||||||
return SPELL_MISS_NONE;
|
return SPELL_MISS_NONE;
|
||||||
|
|
||||||
// Check for immune
|
// Check for immune
|
||||||
if (pVictim->IsImmunedToDamage(GetSpellSchoolMask(spell)))
|
if (pVictim->IsImmunedToDamage(spell))
|
||||||
return SPELL_MISS_IMMUNE;
|
return SPELL_MISS_IMMUNE;
|
||||||
|
|
||||||
if(this == pVictim)
|
if(this == pVictim)
|
||||||
@@ -9266,6 +9261,29 @@ bool Unit::IsImmunedToDamage(SpellSchoolMask shoolMask)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Unit::IsImmunedToDamage(SpellEntry const* spellInfo)
|
||||||
|
{
|
||||||
|
uint32 shoolMask = GetSpellSchoolMask(spellInfo);
|
||||||
|
if( !(spellInfo->AttributesEx & SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE) && // unaffected by school immunity
|
||||||
|
!(spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY) // can remove immune (by dispell or immune it)
|
||||||
|
&& (spellInfo->Id != 42292))
|
||||||
|
{
|
||||||
|
//If m_immuneToSchool type contain this school type, IMMUNE damage.
|
||||||
|
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
||||||
|
for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
|
||||||
|
if(itr->type & shoolMask &&!IsDispelableBySpell(spellInfo, itr->spellId))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//If m_immuneToDamage type contain magic, IMMUNE damage.
|
||||||
|
SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
|
||||||
|
for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
|
||||||
|
if(itr->type & shoolMask)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo)
|
bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo)
|
||||||
{
|
{
|
||||||
if (!spellInfo)
|
if (!spellInfo)
|
||||||
@@ -9283,7 +9301,7 @@ bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo)
|
|||||||
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
||||||
for(SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
|
for(SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
|
||||||
if( !(IsPositiveSpell(itr->spellId) && IsPositiveSpell(spellInfo->Id)) &&
|
if( !(IsPositiveSpell(itr->spellId) && IsPositiveSpell(spellInfo->Id)) &&
|
||||||
(itr->type & GetSpellSchoolMask(spellInfo)) )
|
(itr->type & GetSpellSchoolMask(spellInfo)) && !IsDispelableBySpell(spellInfo, itr->spellId))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11635,7 +11653,6 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
|
|||||||
|
|
||||||
if(!IsTriggeredAtSpellProcEvent(pTarget, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, (damage > 0), triggerData.spellProcEvent))
|
if(!IsTriggeredAtSpellProcEvent(pTarget, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, (damage > 0), triggerData.spellProcEvent))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (uint8 i=0; i<MAX_SPELL_EFFECTS;++i)
|
for (uint8 i=0; i<MAX_SPELL_EFFECTS;++i)
|
||||||
{
|
{
|
||||||
if (AuraEffect * aurEff = itr->second->GetPartAura(i))
|
if (AuraEffect * aurEff = itr->second->GetPartAura(i))
|
||||||
@@ -11646,7 +11663,6 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
|
|||||||
// If not trigger by default and spellProcEvent==NULL - skip
|
// If not trigger by default and spellProcEvent==NULL - skip
|
||||||
if (!isTriggerAura[aurEff->GetAuraName()] && triggerData.spellProcEvent==NULL)
|
if (!isTriggerAura[aurEff->GetAuraName()] && triggerData.spellProcEvent==NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
triggerData.effMask |= 1<<i;
|
triggerData.effMask |= 1<<i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12456,7 +12472,6 @@ bool Unit::IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura * aura, SpellEntry co
|
|||||||
// Check spellProcEvent data requirements
|
// Check spellProcEvent data requirements
|
||||||
if(!spellmgr.IsSpellProcEventCanTriggeredBy(spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
|
if(!spellmgr.IsSpellProcEventCanTriggeredBy(spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// In most cases req get honor or XP from kill
|
// In most cases req get honor or XP from kill
|
||||||
if (EventProcFlag & PROC_FLAG_KILL && GetTypeId() == TYPEID_PLAYER)
|
if (EventProcFlag & PROC_FLAG_KILL && GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1528,6 +1528,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
virtual bool IsImmunedToSpell(SpellEntry const* spellInfo);
|
virtual bool IsImmunedToSpell(SpellEntry const* spellInfo);
|
||||||
// redefined in Creature
|
// redefined in Creature
|
||||||
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask);
|
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask);
|
||||||
|
bool IsImmunedToDamage(SpellEntry const* spellInfo);
|
||||||
virtual bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
|
virtual bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
|
||||||
// redefined in Creature
|
// redefined in Creature
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user