aboutsummaryrefslogtreecommitdiff
path: root/src/game/Unit.cpp
diff options
context:
space:
mode:
authorKingPin <none@none>2008-11-05 20:10:19 -0600
committerKingPin <none@none>2008-11-05 20:10:19 -0600
commit8d331f2b10cff29ee0571f7056ad353df6a3eabd (patch)
tree36ef334fec8d6a55f151d40ca5e709880346c219 /src/game/Unit.cpp
parent404f72c7a2e9c230156e51f8013993b3c8f03d93 (diff)
[svn] * Avoid access to bag item prototype for getting bag size, use related item update field instead as more fast source.
* Better check client inventory pos data received in some client packets to skip invalid cases. * Removed some unnecessary database queries. * Make guid lookup for adding ignore async. * Added two parameter versions of the AsyncQuery function * Make queries for adding friends async. - Hunuza * Replace some PQuery() calls with more simple Query() - Hunuza * Mark spell as executed instead of deleteable to solve crash. *** Source mangos. **Its a big commit. so test with care... or without care.... whatever floats your boat. --HG-- branch : trunk
Diffstat (limited to 'src/game/Unit.cpp')
-rw-r--r--src/game/Unit.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 70b334b3c3c..f1d8269cd65 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -237,9 +237,11 @@ Unit::~Unit()
// set current spells as deletable
for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
{
- // spell may be safely deleted now
- if (m_currentSpells[i]) m_currentSpells[i]->SetDeletable(true);
- m_currentSpells[i] = NULL;
+ if (m_currentSpells[i])
+ {
+ m_currentSpells[i]->SetReferencedFromCurrent(false);
+ m_currentSpells[i] = NULL;
+ }
}
RemoveAllGameObjects();
@@ -3163,7 +3165,7 @@ void Unit::_UpdateSpells( uint32 time )
{
if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
{
- m_currentSpells[i]->SetDeletable(true); // spell may be safely deleted now
+ m_currentSpells[i]->SetReferencedFromCurrent(false);
m_currentSpells[i] = NULL; // remove pointer
}
}
@@ -3276,7 +3278,6 @@ void Unit::SetCurrentCastedSpell( Spell * pSpell )
uint32 CSpellType = pSpell->GetCurrentContainer();
- pSpell->SetDeletable(false); // spell will not be deleted until gone from current pointers
if (pSpell == m_currentSpells[CSpellType]) return; // avoid breaking self
// break same type spell if it is not delayed
@@ -3333,10 +3334,11 @@ void Unit::SetCurrentCastedSpell( Spell * pSpell )
// current spell (if it is still here) may be safely deleted now
if (m_currentSpells[CSpellType])
- m_currentSpells[CSpellType]->SetDeletable(true);
+ m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
// set new current spell
m_currentSpells[CSpellType] = pSpell;
+ pSpell->SetReferencedFromCurrent(true);
}
void Unit::InterruptSpell(uint32 spellType, bool withDelayed)
@@ -3354,7 +3356,7 @@ void Unit::InterruptSpell(uint32 spellType, bool withDelayed)
if (m_currentSpells[spellType]->getState() != SPELL_STATE_FINISHED)
m_currentSpells[spellType]->cancel();
- m_currentSpells[spellType]->SetDeletable(true);
+ m_currentSpells[spellType]->SetReferencedFromCurrent(false);
m_currentSpells[spellType] = NULL;
}
}
@@ -3390,7 +3392,7 @@ void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id)
if ( (m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_FINISHED) &&
(withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED) )
m_currentSpells[CURRENT_GENERIC_SPELL]->cancel();
- m_currentSpells[CURRENT_GENERIC_SPELL]->SetDeletable(true);
+ m_currentSpells[CURRENT_GENERIC_SPELL]->SetReferencedFromCurrent(false);
m_currentSpells[CURRENT_GENERIC_SPELL] = NULL;
}
@@ -3404,7 +3406,7 @@ void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id)
if ( (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->getState() != SPELL_STATE_FINISHED) &&
(withDelayed || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->getState() != SPELL_STATE_DELAYED) )
m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->cancel();
- m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->SetDeletable(true);
+ m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->SetReferencedFromCurrent(false);
m_currentSpells[CURRENT_AUTOREPEAT_SPELL] = NULL;
}
@@ -3413,7 +3415,7 @@ void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id)
{
if (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)
m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel();
- m_currentSpells[CURRENT_CHANNELED_SPELL]->SetDeletable(true);
+ m_currentSpells[CURRENT_CHANNELED_SPELL]->SetReferencedFromCurrent(false);
m_currentSpells[CURRENT_CHANNELED_SPELL] = NULL;
}
}
@@ -9860,7 +9862,7 @@ void Unit::CleanupsBeforeDelete()
if(m_uint32Values) // only for fully created object
{
InterruptNonMeleeSpells(true);
- m_Events.KillAllEvents();
+ m_Events.KillAllEvents(false); // non-delatable (currently casted spells) will not deleted ans will deleated at call in Map::RemoveAllObjectsInRemoveList
CombatStop();
ClearComboPointHolders();
DeleteThreatList();