From 4523996067126bbf43ad6d5082a2da1abb06fcd4 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 1 Jan 2013 07:01:14 -0500 Subject: [PATCH] more packets parsed --- lib/parser.js | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ packets.json | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) diff --git a/lib/parser.js b/lib/parser.js index 1001b75..f125594 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -79,8 +79,89 @@ var readers = { 'float': readFloat, 'slotArray': readSlotArray, 'mapChunkBulk': readMapChunkBulk, + 'entityMetadata': readEntityMetadata, + 'objectData': readObjectData, }; +var entityMetadataReaders = { + 0: readByte, + 1: readShort, + 2: readInt, + 3: readFloat, + 4: readString, + 5: readSlot, + 6: readVector, +}; + +function readVector(buffer, offset) { + if (offset + 12 > buffer.length) return null; + return { + value: { + x: buffer.readInt32BE(offset), + y: buffer.readInt32BE(offset + 4), + z: buffer.readInt32BE(offset + 8), + }, + size: 12, + }; +} + +function readEntityMetadata(buffer, offset) { + var cursor = offset; + var metadata = {}; + var item, key, type, results; + while (true) { + if (cursor + 1 > buffer.length) return null; + item = buffer.readUInt8(cursor); + cursor += 1; + if (item === 0x7f) break; + key = item & 0x1f; + type = item >> 5; + reader = entityMetadataReaders[type]; + assert.ok(reader, "missing reader for entity metadata type " + type); + results = reader(buffer, cursor); + if (! results) return null; + metadata[key] = results.value; + cursor += results.size; + } + return { + value: metadata, + size: cursor - offset, + }; +} + +function readObjectData(buffer, offset) { + var cursor = offset + 4; + if (cursor > buffer.length) return null; + var intField = buffer.readInt32BE(offset); + + if (intField === 0) { + return { + value: { + intField: intField, + }, + size: cursor - offset, + }; + } + + if (cursor + 6 > buffer.length) return null; + var velocityX = buffer.readInt16BE(cursor); + cursor += 2; + var velocityY = buffer.readInt16BE(cursor); + cursor += 2; + var velocityZ = buffer.readInt16BE(cursor); + cursor += 2; + + return { + value: { + intField: intField, + velocityX: velocityX, + velocityY: velocityY, + velocityZ: velocityZ, + }, + size: cursor - offset, + }; +} + function readMapChunkBulk (buffer, offset) { var cursor = offset + 7; if (cursor > buffer.length) return null; diff --git a/packets.json b/packets.json index a3403b9..35068c9 100644 --- a/packets.json +++ b/packets.json @@ -133,6 +133,90 @@ "type": "short" } ], + "23": [ + { + "name": "eid", + "type": "int" + }, + { + "name": "type", + "type": "byte" + }, + { + "name": "x", + "type": "int" + }, + { + "name": "y", + "type": "int" + }, + { + "name": "z", + "type": "int" + }, + { + "name": "yaw", + "type": "byte" + }, + { + "name": "pitch", + "type": "byte" + }, + { + "name": "objectData", + "type": "objectData" + } + ], + "24": [ + { + "name": "eid", + "type": "int" + }, + { + "name": "type", + "type": "byte" + }, + { + "name": "x", + "type": "int" + }, + { + "name": "y", + "type": "int" + }, + { + "name": "z", + "type": "int" + }, + { + "name": "yaw", + "type": "byte" + }, + { + "name": "pitch", + "type": "byte" + }, + { + "name": "headYaw", + "type": "byte" + }, + { + "name": "velocityX", + "type": "short" + }, + { + "name": "velocityY", + "type": "short" + }, + { + "name": "velocityZ", + "type": "short" + }, + { + "name": "metadata", + "type": "entityMetadata" + } + ], "56": [ { "name": "data",