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.cpp25
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());