all clent to server packets have supported data type writers

This commit is contained in:
Andrew Kelley 2013-01-01 20:58:47 -05:00
parent 0d3d9d63a3
commit 1979ef3848

View File

@ -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;