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;
|
||||
|
||||
Unit* target = aurApp->GetTarget();
|
||||
std::list <AuraType> aura_immunity_list;
|
||||
uint32 mechanic_immunity_list;
|
||||
int32 miscVal = GetMiscValue();
|
||||
|
||||
std::list <AuraType> immunity_list;
|
||||
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)
|
||||
switch (miscVal)
|
||||
{
|
||||
target->RemoveAurasByType(SPELL_AURA_MOD_ROOT);
|
||||
target->RemoveAurasByType(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
case 96:
|
||||
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)
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
void AuraEffect::HandleModMechanicImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const
|
||||
|
||||
Reference in New Issue
Block a user