diff options
| author | QAston <qaston@gmail.com> | 2011-08-26 12:05:47 +0200 |
|---|---|---|
| committer | QAston <qaston@gmail.com> | 2011-08-26 12:06:13 +0200 |
| commit | 5c48d9ec8ab587f6d26b04b6b2becb340a9804a8 (patch) | |
| tree | 87bd738171d5af8ea7e3e19341e82b2cdd7462ca /src/server/game/Spells/SpellInfo.cpp | |
| parent | e41774750f58c64a87f511dff4aeeda506ea7b48 (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.cpp | 38 |
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 :/ |
