diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-09-02 10:40:50 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-09-02 11:00:45 +0200 |
commit | d39e81e257b5de68c947bff5e8304fdc9b6bcb5d (patch) | |
tree | 291b6805cc97f9bfd9335b143c23aa439b8c9ba8 | |
parent | 0b10514289a2a9db2f8ff3ef1c535f7d9a77d6a2 (diff) |
Core/Spells: Fixed spell target selection not being shared by multiple effects when there are targeting scripts that have the same script function
(cherry picked from commit b1d8061a0f848241fe70ab0d718e829836cb5601)
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 40 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 8 |
2 files changed, 35 insertions, 13 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a91768186a3..7f0dbe517dc 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -8099,23 +8099,37 @@ void Spell::CallScriptDestinationTargetSelectHandlers(SpellDestination& target, bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToCheck) { - // Skip if there are not any script - if (m_loadedScripts.empty()) + auto allEffectTargetScriptsAreShared = []<typename HookType>(HookList<HookType>& hooks, SpellInfo const* spellInfo, uint32 effIndex, uint32 effIndexToCheck) + { + for (HookType& hook : hooks) + { + if (!hook.IsEffectAffected(spellInfo, effIndex)) + continue; + + bool otherEffectHasSameTargetFunction = std::ranges::any_of(hooks, [&](HookType& other) + { + return other.IsEffectAffected(spellInfo, effIndexToCheck) && hook.HasSameTargetFunctionAs(other); + }); + if (!otherEffectHasSameTargetFunction) + return false; + } + return true; + }; - for (auto itr = m_loadedScripts.begin(); itr != m_loadedScripts.end(); ++itr) + for (SpellScript* script : m_loadedScripts) { - auto targetSelectHookEnd = (*itr)->OnObjectTargetSelect.end(), targetSelectHookItr = (*itr)->OnObjectTargetSelect.begin(); - for (; targetSelectHookItr != targetSelectHookEnd; ++targetSelectHookItr) - if (((*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) || - (!(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && (*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck))) - return false; + if (!allEffectTargetScriptsAreShared(script->OnObjectTargetSelect, m_spellInfo, effIndex, effIndexToCheck)) + return false; - auto areaTargetSelectHookEnd = (*itr)->OnObjectAreaTargetSelect.end(), areaTargetSelectHookItr = (*itr)->OnObjectAreaTargetSelect.begin(); - for (; areaTargetSelectHookItr != areaTargetSelectHookEnd; ++areaTargetSelectHookItr) - if (((*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) || - (!(*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && (*areaTargetSelectHookItr).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 91eb9cf5c3b..5f623e22218 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -281,6 +281,10 @@ class TC_GAME_API SpellScript : public _SpellScript public: ObjectAreaTargetSelectHandler(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType); void Call(SpellScript* spellScript, std::list<WorldObject*>& targets); + bool HasSameTargetFunctionAs(ObjectAreaTargetSelectHandler const& other) const + { + return pObjectAreaTargetSelectHandlerScript == other.pObjectAreaTargetSelectHandlerScript; + } private: SpellObjectAreaTargetSelectFnType pObjectAreaTargetSelectHandlerScript; }; @@ -290,6 +294,10 @@ class TC_GAME_API SpellScript : public _SpellScript public: ObjectTargetSelectHandler(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType); void Call(SpellScript* spellScript, WorldObject*& target); + bool HasSameTargetFunctionAs(ObjectTargetSelectHandler const& other) const + { + return pObjectTargetSelectHandlerScript == other.pObjectTargetSelectHandlerScript; + } private: SpellObjectTargetSelectFnType pObjectTargetSelectHandlerScript; }; |