diff --git a/lib/parser.js b/lib/parser.js index 35effbf..0845d2f 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -61,10 +61,15 @@ Parser.prototype.writePacket = function(packetId, params) { var writers = { 'int': IntWriter, + 'short': ShortWriter, 'byte': ByteWriter, 'ubyte': UByteWriter, 'string': StringWriter, 'byteArray': ByteArrayWriter, + 'bool': BoolWriter, + 'double': DoubleWriter, + 'float': FloatWriter, + 'slot': SlotWriter, }; var readers = { @@ -98,8 +103,8 @@ function readIntArray(buffer, offset) { var count = results.value; var cursor = offset + results.size; - var endCursor = cursor + 4 * count; - if (endCursor > buffer.length) return null; + var cursorEnd = cursor + 4 * count; + if (cursorEnd > buffer.length) return null; var array = []; for (var i = 0; i < count; ++i) { array.push(buffer.readInt32BE(cursor)); @@ -108,7 +113,7 @@ function readIntArray(buffer, offset) { return { value: array, - size: endCursor - offset, + size: cursorEnd - offset, }; } @@ -233,8 +238,8 @@ function readMapChunkBulk (buffer, offset) { var dataSize = buffer.readInt32BE(offset + 2); var skyLightSent = !!buffer.readInt8(offset + 6); - var endCursor = cursor + dataSize + 12 * chunkCount; - if (endCursor > buffer.length) return null; + var cursorEnd = cursor + dataSize + 12 * chunkCount; + if (cursorEnd > buffer.length) return null; var compressedChunkDataEnd = cursor + dataSize; var compressedChunkData = buffer.slice(cursor, compressedChunkDataEnd); @@ -266,7 +271,7 @@ function readMapChunkBulk (buffer, offset) { compressedChunkData: compressedChunkData, meta: meta, }, - size: endCursor - offset, + size: cursorEnd - offset, }; } @@ -448,28 +453,18 @@ function readSlot(buffer, offset) { }; } - results = readByte(buffer, cursor); - if (! results) return null; - var itemCount = results.value; - cursor += results.size; - - results = readShort(buffer, cursor); - if (! results) return null; - var itemDamage = results.value; - cursor += results.size; - - results = readShort(buffer, cursor); - if (! results) return null; - var nbtDataSize = results.value; - cursor += results.size; - + var cursorEnd = cursor + 5; + if (cursorEnd > buffer.length) return null; + var itemCount = buffer.readInt8(cursor); + var itemDamage = buffer.readInt16BE(cursor + 1); + var nbtDataSize = buffer.readInt16BE(cursor + 3); if (nbtDataSize === -1) nbtDataSize = 0; - var nbtDataEnd = cursor + nbtDataSize; - var nbtData = buffer.slice(cursor, nbtDataEnd); + var nbtDataEnd = cursorEnd + nbtDataSize; + var nbtData = buffer.slice(cursorEnd, nbtDataEnd); return { value: { - blockId: blockId, + id: blockId, itemCount: itemCount, itemDamage: itemDamage, nbtData: nbtData, @@ -478,6 +473,22 @@ function readSlot(buffer, offset) { }; } +function SlotWriter(value) { + this.value = value; + this.size = value.id === -1 ? 2 : 7 + this.value.nbtData.length; +} + +SlotWriter.prototype.write = function(buffer, offset) { + buffer.writeInt16BE(this.value.id, offset); + if (this.value.id === -1) return; + buffer.writeInt8(this.value.itemCount, offset + 2); + buffer.writeInt16BE(this.value.itemDamage, offset + 3); + var nbtDataSize = this.value.nbtData.length; + if (nbtDataSize === 0) nbtDataSize = -1; // I don't know wtf mojang smokes + buffer.writeInt16BE(nbtDataSize, offset + 5); + this.value.nbtData.copy(buffer, offset + 7); +}; + function StringWriter(value) { this.value = value; this.encoded = toUcs2.convert(value); @@ -509,6 +520,15 @@ ByteWriter.prototype.write = function(buffer, offset) { buffer.writeInt8(this.value, offset); } +function BoolWriter(value) { + this.value = value; + this.size = 1; +} + +BoolWriter.prototype.write = function(buffer, offset) { + buffer.writeInt8(this.value ? 1 : 0, offset); +} + function UByteWriter(value) { this.value = value; this.size = 1; @@ -518,6 +538,33 @@ UByteWriter.prototype.write = function(buffer, offset) { buffer.writeUInt8(this.value, offset); }; +function FloatWriter(value) { + this.value = value; + this.size = 4; +} + +FloatWriter.prototype.write = function(buffer, offset) { + buffer.writeFloatBE(this.value, offset); +} + +function DoubleWriter(value) { + this.value = value; + this.size = 8; +} + +DoubleWriter.prototype.write = function(buffer, offset) { + buffer.writeDoubleBE(this.value, offset); +} + +function ShortWriter(value) { + this.value = value; + this.size = 2; +} + +ShortWriter.prototype.write = function(buffer, offset) { + buffer.writeInt16BE(this.value, offset); +} + function IntWriter(value) { this.value = value; this.size = 4;