aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none.none>2011-11-11 14:11:58 -0500
committermegamage <none@none.none>2011-11-11 14:11:58 -0500
commit9e3b4fe409e401bdffa44dc479177aa1b5fe96b1 (patch)
tree9d9056429b11873821324a27ad631eec1d28a413
parent360c9dd63520bb3b156e9c139231d081d4ba55bf (diff)
Cleanup before deleting objects when unloading grid. Fix #3922.
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp2
-rwxr-xr-xsrc/server/game/Grids/ObjectGridLoader.cpp12
-rwxr-xr-xsrc/server/game/Grids/ObjectGridLoader.h1
3 files changed, 7 insertions, 8 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index a354422c9ae..978d9accb64 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1273,6 +1273,8 @@ void WorldObject::setActive(bool on)
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
{
+ if (IsInWorld())
+ RemoveFromWorld();
}
void WorldObject::_Create(uint32 guidlow, HighGuid guidhigh, uint32 phaseMask)
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp
index 1f27aeb4742..73e4a85e9d0 100755
--- a/src/server/game/Grids/ObjectGridLoader.cpp
+++ b/src/server/game/Grids/ObjectGridLoader.cpp
@@ -205,6 +205,9 @@ void ObjectGridUnloader::Visit(GridRefManager<T> &m)
// if option set then object already saved at this moment
if (!sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
obj->SaveRespawnTime();
+ //Some creatures may summon other temp summons in CleanupsBeforeDelete()
+ //So we need this even after cleaner (maybe we can remove cleaner)
+ obj->CleanupsBeforeDelete();
///- object will get delinked from the manager when deleted
delete obj;
}
@@ -225,23 +228,18 @@ void ObjectGridStoper::Visit(CreatureMapType &m)
}
}
-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 (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
- iter->getSource()->RemoveFromWorld();
+ iter->getSource()->CleanupsBeforeDelete();
}
template void ObjectGridUnloader::Visit(CreatureMapType &);
template void ObjectGridUnloader::Visit(GameObjectMapType &);
template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
template void ObjectGridUnloader::Visit(CorpseMapType &);
+template void ObjectGridCleaner::Visit(CreatureMapType &);
template void ObjectGridCleaner::Visit<GameObject>(GameObjectMapType &);
template void ObjectGridCleaner::Visit<DynamicObject>(DynamicObjectMapType &);
template void ObjectGridCleaner::Visit<Corpse>(CorpseMapType &);
diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h
index 411cae10a90..09a8fb2af9c 100755
--- a/src/server/game/Grids/ObjectGridLoader.h
+++ b/src/server/game/Grids/ObjectGridLoader.h
@@ -74,7 +74,6 @@ class ObjectGridEvacuator
class ObjectGridCleaner
{
public:
- void Visit(CreatureMapType &m);
template<class T> void Visit(GridRefManager<T> &);
};