aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2008-12-04 16:52:49 -0600
committermegamage <none@none>2008-12-04 16:52:49 -0600
commit929f9f221d912d09afb07ddf80b2d2a59722e479 (patch)
tree73a3bba927f557de7fccac896015e20b7798abbb
parent717885da7dd51c50be80e72c3752ccfe8fa5bf5d (diff)
*Lock notifylist during update. This should fix the crash bug during relocationnotify update.
--HG-- branch : trunk
-rw-r--r--src/game/Map.cpp6
-rw-r--r--src/game/Map.h1
2 files changed, 6 insertions, 1 deletions
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index c807c6ab1a1..6c693bfe177 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -212,6 +212,7 @@ void Map::DeleteStateMachine()
Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode)
: i_id(id), i_gridExpiry(expiry), i_mapEntry (sMapStore.LookupEntry(id)),
i_InstanceId(InstanceId), i_spawnMode(SpawnMode), m_unloadTimer(0)
+ , i_lock(false)
{
for(unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx)
{
@@ -642,6 +643,8 @@ bool Map::loaded(const GridPair &p) const
void Map::Update(const uint32 &t_diff)
{
+ //creatures may be added to the list during update
+ i_lock = true;
for(std::vector<uint64>::iterator iter = i_unitsToNotify.begin(); iter != i_unitsToNotify.end(); ++iter)
{
Unit *unit = ObjectAccessor::GetObjectInWorld(*iter, (Unit*)NULL);
@@ -665,6 +668,7 @@ void Map::Update(const uint32 &t_diff)
}
}
i_unitsToNotify.clear();
+ i_lock = false;
resetMarkedCells();
@@ -2058,7 +2062,7 @@ void BattleGroundMap::UnloadAll(bool pForce)
void Map::AddUnitToNotify(Unit* u)
{
- if(!u->m_IsInNotifyList)
+ if(!i_lock && !u->m_IsInNotifyList)
{
i_unitsToNotify.push_back(u->GetGUID());
u->m_IsInNotifyList = true;
diff --git a/src/game/Map.h b/src/game/Map.h
index 167a34dcccd..2fb2f4f31e5 100644
--- a/src/game/Map.h
+++ b/src/game/Map.h
@@ -314,6 +314,7 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
time_t i_gridExpiry;
+ bool i_lock;
std::set<WorldObject *> i_activeObjects;
std::vector<uint64> i_unitsToNotify;
std::set<WorldObject *> i_objectsToRemove;