Core/Spells: handle SPELL_AURA_MOD_DEBUFF_RESISTANCE only for auras. fixes sacred cleansing causing the whole spell to be resisted.

This commit is contained in:
Kandera
2012-06-13 12:34:59 -04:00
parent b43fa6f743
commit 5daa540d3a
2 changed files with 27 additions and 8 deletions
+3 -3
View File
@@ -2465,12 +2465,12 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spell)
// Chance resist debuff // Chance resist debuff
if (!spell->IsPositive()) if (!spell->IsPositive())
{ {
bool bNegativeAura = false; bool bNegativeAura = true;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{ {
if (spell->Effects[i].ApplyAuraName != 0) if (spell->Effects[i].ApplyAuraName == 0)
{ {
bNegativeAura = true; bNegativeAura = false;
break; break;
} }
} }
+24 -5
View File
@@ -2547,13 +2547,32 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
return SPELL_MISS_EVADE; return SPELL_MISS_EVADE;
// For delayed spells immunity may be applied between missile launch and hit - check immunity for that case // For delayed spells immunity may be applied between missile launch and hit - check immunity for that case
// disable effects to which unit is immune if (m_spellInfo->Speed && (unit->IsImmunedToDamage(m_spellInfo) || unit->IsImmunedToSpell(m_spellInfo)))
for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber)
if (effectMask & (1 << effectNumber) && unit->IsImmunedToSpellEffect(m_spellInfo, effectNumber))
effectMask &= ~(1 << effectNumber);
if (!effectMask || (m_spellInfo->Speed && (unit->IsImmunedToDamage(m_spellInfo) || unit->IsImmunedToSpell(m_spellInfo))))
return SPELL_MISS_IMMUNE; return SPELL_MISS_IMMUNE;
// disable effects to which unit is immune
SpellMissInfo returnVal = SPELL_MISS_IMMUNE;
for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber)
{
if (effectMask & (1 << effectNumber))
if (unit->IsImmunedToSpellEffect(m_spellInfo, effectNumber))
effectMask &= ~(1 << effectNumber);
else if (m_spellInfo->Effects[effectNumber].IsAura() && !m_spellInfo->IsPositiveEffect(effectNumber))
{
int32 debuff_resist_chance = unit->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(m_spellInfo->Dispel));
debuff_resist_chance += unit->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(m_spellInfo->Dispel));
if (debuff_resist_chance > 0)
if (irand(0,10000) <= (debuff_resist_chance * 100))
{
effectMask &= ~(1 << effectNumber);
returnVal = SPELL_MISS_RESIST;
}
}
}
if (!effectMask)
return returnVal;
PrepareScriptHitHandlers(); PrepareScriptHitHandlers();
CallScriptBeforeHitHandlers(); CallScriptBeforeHitHandlers();