Cleanup before deleting objects when unloading grid. Fix #3922.
This commit is contained in:
@@ -1273,6 +1273,8 @@ void WorldObject::setActive(bool on)
|
|||||||
|
|
||||||
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
|
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
|
||||||
{
|
{
|
||||||
|
if (IsInWorld())
|
||||||
|
RemoveFromWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldObject::_Create(uint32 guidlow, HighGuid guidhigh, uint32 phaseMask)
|
void WorldObject::_Create(uint32 guidlow, HighGuid guidhigh, uint32 phaseMask)
|
||||||
|
|||||||
@@ -205,6 +205,9 @@ void 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->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
|
if (!sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
|
||||||
obj->SaveRespawnTime();
|
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
|
///- object will get delinked from the manager when deleted
|
||||||
delete obj;
|
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>
|
template<class T>
|
||||||
void ObjectGridCleaner::Visit(GridRefManager<T> &m)
|
void ObjectGridCleaner::Visit(GridRefManager<T> &m)
|
||||||
{
|
{
|
||||||
for (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
|
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(CreatureMapType &);
|
||||||
template void ObjectGridUnloader::Visit(GameObjectMapType &);
|
template void ObjectGridUnloader::Visit(GameObjectMapType &);
|
||||||
template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
|
template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
|
||||||
template void ObjectGridUnloader::Visit(CorpseMapType &);
|
template void ObjectGridUnloader::Visit(CorpseMapType &);
|
||||||
|
template void ObjectGridCleaner::Visit(CreatureMapType &);
|
||||||
template void ObjectGridCleaner::Visit<GameObject>(GameObjectMapType &);
|
template void ObjectGridCleaner::Visit<GameObject>(GameObjectMapType &);
|
||||||
template void ObjectGridCleaner::Visit<DynamicObject>(DynamicObjectMapType &);
|
template void ObjectGridCleaner::Visit<DynamicObject>(DynamicObjectMapType &);
|
||||||
template void ObjectGridCleaner::Visit<Corpse>(CorpseMapType &);
|
template void ObjectGridCleaner::Visit<Corpse>(CorpseMapType &);
|
||||||
|
|||||||
@@ -74,7 +74,6 @@ class ObjectGridEvacuator
|
|||||||
class ObjectGridCleaner
|
class ObjectGridCleaner
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Visit(CreatureMapType &m);
|
|
||||||
template<class T> void Visit(GridRefManager<T> &);
|
template<class T> void Visit(GridRefManager<T> &);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user