[8102] Simplify code base at new root method WorldObject::CleanupsBeforeDelete

* Call it from Map::AddObjectToRemoveList and remove now not needed explcit calls
* Create Gameobject version to make GO with owner more safe for remove
This commit is contained in:
VladimirMangos 2009-07-01 11:05:55 +04:00
parent dc10620148
commit 9f41772828
15 changed files with 19 additions and 32 deletions

View file

@ -1529,7 +1529,6 @@ bool BattleGround::DelCreature(uint32 type)
sLog.outError("Can't find creature guid: %u",GUID_LOPART(m_BgCreatures[type])); sLog.outError("Can't find creature guid: %u",GUID_LOPART(m_BgCreatures[type]));
return false; return false;
} }
cr->CleanupsBeforeDelete();
cr->AddObjectToRemoveList(); cr->AddObjectToRemoveList();
m_BgCreatures[type] = 0; m_BgCreatures[type] = 0;
return true; return true;

View file

@ -599,12 +599,9 @@ void GameEventMgr::GameEventUnspawn(int16 event_id)
objmgr.RemoveCreatureFromGrid(*itr, data); objmgr.RemoveCreatureFromGrid(*itr, data);
if( Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(*itr, data->id, HIGHGUID_UNIT), (Creature*)NULL) ) if( Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(*itr, data->id, HIGHGUID_UNIT), (Creature*)NULL) )
{
pCreature->CleanupsBeforeDelete();
pCreature->AddObjectToRemoveList(); pCreature->AddObjectToRemoveList();
} }
} }
}
if(internal_event_id < 0 || internal_event_id >= mGameEventGameobjectGuids.size()) if(internal_event_id < 0 || internal_event_id >= mGameEventGameobjectGuids.size())
{ {

View file

@ -59,15 +59,18 @@ GameObject::GameObject() : WorldObject()
} }
GameObject::~GameObject() GameObject::~GameObject()
{
CleanupsBeforeDelete();
}
void GameObject::CleanupsBeforeDelete()
{ {
if(m_uint32Values) // field array can be not exist if GameOBject not loaded if(m_uint32Values) // field array can be not exist if GameOBject not loaded
{ {
// Possible crash at access to deleted GO in Unit::m_gameobj // Possible crash at access to deleted GO in Unit::m_gameobj
uint64 owner_guid = GetOwnerGUID(); if(uint64 owner_guid = GetOwnerGUID())
if(owner_guid)
{ {
Unit* owner = ObjectAccessor::GetUnit(*this,owner_guid); if(Unit* owner = ObjectAccessor::GetUnit(*this,owner_guid))
if(owner)
owner->RemoveGameObject(this,false); owner->RemoveGameObject(this,false);
else else
{ {

View file

@ -467,6 +467,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
void AddToWorld(); void AddToWorld();
void RemoveFromWorld(); void RemoveFromWorld();
void CleanupsBeforeDelete();
bool Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, GOState go_state); bool Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, GOState go_state);
void Update(uint32 p_time); void Update(uint32 p_time);

View file

@ -1337,7 +1337,6 @@ bool ChatHandler::HandleNpcDeleteCommand(const char* args)
// Delete the creature // Delete the creature
unit->CombatStop(); unit->CombatStop();
unit->DeleteFromDB(); unit->DeleteFromDB();
unit->CleanupsBeforeDelete();
unit->AddObjectToRemoveList(); unit->AddObjectToRemoveList();
SendSysMessage(LANG_COMMAND_DELCREATMESSAGE); SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
@ -2783,7 +2782,6 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
{ {
wpCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); wpCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT));
wpCreature->DeleteFromDB(); wpCreature->DeleteFromDB();
wpCreature->CleanupsBeforeDelete();
wpCreature->AddObjectToRemoveList(); wpCreature->AddObjectToRemoveList();
} }
@ -2847,7 +2845,6 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
{ {
wpCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); wpCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT));
wpCreature->DeleteFromDB(); wpCreature->DeleteFromDB();
wpCreature->CleanupsBeforeDelete();
wpCreature->AddObjectToRemoveList(); wpCreature->AddObjectToRemoveList();
// re-create // re-create
Creature* wpCreature2 = new Creature; Creature* wpCreature2 = new Creature;
@ -3127,7 +3124,6 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
else else
{ {
pCreature->DeleteFromDB(); pCreature->DeleteFromDB();
pCreature->CleanupsBeforeDelete();
pCreature->AddObjectToRemoveList(); pCreature->AddObjectToRemoveList();
} }
@ -3325,7 +3321,6 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
else else
{ {
pCreature->DeleteFromDB(); pCreature->DeleteFromDB();
pCreature->CleanupsBeforeDelete();
pCreature->AddObjectToRemoveList(); pCreature->AddObjectToRemoveList();
} }
}while(result->NextRow()); }while(result->NextRow());

View file

