aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2009-08-06 16:14:13 -0500
committermegamage <none@none>2009-08-06 16:14:13 -0500
commitbefbae3a61c50252c1b56466dc23aa166167fc6b (patch)
tree58cb214e2da93bf4fac879a503ce339112fd3cb3
parent50c73d433ce54b5c119058ee295d0ffaa5ac95bc (diff)
*Fix the bug that players get stuck after teleported out of bg.
*Do not delete the map immediately until all players are teleported. --HG-- branch : trunk
-rw-r--r--src/game/Map.cpp37
-rw-r--r--src/game/Map.h3
-rw-r--r--src/game/MapInstanced.cpp22
-rw-r--r--src/game/MapInstanced.h3
-rw-r--r--src/game/MapManager.cpp7
-rw-r--r--src/game/MapManager.h3
6 files changed, 40 insertions, 35 deletions
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index 7b2b846c6e7..85a720948ab 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -1196,6 +1196,21 @@ bool Map::UnloadGrid(const uint32 &x, const uint32 &y, bool unloadAll)
return true;
}
+void Map::RemoveAllPlayers()
+{
+ if(HavePlayers())
+ {
+ sLog.outError("Map::UnloadAll: there are still players in the instance at unload, should not happen!");
+
+ for(MapRefManager::iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr)
+ {
+ Player* plr = itr->getSource();
+ if(!plr->IsBeingTeleportedFar())
+ plr->TeleportTo(plr->m_homebindMapId, plr->m_homebindX, plr->m_homebindY, plr->m_homebindZ, plr->GetOrientation());
+ }
+ }
+}
+
void Map::UnloadAll()
{
// clear all delayed moves, useless anyway do this moves before map unload.
@@ -2642,12 +2657,7 @@ void InstanceMap::PermBindAllPlayers(Player *player)
void InstanceMap::UnloadAll()
{
- while(HavePlayers())
- {
- sLog.outError("InstanceMap::UnloadAll: there are still players in the instance at unload, should not happen!");
- Player *plr = m_mapRefManager.getFirst()->getSource();
- plr->TeleportOutOfMap(this);
- }
+ assert(!HavePlayers());
if(m_resetAfterUnload == true)
objmgr.DeleteRespawnTimeForInstance(GetInstanceId());
@@ -2734,16 +2744,17 @@ void BattleGroundMap::SetUnload()
m_unloadTimer = MIN_UNLOAD_DELAY;
}
-void BattleGroundMap::UnloadAll()
+void BattleGroundMap::RemoveAllPlayers()
{
- while(HavePlayers())
+ if(HavePlayers())
{
- Player *plr = m_mapRefManager.getFirst()->getSource();
- plr->TeleportTo(plr->GetBattleGroundEntryPoint());
- plr->TeleportOutOfMap(this);
+ for(MapRefManager::iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr)
+ {
+ Player* plr = itr->getSource();
+ if(!plr->IsBeingTeleportedFar())
+ plr->TeleportTo(plr->GetBattleGroundEntryPoint());
+ }
}
-
- Map::UnloadAll();
}
/// Put scripts in the execution queue
diff --git a/src/game/Map.h b/src/game/Map.h
index 0597cfde8a0..bfd8d178fdd 100644
--- a/src/game/Map.h
+++ b/src/game/Map.h
@@ -355,6 +355,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
virtual void MoveAllCreaturesInMoveList();
virtual void RemoveAllObjectsInRemoveList();
virtual void RelocationNotify();
+ virtual void RemoveAllPlayers();
bool CreatureRespawnRelocation(Creature *c); // used only in MoveAllCreaturesInMoveList and ObjectGridUnloader
@@ -610,7 +611,7 @@ class TRINITY_DLL_SPEC BattleGroundMap : public Map
void Remove(Player *, bool);
bool CanEnter(Player* player);
void SetUnload();
- void UnloadAll();
+ void RemoveAllPlayers();
};
/*inline
diff --git a/src/game/MapInstanced.cpp b/src/game/MapInstanced.cpp
index 4817c463f6e..e423abbad31 100644
--- a/src/game/MapInstanced.cpp
+++ b/src/game/MapInstanced.cpp
@@ -46,7 +46,10 @@ void MapInstanced::Update(const uint32& t)
{
if(i->second->CanUnload(t))
{
- DestroyInstance(i); // iterator incremented
+ if(!DestroyInstance(i)) // iterator incremented
+ {
+ //m_unloadTimer
+ }
}
else
{
@@ -203,16 +206,16 @@ BattleGroundMap* MapInstanced::CreateBattleGround(uint32 InstanceId)
return map;
}
-void MapInstanced::DestroyInstance(uint32 InstanceId)
-{
- InstancedMaps::iterator itr = m_InstancedMaps.find(InstanceId);
- if(itr != m_InstancedMaps.end())
- DestroyInstance(itr);
-}
-
// increments the iterator after erase
-void MapInstanced::DestroyInstance(InstancedMaps::iterator &itr)
+bool MapInstanced::DestroyInstance(InstancedMaps::iterator &itr)
{
+ itr->second->RemoveAllPlayers();
+ if(itr->second->HavePlayers())
+ {
+ ++itr;
+ return false;
+ }
+
itr->second->UnloadAll();
// should only unload VMaps if this is the last instance and grid unloading is enabled
if(m_InstancedMaps.size() <= 1 && sWorld.getConfig(CONFIG_GRID_UNLOAD))
@@ -225,6 +228,7 @@ void MapInstanced::DestroyInstance(InstancedMaps::iterator &itr)
// erase map
delete itr->second;
m_InstancedMaps.erase(itr++);
+ return true;
}
bool MapInstanced::CanEnter(Player *player)
diff --git a/src/game/MapInstanced.h b/src/game/MapInstanced.h
index 31e7b2da0f3..851fe8942a0 100644
--- a/src/game/MapInstanced.h
+++ b/src/game/MapInstanced.h
@@ -44,8 +44,7 @@ class TRINITY_DLL_DECL MapInstanced : public Map
Map* CreateInstance(const uint32 mapId, Player * player, uint32 instanceId);
Map* FindMap(uint32 InstanceId) const { return _FindMap(InstanceId); }
- void DestroyInstance(uint32 InstanceId);
- void DestroyInstance(InstancedMaps::iterator &itr);
+ bool DestroyInstance(InstancedMaps::iterator &itr);
void AddGridMapReference(const GridPair &p)
{
diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp
index 74405462749..297bc1a3874 100644
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -234,13 +234,6 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player)
return true;
}
-void MapManager::DeleteInstance(uint32 mapid, uint32 instanceId)
-{
- Map *m = _createBaseMap(mapid);
- if (m && m->Instanceable())
- ((MapInstanced*)m)->DestroyInstance(instanceId);
-}
-
void MapManager::RemoveBonesFromMap(uint32 mapid, uint64 guid, float x, float y)
{
bool remove_result = _createBaseMap(mapid)->RemoveBones(guid, x, y);
diff --git a/src/game/MapManager.h b/src/game/MapManager.h
index aac25af8a41..118a057c9af 100644
--- a/src/game/MapManager.h
+++ b/src/game/MapManager.h
@@ -43,9 +43,6 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::
Map const* CreateBaseMap(uint32 id) const { return const_cast<MapManager*>(this)->_createBaseMap(id); }
Map* FindMap(uint32 mapid, uint32 instanceId = 0) const;
- // only const version for outer users
- void DeleteInstance(uint32 mapid, uint32 instanceId);
-
uint16 GetAreaFlag(uint32 mapid, float x, float y, float z) const
{
Map const* m = CreateBaseMap(mapid);