aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-04-08 11:40:06 +0200
committerShauren <shauren.trinity@gmail.com>2024-04-08 11:40:06 +0200
commitd434182e30dd8ed42003da46d27ed041f6533c72 (patch)
tree9ef939bad2f0311c22b1f5ee8fb3ccf8a046266b /src/server/game/Spells/Spell.cpp
parent2fca5545553bcb368096d27bd1f72cda99e52520 (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.cpp35
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?