aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-03-07 17:17:01 -0600
committermegamage <none@none>2009-03-07 17:17:01 -0600
commit658568a8e2eb749ea974b45e09b7e2775d6e0c69 (patch)
tree2cd0e5968e57e3d1def7c8f7391668c25febf58a /src
parent6dc06ab53b2e5307b682c5723b3c6fd62318633e (diff)
*Fix a crash when statues are killed.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Spell.cpp12
-rw-r--r--src/game/Unit.cpp10
2 files changed, 14 insertions, 8 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 707f1819968..442df24239a 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -2116,8 +2116,11 @@ void Spell::cancel()
if(m_spellState == SPELL_STATE_FINISHED)
return;
+ uint32 oldState = m_spellState;
+ m_spellState = SPELL_STATE_FINISHED;
+
m_autoRepeat = false;
- switch (m_spellState)
+ switch (oldState)
{
case SPELL_STATE_PREPARING:
case SPELL_STATE_DELAYED:
@@ -2149,10 +2152,13 @@ void Spell::cancel()
} break;
}
- finish(false);
-
m_caster->RemoveDynObject(m_spellInfo->Id);
m_caster->RemoveGameObject(m_spellInfo->Id,true);
+
+ //set state back so finish will be processed
+ m_spellState = oldState;
+
+ finish(false);
}
void Spell::cast(bool skipCheck)
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 7bdb3b28d27..6c75903072f 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -4706,13 +4706,10 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
if(!caster) // can be already located for IsSingleTargetSpell case
caster = Aur->GetCaster();
- if(caster)
+ if(caster && caster->isAlive())
{
- if(caster->GetTypeId()==TYPEID_UNIT && ((Creature*)caster)->isTotem() && ((Totem*)caster)->GetTotemType()==TOTEM_STATUE)
- statue = ((Totem*)caster);
-
// stop caster chanelling state
- else if(caster->m_currentSpells[CURRENT_CHANNELED_SPELL]
+ if(caster->m_currentSpells[CURRENT_CHANNELED_SPELL]
//prevent recurential call
&& caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)
{
@@ -4727,6 +4724,9 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel();
}
}
+
+ if(caster->GetTypeId()==TYPEID_UNIT && ((Creature*)caster)->isTotem() && ((Totem*)caster)->GetTotemType()==TOTEM_STATUE)
+ statue = ((Totem*)caster);
}
// Unsummon summon as possessed creatures on spell cancel