diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Spell.cpp | 39 | ||||
-rw-r--r-- | src/game/SpellAuraEffects.cpp | 63 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 6 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 6 |
4 files changed, 55 insertions, 59 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 0f097f12ef4..c0948ce3bdd 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1415,7 +1415,6 @@ void Spell::DoTriggersOnSpellHit(Unit *unit) if (m_preCastSpell) { // Special spell id - // TODO: Handle all of special spells in one place? if(m_preCastSpell==61988) { //Cast Forbearance @@ -1423,14 +1422,9 @@ void Spell::DoTriggersOnSpellHit(Unit *unit) // Cast Avenging Wrath Marker m_caster->CastSpell(unit,61987, true, m_CastItem); } - // Avenging Wrath Marker - else if (m_preCastSpell==61987) - { - // Cast unknown spell (client will use to determine if Divine Shield is castable) - m_caster->CastSpell(unit,61988, true, m_CastItem); - } - else if (sSpellStore.LookupEntry(m_preCastSpell)) - m_caster->CastSpell(unit,m_preCastSpell, true, m_CastItem); + if (sSpellStore.LookupEntry(m_preCastSpell)) + // Blizz seems to just apply aura without bothering to cast + m_caster->AddAura(m_preCastSpell, unit); } // spells with this flag can trigger only if not selfcast (eviscerate for example) @@ -4498,7 +4492,15 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_MOVING; } - if(Unit *target = m_targets.getUnitTarget()) + Unit *target; + + // In pure self-cast spells, the client won't send any unit target + if (m_targets.getTargetMask() == TARGET_FLAG_SELF || m_targets.getTargetMask() & TARGET_FLAG_CASTER) // TARGET_FLAG_SELF == 0, remember! + target = m_caster; + else + target = m_targets.getUnitTarget(); + + if (target) { // target state requirements (not allowed state), apply to self also if(!m_IsTriggeredSpell && m_spellInfo->TargetAuraStateNot && target->HasAuraState(AuraState(m_spellInfo->TargetAuraStateNot), m_spellInfo, m_caster)) @@ -4510,6 +4512,11 @@ SpellCastResult Spell::CheckCast(bool strict) if(m_spellInfo->excludeTargetAuraSpell && target->HasAura(m_spellInfo->excludeTargetAuraSpell)) return SPELL_FAILED_TARGET_AURASTATE; + // Special exclude - Hand of Protection, Divine Protection, Divine Shield cannot be cast on target after it used Avenging Wrath + if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->Mechanic == MECHANIC_IMMUNE_SHIELD) + if (target->HasAura(61987)) // Avenging Wrath Marker + return SPELL_FAILED_TARGET_AURASTATE; + if(!m_IsTriggeredSpell && target == m_caster && m_spellInfo->AttributesEx & SPELL_ATTR_EX_CANT_TARGET_SELF) return SPELL_FAILED_BAD_TARGETS; @@ -4578,11 +4585,15 @@ SpellCastResult Spell::CheckCast(bool strict) else return SPELL_FAILED_BAD_TARGETS; } - // Lay on Hands - cannot be casted on paladin after using Avenging Wrath - if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN - && m_spellInfo->SpellFamilyFlags[0] & 0x0008000) - if (target->HasAura(61988)) // Avenging Wrath Marker (Not existing spell) + // Lay on Hands - cannot be self-cast on paladin with Forbearance or after using Avenging Wrath + if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags[0] & 0x0008000) + { + if (target->HasAura(61987)) // Avenging Wrath Marker + return SPELL_FAILED_TARGET_AURASTATE; + + if (target->HasAura(25771)) // Forbearance (we could test for the immune shield marker 61988 instead) return SPELL_FAILED_TARGET_AURASTATE; + } } } diff --git a/src/game/SpellAuraEffects.cpp b/src/game/SpellAuraEffects.cpp index 3b1fb2e0c8f..d12817eaef2 100644 --- a/src/game/SpellAuraEffects.cpp +++ b/src/game/SpellAuraEffects.cpp @@ -4095,53 +4095,30 @@ void AuraEffect::HandleModMechanicImmunity(AuraApplication const * aurApp, uint8 return; Unit * target = aurApp->GetTarget(); - uint32 mechanic; - mechanic = 1 << GetMiscValue(); - - //immune movement impairment and loss of control - if(GetId()==42292 || GetId()==59752) - mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK; - // Forbearance - // in DBC wrong mechanic immune since 3.0.x - else if (GetId() == 25771) - mechanic = 1 << MECHANIC_IMMUNE_SHIELD; - - if (!mechanic) - return; - if(apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY) + switch (GetId()) { - Unit::AuraApplicationMap& Auras = target->GetAppliedAuras(); - for (Unit::AuraApplicationMap::iterator iter = Auras.begin(); iter != Auras.end();) - { - SpellEntry const *spell = iter->second->GetBase()->GetSpellProto(); - if (spell->Id != GetId()) - { - //check for mechanic mask - if(GetAllSpellMechanicMask(spell) & mechanic) - { - target->RemoveAura(iter); - } - else - ++iter; - } - else - ++iter; - } - } - - target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,GetMiscValue(), apply); - - // Demonic Empowerment -- voidwalker -- missing movement impairing effects immunity - if (GetId() == 54508) - { - if (apply) - target->RemoveMovementImpairingAuras(); - - target->ApplySpellImmune(GetId(),IMMUNITY_STATE,SPELL_AURA_MOD_ROOT, apply); - target->ApplySpellImmune(GetId(),IMMUNITY_STATE,SPELL_AURA_MOD_DECREASE_SPEED, apply); + case 42292: // PvP trinket + case 59752: // Every Man for Himself + mechanic = IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK; + // Actually we should apply immunities here, too, but the aura has only 100 ms duration, so there is practically no point + break; + case 54508: // Demonic Empowerment + mechanic = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT); + target->ApplySpellImmune(GetId(), IMMUNITY_STATE, SPELL_AURA_MOD_ROOT, apply); + target->ApplySpellImmune(GetId(), IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, apply); + break; + default: + if (GetMiscValue() < 1) + return; + mechanic = 1 << GetMiscValue(); + target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, GetMiscValue(), apply); + break; } + + if (apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY) + target->RemoveAurasWithMechanic(mechanic, AURA_REMOVE_BY_DEFAULT, GetId()); } void AuraEffect::HandleAuraModEffectImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index a5640ad4106..d563535b138 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4757,7 +4757,11 @@ void Spell::EffectHealMaxHealth(uint32 /*i*/) if(m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN) // Lay on Hands { if (m_caster && m_caster->GetGUID() == unitTarget->GetGUID()) - m_caster->CastSpell(m_caster, 25771, true); + { + m_caster->CastSpell(m_caster, 25771, true); // Forbearance + m_caster->CastSpell(m_caster, 61988, true); // Immune shield marker (serverside) + m_caster->CastSpell(m_caster, 61987, true); // Avenging Wrath marker + } addhealth = m_caster->GetMaxHealth(); } diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 1f0c27494e2..f94f980f7bb 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -939,7 +939,7 @@ bool SpellMgr::_isPositiveEffect(uint32 spellId, uint32 effIndex, bool deep) con bool IsPositiveSpell(uint32 spellId) { - if(!sSpellStore.LookupEntry(spellId)) // non-existing spells such as 61988 (Forbearance) + if(!sSpellStore.LookupEntry(spellId)) // non-existing spells return false; return !(spellmgr.GetSpellCustomAttr(spellId) & SPELL_ATTR_CU_NEGATIVE); } @@ -3783,6 +3783,10 @@ void SpellMgr::LoadSpellCustomAttr() spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER; count++; break; + case 25771: // Forbearance - wrong mechanic immunity in DBC since 3.0.x + spellInfo->EffectMiscValue[0] = MECHANIC_IMMUNE_SHIELD; + count++; + break; default: break; } |