diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-01-27 00:24:12 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-02-01 05:36:16 +0100 |
commit | 176d1e73e829584e18b12a1b12e76bb38983b6ea (patch) | |
tree | 9319c4e1176a6349e758cad54712efc58a9af8b3 | |
parent | 7848d0bf8d2b45d0799fec5e645bf76c3961db00 (diff) |
Core/Spells: Don't fail spells SPELL_ATTR2_FAIL_ON_ALL_TARGETS_IMMUNE when target list is empty for one effect
Closes #30603
(cherry picked from commit a5c547a383e40b155a2063404c040ea0007c9ebd)
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c830fedee22..6f6f23e618c 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -748,7 +748,7 @@ void Spell::SelectSpellTargets() { if (m_spellInfo->HasAttribute(SPELL_ATTR1_REQUIRE_ALL_TARGETS)) { - bool noTargetFound = std::none_of(m_UniqueTargetInfo.begin(), m_UniqueTargetInfo.end(), [effectMask = 1u << spellEffectInfo.EffectIndex](TargetInfo const& target) + bool noTargetFound = std::ranges::none_of(m_UniqueTargetInfo, [effectMask = 1u << spellEffectInfo.EffectIndex](TargetInfo const& target) { return target.EffectMask & effectMask; }); @@ -760,20 +760,6 @@ void Spell::SelectSpellTargets() return; } } - if (m_spellInfo->HasAttribute(SPELL_ATTR2_FAIL_ON_ALL_TARGETS_IMMUNE)) - { - bool anyNonImmuneTargetFound = std::any_of(m_UniqueTargetInfo.begin(), m_UniqueTargetInfo.end(), [effectMask = 1u << spellEffectInfo.EffectIndex](TargetInfo const& target) - { - return target.EffectMask & effectMask && target.MissCondition != SPELL_MISS_IMMUNE && target.MissCondition != SPELL_MISS_IMMUNE2; - }); - - if (!anyNonImmuneTargetFound) - { - SendCastResult(SPELL_FAILED_IMMUNE); - finish(SPELL_FAILED_IMMUNE); - return; - } - } } if (m_spellInfo->IsChanneled()) @@ -798,6 +784,21 @@ void Spell::SelectSpellTargets() } } + if (m_spellInfo->HasAttribute(SPELL_ATTR2_FAIL_ON_ALL_TARGETS_IMMUNE)) + { + bool anyNonImmuneTargetFound = std::ranges::any_of(m_UniqueTargetInfo, [](TargetInfo const& target) + { + return target.MissCondition != SPELL_MISS_IMMUNE && target.MissCondition != SPELL_MISS_IMMUNE2; + }); + + if (!anyNonImmuneTargetFound) + { + SendCastResult(SPELL_FAILED_IMMUNE); + finish(SPELL_FAILED_IMMUNE); + return; + } + } + if (m_targets.HasDst()) { if (m_spellInfo->HasAttribute(SPELL_ATTR8_REQUIRES_LOCATION_TO_BE_ON_LIQUID_SURFACE)) |