aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-04-24 00:12:56 +0200
committerShauren <shauren.trinity@gmail.com>2024-04-24 00:12:56 +0200
commitad6ef5237d0bd2d18e15462c9b55576ebb68fb22 (patch)
treee3b30ed2a39a249fd2ccf8bae984708c0e6131b7 /src
parent5f31d7cb88e77104c10f6dda1b082809471687a3 (diff)
Core/Movement: Fixed spline packed deltas validation check
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index e22c8c634b9..45ebc48ebe5 100644
--- a/src/server/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
@@ -265,12 +265,15 @@ bool MoveSplineInitArgs::Validate(Unit const* unit)
// check path lengths - why are we even starting such short movement?
bool MoveSplineInitArgs::_checkPathLengths()
{
- constexpr float MIN_OFFSET = 1.0f / 4.0f;
- constexpr float MAX_XY_OFFSET = (1 << 11) / 4.0f;
- constexpr float MAX_Z_OFFSET = (1 << 10) / 4.0f;
+ constexpr float MIN_XY_OFFSET = -(1 << 11) / 4.0f;
+ constexpr float MIN_Z_OFFSET = -(1 << 10) / 4.0f;
- auto isValidPackedXYOffset = [](float coord) -> bool { return coord < MAX_XY_OFFSET && (coord < 0.1f || coord >= MIN_OFFSET); };
- auto isValidPackedZOffset = [](float coord) -> bool { return coord < MAX_Z_OFFSET && (coord < 0.1f || coord >= MIN_OFFSET); };
+ // positive values have 1 less bit limit (if the highest bit was set, value would be sign extended into negative when decompressing)
+ constexpr float MAX_XY_OFFSET = (1 << 10) / 4.0f;
+ constexpr float MAX_Z_OFFSET = (1 << 9) / 4.0f;
+
+ auto isValidPackedXYOffset = [](float coord) -> bool { return coord > MIN_XY_OFFSET && coord < MAX_XY_OFFSET; };
+ auto isValidPackedZOffset = [](float coord) -> bool { return coord > MIN_Z_OFFSET && coord < MAX_Z_OFFSET; };
if (path.size() > 2)
{
@@ -285,9 +288,9 @@ bool MoveSplineInitArgs::_checkPathLengths()
// when compression is enabled, each point coord is packed into 11 bits (10 for Z)
if (!flags.UncompressedPath)
- if (!isValidPackedXYOffset(std::fabs(path[i].x - middle.x))
- || !isValidPackedXYOffset(std::fabs(path[i].y - middle.y))
- || !isValidPackedZOffset(std::fabs(path[i].z - middle.z)))
+ if (!isValidPackedXYOffset(middle.x - path[i].x)
+ || !isValidPackedXYOffset(middle.y - path[i].y)
+ || !isValidPackedZOffset(middle.z - path[i].z))
flags.UncompressedPath = true;
}
}