diff options
author | QAston <qaston@gmail.com> | 2011-09-16 22:17:20 +0200 |
---|---|---|
committer | QAston <qaston@gmail.com> | 2011-09-16 22:17:49 +0200 |
commit | 9bbb4ef5830cbe3bf94e9e1e6ad4cac4c45be2fa (patch) | |
tree | f8c2a5ff67df92f157e187751ee71914038df9ce /src | |
parent | 31e755c2910d26c1616c098a39b343101c398e96 (diff) |
Core/Spells: Use Unit::IsValidAttack/AssistTarget functions to validate spell explicit targets.
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 26 |
2 files changed, 19 insertions, 32 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a8f6edda993..388aa8df2aa 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4781,7 +4781,7 @@ SpellCastResult Spell::CheckCast(bool strict) // those spells may have incorrect target entries or not filled at all (for example 15332) // such spells when learned are not targeting anyone using targeting system, they should apply directly to caster instead // also, such casts shouldn't be sent to client - if (!(((m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !m_targets.GetUnitTarget()) || m_targets.GetUnitTarget() == m_caster)) + if (!((m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && (!m_targets.GetUnitTarget() || m_targets.GetUnitTarget() == m_caster))) { // Check explicit target for m_originalCaster - todo: get rid of such workarounds SpellCastResult castResult = m_spellInfo->CheckExplicitTarget(m_originalCaster ? m_originalCaster : m_caster, m_targets.GetObjectTarget(), m_targets.GetItemTarget()); @@ -4818,22 +4818,21 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_TARGET_AURASTATE; } } + } - // check pet presence - for (int j = 0; j < MAX_SPELL_EFFECTS; ++j) + // check pet presence + for (int j = 0; j < MAX_SPELL_EFFECTS; ++j) + { + if (m_spellInfo->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PET) { - if (m_spellInfo->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PET) + if (!m_caster->GetGuardianPet()) { - target = m_caster->GetGuardianPet(); - if (!target) - { - if (m_triggeredByAuraSpell) // not report pet not existence for triggered spells - return SPELL_FAILED_DONT_REPORT; - else - return SPELL_FAILED_NO_PET; - } - break; + if (m_triggeredByAuraSpell) // not report pet not existence for triggered spells + return SPELL_FAILED_DONT_REPORT; + else + return SPELL_FAILED_NO_PET; } + break; } } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index f259b130a5d..d880b9524b2 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1634,7 +1634,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, b if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE) && !caster->canSeeOrDetect(target, implicit)) return SPELL_FAILED_BAD_TARGETS; - // TODO: more research + // checked in Unit::IsValidAttack/AssistTarget, shouldn't be checked for ENTRY targets //if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_UNTARGETABLE) && target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) // return SPELL_FAILED_BAD_TARGETS; @@ -1648,14 +1648,6 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, b return SPELL_FAILED_BAD_TARGETS; } - // check UNIT_FLAG_NON_ATTACKABLE flag - a player can cast spells on his pet (or other controlled unit) though in any state - if (!IsPositive() && target != caster && target->GetCharmerOrOwnerGUID() != caster->GetGUID()) - { - // any unattackable target skipped - if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return SPELL_FAILED_BAD_TARGETS; - } - // check GM mode and GM invisibility - only for player casts (npc casts are controlled by AI) and negative spells if (target != caster && (caster->IsControlledByPlayer() || !IsPositive()) && target->GetTypeId() == TYPEID_PLAYER) { @@ -1738,17 +1730,13 @@ SpellCastResult SpellInfo::CheckExplicitTarget(Unit const* caster, WorldObject c 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)) + if (caster->_IsValidAttackTarget(unitTarget, this)) return SPELL_CAST_OK; + if (neededTargets & TARGET_FLAG_UNIT_ALLY + || (neededTargets & TARGET_FLAG_UNIT_PARTY && caster->IsInPartyWith(unitTarget)) + || (neededTargets & TARGET_FLAG_UNIT_RAID && caster->IsInRaidWith(unitTarget))) + if (caster->_IsValidAssistTarget(unitTarget, this)) + return SPELL_CAST_OK; if (neededTargets & TARGET_FLAG_UNIT_MINIPET) if (unitTarget->GetGUID() == caster->GetCritterGUID()) return SPELL_CAST_OK; |