*Fix a crash.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-03-29 11:58:19 -06:00
parent 3733af4d6a
commit e528611141
3 changed files with 60 additions and 32 deletions
+10 -6
View File
@@ -1074,27 +1074,31 @@ bool Map::UnloadGrid(const uint32 &x, const uint32 &y, bool unloadAll)
return false; return false;
DEBUG_LOG("Unloading grid[%u,%u] for map %u", x,y, i_id); DEBUG_LOG("Unloading grid[%u,%u] for map %u", x,y, i_id);
ObjectGridUnloader unloader(*grid); ObjectGridUnloader unloader(*grid);
if(!unloadAll) if(!unloadAll)
{ {
// Finish creature moves, remove and delete all creatures with delayed remove before moving to respawn grids // Finish creature moves, remove and delete all creatures with delayed remove before moving to respawn grids
// Must know real mob position before move // Must know real mob position before move
DoDelayedMovesAndRemoves(); MoveAllCreaturesInMoveList();
// move creatures to respawn grids if this is diff.grid or to remove list // move creatures to respawn grids if this is diff.grid or to remove list
unloader.MoveToRespawnN(); unloader.MoveToRespawnN();
// Finish creature moves, remove and delete all creatures with delayed remove before unload // Finish creature moves, remove and delete all creatures with delayed remove before unload
DoDelayedMovesAndRemoves(); MoveAllCreaturesInMoveList();
} }
else
ObjectGridCleaner cleaner(*grid);
cleaner.CleanN();
RemoveAllObjectsInRemoveList(); RemoveAllObjectsInRemoveList();
//assert(grid.NoWorldObjectInGrid());
unloader.UnloadN(); unloader.UnloadN();
//assert(grid.NoWorldObjectInGrid());
//assert(grid.NoGridObjectInGrid()); assert(i_objectsToRemove.empty());
delete grid; delete grid;
setNGrid(NULL, x, y); setNGrid(NULL, x, y);
} }
+25 -24
View File
@@ -293,33 +293,11 @@ ObjectGridUnloader::Visit(GridRefManager<T> &m)
// if option set then object already saved at this moment // if option set then object already saved at this moment
if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY)) if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
obj->SaveRespawnTime(); obj->SaveRespawnTime();
///- object must be out of world before delete
obj->RemoveFromWorld();
///- object will get delinked from the manager when deleted ///- object will get delinked from the manager when deleted
delete obj; delete obj;
} }
} }
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_IMMEDIATELY))
obj->SaveRespawnTime();
///- object will get delinked from the manager when deleted
obj->CleanupsBeforeDelete();
delete obj;
}
}
void void
ObjectGridStoper::Stop(GridType &grid) ObjectGridStoper::Stop(GridType &grid)
{ {
@@ -339,6 +317,29 @@ ObjectGridStoper::Visit(CreatureMapType &m)
} }
} }
template void ObjectGridUnloader::Visit(GameObjectMapType &); void
template void ObjectGridUnloader::Visit(DynamicObjectMapType &); ObjectGridCleaner::Stop(GridType &grid)
{
TypeContainerVisitor<ObjectGridCleaner, GridTypeMapContainer > stoper(*this);
grid.Visit(stoper);
}
void
ObjectGridCleaner::Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
iter->getSource()->CleanupsBeforeDelete();
}
template<class T>
void
ObjectGridCleaner::Visit(GridRefManager<T> &m)
{
for(GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
iter->getSource()->RemoveFromWorld();
}
/*template void ObjectGridUnloader::Visit(GameObjectMapType &);
template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
template void ObjectGridCleaner::Visit(GameObjectMapType &);
template void ObjectGridCleaner::Visit(DynamicObjectMapType &);*/
+24 -1
View File
@@ -85,7 +85,6 @@ class TRINITY_DLL_DECL ObjectGridStoper
public: public:
ObjectGridStoper(NGridType &grid) : i_grid(grid) {} ObjectGridStoper(NGridType &grid) : i_grid(grid) {}
void MoveToRespawnN();
void StopN() void StopN()
{ {
for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x) for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x)
@@ -106,6 +105,30 @@ class TRINITY_DLL_DECL ObjectGridStoper
NGridType &i_grid; NGridType &i_grid;
}; };
class TRINITY_DLL_DECL ObjectGridCleaner
{
public:
ObjectGridCleaner(NGridType &grid) : i_grid(grid) {}
void CleanN()
{
for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x)
{
for(unsigned int y=0; y < MAX_NUMBER_OF_CELLS; ++y)
{
GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> loader;
loader.Stop(i_grid(x, y), *this);
}
}
}
void Stop(GridType &grid);
void Visit(CreatureMapType &m);
template<class T> void Visit(GridRefManager<T> &);
private:
NGridType &i_grid;
};
typedef GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> GridLoaderType; typedef GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> GridLoaderType;
#endif #endif