[8103] More wide use IsInWorld checks and delayed at teleport operations.

* IsInWorld used to prevent return unexpected not in world objects.
* Delayed operations need to process its in world state.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
Ambal 2009-07-01 12:04:58 +04:00 committed by VladimirMangos
parent 9f41772828
commit 9f938a9ed4
17 changed files with 220 additions and 40 deletions

View file

@ -254,6 +254,10 @@ template<class T>
void
ObjectGridUnloader::Visit(GridRefManager<T> &m)
{
// remove all cross-reference before deleting
for(GridRefManager<T>::iterator iter=m.begin(); iter != m.end(); ++iter)
iter->getSource()->CleanupsBeforeDelete();
while(!m.isEmpty())
{
T *obj = m.getFirst()->getSource();
@ -267,25 +271,6 @@ ObjectGridUnloader::Visit(GridRefManager<T> &m)
}
}
template<>
void
ObjectGridUnloader::Visit(CreatureMapType &m)
{
// remove all cross-reference before deleting
for(CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
iter->getSource()->CleanupsBeforeDelete();
while(!m.isEmpty())
{
Creature *obj = m.getFirst()->getSource();
// if option set then object already saved at this moment
if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATLY))
obj->SaveRespawnTime();
///- object will get delinked from the manager when deleted
delete obj;
}
}
void
ObjectGridStoper::Stop(GridType &grid)
{