From d8b95d77556f8c12294e1b2328b3597430016a80 Mon Sep 17 00:00:00 2001 From: deathcap Date: Tue, 16 Feb 2016 00:31:00 -0800 Subject: [PATCH 1/2] Compress compressedNbt on write --- src/datatypes/minecraft.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/datatypes/minecraft.js b/src/datatypes/minecraft.js index 7e32898..569e5d2 100644 --- a/src/datatypes/minecraft.js +++ b/src/datatypes/minecraft.js @@ -73,14 +73,26 @@ function writeCompressedNbt(value, buffer, offset) { buffer.writeInt16BE(-1,offset); return offset+2; } - buffer.writeInt16BE(sizeOfNbt(value),offset); - return nbt.proto.write(value,buffer,offset+2,"nbt"); + const nbtBuffer = new Buffer(sizeOfNbt(value)); + nbt.proto.write(value,nbtBuffer,0,"nbt"); + + const compressedNbt = zlib.gzipSync(nbtBuffer); // TODO: async + + buffer.writeInt16BE(compressedNbt.length,offset); + compressedNbt.copy(buffer,offset+2); + return offset+2+compressedNbt.length; } function sizeOfCompressedNbt(value) { if(value==undefined) return 2; - return 2+nbt.proto.sizeOf(value,"nbt"); + + const nbtBuffer = new Buffer(sizeOfNbt(value,"nbt")); + nbt.proto.write(value,nbtBuffer,0,"nbt"); + + const compressedNbt = zlib.gzipSync(nbtBuffer); // TODO: async + + return 2+compressedNbt.length; } From 96c3ef3e341be50cc9bf4fba2b6aac02cd22566b Mon Sep 17 00:00:00 2001 From: deathcap Date: Tue, 16 Feb 2016 00:51:18 -0800 Subject: [PATCH 2/2] compressedNbt: clear OS field in gzip header to match MC http://tools.ietf.org/html/rfc1952 defines the gzip header, which has an "OS (Operating System)" byte; node.js zlib https://nodejs.org/api/zlib.html sets OS to 0x03 (Unix) but Minecraft leaves it cleared to 0x00. To match Minecraft behavior byte-for-byte (important for examples/proxy/proxy.js), make sure this byte is cleared when writing compressedNbt. --- src/datatypes/minecraft.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datatypes/minecraft.js b/src/datatypes/minecraft.js index 569e5d2..ed1439a 100644 --- a/src/datatypes/minecraft.js +++ b/src/datatypes/minecraft.js @@ -77,6 +77,7 @@ function writeCompressedNbt(value, buffer, offset) { nbt.proto.write(value,nbtBuffer,0,"nbt"); const compressedNbt = zlib.gzipSync(nbtBuffer); // TODO: async + compressedNbt.writeUInt8(0, 9); // clear the OS field to match MC buffer.writeInt16BE(compressedNbt.length,offset); compressedNbt.copy(buffer,offset+2);