aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Spells/Spell.cpp36
-rw-r--r--src/server/game/Spells/SpellScript.h10
2 files changed, 36 insertions, 10 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 2caa6d6d041..d96a0d6388f 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -8845,21 +8845,37 @@ void Spell::CallScriptOnResistAbsorbCalculateHandlers(DamageInfo const& damageIn
bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToCheck)
{
- // Skip if there are not any script
- if (m_loadedScripts.empty())
+ auto allEffectTargetScriptsAreShared = []<typename HookType>(HookList<HookType> const& hooks, SpellInfo const* spellInfo, uint32 effIndex, uint32 effIndexToCheck)
+ {
+ for (HookType const& hook : hooks)
+ {
+ if (!hook.IsEffectAffected(spellInfo, effIndex))
+ continue;
+
+ bool otherEffectHasSameTargetFunction = std::ranges::any_of(hooks, [&](HookType const& other)
+ {
+ return other.IsEffectAffected(spellInfo, effIndexToCheck) && hook.HasSameTargetFunctionAs(other);
+ });
+ if (!otherEffectHasSameTargetFunction)
+ return false;
+ }
+
return true;
+ };
for (SpellScript* script : m_loadedScripts)
{
- for (SpellScript::ObjectTargetSelectHandler const& objectTargetSelect : script->OnObjectTargetSelect)
- if ((objectTargetSelect.IsEffectAffected(m_spellInfo, effIndex) && !objectTargetSelect.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
- (!objectTargetSelect.IsEffectAffected(m_spellInfo, effIndex) && objectTargetSelect.IsEffectAffected(m_spellInfo, effIndexToCheck)))
- return false;
+ if (!allEffectTargetScriptsAreShared(script->OnObjectTargetSelect, m_spellInfo, effIndex, effIndexToCheck))
+ return false;
- for (SpellScript::ObjectAreaTargetSelectHandler const& objectAreaTargetSelect : script->OnObjectAreaTargetSelect)
- if ((objectAreaTargetSelect.IsEffectAffected(m_spellInfo, effIndex) && !objectAreaTargetSelect.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
- (!objectAreaTargetSelect.IsEffectAffected(m_spellInfo, effIndex) && objectAreaTargetSelect.IsEffectAffected(m_spellInfo, effIndexToCheck)))
- return false;
+ if (!allEffectTargetScriptsAreShared(script->OnObjectTargetSelect, m_spellInfo, effIndexToCheck, effIndex))
+ return false;
+
+ if (!allEffectTargetScriptsAreShared(script->OnObjectAreaTargetSelect, m_spellInfo, effIndex, effIndexToCheck))
+ return false;
+
+ if (!allEffectTargetScriptsAreShared(script->OnObjectAreaTargetSelect, m_spellInfo, effIndexToCheck, effIndex))
+ return false;
}
return true;
}
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 9c28dd10d7d..72573fb568a 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -570,6 +570,11 @@ public:
{
return _safeWrapper(spellScript, targets, _callImpl);
}
+
+ bool HasSameTargetFunctionAs(ObjectAreaTargetSelectHandler const& other) const
+ {
+ return _callImpl.Member == other._callImpl.Member || _callImpl.Static == other._callImpl.Static;
+ }
private:
SpellObjectAreaTargetSelectFnType _callImpl;
SafeWrapperType _safeWrapper;
@@ -623,6 +628,11 @@ public:
{
return _safeWrapper(spellScript, target, _callImpl);
}
+
+ bool HasSameTargetFunctionAs(ObjectTargetSelectHandler const& other) const
+ {
+ return _callImpl.Member == other._callImpl.Member || _callImpl.Static == other._callImpl.Static;
+ }
private:
SpellObjectTargetSelectFnType _callImpl;
SafeWrapperType _safeWrapper;