aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-03-29 11:58:19 -0600
committermegamage <none@none>2009-03-29 11:58:19 -0600
commite528611141ca0923503933a0fe4d0f0720efaf91 (patch)
treec6a3232a199cc203e09fabea0ffdc7bb5a715060 /src
parent3733af4d6ae2615a09c421b5a6a47c4085575f91 (diff)
*Fix a crash.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Map.cpp18
-rw-r--r--src/game/ObjectGridLoader.cpp49
-rw-r--r--src/game/ObjectGridLoader.h25
3 files changed, 60 insertions, 32 deletions
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index c00b774c68f..3511e7b5bca 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -1074,27 +1074,31 @@ bool Map::UnloadGrid(const uint32 &x, const uint32 &y, bool unloadAll)
return false;
DEBUG_LOG("Unloading grid[%u,%u] for map %u", x,y, i_id);
+
ObjectGridUnloader unloader(*grid);
if(!unloadAll)
{
// Finish creature moves, remove and delete all creatures with delayed remove before moving to respawn grids
// Must know real mob position before move
- DoDelayedMovesAndRemoves();
+ MoveAllCreaturesInMoveList();
// move creatures to respawn grids if this is diff.grid or to remove list
unloader.MoveToRespawnN();
// Finish creature moves, remove and delete all creatures with delayed remove before unload
- DoDelayedMovesAndRemoves();
+ MoveAllCreaturesInMoveList();
}
- else
- RemoveAllObjectsInRemoveList();
- //assert(grid.NoWorldObjectInGrid());
+ ObjectGridCleaner cleaner(*grid);
+ cleaner.CleanN();
+
+ RemoveAllObjectsInRemoveList();
+
unloader.UnloadN();
- //assert(grid.NoWorldObjectInGrid());
- //assert(grid.NoGridObjectInGrid());
+
+ assert(i_objectsToRemove.empty());
+
delete grid;
setNGrid(NULL, x, y);
}
diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp
index 7c3c88756af..d6b2a765690 100644
--- a/src/game/ObjectGridLoader.cpp
+++ b/src/game/ObjectGridLoader.cpp
@@ -293,33 +293,11 @@ ObjectGridUnloader::Visit(GridRefManager<T> &m)
// if option set then object already saved at this moment
if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
obj->SaveRespawnTime();
- ///- object must be out of world before delete
- obj->RemoveFromWorld();
///- object will get delinked from the manager when deleted
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
ObjectGridStoper::Stop(GridType &grid)
{
@@ -339,6 +317,29 @@ ObjectGridStoper::Visit(CreatureMapType &m)
}
}
-template void ObjectGridUnloader::Visit(GameObjectMapType &);
-template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
+void
+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 &);*/
diff --git a/src/game/ObjectGridLoader.h b/src/game/ObjectGridLoader.h
index 7b5c827b7ea..768f1f994db 100644
--- a/src/game/ObjectGridLoader.h
+++ b/src/game/ObjectGridLoader.h
@@ -85,7 +85,6 @@ class TRINITY_DLL_DECL ObjectGridStoper
public:
ObjectGridStoper(NGridType &grid) : i_grid(grid) {}
- void MoveToRespawnN();
void StopN()
{
for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x)
@@ -106,6 +105,30 @@ class TRINITY_DLL_DECL ObjectGridStoper
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;
#endif