From 0a1cfda02cb971ccafa6e7bab8a6386039aed126 Mon Sep 17 00:00:00 2001 From: stone3311 <9110659+stone3311@users.noreply.github.com> Date: Fri, 20 Mar 2020 09:31:06 +0100 Subject: Clamp teleportation position (#4203) --- src/Entities/Entity.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index f0118104b..87d385691 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -2239,8 +2239,16 @@ Vector3d cEntity::GetLookVector(void) const // Set position void cEntity::SetPosition(const Vector3d & a_Position) { + // Clamp the positions to exactly representable single-precision floating point values + // This is necessary to avoid rounding errors in the noise generator and overflows in the chunk loader + const double MaxFloat = std::pow(2, std::numeric_limits().digits); + + const double ClampedPosX = Clamp(a_Position.x, -MaxFloat, MaxFloat); + const double ClampedPosY = Clamp(a_Position.y, -MaxFloat, MaxFloat); + const double ClampedPosZ = Clamp(a_Position.z, -MaxFloat, MaxFloat); + m_LastPosition = m_Position; - m_Position = a_Position; + m_Position = {ClampedPosX, ClampedPosY, ClampedPosZ}; } -- cgit v1.2.3