From a6387f279ed50585750a280beddbefc96ff58339 Mon Sep 17 00:00:00 2001 From: Keegan Date: Sun, 6 Mar 2016 11:59:26 -0500 Subject: [PATCH] metadata! --- data/protocol.json | 87 ++++++++++++++++++++++++++++++++++++++++++++++ src/datatypes.js | 40 ++++++++++++++++++++- 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/data/protocol.json b/data/protocol.json index bce8fb7..93a3918 100644 --- a/data/protocol.json +++ b/data/protocol.json @@ -6,6 +6,93 @@ "countType":"short" } ], + "entityMetadataItem": [ + "switch", + { + "compareTo": "$compareTo", + "fields": { + "0": "i8", + "1": "i16", + "2": "i32", + "3": "f32", + "4": "string", + "5": "slot", + "6": [ + "container", + [ + { + "name": "x", + "type": "i32" + }, + { + "name": "y", + "type": "i32" + }, + { + "name": "z", + "type": "i32" + } + ] + ], + "7": [ + "container", + [ + { + "name": "pitch", + "type": "f32" + }, + { + "name": "yaw", + "type": "f32" + }, + { + "name": "roll", + "type": "f32" + } + ] + ], + "8": "i64" + } + } + ], + "entityMetadata": [ + "entityMetadataLoop", + { + "endVal": 127, + "type": [ + "container", + [ + { + "anon": true, + "type": [ + "bitfield", + [ + { + "name": "type", + "size": 3, + "signed": false + }, + { + "name": "key", + "size": 5, + "signed": false + } + ] + ] + }, + { + "name": "value", + "type": [ + "entityMetadataItem", + { + "compareTo": "type" + } + ] + } + ] + ] + } + ], "slot": [ "container", [ diff --git a/src/datatypes.js b/src/datatypes.js index 39f7b1f..3ad48d3 100644 --- a/src/datatypes.js +++ b/src/datatypes.js @@ -27,7 +27,45 @@ function sizeOfNbt(value) { return nbt.proto.sizeOf(value,"nbt"); } +function readEntityMetadata(buffer, offset, {type,endVal}) { + let cursor = offset; + const metadata = []; + let item; + while(true) { + if(offset+1>buffer.length) + throw new PartialReadError(); + item = buffer.readUInt8(cursor); + if(item === endVal) { + return { + value: metadata, + size: cursor + 1 - offset + }; + } + const results = this.read(buffer, cursor, type, {}); + metadata.push(results.value); + cursor += results.size; + } +} + +function writeEntityMetadata(value, buffer, offset, {type,endVal}) { + const self = this; + value.forEach(function(item) { + offset = self.write(item, buffer, offset, type, {}); + }); + buffer.writeUInt8(endVal, offset); + return offset + 1; +} + +function sizeOfEntityMetadata(value, {type}) { + let size = 1; + for(let i = 0; i < value.length; ++i) { + size += this.sizeOf(value[i], type, {}); + } + return size; +} + module.exports = { 'uuid': [readUUID, writeUUID, 16], - 'nbt': [readNbt, writeNbt, sizeOfNbt] + 'nbt': [readNbt, writeNbt, sizeOfNbt], + 'entityMetadataLoop': [readEntityMetadata, writeEntityMetadata, sizeOfEntityMetadata] };