diff options
author | megamage <none@none> | 2009-08-11 16:33:33 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-08-11 16:33:33 -0500 |
commit | 962b88a381cd7c051378ab10e783511af734b9bf (patch) | |
tree | cd30fccd45c5a2f675b4620760f30ee04667628d | |
parent | 9403ff03e792154b5709a05d8dfdd7da123ce9b5 (diff) |
*ResetMap for worldobjects when map is deleted.
--HG--
branch : trunk
-rw-r--r-- | src/game/Map.cpp | 6 | ||||
-rw-r--r-- | src/game/Map.h | 5 | ||||
-rw-r--r-- | src/game/Object.cpp | 21 | ||||
-rw-r--r-- | src/game/Unit.cpp | 2 |
4 files changed, 29 insertions, 5 deletions
diff --git a/src/game/Map.cpp b/src/game/Map.cpp index e10ee1a2b94..c08078b9f9b 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -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) diff --git a/src/game/Map.h b/src/game/Map.h index 68d5b90f48d..6fd9bb1d9fb 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -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 diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 681a5da6d44..4c100328adb 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -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; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 22cb8895d89..a124dc464c0 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -12389,7 +12389,7 @@ void Unit::RemoveFromWorld() RemoveAllControlled(); if(m_NotifyListPos >= 0) - GetMap()->RemoveUnitFromNotify(this, m_NotifyListPos); + GetMap()->RemoveUnitFromNotify(this); if(GetCharmerGUID()) { |