*ResetMap for worldobjects when map is deleted.
--HG-- branch : trunk
This commit is contained in:
+5
-1
@@ -60,6 +60,9 @@ Map::~Map()
|
||||
{
|
||||
UnloadAll();
|
||||
|
||||
while(!i_worldObjects.empty())
|
||||
(*(i_worldObjects.begin()))->ResetMap();
|
||||
|
||||
if(!m_scriptSchedule.empty())
|
||||
sWorld.DecreaseScheduledScriptCount(m_scriptSchedule.size());
|
||||
}
|
||||
@@ -581,8 +584,9 @@ void Map::AddUnitToNotify(Unit* u)
|
||||
}
|
||||
}
|
||||
|
||||
void Map::RemoveUnitFromNotify(Unit *unit, int32 slot)
|
||||
void Map::RemoveUnitFromNotify(Unit *unit)
|
||||
{
|
||||
int32 slot = unit->m_NotifyListPos;
|
||||
if(i_lock)
|
||||
{
|
||||
if(slot < i_unitsToNotifyBacklog.size() && i_unitsToNotifyBacklog[slot] == unit)
|
||||
|
||||
+4
-1
@@ -404,7 +404,9 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
|
||||
bool ActiveObjectsNearGrid(uint32 x, uint32 y) const;
|
||||
|
||||
void AddUnitToNotify(Unit* unit);
|
||||
void RemoveUnitFromNotify(Unit *unit, int32 slot);
|
||||
void RemoveUnitFromNotify(Unit *unit);
|
||||
void AddWorldObject(WorldObject *obj) { i_worldObjects.insert(obj); }
|
||||
void RemoveWorldObject(WorldObject *obj) { i_worldObjects.erase(obj); }
|
||||
|
||||
void SendToPlayers(WorldPacket const* data) const;
|
||||
|
||||
@@ -527,6 +529,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
|
||||
std::vector<Unit*> i_unitsToNotify;
|
||||
std::set<WorldObject *> i_objectsToRemove;
|
||||
std::map<WorldObject*, bool> i_objectsToSwitch;
|
||||
std::set<WorldObject*> i_worldObjects;
|
||||
std::multimap<time_t, ScriptAction> m_scriptSchedule;
|
||||
|
||||
// Type specific code for add/remove to/from grid
|
||||
|
||||
+19
-2
@@ -80,6 +80,18 @@ Object::Object( ) : m_PackGUID(sizeof(uint64)+1)
|
||||
m_PackGUID.appendPackGUID(0);
|
||||
}
|
||||
|
||||
/*
|
||||
WorldObject::~WorldObject()
|
||||
{
|
||||
if(m_currMap)
|
||||
{
|
||||
sLog.outCrash("Object::~Object - guid="UI64FMTD", typeid=%d, entry=%u deleted but still in map!!", GetGUID(), GetTypeId(), GetEntry());
|
||||
assert(false);
|
||||
ResetMap();
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
Object::~Object( )
|
||||
{
|
||||
if(IsInWorld())
|
||||
@@ -1692,14 +1704,19 @@ void WorldObject::SendObjectDeSpawnAnim(uint64 guid)
|
||||
void WorldObject::SetMap(Map * map)
|
||||
{
|
||||
ASSERT(map);
|
||||
ASSERT(!IsInWorld() || GetTypeId() == TYPEID_CORPSE);
|
||||
//ASSERT(!IsInWorld());
|
||||
ASSERT(!m_currMap);
|
||||
m_currMap = map;
|
||||
if(m_isWorldObject)
|
||||
m_currMap->AddWorldObject(this);
|
||||
}
|
||||
|
||||
void WorldObject::ResetMap()
|
||||
{
|
||||
ASSERT(m_currMap);
|
||||
ASSERT(!IsInWorld() || GetTypeId() == TYPEID_CORPSE);
|
||||
//ASSERT(!IsInWorld() || GetTypeId() == TYPEID_CORPSE);
|
||||
if(m_isWorldObject)
|
||||
m_currMap->RemoveWorldObject(this);
|
||||
m_currMap = NULL;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -12389,7 +12389,7 @@ void Unit::RemoveFromWorld()
|
||||
RemoveAllControlled();
|
||||
|
||||
if(m_NotifyListPos >= 0)
|
||||
GetMap()->RemoveUnitFromNotify(this, m_NotifyListPos);
|
||||
GetMap()->RemoveUnitFromNotify(this);
|
||||
|
||||
if(GetCharmerGUID())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user