diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-04-08 11:40:06 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-04-08 11:40:06 +0200 |
commit | d434182e30dd8ed42003da46d27ed041f6533c72 (patch) | |
tree | 9ef939bad2f0311c22b1f5ee8fb3ccf8a046266b /src/server/game/Spells/Spell.cpp | |
parent | 2fca5545553bcb368096d27bd1f72cda99e52520 (diff) |
Core/Spells: Port SPELL_ATTR1_REQUIRE_ALL_TARGETS and SPELL_ATTR2_FAIL_ON_ALL_TARGETS_IMMUNE from master branch
Closes #21632
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 78964578568..4694b85abaf 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -766,6 +766,41 @@ void Spell::SelectSpellTargets() if (m_targets.HasDst()) AddDestTarget(*m_targets.GetDst(), spellEffectInfo.EffectIndex); + if (spellEffectInfo.TargetA.GetObjectType() == TARGET_OBJECT_TYPE_UNIT + || spellEffectInfo.TargetA.GetObjectType() == TARGET_OBJECT_TYPE_UNIT_AND_DEST + || spellEffectInfo.TargetB.GetObjectType() == TARGET_OBJECT_TYPE_UNIT + || spellEffectInfo.TargetB.GetObjectType() == TARGET_OBJECT_TYPE_UNIT_AND_DEST) + { + 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) + { + return target.EffectMask & effectMask; + }); + + if (noTargetFound) + { + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); + 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(false); + return; + } + } + } + if (m_spellInfo->IsChanneled()) { // maybe do this for all spells? |