From 17e78c11f6149b495f5eb49bde0244644fb5f15b Mon Sep 17 00:00:00 2001 From: Will Franzen Date: Wed, 31 Dec 2014 12:17:02 -0600 Subject: [PATCH] Implement @roblabla's changes --- lib/protocol.js | 93 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/lib/protocol.js b/lib/protocol.js index 1c68f6f..c9c0538 100644 --- a/lib/protocol.js +++ b/lib/protocol.js @@ -321,19 +321,16 @@ var packets = { { name: "location", type: "position" }, { name: "destroyStage", type: "byte" } ]}, - map_chunk_bulk: {id: 0x26, fields: [ /* TODO: This is probably wrong */ + map_chunk_bulk: {id: 0x26, fields: [ { name: "skyLightSent", type: "bool" }, { name: "chunkColumnCount", type: "count", typeArgs: { type: "varint", countFor: "meta" } }, - { name: "dataLength", type: "count", typeArgs: { type: "int", countFor: "chunkData" } }, - { name: "chunkData", type: "buffer", typeArgs: { count: "dataLength" } }, - { name: "meta", type: "array", typeArgs: { count: "chunkColumnCount", - type: "container", typeArgs: { fields: [ + { name: "meta", type: "array", typeArgs: { count: "chunkColumnCount", type: "container", typeArgs: { fields: [ { name: "x", type: "int" }, { name: "z", type: "int" }, { name: "bitMap", type: "ushort" }, - { name: "addBitMap", type: "ushort" } - ] } } } - ]}, + ]}}}, + { name: "data", type: "restBuffer" } + ]} explosion: {id: 0x27, fields: [ { name: "x", type: "float" }, { name: "y", type: "float" }, @@ -428,10 +425,31 @@ var packets = { { name: "text3", type: "string" }, { name: "text4", type: "string" } ]}, - map: {id: 0x34, fields: [ /* TODO: No clue how to do this */ + map: {id: 0x34, fields: [ { name: "itemDamage", type: "varint" }, - { name: "dataLength", type: "count", typeArgs: { type: "short", countFor: "data" } }, - { name: "data", type: "buffer", typeArgs: { count: "dataLength" } }, + { name: "scale", type: "byte" }, + { name: "iconLength", type: "count", typeArgs: { type: "varint", countFor: "icons" } }, + { name: "icons", type: "array", typeArgs: { count: "iconLength", type: "container", typeArgs: { fields: [ + { name: "directionAndType", type: "byte" }, // Yeah... that will do + { name: "x", type: "byte" }, + { name: "y", type: "byte" } + ]}}}, + { name: "columns", type: "byte" }, + { name: "rows", type: "byte", condition: function(field_values) { + return field_values["columns"] !== 0; + }}, + { name: "x", type: "byte", condition: function(field_values) { + return field_values["columns"] !== 0; + }}, + { name: "y", type: "byte", condition: function(field_values) { + return field_values["columns"] !== 0; + }}, + { name: "dataLength", type: "count", typeArgs: { countFor: "data", type: "varint" }, condition: function(field_values) { + return field_values["columns"] !== 0; + }}, + { name: "data", type: "buffer", typeArgs: { count: "dataLength" }, condition: function(field_values) { + return field_values["columns"] !== 0; + }}, ]}, tile_entity_data:{id: 0x35, fields: [ { name: "location", type: "position" }, @@ -451,10 +469,40 @@ var packets = { ]} }} ]}, - player_info: {id: 0x38, fields: [ /* TODO: Again, no clue */ - { name: "playerName", type: "string" }, - { name: "online", type: "bool" }, - { name: "ping", type: "short" } + player_info: {id: 0x38, fields: [ + { name: "action", type: "varint" }, + { name: "length", type: "count", typeArgs: { type: "varint", countFor: "data" }}, + { name: "data", type: "array", typeArgs: { count: "length", type: "container", typeArgs: { fields: [ + { name: "UUID", type: "uuid" }, + { name: "name", type: "string", condition: function(field_values) { + return field_values["action"] === 0; + }}, + { name: "propertiesLength", type: "count", condition: function(field_values) { + return field_values["action"] === 0; + }, typeArgs: { countFor: "properties", type: "varint" }}, + { name: "properties", type: "array", condition: function(field_values) { + return field_values["action"] === 0; + }, typeArgs: { count: propertiesLength, type: "container", typeArgs: { fields: [ + { name: "name", type: "string" } + { name: "value", type: "string" }, + { name: "isSigned", type: "bool" }, + { name: "signature", type: "string", condition: function(field_values) { + return field_values["isSigned"]; + }} + ]}}, + { name: "gamemode", type: "varint", condition: function(field_values) { + return field_values["action"] === 0 || field_values["action"] === 1; + }}, + { name: "ping", type: "varint", condition: function(field_values) { + return field_values["action"] === 0 || field_values["action"] === 2; + }}, + { name: "hasDisplayName", type: "bool", condition: function(field_values) { + return field_values["action"] === 0 || field_values["action"] === 3; + }}, + { name: "displayName", type: "string", condition: function(field_values) { + return field_values["hasDisplayName"]; // Returns false if there is no value "hasDisplayName" + }} + ]}}} ]}, abilities: {id: 0x39, fields: [ { name: "flags", type: "byte" }, @@ -573,7 +621,7 @@ var packets = { return field_values['action'] == 0 || field_values['action'] == 1; } }, { name: "fadeIn", type: "int", condition: function(field_values) { - return field_values['action'] == 0 || field_values['action'] == 1; + return field_values['action'] == 2; } }, { name: "stay", type: "int", condition: function(field_values) { return field_values['action'] == 2; @@ -595,7 +643,7 @@ var packets = { ]}, update_entity_nbt: { id: 0x49, fields: [ { name: "entityId", type: "varint" }, - { name: "tag", type: "string"} /* TODO: Should be of type "NBT Tag" */ + { name: "tag", type: "restBuffer"} ]} }, toServer: { @@ -786,6 +834,7 @@ var types = { 'container': [readContainer, writeContainer, sizeOfContainer], 'array': [readArray, writeArray, sizeOfArray], 'buffer': [readBuffer, writeBuffer, sizeOfBuffer], + 'restBuffer': [readRestBuffer, writeRestBuffer, sizeOfRestBuffer], 'count': [readCount, writeCount, sizeOfCount], // TODO : remove type-specific, replace with generic containers and arrays. 'slot': [readSlot, writeSlot, sizeOfSlot], @@ -1213,6 +1262,16 @@ function sizeOfBuffer(value) { return value.length; } +function readRestBuffer(buffer, offset, typeArgs, rootNode) { + return { + value: buffer.slice(offset), + size: buffer.length - offset + }; +} + +var writeRestBuffer = writeBuffer; +var sizeOfRestBuffer = sizeOfBuffer; + function readArray(buffer, offset, typeArgs, rootNode) { var results = { value: [],