Core/Spells:
- rename SpellInfo::IsAOE to SpellInfo::IsTargetingArea due to ambiguity of old name. - add IsAffectingArea function to check whenever spell or it's effects are affecting objects in area and use new function to fix problems with hunter flares. Closes #3310. Thanks to Kaelima and Warpten for research.
This commit is contained in:
@@ -2412,7 +2412,7 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spell)
|
||||
// Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
|
||||
modHitChance += victim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, schoolMask);
|
||||
// Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
|
||||
if (spell->IsAOE())
|
||||
if (spell->IsTargetingArea())
|
||||
modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
|
||||
|
||||
// Decrease hit chance from victim rating bonus
|
||||
@@ -12081,7 +12081,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) co
|
||||
return false;
|
||||
|
||||
// can't attack invisible (ignore stealth for aoe spells)
|
||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAOE()))
|
||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
|
||||
return false;
|
||||
|
||||
// can't attack dead
|
||||
@@ -12176,7 +12176,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
|
||||
return false;
|
||||
|
||||
// can't assist invisible
|
||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAOE()))
|
||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
|
||||
return false;
|
||||
|
||||
// can't assist dead
|
||||
@@ -14871,7 +14871,7 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp
|
||||
break;
|
||||
}
|
||||
|
||||
if (spellProto->Effects[i].IsArea())
|
||||
if (spellProto->Effects[i].IsTargetingArea())
|
||||
AreaEffect = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1855,7 +1855,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const
|
||||
case SPELL_AURA_OBS_MOD_HEALTH:
|
||||
case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE:
|
||||
// periodic auras which target areas are not allowed to stack this way (replenishment for example)
|
||||
if (m_spellInfo->Effects[i].IsArea() || existingSpellInfo->Effects[i].IsArea())
|
||||
if (m_spellInfo->Effects[i].IsTargetingArea() || existingSpellInfo->Effects[i].IsTargetingArea())
|
||||
break;
|
||||
return true;
|
||||
default:
|
||||
|
||||
@@ -5401,7 +5401,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||
}
|
||||
case SPELL_AURA_PERIODIC_MANA_LEECH:
|
||||
{
|
||||
if (m_spellInfo->Effects[i].IsArea())
|
||||
if (m_spellInfo->Effects[i].IsTargetingArea())
|
||||
break;
|
||||
|
||||
if (!m_targets.GetUnitTarget())
|
||||
@@ -6630,7 +6630,7 @@ void Spell::HandleLaunchPhase()
|
||||
continue;
|
||||
|
||||
// do not consume ammo anymore for Hunter's volley spell
|
||||
if (IsTriggered() && m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && m_spellInfo->IsAOE())
|
||||
if (IsTriggered() && m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && m_spellInfo->IsTargetingArea())
|
||||
usesAmmo = false;
|
||||
|
||||
if (usesAmmo)
|
||||
@@ -6681,7 +6681,7 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier)
|
||||
|
||||
if (m_damage > 0)
|
||||
{
|
||||
if (m_spellInfo->Effects[i].IsArea())
|
||||
if (m_spellInfo->Effects[i].IsTargetingArea())
|
||||
{
|
||||
m_damage = int32(float(m_damage) * unit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, m_spellInfo->SchoolMask));
|
||||
if (m_caster->GetTypeId() == TYPEID_UNIT)
|
||||
|
||||
@@ -503,7 +503,7 @@ bool SpellEffectInfo::IsAura(AuraType aura) const
|
||||
return IsAura() && ApplyAuraName == aura;
|
||||
}
|
||||
|
||||
bool SpellEffectInfo::IsArea() const
|
||||
bool SpellEffectInfo::IsTargetingArea() const
|
||||
{
|
||||
return TargetA.IsArea() || TargetB.IsArea();
|
||||
}
|
||||
@@ -1061,10 +1061,19 @@ bool SpellInfo::IsAbilityOfSkillType(uint32 skillType) const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SpellInfo::IsAOE() const
|
||||
bool SpellInfo::IsAffectingArea() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
if (Effects[i].IsEffect() && Effects[i].IsArea())
|
||||
if (Effects[i].IsEffect() && (Effects[i].IsTargetingArea() || Effects[i].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA) || Effects[i].IsAreaAuraEffect()))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// checks if spell targets are selected from area, doesn't include spell effects in check (like area wide auras for example)
|
||||
bool SpellInfo::IsTargetingArea() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
if (Effects[i].IsEffect() && Effects[i].IsTargetingArea())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -279,7 +279,7 @@ public:
|
||||
bool IsEffect(SpellEffects effectName) const;
|
||||
bool IsAura() const;
|
||||
bool IsAura(AuraType aura) const;
|
||||
bool IsArea() const;
|
||||
bool IsTargetingArea() const;
|
||||
bool IsAreaAuraEffect() const;
|
||||
bool IsFarUnitTargetEffect() const;
|
||||
bool IsFarDestTargetEffect() const;
|
||||
@@ -403,7 +403,8 @@ public:
|
||||
bool IsAbilityLearnedWithProfession() const;
|
||||
bool IsAbilityOfSkillType(uint32 skillType) const;
|
||||
|
||||
bool IsAOE() const;
|
||||
bool IsAffectingArea() const;
|
||||
bool IsTargetingArea() const;
|
||||
bool NeedsExplicitUnitTarget() const;
|
||||
bool NeedsToBeTriggeredByCaster() const;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user