diff --git a/Source/Game/Scripting/SpellScript.cs b/Source/Game/Scripting/SpellScript.cs index b29874c58..f50f75317 100644 --- a/Source/Game/Scripting/SpellScript.cs +++ b/Source/Game/Scripting/SpellScript.cs @@ -392,7 +392,12 @@ namespace Game.Scripting public Targets GetTarget() { return _targetType; } } - public class ObjectAreaTargetSelectHandler : TargetHook + public interface ITargetFunction + { + public virtual bool HasSameTargetFunctionAs(T other) { return false; } + } + + public class ObjectAreaTargetSelectHandler : TargetHook, ITargetFunction { SpellObjectAreaTargetSelectFnType _callImpl; @@ -405,9 +410,14 @@ namespace Game.Scripting { _callImpl(targets); } + + public bool HasSameTargetFunctionAs(ObjectAreaTargetSelectHandler other) + { + return _callImpl.Method == other._callImpl.Method || _callImpl.Target == other._callImpl.Target; + } } - public class ObjectTargetSelectHandler : TargetHook + public class ObjectTargetSelectHandler : TargetHook, ITargetFunction { SpellObjectTargetSelectFnType _callImpl; @@ -420,6 +430,11 @@ namespace Game.Scripting { _callImpl(ref target); } + + public bool HasSameTargetFunctionAs(ObjectTargetSelectHandler other) + { + return _callImpl.Method == other._callImpl.Method || _callImpl.Target == other._callImpl.Target; + } } public class DestinationTargetSelectHandler : TargetHook diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 1c2a9d7a7..284e526fb 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -8194,21 +8194,34 @@ namespace Game.Spells bool CheckScriptEffectImplicitTargets(uint effIndex, uint effIndexToCheck) { - // Skip if there are not any script - if (m_loadedScripts.Empty()) + bool allEffectTargetScriptsAreShared(List hooks, SpellInfo spellInfo, uint effIndex, uint effIndexToCheck) where T : SpellScript.EffectHook, SpellScript.ITargetFunction + { + foreach (var hook in hooks) + { + if (!hook.IsEffectAffected(spellInfo, effIndex)) + continue; + + bool otherEffectHasSameTargetFunction = hooks.Any(other => other.IsEffectAffected(spellInfo, effIndexToCheck) && hook.HasSameTargetFunctionAs(other)); + if (!otherEffectHasSameTargetFunction) + return false; + } + return true; + }; foreach (var script in m_loadedScripts) { - foreach (var hook in script.OnObjectTargetSelect) - if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) || - (!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck))) - return false; + if (!allEffectTargetScriptsAreShared(script.OnObjectTargetSelect, m_spellInfo, effIndex, effIndexToCheck)) + return false; - foreach (var hook in script.OnObjectAreaTargetSelect) - if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) || - (!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.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; }