aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellInfo.cpp
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-08-26 12:05:47 +0200
committerQAston <qaston@gmail.com>2011-08-26 12:06:13 +0200
commit5c48d9ec8ab587f6d26b04b6b2becb340a9804a8 (patch)
tree87bd738171d5af8ea7e3e19341e82b2cdd7462ca /src/server/game/Spells/SpellInfo.cpp
parente41774750f58c64a87f511dff4aeeda506ea7b48 (diff)
Core/Spells: Store explicit unit, corpse and GO targets in one variable, because both client and server can't handle more than one explicit object target; Add spell explicit target validation.
Diffstat (limited to 'src/server/game/Spells/SpellInfo.cpp')
-rw-r--r--src/server/game/Spells/SpellInfo.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index c798eefd98f..d09dce0566d 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1705,6 +1705,44 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, b
return SPELL_CAST_OK;
}
+SpellCastResult SpellInfo::CheckExplicitTarget(Unit const* caster, WorldObject const* target) const
+{
+ uint32 neededTargets = GetExplicitTargetMask();
+ if (!target)
+ {
+ if (neededTargets & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT_MASK | TARGET_FLAG_CORPSE_MASK))
+ return SPELL_FAILED_BAD_TARGETS;
+ return SPELL_CAST_OK;
+ }
+
+ if (Unit const* unitTarget = target->ToUnit())
+ {
+ if (neededTargets & (TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT_ALLY | TARGET_FLAG_UNIT_RAID | TARGET_FLAG_UNIT_PARTY | TARGET_FLAG_UNIT_MINIPET | TARGET_FLAG_UNIT_PASSENGER))
+ {
+ if (neededTargets & TARGET_FLAG_UNIT_ENEMY)
+ if (!caster->IsFriendlyTo(unitTarget))
+ return SPELL_CAST_OK;
+ if (neededTargets & TARGET_FLAG_UNIT_ALLY)
+ if (caster->IsFriendlyTo(unitTarget))
+ return SPELL_CAST_OK;
+ if (neededTargets & TARGET_FLAG_UNIT_PARTY)
+ if (caster->IsInPartyWith(unitTarget))
+ return SPELL_CAST_OK;
+ if (neededTargets & TARGET_FLAG_UNIT_RAID)
+ if (caster->IsInRaidWith(unitTarget))
+ return SPELL_CAST_OK;
+ if (neededTargets & TARGET_FLAG_UNIT_MINIPET)
+ if (unitTarget->GetGUID() == caster->GetCritterGUID())
+ return SPELL_CAST_OK;
+ if (neededTargets & TARGET_FLAG_UNIT_PASSENGER)
+ if (unitTarget->IsOnVehicle(caster))
+ return SPELL_CAST_OK;
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+ }
+ return SPELL_CAST_OK;
+}
+
bool SpellInfo::CheckTargetCreatureType(Unit const* target) const
{
// Curse of Doom & Exorcism: not find another way to fix spell target check :/