From fe443e84ff5333f69c3b3dad90ac0d0cfc9a988d Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Wed, 13 May 2015 04:06:14 +0200 Subject: [PATCH] move entity metadata type to minecraft.js --- src/datatypes/minecraft.js | 94 +++++++++++++++++++++++++++++++++++++- src/protocol.js | 93 +------------------------------------ 2 files changed, 94 insertions(+), 93 deletions(-) diff --git a/src/datatypes/minecraft.js b/src/datatypes/minecraft.js index 6215450..8a56c20 100644 --- a/src/datatypes/minecraft.js +++ b/src/datatypes/minecraft.js @@ -7,7 +7,8 @@ module.exports = { 'position': [readPosition, writePosition, 8], 'slot': [readSlot, writeSlot, sizeOfSlot], 'nbt': [readNbt, utils.buffer[1], utils.buffer[2]], - 'restBuffer': [readRestBuffer, utils.buffer[1], utils.buffer[2]] + 'restBuffer': [readRestBuffer, utils.buffer[1], utils.buffer[2]], + 'entityMetadata': [readEntityMetadata, writeEntityMetadata, sizeOfEntityMetadata] }; function readUUID(buffer, offset) { @@ -144,3 +145,94 @@ function readRestBuffer(buffer, offset, typeArgs, rootNode) { size: buffer.length - offset }; } + + +var entityMetadataTypes = { + 0: { type: 'byte' }, + 1: { type: 'short' }, + 2: { type: 'int' }, + 3: { type: 'float' }, + 4: { type: 'string' }, + 5: { type: 'slot' }, + 6: { type: 'container', typeArgs: { fields: [ + { name: 'x', type: 'int' }, + { name: 'y', type: 'int' }, + { name: 'z', type: 'int' } + ]}}, + 7: { type: 'container', typeArgs: { fields: [ + { name: 'pitch', type: 'float' }, + { name: 'yaw', type: 'float' }, + { name: 'roll', type: 'float' } + ]}} +}; + +// maps string type name to number +var entityMetadataTypeBytes = {}; +for (var n in entityMetadataTypes) { + if (!entityMetadataTypes.hasOwnProperty(n)) continue; + + entityMetadataTypeBytes[entityMetadataTypes[n].type] = n; +} + + +function readEntityMetadata(buffer, offset) { + var cursor = offset; + var metadata = []; + var item, key, type, results, reader, typeName, dataType; + while (true) { + if (cursor + 1 > buffer.length) return null; + item = buffer.readUInt8(cursor); + cursor += 1; + if (item === 0x7f) { + return { + value: metadata, + size: cursor - offset, + }; + } + key = item & 0x1f; + type = item >> 5; + dataType = entityMetadataTypes[type]; + typeName = dataType.type; + //debug("Reading entity metadata type " + dataType + " (" + ( typeName || "unknown" ) + ")"); + if (!dataType) { + return { + error: new Error("unrecognized entity metadata type " + type) + } + } + results = this.read(buffer, cursor, dataType, {}); + if (! results) return null; + metadata.push({ + key: key, + value: results.value, + type: typeName, + }); + cursor += results.size; + } +} + + + +function writeEntityMetadata(value, buffer, offset) { + var self=this; + value.forEach(function(item) { + var type = entityMetadataTypeBytes[item.type]; + var headerByte = (type << 5) | item.key; + buffer.writeUInt8(headerByte, offset); + offset += 1; + offset = self.write(item.value, buffer, offset, entityMetadataTypes[type], {}); + }); + buffer.writeUInt8(0x7f, offset); + return offset + 1; +} + + + +function sizeOfEntityMetadata(value) { + var size = 1 + value.length; + var item; + for (var i = 0; i < value.length; ++i) { + item = value[i]; + size += this.sizeOf(item.value, entityMetadataTypes[entityMetadataTypeBytes[item.type]], {}); + } + return size; +} diff --git a/src/protocol.js b/src/protocol.js index 652147d..05d05f1 100644 --- a/src/protocol.js +++ b/src/protocol.js @@ -80,7 +80,7 @@ var types = { 'position': minecraft.position, 'slot': minecraft.slot, 'nbt': minecraft.nbt, - 'entityMetadata': [readEntityMetadata, writeEntityMetadata, sizeOfEntityMetadata] + 'entityMetadata': minecraft.entityMetadata }; @@ -98,97 +98,6 @@ if (process.env.NODE_DEBUG && /(minecraft-protocol|mc-proto)/.test(process.env.N debug = function() { }; } -var entityMetadataTypes = { - 0: { type: 'byte' }, - 1: { type: 'short' }, - 2: { type: 'int' }, - 3: { type: 'float' }, - 4: { type: 'string' }, - 5: { type: 'slot' }, - 6: { type: 'container', typeArgs: { fields: [ - { name: 'x', type: 'int' }, - { name: 'y', type: 'int' }, - { name: 'z', type: 'int' } - ]}}, - 7: { type: 'container', typeArgs: { fields: [ - { name: 'pitch', type: 'float' }, - { name: 'yaw', type: 'float' }, - { name: 'roll', type: 'float' } - ]}} -}; - -// maps string type name to number -var entityMetadataTypeBytes = {}; -for (var n in entityMetadataTypes) { - if (!entityMetadataTypes.hasOwnProperty(n)) continue; - - entityMetadataTypeBytes[entityMetadataTypes[n].type] = n; -} - - -function readEntityMetadata(buffer, offset) { - var cursor = offset; - var metadata = []; - var item, key, type, results, reader, typeName, dataType; - while (true) { - if (cursor + 1 > buffer.length) return null; - item = buffer.readUInt8(cursor); - cursor += 1; - if (item === 0x7f) { - return { - value: metadata, - size: cursor - offset, - }; - } - key = item & 0x1f; - type = item >> 5; - dataType = entityMetadataTypes[type]; - typeName = dataType.type; - //debug("Reading entity metadata type " + dataType + " (" + ( typeName || "unknown" ) + ")"); - if (!dataType) { - return { - error: new Error("unrecognized entity metadata type " + type) - } - } - results = proto.read(buffer, cursor, dataType, {}); - if (! results) return null; - metadata.push({ - key: key, - value: results.value, - type: typeName, - }); - cursor += results.size; - } -} - - - -function writeEntityMetadata(value, buffer, offset) { - value.forEach(function(item) { - var type = entityMetadataTypeBytes[item.type]; - var headerByte = (type << 5) | item.key; - buffer.writeUInt8(headerByte, offset); - offset += 1; - offset = proto.write(item.value, buffer, offset, entityMetadataTypes[type], {}); - }); - buffer.writeUInt8(0x7f, offset); - return offset + 1; -} - - - -function sizeOfEntityMetadata(value) { - var size = 1 + value.length; - var item; - for (var i = 0; i < value.length; ++i) { - item = value[i]; - size += proto.sizeOf(item.value, entityMetadataTypes[entityMetadataTypeBytes[item.type]], {}); - } - return size; -} - - - function NMProtocols() {