mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Spells: Fixed spell target selection not being shared by multiple effects when there are targeting scripts that have the same script function
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user