aboutsummaryrefslogtreecommitdiff
path: root/src/game/Spell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Spell.cpp')
-rw-r--r--src/game/Spell.cpp36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 8752bf41b41..5d7e57d2c34 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -4464,19 +4464,34 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_LINE_OF_SIGHT;
}
- else if (m_caster->GetTypeId() == TYPEID_PLAYER) // Target - is player caster
+ else if (m_caster == target)
{
- // Additional check for some spells
- // If 0 spell effect empty - client not send target data (need use selection)
- // TODO: check it on next client version
- if (m_targets.m_targetMask == TARGET_FLAG_SELF &&
- m_spellInfo->EffectImplicitTargetA[1] == TARGET_UNIT_TARGET_ENEMY)
+
+ if (m_caster->GetTypeId() == TYPEID_PLAYER) // Target - is player caster
{
- if (target = m_caster->GetUnit(*m_caster, ((Player *)m_caster)->GetSelection()))
- m_targets.setUnitTarget(target);
- else
- return SPELL_FAILED_BAD_TARGETS;
+ // Additional check for some spells
+ // If 0 spell effect empty - client not send target data (need use selection)
+ // TODO: check it on next client version
+ if (m_targets.m_targetMask == TARGET_FLAG_SELF &&
+ m_spellInfo->EffectImplicitTargetA[1] == TARGET_UNIT_TARGET_ENEMY)
+ {
+ if (target = m_caster->GetUnit(*m_caster, ((Player *)m_caster)->GetSelection()))
+ m_targets.setUnitTarget(target);
+ else
+ return SPELL_FAILED_BAD_TARGETS;
+ }
}
+
+ // Some special spells with non-caster only mode
+
+ // Fire Shield
+ if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&
+ m_spellInfo->SpellIconID == 16)
+ return SPELL_FAILED_BAD_TARGETS;
+
+ // Focus Magic (main spell)
+ if (m_spellInfo->Id == 54646)
+ return SPELL_FAILED_BAD_TARGETS;
}
// check pet presents
@@ -6631,7 +6646,6 @@ void Spell::SelectTrajTargets()
}
#define CHECK_DIST {\
- //sLog.outError("Spell::SelectTrajTargets: dist %f, height %f.", dist, height);
if(dist < objDist2d + size && dist > objDist2d - size)\
{ bestDist = dist; break; }\
}