aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-09-02 10:40:50 +0200
committerShauren <shauren.trinity@gmail.com>2024-09-02 11:00:45 +0200
commitd39e81e257b5de68c947bff5e8304fdc9b6bcb5d (patch)
tree291b6805cc97f9bfd9335b143c23aa439b8c9ba8 /src/server/game/Spells/Spell.cpp
parent0b10514289a2a9db2f8ff3ef1c535f7d9a77d6a2 (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)
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp40
1 files changed, 27 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;
}