diff options
author | megamage <none@none.none> | 2011-11-11 14:11:58 -0500 |
---|---|---|
committer | megamage <none@none.none> | 2011-11-11 14:11:58 -0500 |
commit | 9e3b4fe409e401bdffa44dc479177aa1b5fe96b1 (patch) | |
tree | 9d9056429b11873821324a27ad631eec1d28a413 | |
parent | 360c9dd63520bb3b156e9c139231d081d4ba55bf (diff) |
Cleanup before deleting objects when unloading grid. Fix #3922.
-rwxr-xr-x | src/server/game/Entities/Object/Object.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Grids/ObjectGridLoader.cpp | 12 | ||||
-rwxr-xr-x | src/server/game/Grids/ObjectGridLoader.h | 1 |
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> &); }; |