summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2021-07-06 13:03:12 +0200
committerTiger Wang <ziwei.tiger@outlook.com>2021-07-06 22:33:03 +0200
commitfe82551f3211b169928b89b361cd5654f5e8dec2 (patch)
tree5af8be2bbc13afaa596c3d67e6b7566528cc300f
parentInvalidate m_LastStreamedChunk when player position doesn't match (diff)
downloadcuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.tar
cuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.tar.gz
cuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.tar.bz2
cuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.tar.lz
cuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.tar.xz
cuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.tar.zst
cuberite-fe82551f3211b169928b89b361cd5654f5e8dec2.zip
-rw-r--r--src/ClientHandle.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index 6c9fa751c..47bbe691a 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -72,10 +72,10 @@ cClientHandle::cClientHandle(const AString & a_IPString, int a_ViewDistance) :
m_RequestedViewDistance(a_ViewDistance),
m_IPString(a_IPString),
m_Player(nullptr),
- m_CachedSentChunk(0x7fffffff, 0x7fffffff),
+ m_CachedSentChunk(std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkX)>::max(), std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkZ)>::max()),
m_HasSentDC(false),
- m_LastStreamedChunkX(0x7fffffff), // bogus chunk coords to force streaming upon login
- m_LastStreamedChunkZ(0x7fffffff),
+ m_LastStreamedChunkX(std::numeric_limits<decltype(m_LastStreamedChunkX)>::max()), // bogus chunk coords to force streaming upon login
+ m_LastStreamedChunkZ(std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max()),
m_TicksSinceLastPacket(0),
m_Ping(1000),
m_PingID(1),
@@ -401,14 +401,13 @@ void cClientHandle::StreamNextChunks(void)
if ((m_LastStreamedChunkX == ChunkPosX) && (m_LastStreamedChunkZ == ChunkPosZ))
{
- // All chunks are already loaded. Abort loading.
+ // All chunks are already loaded and the player has not moved, work is done:
return;
}
- else
- {
- m_LastStreamedChunkX = 0x7fffffff;
- m_LastStreamedChunkZ = 0x7fffffff;
- }
+
+ // Player moved chunks and / or loading is not finished, reset to bogus (GH #4531):
+ m_LastStreamedChunkX = std::numeric_limits<decltype(m_LastStreamedChunkX)>::max();
+ m_LastStreamedChunkZ = std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max();
int StreamedChunks = 0;
Vector3d Position = m_Player->GetEyePosition();
@@ -1942,11 +1941,11 @@ void cClientHandle::RemoveFromWorld(void)
// No need to send Unload Chunk packets, the client unloads automatically.
// Here, we set last streamed values to bogus ones so everything is resent:
- m_LastStreamedChunkX = 0x7fffffff;
- m_LastStreamedChunkZ = 0x7fffffff;
+ m_LastStreamedChunkX = std::numeric_limits<decltype(m_LastStreamedChunkX)>::max();
+ m_LastStreamedChunkZ = std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max();
// Restart player unloaded chunk checking and freezing:
- m_CachedSentChunk = cChunkCoords(0x7fffffff, 0x7fffffff);
+ m_CachedSentChunk = cChunkCoords(std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkX)>::max(), std::numeric_limits<decltype(m_CachedSentChunk.m_ChunkZ)>::max());
}
@@ -3166,8 +3165,8 @@ void cClientHandle::SetViewDistance(int a_ViewDistance)
m_CurrentViewDistance = Clamp(a_ViewDistance, cClientHandle::MIN_VIEW_DISTANCE, world->GetMaxViewDistance());
// Restart chunk streaming to respond to new view distance:
- m_LastStreamedChunkX = 0x7fffffff;
- m_LastStreamedChunkZ = 0x7fffffff;
+ m_LastStreamedChunkX = std::numeric_limits<decltype(m_LastStreamedChunkX)>::max();
+ m_LastStreamedChunkZ = std::numeric_limits<decltype(m_LastStreamedChunkZ)>::max();
}
}