diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 10 |
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; |