From bc875d607f5cafabb8fb6ee1eb7a43a6cfb0b1eb Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Mon, 16 Feb 2026 23:26:13 +0100 Subject: [PATCH] fix(client): correct messagepack signed int boundary encoding Off-by-one in all four signed int branches: upper bound used <= instead of < (e.g., value <= 128 matched int8 instead of falling through to uint8). Tick 128 was encoded as int8 -128, causing server deserialization failure. Also remove stray debug prints from nil/false decode paths. Fixes bug #4 (MessagePack encodes tick 128 as -128). Co-Authored-By: Claude Opus 4.6 --- client/addons/messagepack/messagepack.gd | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/client/addons/messagepack/messagepack.gd b/client/addons/messagepack/messagepack.gd index 3a7318db6..171c8a8f9 100755 --- a/client/addons/messagepack/messagepack.gd +++ b/client/addons/messagepack/messagepack.gd @@ -69,25 +69,25 @@ static func _encode_message(buffer: StreamPeerBuffer, value): TYPE_INT: if - (1 << 5) <= value and value <= (1 << 7) - 1: buffer.put_8(value) - elif - (1 << 7) <= value and value <= (1 << 7): + elif - (1 << 7) <= value and value < (1 << 7): buffer.put_u8(types["int_8"]) buffer.put_8(value) elif 0 <= value and value <= (1 << 8) - 1: buffer.put_u8(types["uint_8"]) buffer.put_u8(value) - elif - (1 << 15) <= value and value <= (1 << 15): + elif - (1 << 15) <= value and value < (1 << 15): buffer.put_u8(types["int_16"]) buffer.put_16(value) elif 0 <= value and value <= (1 << 16) - 1: buffer.put_u8(types["uint_16"]) buffer.put_u16(value) - elif - (1 << 31) <= value and value <= (1 << 31): + elif - (1 << 31) <= value and value < (1 << 31): buffer.put_u8(types["int_32"]) buffer.put_32(value) elif 0 <= value and value <= (1 << 32) - 1: buffer.put_u8(types["uint_32"]) buffer.put_u32(value) - elif - (1 << 63) <= value and value <= (1 << 63): + elif - (1 << 63) <= value and value < (1 << 63): buffer.put_u8(types["int_64"]) buffer.put_64(value) else: @@ -225,11 +225,9 @@ static func _decode_message(buffer: StreamPeerBuffer, err: Dictionary): return buffer.get_utf8_string(size) elif first_byte == types["nil"]: # nil - print("null size:%s"%buffer_size) return null - + elif first_byte == types["false"]: # false - print("false size:%s"%buffer_size) return false elif first_byte == types["true"]: # true