mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[8649] Implement SPELL_AURA_MECHANIC_IMMUNITY_MASK (147) and related cleanups.
* Always use machanic masks in form (1 << (mech-1)), fix all cases. * Imppement SPELL_AURA_MECHANIC_IMMUNITY_MASK (mostly boss/elite spells). Note: db stored mechannic masks already stored in proper format so not affected.
This commit is contained in:
parent
369e50e068
commit
a4d61a6988
11 changed files with 158 additions and 119 deletions
|
|
@ -956,18 +956,31 @@ enum Mechanics
|
||||||
|
|
||||||
// Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967da6)
|
// Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967da6)
|
||||||
#define IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK ( \
|
#define IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK ( \
|
||||||
(1<<MECHANIC_CHARM )|(1<<MECHANIC_DISORIENTED )|(1<<MECHANIC_FEAR )| \
|
(1<<(MECHANIC_CHARM -1))|(1<<(MECHANIC_DISORIENTED-1))|(1<<(MECHANIC_FEAR -1))| \
|
||||||
(1<<MECHANIC_ROOT )|(1<<MECHANIC_PACIFY )|(1<<MECHANIC_SLEEP )| \
|
(1<<(MECHANIC_ROOT -1))|(1<<(MECHANIC_PACIFY -1))|(1<<(MECHANIC_SLEEP -1))| \
|
||||||
(1<<MECHANIC_SNARE )|(1<<MECHANIC_STUN )|(1<<MECHANIC_FREEZE)| \
|
(1<<(MECHANIC_SNARE -1))|(1<<(MECHANIC_STUN -1))|(1<<(MECHANIC_FREEZE-1))| \
|
||||||
(1<<MECHANIC_KNOCKOUT)|(1<<MECHANIC_POLYMORPH)|(1<<MECHANIC_BANISH)| \
|
(1<<(MECHANIC_KNOCKOUT-1))|(1<<(MECHANIC_POLYMORPH -1))|(1<<(MECHANIC_BANISH-1))| \
|
||||||
(1<<MECHANIC_SHACKLE )|(1<<MECHANIC_TURN )|(1<<MECHANIC_HORROR)| \
|
(1<<(MECHANIC_SHACKLE -1))|(1<<(MECHANIC_TURN -1))|(1<<(MECHANIC_HORROR-1))| \
|
||||||
(1<<MECHANIC_DAZE )|(1<<MECHANIC_SAPPED ) )
|
(1<<(MECHANIC_DAZE -1))|(1<<(MECHANIC_SAPPED -1)))
|
||||||
|
|
||||||
|
#define IMMUNE_TO_ROOT_AND_SNARE_MASK ( \
|
||||||
|
(1<<(MECHANIC_ROOT-1))|(1<<(MECHANIC_SNARE-1)))
|
||||||
|
|
||||||
|
#define IMMUNE_TO_ROOT_AND_STUN_MASK ( \
|
||||||
|
(1<<(MECHANIC_ROOT-1))|(1<<(MECHANIC_STUN-1)))
|
||||||
|
|
||||||
|
#define IMMUNE_TO_SILENCE_AND_STUN_AND_FEAR_MASK ( \
|
||||||
|
(1<<(MECHANIC_SILENCE-1))|(1<<(MECHANIC_STUN-1))|(1<<(MECHANIC_FEAR-1)))
|
||||||
|
|
||||||
|
#define IMMUNE_TO_INTERRUPT_AND_SILENCE_MASK ( \
|
||||||
|
(1<<(MECHANIC_INTERRUPT-1))|(1<<(MECHANIC_SILENCE-1)))
|
||||||
|
|
||||||
// Daze and all croud control spells except polymorph are not removed
|
// Daze and all croud control spells except polymorph are not removed
|
||||||
#define MECHANIC_NOT_REMOVED_BY_SHAPESHIFT ( \
|
#define MECHANIC_NOT_REMOVED_BY_SHAPESHIFT ( \
|
||||||
(1<<MECHANIC_CHARM )|(1<<MECHANIC_DISORIENTED)|(1<<MECHANIC_FEAR )|(1<<MECHANIC_PACIFY )| \
|
(1<<(MECHANIC_CHARM -1))|(1<<(MECHANIC_DISORIENTED-1))|(1<<(MECHANIC_FEAR -1))| \
|
||||||
(1<<MECHANIC_STUN )|(1<<MECHANIC_FREEZE )|(1<<MECHANIC_BANISH)|(1<<MECHANIC_SHACKLE)| \
|
(1<<(MECHANIC_PACIFY-1))|(1<<(MECHANIC_STUN -1))|(1<<(MECHANIC_FREEZE-1))| \
|
||||||
(1<<MECHANIC_HORROR)|(1<<MECHANIC_TURN )|(1<<MECHANIC_DAZE )|(1<<MECHANIC_SAPPED ) )
|
(1<<(MECHANIC_BANISH-1))|(1<<(MECHANIC_SHACKLE -1))|(1<<(MECHANIC_HORROR-1))| \
|
||||||
|
(1<<(MECHANIC_TURN -1))|(1<<(MECHANIC_DAZE -1))|(1<<(MECHANIC_SAPPED-1)))
|
||||||
|
|
||||||
// Spell dispell type
|
// Spell dispell type
|
||||||
enum DispelType
|
enum DispelType
|
||||||
|
|
|
||||||
|
|
@ -4876,7 +4876,9 @@ SpellCastResult Spell::CheckCasterAuras() const
|
||||||
if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_SCHOOL_IMMUNITY)
|
if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_SCHOOL_IMMUNITY)
|
||||||
school_immune |= uint32(m_spellInfo->EffectMiscValue[i]);
|
school_immune |= uint32(m_spellInfo->EffectMiscValue[i]);
|
||||||
else if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MECHANIC_IMMUNITY)
|
else if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MECHANIC_IMMUNITY)
|
||||||
mechanic_immune |= 1 << uint32(m_spellInfo->EffectMiscValue[i]);
|
mechanic_immune |= 1 << uint32(m_spellInfo->EffectMiscValue[i]-1);
|
||||||
|
else if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MECHANIC_IMMUNITY_MASK)
|
||||||
|
mechanic_immune |= uint32(m_spellInfo->EffectMiscValue[i]);
|
||||||
else if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_DISPEL_IMMUNITY)
|
else if (m_spellInfo->EffectApplyAuraName[i] == SPELL_AURA_DISPEL_IMMUNITY)
|
||||||
dispel_immune |= GetDispellMask(DispelType(m_spellInfo->EffectMiscValue[i]));
|
dispel_immune |= GetDispellMask(DispelType(m_spellInfo->EffectMiscValue[i]));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,7 @@ enum AuraType
|
||||||
SPELL_AURA_SAFE_FALL = 144,
|
SPELL_AURA_SAFE_FALL = 144,
|
||||||
SPELL_AURA_MOD_PET_TALENT_POINTS = 145,
|
SPELL_AURA_MOD_PET_TALENT_POINTS = 145,
|
||||||
SPELL_AURA_ALLOW_TAME_PET_TYPE = 146,
|
SPELL_AURA_ALLOW_TAME_PET_TYPE = 146,
|
||||||
SPELL_AURA_ADD_CREATURE_IMMUNITY = 147,
|
SPELL_AURA_MECHANIC_IMMUNITY_MASK = 147,
|
||||||
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
|
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
|
||||||
SPELL_AURA_REDUCE_PUSHBACK = 149, // Reduce Pushback
|
SPELL_AURA_REDUCE_PUSHBACK = 149, // Reduce Pushback
|
||||||
SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT = 150,
|
SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT = 150,
|
||||||
|
|
|
||||||
|
|
@ -197,7 +197,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||||
&Aura::HandleAuraSafeFall, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
|
&Aura::HandleAuraSafeFall, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
|
||||||
&Aura::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
|
&Aura::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
|
||||||
&Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
|
&Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
|
||||||
&Aura::HandleNULL, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY
|
&Aura::HandleModMechanicImmunityMask, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY implemented in Unit::IsImmunedToSpell and Unit::IsImmunedToSpellEffect (check part)
|
||||||
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
||||||
&Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK
|
&Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK
|
||||||
&Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
|
&Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
|
||||||
|
|
@ -2887,7 +2887,8 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real)
|
||||||
// If spell that caused this aura has Croud Control or Daze effect
|
// If spell that caused this aura has Croud Control or Daze effect
|
||||||
if((aurMechMask & MECHANIC_NOT_REMOVED_BY_SHAPESHIFT) ||
|
if((aurMechMask & MECHANIC_NOT_REMOVED_BY_SHAPESHIFT) ||
|
||||||
// some Daze spells have these parameters instead of MECHANIC_DAZE (skip snare spells)
|
// some Daze spells have these parameters instead of MECHANIC_DAZE (skip snare spells)
|
||||||
aurSpellInfo->SpellIconID == 15 && aurSpellInfo->Dispel == 0 && (aurMechMask & (1 << MECHANIC_SNARE))==0)
|
aurSpellInfo->SpellIconID == 15 && aurSpellInfo->Dispel == 0 &&
|
||||||
|
(aurMechMask & (1 << (MECHANIC_SNARE-1)))==0)
|
||||||
{
|
{
|
||||||
++iter;
|
++iter;
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -4171,32 +4172,13 @@ void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
|
||||||
|
|
||||||
if(apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
if(apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
||||||
{
|
{
|
||||||
uint32 mechanic = 1 << misc;
|
uint32 mechanic = 1 << (misc-1);
|
||||||
|
|
||||||
//immune movement impairment and loss of control
|
//immune movement impairment and loss of control
|
||||||
if(GetId()==42292 || GetId()==59752)
|
if(GetId()==42292 || GetId()==59752)
|
||||||
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
|
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
|
||||||
|
|
||||||
Unit::AuraMap& Auras = m_target->GetAuras();
|
m_target->RemoveAurasAtMechanicImmunity(mechanic,GetId());
|
||||||
for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
|
|
||||||
{
|
|
||||||
next = iter;
|
|
||||||
++next;
|
|
||||||
SpellEntry const *spell = iter->second->GetSpellProto();
|
|
||||||
if (!( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) && // spells unaffected by invulnerability
|
|
||||||
spell->Id != GetId())
|
|
||||||
{
|
|
||||||
//check for mechanic mask
|
|
||||||
if(GetSpellMechanicMask(spell, iter->second->GetEffIndex()) & mechanic)
|
|
||||||
{
|
|
||||||
m_target->RemoveAurasDueToSpell(spell->Id);
|
|
||||||
if(Auras.empty())
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
next = Auras.begin();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,misc,apply);
|
m_target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,misc,apply);
|
||||||
|
|
@ -4224,6 +4206,16 @@ void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Aura::HandleModMechanicImmunityMask(bool apply, bool /*Real*/)
|
||||||
|
{
|
||||||
|
uint32 mechanic = m_modifier.m_miscvalue;
|
||||||
|
|
||||||
|
if(apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
||||||
|
m_target->RemoveAurasAtMechanicImmunity(mechanic,GetId());
|
||||||
|
|
||||||
|
// check implemented in Unit::IsImmunedToSpell and Unit::IsImmunedToSpellEffect
|
||||||
|
}
|
||||||
|
|
||||||
//this method is called whenever we add / remove aura which gives m_target some imunity to some spell effect
|
//this method is called whenever we add / remove aura which gives m_target some imunity to some spell effect
|
||||||
void Aura::HandleAuraModEffectImmunity(bool apply, bool /*Real*/)
|
void Aura::HandleAuraModEffectImmunity(bool apply, bool /*Real*/)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -159,6 +159,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandleFarSight(bool Apply, bool Real);
|
void HandleFarSight(bool Apply, bool Real);
|
||||||
void HandleModPossessPet(bool Apply, bool Real);
|
void HandleModPossessPet(bool Apply, bool Real);
|
||||||
void HandleModMechanicImmunity(bool Apply, bool Real);
|
void HandleModMechanicImmunity(bool Apply, bool Real);
|
||||||
|
void HandleModMechanicImmunityMask(bool Apply, bool Real);
|
||||||
void HandleAuraModSkill(bool Apply, bool Real);
|
void HandleAuraModSkill(bool Apply, bool Real);
|
||||||
void HandleModDamagePercentDone(bool Apply, bool Real);
|
void HandleModDamagePercentDone(bool Apply, bool Real);
|
||||||
void HandleModPercentStat(bool Apply, bool Real);
|
void HandleModPercentStat(bool Apply, bool Real);
|
||||||
|
|
|
||||||
|
|
@ -4989,26 +4989,7 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
||||||
if(!unitTarget)
|
if(!unitTarget)
|
||||||
return;
|
return;
|
||||||
// Removes snares and roots.
|
// Removes snares and roots.
|
||||||
uint32 mechanic_mask = (1<<MECHANIC_ROOT) | (1<<MECHANIC_SNARE);
|
unitTarget->RemoveAurasAtMechanicImmunity(IMMUNE_TO_ROOT_AND_SNARE_MASK,30918,true);
|
||||||
Unit::AuraMap& Auras = unitTarget->GetAuras();
|
|
||||||
for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
|
|
||||||
{
|
|
||||||
next = iter;
|
|
||||||
++next;
|
|
||||||
Aura *aur = iter->second;
|
|
||||||
if (!aur->IsPositive()) //only remove negative spells
|
|
||||||
{
|
|
||||||
// check for mechanic mask
|
|
||||||
if(GetSpellMechanicMask(aur->GetSpellProto(), aur->GetEffIndex()) & mechanic_mask)
|
|
||||||
{
|
|
||||||
unitTarget->RemoveAurasDueToSpell(aur->GetId());
|
|
||||||
if(Auras.empty())
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
next = Auras.begin();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Flame Crash
|
// Flame Crash
|
||||||
|
|
|
||||||
|
|
@ -3309,23 +3309,33 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
|
||||||
|
|
||||||
// Get by mechanic
|
// Get by mechanic
|
||||||
uint32 mechanic = GetAllSpellMechanicMask(spellproto);
|
uint32 mechanic = GetAllSpellMechanicMask(spellproto);
|
||||||
if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE;
|
if (!mechanic)
|
||||||
if (mechanic & ((1<<MECHANIC_STUN) |
|
return DIMINISHING_NONE;
|
||||||
(1<<MECHANIC_SHACKLE))) return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
|
|
||||||
if (mechanic & (1<<MECHANIC_SLEEP)) return DIMINISHING_FREEZE_SLEEP;
|
|
||||||
if (mechanic & (1<<MECHANIC_POLYMORPH)) return DIMINISHING_POLYMORPH_GOUGE_SAP;
|
|
||||||
if (mechanic & (1<<MECHANIC_ROOT)) return triggered ? DIMINISHING_TRIGGER_ROOT : DIMINISHING_CONTROL_ROOT;
|
|
||||||
if (mechanic & ((1<<MECHANIC_FEAR) |
|
|
||||||
(1<<MECHANIC_TURN))) return DIMINISHING_FEAR_BLIND;
|
|
||||||
if (mechanic & (1<<MECHANIC_CHARM)) return DIMINISHING_CHARM;
|
|
||||||
if (mechanic & (1<<MECHANIC_SILENCE)) return DIMINISHING_SILENCE;
|
|
||||||
if (mechanic & (1<<MECHANIC_DISARM)) return DIMINISHING_DISARM;
|
|
||||||
if (mechanic & (1<<MECHANIC_FREEZE)) return DIMINISHING_FREEZE_SLEEP;
|
|
||||||
if (mechanic & ((1<<MECHANIC_KNOCKOUT) |
|
|
||||||
(1<<MECHANIC_SAPPED))) return DIMINISHING_POLYMORPH_GOUGE_SAP;
|
|
||||||
if (mechanic & (1<<MECHANIC_BANISH)) return DIMINISHING_BANISH;
|
|
||||||
if (mechanic & (1<<MECHANIC_HORROR)) return DIMINISHING_DEATHCOIL;
|
|
||||||
|
|
||||||
|
if (mechanic & ((1<<(MECHANIC_STUN-1))|(1<<(MECHANIC_SHACKLE-1))))
|
||||||
|
return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
|
||||||
|
if (mechanic & (1<<(MECHANIC_SLEEP-1)))
|
||||||
|
return DIMINISHING_FREEZE_SLEEP;
|
||||||
|
if (mechanic & (1<<(MECHANIC_POLYMORPH-1)))
|
||||||
|
return DIMINISHING_POLYMORPH_GOUGE_SAP;
|
||||||
|
if (mechanic & (1<<(MECHANIC_ROOT-1)))
|
||||||
|
return triggered ? DIMINISHING_TRIGGER_ROOT : DIMINISHING_CONTROL_ROOT;
|
||||||
|
if (mechanic & ((1<<(MECHANIC_FEAR-1))|(1<<(MECHANIC_TURN-1))))
|
||||||
|
return DIMINISHING_FEAR_BLIND;
|
||||||
|
if (mechanic & (1<<(MECHANIC_CHARM-1)))
|
||||||
|
return DIMINISHING_CHARM;
|
||||||
|
if (mechanic & (1<<(MECHANIC_SILENCE-1)))
|
||||||
|
return DIMINISHING_SILENCE;
|
||||||
|
if (mechanic & (1<<(MECHANIC_DISARM-1)))
|
||||||
|
return DIMINISHING_DISARM;
|
||||||
|
if (mechanic & (1<<(MECHANIC_FREEZE-1)))
|
||||||
|
return DIMINISHING_FREEZE_SLEEP;
|
||||||
|
if (mechanic & ((1<<(MECHANIC_KNOCKOUT-1))|(1<<(MECHANIC_SAPPED-1))))
|
||||||
|
return DIMINISHING_POLYMORPH_GOUGE_SAP;
|
||||||
|
if (mechanic & (1<<(MECHANIC_BANISH-1)))
|
||||||
|
return DIMINISHING_BANISH;
|
||||||
|
if (mechanic & (1<<(MECHANIC_HORROR-1)))
|
||||||
|
return DIMINISHING_DEATHCOIL;
|
||||||
|
|
||||||
return DIMINISHING_NONE;
|
return DIMINISHING_NONE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -388,9 +388,9 @@ inline uint32 GetSpellMechanicMask(SpellEntry const* spellInfo, int32 effect)
|
||||||
{
|
{
|
||||||
uint32 mask = 0;
|
uint32 mask = 0;
|
||||||
if (spellInfo->Mechanic)
|
if (spellInfo->Mechanic)
|
||||||
mask |= 1<<spellInfo->Mechanic;
|
mask |= 1 << (spellInfo->Mechanic - 1);
|
||||||
if (spellInfo->EffectMechanic[effect])
|
if (spellInfo->EffectMechanic[effect])
|
||||||
mask |= 1<<spellInfo->EffectMechanic[effect];
|
mask |= 1 << (spellInfo->EffectMechanic[effect] - 1);
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -398,10 +398,10 @@ inline uint32 GetAllSpellMechanicMask(SpellEntry const* spellInfo)
|
||||||
{
|
{
|
||||||
uint32 mask = 0;
|
uint32 mask = 0;
|
||||||
if (spellInfo->Mechanic)
|
if (spellInfo->Mechanic)
|
||||||
mask |= 1<<spellInfo->Mechanic;
|
mask |= 1 << (spellInfo->Mechanic - 1);
|
||||||
for (int i=0; i< 3; ++i)
|
for (int i=0; i< 3; ++i)
|
||||||
if (spellInfo->EffectMechanic[i])
|
if (spellInfo->EffectMechanic[i])
|
||||||
mask |= 1<<spellInfo->EffectMechanic[i];
|
mask |= 1 << (spellInfo->EffectMechanic[i]-1);
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4078,10 +4078,13 @@ void Unit::RemoveArenaAuras(bool onleave)
|
||||||
// used to remove positive visible auras in arenas
|
// used to remove positive visible auras in arenas
|
||||||
for(AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end();)
|
for(AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end();)
|
||||||
{
|
{
|
||||||
if ( !(iter->second->GetSpellProto()->AttributesEx4 & (1<<21)) // don't remove stances, shadowform, pally/hunter auras
|
if (!(iter->second->GetSpellProto()->AttributesEx4 & SPELL_ATTR_EX4_UNK21) &&
|
||||||
&& !iter->second->IsPassive() // don't remove passive auras
|
// don't remove stances, shadowform, pally/hunter auras
|
||||||
&& (!(iter->second->GetSpellProto()->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) || !(iter->second->GetSpellProto()->Attributes & SPELL_ATTR_UNK8)) // not unaffected by invulnerability auras or not having that unknown flag (that seemed the most probable)
|
!iter->second->IsPassive() && // don't remove passive auras
|
||||||
&& (iter->second->IsPositive() != onleave)) // remove positive buffs on enter, negative buffs on leave
|
(!(iter->second->GetSpellProto()->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) ||
|
||||||
|
!(iter->second->GetSpellProto()->Attributes & SPELL_ATTR_UNK8)) &&
|
||||||
|
// not unaffected by invulnerability auras or not having that unknown flag (that seemed the most probable)
|
||||||
|
(iter->second->IsPositive() != onleave)) // remove positive buffs on enter, negative buffs on leave
|
||||||
RemoveAura(iter);
|
RemoveAura(iter);
|
||||||
else
|
else
|
||||||
++iter;
|
++iter;
|
||||||
|
|
@ -5191,7 +5194,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||||
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
||||||
return false;
|
return false;
|
||||||
// Need stun or root mechanic
|
// Need stun or root mechanic
|
||||||
if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_ROOT)|(1<<MECHANIC_STUN))))
|
if (!(GetAllSpellMechanicMask(procSpell) & IMMUNE_TO_ROOT_AND_STUN_MASK))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (dummySpell->Id)
|
switch (dummySpell->Id)
|
||||||
|
|
@ -6355,7 +6358,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||||
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
||||||
return false;
|
return false;
|
||||||
// Need snare or root mechanic
|
// Need snare or root mechanic
|
||||||
if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_ROOT)|(1<<MECHANIC_SNARE))))
|
if (!(GetAllSpellMechanicMask(procSpell) & IMMUNE_TO_ROOT_AND_SNARE_MASK))
|
||||||
return false;
|
return false;
|
||||||
triggered_spell_id = 61258;
|
triggered_spell_id = 61258;
|
||||||
target = this;
|
target = this;
|
||||||
|
|
@ -7159,7 +7162,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Need stun, fear or silence mechanic
|
// Need stun, fear or silence mechanic
|
||||||
if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_SILENCE)|(1<<MECHANIC_STUN)|(1<<MECHANIC_FEAR))))
|
if (!(GetAllSpellMechanicMask(procSpell) & IMMUNE_TO_SILENCE_AND_STUN_AND_FEAR_MASK))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -7169,7 +7172,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
|
||||||
if(!procSpell)
|
if(!procSpell)
|
||||||
return false;
|
return false;
|
||||||
// Need Interrupt or Silenced mechanic
|
// Need Interrupt or Silenced mechanic
|
||||||
if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_INTERRUPT)|(1<<MECHANIC_SILENCE))))
|
if (!(GetAllSpellMechanicMask(procSpell) & IMMUNE_TO_INTERRUPT_AND_SILENCE_MASK))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -8964,8 +8967,9 @@ int32 Unit::SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit *pVi
|
||||||
int32 AdvertisedBenefit = 0;
|
int32 AdvertisedBenefit = 0;
|
||||||
AuraList const& mDamageTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_HEALING);
|
AuraList const& mDamageTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_HEALING);
|
||||||
for(AuraList::const_iterator i = mDamageTaken.begin();i != mDamageTaken.end(); ++i)
|
for(AuraList::const_iterator i = mDamageTaken.begin();i != mDamageTaken.end(); ++i)
|
||||||
if(((*i)->GetModifier()->m_miscvalue & schoolMask) != 0)
|
if ((*i)->GetModifier()->m_miscvalue & schoolMask)
|
||||||
AdvertisedBenefit += (*i)->GetModifier()->m_amount;
|
AdvertisedBenefit += (*i)->GetModifier()->m_amount;
|
||||||
|
|
||||||
return AdvertisedBenefit;
|
return AdvertisedBenefit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9009,13 +9013,17 @@ bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(uint32 mechanic = spellInfo->Mechanic)
|
||||||
|
{
|
||||||
SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
|
SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
|
||||||
for(SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
|
for(SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
|
||||||
{
|
if (itr->type == mechanic)
|
||||||
if(itr->type == spellInfo->Mechanic)
|
return true;
|
||||||
{
|
|
||||||
|
AuraList const& immuneAuraApply = GetAurasByType(SPELL_AURA_MECHANIC_IMMUNITY_MASK);
|
||||||
|
for(AuraList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
|
||||||
|
if ((*iter)->GetModifier()->m_miscvalue & (1 << (mechanic-1)))
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -9036,6 +9044,11 @@ bool Unit::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) con
|
||||||
for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
|
for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
|
||||||
if (itr->type == mechanic)
|
if (itr->type == mechanic)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
AuraList const& immuneAuraApply = GetAurasByType(SPELL_AURA_MECHANIC_IMMUNITY_MASK);
|
||||||
|
for(AuraList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
|
||||||
|
if ((*iter)->GetModifier()->m_miscvalue & (1 << (mechanic-1)))
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(uint32 aura = spellInfo->EffectApplyAuraName[index])
|
if(uint32 aura = spellInfo->EffectApplyAuraName[index])
|
||||||
|
|
@ -9044,6 +9057,7 @@ bool Unit::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) con
|
||||||
for(SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
|
for(SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
|
||||||
if (itr->type == aura)
|
if (itr->type == aura)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Check for immune to application of harmful magical effects
|
// Check for immune to application of harmful magical effects
|
||||||
AuraList const& immuneAuraApply = GetAurasByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL);
|
AuraList const& immuneAuraApply = GetAurasByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL);
|
||||||
for(AuraList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
|
for(AuraList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
|
||||||
|
|
@ -9089,7 +9103,7 @@ uint32 Unit::MeleeDamageBonus(Unit *pVictim, uint32 pdamage,WeaponAttackType att
|
||||||
|
|
||||||
// Shred also have bonus as MECHANIC_BLEED damages
|
// Shred also have bonus as MECHANIC_BLEED damages
|
||||||
if (spellProto && spellProto->SpellFamilyName==SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags & UI64LIT(0x00008000))
|
if (spellProto && spellProto->SpellFamilyName==SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags & UI64LIT(0x00008000))
|
||||||
mechanicMask |= (1 << MECHANIC_BLEED);
|
mechanicMask |= (1 << (MECHANIC_BLEED-1));
|
||||||
|
|
||||||
|
|
||||||
// FLAT damage bonus auras
|
// FLAT damage bonus auras
|
||||||
|
|
@ -12416,6 +12430,31 @@ void Unit::RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unit::RemoveAurasAtMechanicImmunity(uint32 mechMask, uint32 exceptSpellId, bool non_positive /*= false*/)
|
||||||
|
{
|
||||||
|
Unit::AuraMap& auras = GetAuras();
|
||||||
|
for(Unit::AuraMap::iterator iter = auras.begin(); iter != auras.end();)
|
||||||
|
{
|
||||||
|
SpellEntry const *spell = iter->second->GetSpellProto();
|
||||||
|
if (spell->Id == exceptSpellId)
|
||||||
|
++iter;
|
||||||
|
else if (non_positive && iter->second->IsPositive())
|
||||||
|
++iter;
|
||||||
|
else if (spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
|
||||||
|
++iter;
|
||||||
|
else if (GetSpellMechanicMask(spell, iter->second->GetEffIndex()) & mechMask)
|
||||||
|
{
|
||||||
|
RemoveAurasDueToSpell(spell->Id);
|
||||||
|
if(auras.empty())
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
iter = auras.begin();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
|
void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
|
||||||
{
|
{
|
||||||
if(newPhaseMask==GetPhaseMask())
|
if(newPhaseMask==GetPhaseMask())
|
||||||
|
|
|
||||||
|
|
@ -1214,6 +1214,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
void RemoveAurasDueToSpellByCancel(uint32 spellId);
|
void RemoveAurasDueToSpellByCancel(uint32 spellId);
|
||||||
void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
|
void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
|
||||||
void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
|
void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
|
||||||
|
void RemoveAurasAtMechanicImmunity(uint32 mechMask, uint32 exceptSpellId, bool non_positive = false);
|
||||||
|
|
||||||
void RemoveSpellsCausingAura(AuraType auraType);
|
void RemoveSpellsCausingAura(AuraType auraType);
|
||||||
void RemoveRankAurasDueToSpell(uint32 spellId);
|
void RemoveRankAurasDueToSpell(uint32 spellId);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8648"
|
#define REVISION_NR "8649"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue