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 10:40:50 +0200
commitb1d8061a0f848241fe70ab0d718e829836cb5601 (patch)
tree8084fc69b3d9d881be9af79c7dab099f22fcfc80 /src/server/game/Spells/Spell.cpp
parent8f580b0581ac16fc1adfdfeb0f2abbeb98c4d2f1 (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/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp36
1 files changed, 26 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;
}