summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2015-10-05 18:08:45 +0200
committerMattes D <github@xoft.cz>2015-10-05 18:08:45 +0200
commitbe27992a07d2f846881e8e72ea5c1cf9c4a46be8 (patch)
tree9399904ac2fa3df4b13162a39753d43e8a11bf63
parentMerge pull request #2522 from cuberite/FixLoaderGenRaceCondition (diff)
parentImproved the data structure for storing loaded chunks (diff)
downloadcuberite-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.cpp14
-rw-r--r--src/ClientHandle.h2
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