diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-09-02 10:40:50 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-09-02 10:40:50 +0200 |
commit | b1d8061a0f848241fe70ab0d718e829836cb5601 (patch) | |
tree | 8084fc69b3d9d881be9af79c7dab099f22fcfc80 /src | |
parent | 8f580b0581ac16fc1adfdfeb0f2abbeb98c4d2f1 (diff) |
Core/Spells: Fixed spell target selection not being shared by multiple effects when there are targeting scripts that have the same script function
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 31d5757cd93..0456a028cb8 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -9124,21 +9124,37 @@ void Spell::CallScriptEmpowerCompletedHandlers(int32 completedStagesCount) 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 91933d7dc0d..ae823201ef2 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -572,6 +572,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; @@ -625,6 +630,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; |