aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2012-06-07 23:20:57 +0200
committerShauren <shauren.trinity@gmail.com>2012-06-07 23:20:57 +0200
commitc7775c8d72fb8618ad96c243910f923b239ea39b (patch)
tree9ea59ceec04ac86bedfe31655abb04561c312e70 /src/server/game/Maps
parent426145373ba93f080c5503054daecd9ec823edcb (diff)
Core/Maps: Moved object respawn time storage from global to map level. This removes unneccessary locking since all objects run within its map's thread.
Diffstat (limited to 'src/server/game/Maps')
-rwxr-xr-xsrc/server/game/Maps/Map.cpp127
-rwxr-xr-xsrc/server/game/Maps/Map.h34
-rwxr-xr-xsrc/server/game/Maps/MapInstanced.cpp2
-rwxr-xr-xsrc/server/game/Maps/MapManager.cpp1
4 files changed, 163 insertions, 1 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 162dd12d121..6f19fdcbc0a 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2632,7 +2632,7 @@ void InstanceMap::UnloadAll()
ASSERT(!HavePlayers());
if (m_resetAfterUnload == true)
- sObjectMgr->DeleteRespawnTimeForInstance(GetInstanceId());
+ DeleteRespawnTimes();
Map::UnloadAll();
}
@@ -2781,3 +2781,128 @@ void Map::UpdateIteratorBack(Player* player)
if (m_mapRefIter == player->GetMapRef())
m_mapRefIter = m_mapRefIter->nocheck_prev();
}
+
+void Map::SaveCreatureRespawnTime(uint32 dbGuid, time_t respawnTime)
+{
+ if (!respawnTime)
+ {
+ // Delete only
+ RemoveCreatureRespawnTime(dbGuid);
+ return;
+ }
+
+ _creatureRespawnTimes[dbGuid] = respawnTime;
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN);
+ stmt->setUInt32(0, dbGuid);
+ stmt->setUInt32(1, uint32(respawnTime));
+ stmt->setUInt16(2, GetId());
+ stmt->setUInt32(3, GetInstanceId());
+ CharacterDatabase.Execute(stmt);
+}
+
+void Map::RemoveCreatureRespawnTime(uint32 dbGuid)
+{
+ _creatureRespawnTimes.erase(dbGuid);
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN);
+ stmt->setUInt32(0, dbGuid);
+ stmt->setUInt16(1, GetId());
+ stmt->setUInt32(2, GetInstanceId());
+ CharacterDatabase.Execute(stmt);
+}
+
+void Map::SaveGORespawnTime(uint32 dbGuid, time_t respawnTime)
+{
+ if (!respawnTime)
+ {
+ // Delete only
+ RemoveGORespawnTime(dbGuid);
+ return;
+ }
+
+ _goRespawnTimes[dbGuid] = respawnTime;
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GO_RESPAWN);
+ stmt->setUInt32(0, dbGuid);
+ stmt->setUInt32(1, uint32(respawnTime));
+ stmt->setUInt16(2, GetId());
+ stmt->setUInt32(3, GetInstanceId());
+ CharacterDatabase.Execute(stmt);
+}
+
+void Map::RemoveGORespawnTime(uint32 dbGuid)
+{
+ _goRespawnTimes.erase(dbGuid);
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN);
+ stmt->setUInt32(0, dbGuid);
+ stmt->setUInt16(1, GetId());
+ stmt->setUInt32(2, GetInstanceId());
+ CharacterDatabase.Execute(stmt);
+}
+
+void Map::LoadRespawnTimes()
+{
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS);
+ stmt->setUInt16(0, GetId());
+ stmt->setUInt32(1, GetInstanceId());
+ if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 loguid = fields[0].GetUInt32();
+ uint32 respawnTime = fields[1].GetUInt32();
+
+ _creatureRespawnTimes[loguid] = time_t(respawnTime);
+ } while (result->NextRow());
+ }
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS);
+ stmt->setUInt16(0, GetId());
+ stmt->setUInt32(1, GetInstanceId());
+ if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 loguid = fields[0].GetUInt32();
+ uint32 respawnTime = fields[1].GetUInt32();
+
+ _goRespawnTimes[loguid] = time_t(respawnTime);
+ } while (result->NextRow());
+ }
+}
+
+void Map::DeleteRespawnTimes()
+{
+ _creatureRespawnTimes.clear();
+ _goRespawnTimes.clear();
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE);
+ stmt->setUInt16(0, GetId());
+ stmt->setUInt32(1, GetInstanceId());
+ CharacterDatabase.Execute(stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE);
+ stmt->setUInt16(0, GetId());
+ stmt->setUInt32(1, GetInstanceId());
+ CharacterDatabase.Execute(stmt);
+}
+
+time_t Map::GetLinkedRespawnTime(uint64 guid) const
+{
+ uint64 linkedGuid = sObjectMgr->GetLinkedRespawnGuid(guid);
+ switch (GUID_HIPART(linkedGuid))
+ {
+ case HIGHGUID_UNIT:
+ return GetCreatureRespawnTime(GUID_LOPART(linkedGuid));
+ case HIGHGUID_GAMEOBJECT:
+ return GetGORespawnTime(GUID_LOPART(linkedGuid));
+ default:
+ break;
+ }
+
+ return time_t(0);
+}
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 6ba08646f25..94a64126da1 100755
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -443,6 +443,36 @@ class Map : public GridRefManager<NGridType>
void Insert(const GameObjectModel& mdl) { _dynamicTree.insert(mdl); }
bool Contains(const GameObjectModel& mdl) const { return _dynamicTree.contains(mdl);}
bool getObjectHitPos(uint32 phasemask, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float modifyDist);
+
+ /*
+ RESPAWN TIMES
+ */
+ time_t GetLinkedRespawnTime(uint64 guid) const;
+ time_t GetCreatureRespawnTime(uint32 dbGuid) const
+ {
+ UNORDERED_MAP<uint32 /*dbGUID*/, time_t>::const_iterator itr = _creatureRespawnTimes.find(dbGuid);
+ if (itr != _creatureRespawnTimes.end())
+ return itr->second;
+
+ return time_t(0);
+ }
+
+ time_t GetGORespawnTime(uint32 dbGuid) const
+ {
+ UNORDERED_MAP<uint32 /*dbGUID*/, time_t>::const_iterator itr = _goRespawnTimes.find(dbGuid);
+ if (itr != _goRespawnTimes.end())
+ return itr->second;
+
+ return time_t(0);
+ }
+
+ void SaveCreatureRespawnTime(uint32 dbGuid, time_t respawnTime);
+ void RemoveCreatureRespawnTime(uint32 dbGuid);
+ void SaveGORespawnTime(uint32 dbGuid, time_t respawnTime);
+ void RemoveGORespawnTime(uint32 dbGuid);
+ void LoadRespawnTimes();
+ void DeleteRespawnTimes();
+
private:
void LoadMapAndVMap(int gx, int gy);
void LoadVMap(int gx, int gy);
@@ -488,6 +518,7 @@ class Map : public GridRefManager<NGridType>
void ScriptsProcess();
void UpdateActiveCells(const float &x, const float &y, const uint32 t_diff);
+
protected:
void SetUnloadReferenceLock(const GridCoord &p, bool on) { getNGrid(p.x_coord, p.y_coord)->setUnloadReferenceLock(on); }
@@ -570,6 +601,9 @@ class Map : public GridRefManager<NGridType>
else
m_activeNonPlayers.erase(obj);
}
+
+ UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _creatureRespawnTimes;
+ UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _goRespawnTimes;
};
enum InstanceResetMethod
diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp
index 5543251e115..2c1bdb00834 100755
--- a/src/server/game/Maps/MapInstanced.cpp
+++ b/src/server/game/Maps/MapInstanced.cpp
@@ -211,6 +211,8 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save,
InstanceMap* map = new InstanceMap(GetId(), GetGridExpiry(), InstanceId, difficulty, this);
ASSERT(map->IsDungeon());
+ map->LoadRespawnTimes();
+
bool load_data = save != NULL;
map->CreateInstanceData(load_data);
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index eb09538721d..e9de3ae001f 100755
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -110,6 +110,7 @@ Map* MapManager::CreateBaseMap(uint32 id)
else
{
map = new Map(id, i_gridCleanUpDelay, 0, REGULAR_DIFFICULTY);
+ map->LoadRespawnTimes();
}
i_maps[id] = map;
}