diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-06-19 20:14:53 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-06-19 20:14:53 +0200 |
| commit | c968dedfee59db53fc912ac166309f3d87470821 (patch) | |
| tree | 040b523a5bed5e38c7447dadbad8b314ea6c6463 /src/server/game/Spells | |
| parent | e54e3ed2040d0c21c3b05433269044568572cb7a (diff) | |
Core/Spells: Fixed implementation of SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS and removed banish special cases that were neccessary because that attribute wasn't correctly supported
Diffstat (limited to 'src/server/game/Spells')
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 40 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 56 |
4 files changed, 30 insertions, 70 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 1ee6f4545c0..37d938dd7e7 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3369,28 +3369,6 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint Unit* target = aurApp->GetTarget(); m_spellInfo->ApplyAllSpellImmunitiesTo(target, GetSpellEffectInfo(), apply); - if (GetSpellInfo()->Mechanic == MECHANIC_BANISH) - { - if (apply) - target->AddUnitState(UNIT_STATE_ISOLATED); - else - { - bool banishFound = false; - Unit::AuraEffectList const& banishAuras = target->GetAuraEffectsByType(GetAuraType()); - for (AuraEffect const* aurEff : banishAuras) - { - if (aurEff->GetSpellInfo()->Mechanic == MECHANIC_BANISH) - { - banishFound = true; - break; - } - } - - if (!banishFound) - target->ClearUnitState(UNIT_STATE_ISOLATED); - } - } - // TODO: should be changed to a proc script on flag spell (they have "Taken positive" proc flags in db2) { if (apply && GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL) @@ -5431,7 +5409,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const if (!target->IsAlive()) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo(), &GetSpellEffectInfo())) + if (target->IsImmunedToDamage(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5566,7 +5544,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c if (!target->IsAlive()) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo(), &GetSpellEffectInfo())) + if (target->IsImmunedToDamage(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5665,7 +5643,7 @@ void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) if (!caster || !caster->IsAlive() || !target->IsAlive()) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED)) + if (target->IsImmunedToAuraPeriodicTick(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5695,7 +5673,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const if (!target->IsAlive()) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED)) + if (target->IsImmunedToAuraPeriodicTick(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5755,7 +5733,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con if (!caster || !caster->IsAlive() || !target->IsAlive() || target->GetPowerType() != powerType) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo(), &GetSpellEffectInfo())) + if (target->IsImmunedToAuraPeriodicTick(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5818,7 +5796,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const if (!target->IsAlive() || !target->GetMaxPower(powerType)) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED)) + if (target->IsImmunedToAuraPeriodicTick(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5848,7 +5826,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons if (!target->IsAlive() || !target->GetMaxPower(powerType)) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED)) + if (target->IsImmunedToAuraPeriodicTick(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -5880,7 +5858,7 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con if (!caster || !target->IsAlive() || target->GetPowerType() != powerType) return; - if (target->HasUnitState(UNIT_STATE_ISOLATED) || target->IsImmunedToDamage(GetSpellInfo(), &GetSpellEffectInfo())) + if (target->IsImmunedToDamage(caster, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(target, caster); return; @@ -6008,7 +5986,7 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv { Unit* target = aurApp->GetTarget(); Unit* triggerTarget = eventInfo.GetProcTarget(); - if (triggerTarget->HasUnitState(UNIT_STATE_ISOLATED) || triggerTarget->IsImmunedToDamage(GetSpellInfo(), &GetSpellEffectInfo())) + if (triggerTarget->IsImmunedToDamage(target, GetSpellInfo(), &GetSpellEffectInfo())) { SendTickImmune(triggerTarget, target); return; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index c28730263bb..00287b1f4b7 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2541,7 +2541,7 @@ void UnitAura::FillTargetMap(std::unordered_map<Unit*, uint32>& targets, Unit* c if (!GetUnitOwner()->IsInWorld()) continue; - if (GetUnitOwner()->HasUnitState(UNIT_STATE_ISOLATED)) + if (GetUnitOwner()->HasAuraState(AURA_STATE_BANISHED, GetSpellInfo(), caster)) continue; std::vector<WorldObject*> units; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f84066f77c4..785f468612d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2920,7 +2920,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Fill base damage struct (unitTarget - is real spell target) SpellNonMeleeDamage damageInfo(caster, spell->unitTarget, spell->m_spellInfo, spell->m_SpellVisual, spell->m_spellSchoolMask, spell->m_castId); // Check damage immunity - if (spell->unitTarget->IsImmunedToDamage(spell->m_spellInfo)) + if (spell->unitTarget->IsImmunedToDamage(caster, spell->m_spellInfo)) { hitMask = PROC_HIT_IMMUNE; spell->m_damage = 0; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index c732f497e0c..0d172cef5e6 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1848,24 +1848,6 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const bool SpellInfo::CanPierceImmuneAura(SpellInfo const* auraSpellInfo) const { - // aura can't be pierced - if (!auraSpellInfo || auraSpellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) - return false; - - // these spells pierce all available spells (Resurrection Sickness for example) - if (HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) - return true; - - // these spells (Cyclone for example) can pierce all... - if (HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) - { - // ...but not these (Divine shield, Ice block, Cyclone and Banish for example) - if (auraSpellInfo->Mechanic != MECHANIC_IMMUNE_SHIELD && - auraSpellInfo->Mechanic != MECHANIC_INVULNERABILITY && - (auraSpellInfo->Mechanic != MECHANIC_BANISH || (IsRankOf(auraSpellInfo) && auraSpellInfo->Dispel != DISPEL_NONE))) // Banish shouldn't be immune to itself, but Cyclone should - return true; - } - // Dispels other auras on immunity, check if this spell makes the unit immune to aura if (HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT) && CanSpellProvideImmunityAgainstAura(auraSpellInfo)) return true; @@ -1879,15 +1861,6 @@ bool SpellInfo::CanDispelAura(SpellInfo const* auraSpellInfo) const if (auraSpellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) return false; - // These spells (like Mass Dispel) can dispel all auras - if (HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) - return true; - - // These auras (Cyclone for example) are not dispelable - if ((auraSpellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) && auraSpellInfo->Mechanic != MECHANIC_NONE) - || auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) - return false; - return true; } @@ -3521,14 +3494,24 @@ void SpellInfo::ApplyAllSpellImmunitiesTo(Unit* target, SpellEffectInfo const& s if (apply && HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT)) { - target->RemoveAppliedAuras([this, schoolImmunity](AuraApplication const* aurApp) -> bool + target->RemoveAppliedAuras([this, target, schoolImmunity](AuraApplication const* aurApp) -> bool { SpellInfo const* auraSpellInfo = aurApp->GetBase()->GetSpellInfo(); - return ((auraSpellInfo->GetSchoolMask() & schoolImmunity) != 0 && // Check for school mask - CanDispelAura(auraSpellInfo) && - (IsPositive() != aurApp->IsPositive()) && // Check spell vs aura possitivity - !auraSpellInfo->IsPassive() && // Don't remove passive auras - auraSpellInfo->Id != Id); // Don't remove self + if (auraSpellInfo->Id == Id) // Don't remove self + return false; + if (auraSpellInfo->IsPassive()) // Don't remove passive auras + return false; + if (!(auraSpellInfo->GetSchoolMask() & schoolImmunity)) // Check for school mask + return false; + if (!CanDispelAura(auraSpellInfo)) + return false; + if (!HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS)) + { + WorldObject const* existingAuraCaster = aurApp->GetBase()->GetWorldObjectCaster(); + if (existingAuraCaster && existingAuraCaster->IsFriendlyTo(target)) // Check spell vs aura possitivity + return false; + } + return true; }); } @@ -3597,10 +3580,9 @@ void SpellInfo::ApplyAllSpellImmunitiesTo(Unit* target, SpellEffectInfo const& s { target->ApplySpellImmune(Id, IMMUNITY_STATE, auraType, apply); if (apply && HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT)) - target->RemoveAurasByType(auraType, [](AuraApplication const* aurApp) -> bool + target->RemoveAurasByType(auraType, [this](AuraApplication const* aurApp) -> bool { - // if the aura has SPELL_ATTR0_NO_IMMUNITIES, then it cannot be removed by immunity - return !aurApp->GetBase()->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES); + return CanDispelAura(aurApp->GetBase()->GetSpellInfo()); }); } @@ -3625,7 +3607,7 @@ bool SpellInfo::CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInf if (!immuneInfo) continue; - if (!auraSpellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) && !auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) + if (!auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) { if (uint32 schoolImmunity = immuneInfo->SchoolImmuneMask) if ((auraSpellInfo->SchoolMask & schoolImmunity) != 0) |
