@@ -8099,23 +8099,37 @@ void Spell::CallScriptDestinationTargetSelectHandlers(SpellDestination& target,
80998099
81008100bool Spell::CheckScriptEffectImplicitTargets (uint32 effIndex, uint32 effIndexToCheck)
81018101{
8102- // Skip if there are not any script
8103- if (m_loadedScripts.empty ())
8102+ auto allEffectTargetScriptsAreShared = []<typename HookType>(HookList<HookType>& hooks, SpellInfo const * spellInfo, uint32 effIndex, uint32 effIndexToCheck)
8103+ {
8104+ for (HookType& hook : hooks)
8105+ {
8106+ if (!hook.IsEffectAffected (spellInfo, effIndex))
8107+ continue ;
8108+
8109+ bool otherEffectHasSameTargetFunction = std::ranges::any_of (hooks, [&](HookType& other)
8110+ {
8111+ return other.IsEffectAffected (spellInfo, effIndexToCheck) && hook.HasSameTargetFunctionAs (other);
8112+ });
8113+ if (!otherEffectHasSameTargetFunction)
8114+ return false ;
8115+ }
8116+
81048117 return true ;
8118+ };
81058119
8106- for (auto itr = m_loadedScripts. begin (); itr != m_loadedScripts. end (); ++itr )
8120+ for (SpellScript* script : m_loadedScripts)
81078121 {
8108- auto targetSelectHookEnd = (*itr)->OnObjectTargetSelect .end (), targetSelectHookItr = (*itr)->OnObjectTargetSelect .begin ();
8109- for (; targetSelectHookItr != targetSelectHookEnd; ++targetSelectHookItr)
8110- if (((*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && !(*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)) ||
8111- (!(*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && (*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)))
8112- return false ;
8122+ if (!allEffectTargetScriptsAreShared (script->OnObjectTargetSelect , m_spellInfo, effIndex, effIndexToCheck))
8123+ return false ;
81138124
8114- auto areaTargetSelectHookEnd = (*itr)->OnObjectAreaTargetSelect .end (), areaTargetSelectHookItr = (*itr)->OnObjectAreaTargetSelect .begin ();
8115- for (; areaTargetSelectHookItr != areaTargetSelectHookEnd; ++areaTargetSelectHookItr)
8116- if (((*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && !(*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)) ||
8117- (!(*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && (*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)))
8118- return false ;
8125+ if (!allEffectTargetScriptsAreShared (script->OnObjectTargetSelect , m_spellInfo, effIndexToCheck, effIndex))
8126+ return false ;
8127+
8128+ if (!allEffectTargetScriptsAreShared (script->OnObjectAreaTargetSelect , m_spellInfo, effIndex, effIndexToCheck))
8129+ return false ;
8130+
8131+ if (!allEffectTargetScriptsAreShared (script->OnObjectAreaTargetSelect , m_spellInfo, effIndexToCheck, effIndex))
8132+ return false ;
81198133 }
81208134 return true ;
81218135}
0 commit comments