aboutsummaryrefslogtreecommitdiff
path: root/src/game/Spell.cpp
diff options
context:
space:
mode:
authormegamage <none@none>2009-06-07 11:59:12 -0500
committermegamage <none@none>2009-06-07 11:59:12 -0500
commit79b76f10cd7a0b5e299b7e0ff3d01cdd727b893d (patch)
treec1ec074e433a61b335c25342c6a1fad8827d1f4a /src/game/Spell.cpp
parentc48c20cb9866d22f1b03159ae258310ab10a9263 (diff)
parent2e4fae75a4f4f24dc2c97b8bde4870974c073aa9 (diff)
*Merge. A m_casttime check is added to prevent redundent check of canseeordetect.
--HG-- branch : trunk
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());