@@ -8105,23 +8105,37 @@ void Spell::CallScriptDestinationTargetSelectHandlers(SpellDestination& target,
81058105
81068106bool Spell::CheckScriptEffectImplicitTargets (uint32 effIndex, uint32 effIndexToCheck)
81078107{
8108- // Skip if there are not any script
8109- if (m_loadedScripts.empty ())
8108+ auto allEffectTargetScriptsAreShared = []<typename HookType>(HookList<HookType>& hooks, SpellInfo const * spellInfo, uint32 effIndex, uint32 effIndexToCheck)
8109+ {
8110+ for (HookType& hook : hooks)
8111+ {
8112+ if (!hook.IsEffectAffected (spellInfo, effIndex))
8113+ continue ;
8114+
8115+ bool otherEffectHasSameTargetFunction = std::ranges::any_of (hooks, [&](HookType& other)
8116+ {
8117+ return other.IsEffectAffected (spellInfo, effIndexToCheck) && hook.HasSameTargetFunctionAs (other);
8118+ });
8119+ if (!otherEffectHasSameTargetFunction)
8120+ return false ;
8121+ }
8122+
81108123 return true ;
8124+ };
81118125
8112- for (auto itr = m_loadedScripts. begin (); itr != m_loadedScripts. end (); ++itr )
8126+ for (SpellScript* script : m_loadedScripts)
81138127 {
8114- auto targetSelectHookEnd = (*itr)->OnObjectTargetSelect .end (), targetSelectHookItr = (*itr)->OnObjectTargetSelect .begin ();
8115- for (; targetSelectHookItr != targetSelectHookEnd; ++targetSelectHookItr)
8116- if (((*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && !(*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)) ||
8117- (!(*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && (*targetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)))
8118- return false ;
8128+ if (!allEffectTargetScriptsAreShared (script->OnObjectTargetSelect , m_spellInfo, effIndex, effIndexToCheck))
8129+ return false ;
81198130
8120- auto areaTargetSelectHookEnd = (*itr)->OnObjectAreaTargetSelect .end (), areaTargetSelectHookItr = (*itr)->OnObjectAreaTargetSelect .begin ();
8121- for (; areaTargetSelectHookItr != areaTargetSelectHookEnd; ++areaTargetSelectHookItr)
8122- if (((*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && !(*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)) ||
8123- (!(*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndex) && (*areaTargetSelectHookItr).IsEffectAffected (m_spellInfo, effIndexToCheck)))
8124- return false ;
8131+ if (!allEffectTargetScriptsAreShared (script->OnObjectTargetSelect , m_spellInfo, effIndexToCheck, effIndex))
8132+ return false ;
8133+
8134+ if (!allEffectTargetScriptsAreShared (script->OnObjectAreaTargetSelect , m_spellInfo, effIndex, effIndexToCheck))
8135+ return false ;
8136+
8137+ if (!allEffectTargetScriptsAreShared (script->OnObjectAreaTargetSelect , m_spellInfo, effIndexToCheck, effIndex))
8138+ return false ;
81258139 }
81268140 return true ;
81278141}
0 commit comments