diff options
author | Mattes D <github@xoft.cz> | 2015-10-05 18:08:45 +0200 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2015-10-05 18:08:45 +0200 |
commit | be27992a07d2f846881e8e72ea5c1cf9c4a46be8 (patch) | |
tree | 9399904ac2fa3df4b13162a39753d43e8a11bf63 | |
parent | Merge pull request #2522 from cuberite/FixLoaderGenRaceCondition (diff) | |
parent | Improved the data structure for storing loaded chunks (diff) | |
download | cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.tar cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.tar.gz cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.tar.bz2 cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.tar.lz cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.tar.xz cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.tar.zst cuberite-be27992a07d2f846881e8e72ea5c1cf9c4a46be8.zip |
-rw-r--r-- | src/ClientHandle.cpp | 14 | ||||
-rw-r--r-- | src/ClientHandle.h | 2 |
2 files changed, 8 insertions, 8 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 98005e934..bc7df883a 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -456,7 +456,7 @@ bool cClientHandle::StreamNextChunk(void) // If the chunk already loading / loaded -> skip if ( (m_ChunksToSend.find(Coords) != m_ChunksToSend.end()) || - (std::find(m_LoadedChunks.begin(), m_LoadedChunks.end(), Coords) != m_LoadedChunks.end()) + (m_LoadedChunks.find(Coords) != m_LoadedChunks.end()) ) { continue; @@ -494,7 +494,7 @@ bool cClientHandle::StreamNextChunk(void) // If the chunk already loading / loaded -> skip if ( (m_ChunksToSend.find(Coords) != m_ChunksToSend.end()) || - (std::find(m_LoadedChunks.begin(), m_LoadedChunks.end(), Coords) != m_LoadedChunks.end()) + (m_LoadedChunks.find(Coords) != m_LoadedChunks.end()) ) { continue; @@ -525,7 +525,7 @@ void cClientHandle::UnloadOutOfRangeChunks(void) cChunkCoordsList ChunksToRemove; { cCSLock Lock(m_CSChunkLists); - for (cChunkCoordsList::iterator itr = m_LoadedChunks.begin(); itr != m_LoadedChunks.end();) + for (auto itr = m_LoadedChunks.begin(); itr != m_LoadedChunks.end();) { int DiffX = Diff((*itr).m_ChunkX, ChunkPosX); int DiffZ = Diff((*itr).m_ChunkZ, ChunkPosZ); @@ -581,7 +581,7 @@ void cClientHandle::StreamChunk(int a_ChunkX, int a_ChunkZ, cChunkSender::eChunk { { cCSLock Lock(m_CSChunkLists); - m_LoadedChunks.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); + m_LoadedChunks.emplace(a_ChunkX, a_ChunkZ); m_ChunksToSend.emplace(a_ChunkX, a_ChunkZ); } World->SendChunkTo(a_ChunkX, a_ChunkZ, a_Priority, this); @@ -1821,15 +1821,15 @@ void cClientHandle::SendData(const char * a_Data, size_t a_Size) void cClientHandle::RemoveFromWorld(void) { // Remove all associated chunks: - cChunkCoordsList Chunks; + decltype(m_LoadedChunks) Chunks; { cCSLock Lock(m_CSChunkLists); std::swap(Chunks, m_LoadedChunks); m_ChunksToSend.clear(); } - for (cChunkCoordsList::iterator itr = Chunks.begin(), end = Chunks.end(); itr != end; ++itr) + for (auto && Chunk : Chunks) { - m_Protocol->SendUnloadChunk(itr->m_ChunkX, itr->m_ChunkZ); + m_Protocol->SendUnloadChunk(Chunk.m_ChunkX, Chunk.m_ChunkZ); } // for itr - Chunks[] // Here, we set last streamed values to bogus ones so everything is resent diff --git a/src/ClientHandle.h b/src/ClientHandle.h index b305648cb..32e894d41 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -383,7 +383,7 @@ private: Json::Value m_Properties; cCriticalSection m_CSChunkLists; - cChunkCoordsList m_LoadedChunks; // Chunks that the player belongs to + std::unordered_set<cChunkCoords, cChunkCoordsHash> m_LoadedChunks; // Chunks that the player belongs to std::unordered_set<cChunkCoords, cChunkCoordsHash> m_ChunksToSend; // Chunks that need to be sent to the player (queued because they weren't generated yet or there's not enough time to send them) cChunkCoordsList m_SentChunks; // Chunks that are currently sent to the client |