From 1a22263c03142869d6923ed13b6233c2bd30e77c Mon Sep 17 00:00:00 2001 From: deathcap Date: Sun, 14 Feb 2016 22:21:29 -0800 Subject: [PATCH] Add optionalLengthPrefixedNbt data type, used in MC 1.7 --- src/datatypes/minecraft.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/datatypes/minecraft.js b/src/datatypes/minecraft.js index 6add0d2..6c2236e 100644 --- a/src/datatypes/minecraft.js +++ b/src/datatypes/minecraft.js @@ -5,6 +5,7 @@ module.exports = { 'UUID': [readUUID, writeUUID, 16], 'nbt': [readNbt, writeNbt, sizeOfNbt], 'optionalNbt':[readOptionalNbt,writeOptionalNbt,sizeOfOptionalNbt], + 'optionalLengthPrefixedNbt':[readOptionalLengthPrefixedNbt,writeOptionalLengthPrefixedNbt,sizeOfOptionalLengthPrefixedNbt], 'restBuffer': [readRestBuffer, writeRestBuffer, sizeOfRestBuffer], 'entityMetadataLoop': [readEntityMetadata, writeEntityMetadata, sizeOfEntityMetadata] }; @@ -54,6 +55,29 @@ function sizeOfOptionalNbt(value) { return nbt.proto.sizeOf(value,"nbt"); } +// Length-prefixed optional NBT, short instead of null byte: http://wiki.vg/index.php?title=Slot_Data&diff=6056&oldid=4753 +function readOptionalLengthPrefixedNbt(buffer, offset) { + if(buffer.readInt16BE(offset) == -1) return {size:2}; + return nbt.proto.read(buffer,offset,"nbt"); +} + +function writeOptionalLengthPrefixedNbt(value, buffer, offset) { + if(value==undefined) { + buffer.writeInt16BE(-1,offset); + return offset+2; + } + buffer.writeInt16(sizeOfNbt(value),offset); + return nbt.proto.write(value,buffer,offset+2,"nbt"); +} + +function sizeOfOptionalLengthPrefixedNbt(value) { + if(value==undefined) + return 2; + return 2+nbt.proto.sizeOf(value,"nbt"); +} + + + function readRestBuffer(buffer, offset) { return { value: buffer.slice(offset),