diff options
Diffstat (limited to 'src/game/Spell.cpp')
-rw-r--r-- | src/game/Spell.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 4b410480ebe..8ca1dc6f82a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2555,18 +2555,29 @@ void Spell::cancel() void Spell::cast(bool skipCheck) { - SetExecutedCurrently(true); - // update pointers base at GUIDs to prevent access to non-existed already object UpdatePointers(); - // cancel at lost main target unit - if(!m_targets.getUnitTarget() && m_targets.getUnitTargetGUID() && m_targets.getUnitTargetGUID() != m_caster->GetGUID()) + if(m_targets.getUnitTarget()) { - cancel(); - SetExecutedCurrently(false); - return; + // three check: prepare, cast (m_casttime > 0), hit (delayed) + if(m_casttime && m_targets.getUnitTarget()->isAlive() && !m_caster->canSeeOrDetect(m_targets.getUnitTarget(), true))) + { + cancel(); + return; + } } + else + { + // cancel at lost main target unit + if(m_targets.getUnitTargetGUID() && m_targets.getUnitTargetGUID() != m_caster->GetGUID()) + { + cancel(); + return; + } + } + + SetExecutedCurrently(true); if(m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.getUnitTarget() && m_targets.getUnitTarget() != m_caster) m_caster->SetInFront(m_targets.getUnitTarget()); |