@ -880,7 +880,6 @@ void Map::MoveAllCreaturesInMoveList()
if((sLog.getLogFilter() & LOG_FILTER_CREATURE_MOVES)==0) if((sLog.getLogFilter() & LOG_FILTER_CREATURE_MOVES)==0)
sLog.outDebug("Creature (GUID: %u Entry: %u ) can't be move to unloaded respawn grid.",c->GetGUIDLow(),c->GetEntry()); sLog.outDebug("Creature (GUID: %u Entry: %u ) can't be move to unloaded respawn grid.",c->GetGUIDLow(),c->GetEntry());
#endif #endif
c->CleanupsBeforeDelete();
AddObjectToRemoveList(c); AddObjectToRemoveList(c);
} }
} }
@ -2048,6 +2047,8 @@ void Map::AddObjectToRemoveList(WorldObject *obj)
{ {
assert(obj->GetMapId()==GetId() && obj->GetInstanceId()==GetInstanceId()); assert(obj->GetMapId()==GetId() && obj->GetInstanceId()==GetInstanceId());
obj->CleanupsBeforeDelete(); // remove or simplify at least cross referenced links
i_objectsToRemove.insert(obj); i_objectsToRemove.insert(obj);
//sLog.outDebug("Object (GUID: %u TypeId: %u ) added to removing list.",obj->GetGUIDLow(),obj->GetTypeId()); //sLog.outDebug("Object (GUID: %u TypeId: %u ) added to removing list.",obj->GetGUIDLow(),obj->GetTypeId());
} }

View file

@ -1053,6 +1053,10 @@ WorldObject::WorldObject()
{ {
} }
void WorldObject::CleanupsBeforeDelete()
{
}
void WorldObject::_Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask ) void WorldObject::_Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask )
{ {
Object::_Create(guidlow, 0, guidhigh); Object::_Create(guidlow, 0, guidhigh);
@ -1546,14 +1550,7 @@ Map const* WorldObject::GetBaseMap() const
void WorldObject::AddObjectToRemoveList() void WorldObject::AddObjectToRemoveList()
{ {
Map* map = GetMap(); GetMap()->AddObjectToRemoveList(this);
if(!map)
{
sLog.outError("Object (TypeId: %u Entry: %u GUID: %u) at attempt add to move list not have valid map (Id: %u).",GetTypeId(),GetEntry(),GetGUIDLow(),GetMapId());
return;
}
map->AddObjectToRemoveList(this);
} }
Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime) Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime)

View file

@ -447,6 +447,8 @@ class MANGOS_DLL_SPEC WorldObject : public Object
float GetAngle( const float x, const float y ) const; float GetAngle( const float x, const float y ) const;
bool HasInArc( const float arcangle, const WorldObject* obj ) const; bool HasInArc( const float arcangle, const WorldObject* obj ) const;
virtual void CleanupsBeforeDelete(); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units
virtual void SendMessageToSet(WorldPacket *data, bool self); virtual void SendMessageToSet(WorldPacket *data, bool self);
virtual void SendMessageToSetInRange(WorldPacket *data, float dist, bool self); virtual void SendMessageToSetInRange(WorldPacket *data, float dist, bool self);

View file

@ -680,7 +680,6 @@ void Pet::Remove(PetSaveMode mode, bool returnreagent)
owner->SetPet(0); owner->SetPet(0);
} }
CleanupsBeforeDelete();
AddObjectToRemoveList(); AddObjectToRemoveList();
m_removed = true; m_removed = true;
} }

View file

@ -16247,7 +16247,6 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
pet->SavePetToDB(mode); pet->SavePetToDB(mode);
pet->CleanupsBeforeDelete();
pet->AddObjectToRemoveList(); pet->AddObjectToRemoveList();
pet->m_removed = true; pet->m_removed = true;

View file

@ -127,12 +127,9 @@ void PoolGroup<Creature>::Despawn1Object(uint32 guid)
objmgr.RemoveCreatureFromGrid(guid, data); objmgr.RemoveCreatureFromGrid(guid, data);
if (Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_UNIT), (Creature*)NULL)) if (Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_UNIT), (Creature*)NULL))
{
pCreature->CleanupsBeforeDelete();
pCreature->AddObjectToRemoveList(); pCreature->AddObjectToRemoveList();
} }
} }
}
// Same on one gameobject // Same on one gameobject
template<> template<>

View file

@ -165,7 +165,6 @@ void TemporarySummon::UnSummon()
{ {
CombatStop(); CombatStop();
CleanupsBeforeDelete();
AddObjectToRemoveList(); AddObjectToRemoveList();
Unit* sum = m_summoner ? ObjectAccessor::GetUnit(*this, m_summoner) : NULL; Unit* sum = m_summoner ? ObjectAccessor::GetUnit(*this, m_summoner) : NULL;

View file

@ -122,7 +122,6 @@ void Totem::UnSummon()
} }
} }
CleanupsBeforeDelete();
AddObjectToRemoveList(); AddObjectToRemoveList();
} }

View file

@ -92,6 +92,5 @@ void Vehicle::Dismiss()
{ {
SendObjectDeSpawnAnim(GetGUID()); SendObjectDeSpawnAnim(GetGUID());
CombatStop(); CombatStop();
CleanupsBeforeDelete();
AddObjectToRemoveList(); AddObjectToRemoveList();
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8101" #define REVISION_NR "8102"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__