Core/Auras: use a case for SPELL_AURA_MECHANIC_IMMUNITY_MASK. distinguish between spells manually. blizzard probably has a seperate database as to which spells have which immunities.
This commit is contained in:
@@ -3368,41 +3368,244 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Unit* target = aurApp->GetTarget();
|
Unit* target = aurApp->GetTarget();
|
||||||
|
std::list <AuraType> aura_immunity_list;
|
||||||
|
uint32 mechanic_immunity_list;
|
||||||
|
int32 miscVal = GetMiscValue();
|
||||||
|
|
||||||
std::list <AuraType> immunity_list;
|
switch (miscVal)
|
||||||
if (GetMiscValue() & (1<<10))
|
|
||||||
immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
|
||||||
if (GetMiscValue() & (1<<1))
|
|
||||||
immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
|
||||||
|
|
||||||
// These flag can be recognized wrong:
|
|
||||||
if (GetMiscValue() & (1<<6))
|
|
||||||
immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
|
||||||
if (GetMiscValue() & (1<<0))
|
|
||||||
immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
|
||||||
if (GetMiscValue() & (1<<2))
|
|
||||||
immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
|
||||||
if (GetMiscValue() & (1<<9))
|
|
||||||
immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
|
||||||
|
|
||||||
// an exception for Bladestorm
|
|
||||||
if ((GetMiscValue() & (1<<7)) && (GetId() != 46924))
|
|
||||||
immunity_list.push_back(SPELL_AURA_MOD_DISARM);
|
|
||||||
|
|
||||||
// apply immunities
|
|
||||||
for (std::list <AuraType>::iterator iter = immunity_list.begin(); iter != immunity_list.end(); ++iter)
|
|
||||||
target->ApplySpellImmune(GetId(), IMMUNITY_STATE, *iter, apply);
|
|
||||||
|
|
||||||
// Patch 3.0.3 Bladestorm now breaks all snares and roots on the warrior when activated.
|
|
||||||
if (apply && GetId() == 46924)
|
|
||||||
{
|
{
|
||||||
target->RemoveAurasByType(SPELL_AURA_MOD_ROOT);
|
case 96:
|
||||||
target->RemoveAurasByType(SPELL_AURA_MOD_DECREASE_SPEED);
|
case 1615:
|
||||||
|
{
|
||||||
|
if (GetBaseAmount())
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT)
|
||||||
|
| (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN)
|
||||||
|
| (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM)
|
||||||
|
| (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR)
|
||||||
|
| (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED)
|
||||||
|
| (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN);
|
||||||
|
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 679:
|
||||||
|
{
|
||||||
|
if (GetId() == 57742)
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT)
|
||||||
|
| (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN)
|
||||||
|
| (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM)
|
||||||
|
| (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR)
|
||||||
|
| (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED)
|
||||||
|
| (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN);
|
||||||
|
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1557:
|
||||||
|
{
|
||||||
|
if (GetId() == 64187)
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_STUN);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT)
|
||||||
|
| (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN)
|
||||||
|
| (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM)
|
||||||
|
| (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR)
|
||||||
|
| (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED)
|
||||||
|
| (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN);
|
||||||
|
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1614:
|
||||||
|
case 1694:
|
||||||
|
{
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_TAUNT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1630:
|
||||||
|
{
|
||||||
|
if (!GetBaseAmount())
|
||||||
|
{
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_TAUNT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT)
|
||||||
|
| (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN)
|
||||||
|
| (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM)
|
||||||
|
| (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR)
|
||||||
|
| (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED)
|
||||||
|
| (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN);
|
||||||
|
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 477:
|
||||||
|
case 1733:
|
||||||
|
{
|
||||||
|
if (!GetBaseAmount())
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT)
|
||||||
|
| (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN)
|
||||||
|
| (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM)
|
||||||
|
| (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR)
|
||||||
|
| (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED)
|
||||||
|
| (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN);
|
||||||
|
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 878:
|
||||||
|
{
|
||||||
|
if (GetBaseAmount() == 1)
|
||||||
|
{
|
||||||
|
mechanic_immunity_list = (1 << MECHANIC_SNARE) | (1 << MECHANIC_STUN)
|
||||||
|
| (1 << MECHANIC_DISORIENTED) | (1 << MECHANIC_FREEZE);
|
||||||
|
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (aura_immunity_list.size() == 0)
|
||||||
|
{
|
||||||
|
if (miscVal & (1<<10))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_STUN);
|
||||||
|
if (miscVal & (1<<1))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_TRANSFORM);
|
||||||
|
|
||||||
|
// These flag can be recognized wrong:
|
||||||
|
if (miscVal & (1<<6))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
if (miscVal & (1<<0))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT);
|
||||||
|
if (miscVal & (1<<2))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE);
|
||||||
|
if (miscVal & (1<<9))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_FEAR);
|
||||||
|
if (miscVal & (1<<7))
|
||||||
|
aura_immunity_list.push_back(SPELL_AURA_MOD_DISARM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply immunities
|
||||||
|
for (std::list <AuraType>::iterator iter = aura_immunity_list.begin(); iter != aura_immunity_list.end(); ++iter)
|
||||||
|
target->ApplySpellImmune(GetId(), IMMUNITY_STATE, *iter, apply);
|
||||||
|
|
||||||
if (apply && GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
|
if (apply && GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
|
||||||
for (std::list <AuraType>::iterator iter = immunity_list.begin(); iter != immunity_list.end(); ++iter)
|
{
|
||||||
|
target->RemoveAurasWithMechanic(mechanic_immunity_list, AURA_REMOVE_BY_DEFAULT, GetId());
|
||||||
|
for (std::list <AuraType>::iterator iter = aura_immunity_list.begin(); iter != aura_immunity_list.end(); ++iter)
|
||||||
target->RemoveAurasByType(*iter);
|
target->RemoveAurasByType(*iter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleModMechanicImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const
|
void AuraEffect::HandleModMechanicImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const
|
||||||
|
|||||||
Reference in New Issue
Block a user