aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Map.cpp6
-rw-r--r--src/game/Map.h5
-rw-r--r--src/game/Object.cpp21
-rw-r--r--src/game/Unit.cpp2
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())
{