improved 0x64 packet support, code refactorized using an optional_fields hash

This commit is contained in:
Xabier de Zuazo 2013-07-08 10:07:07 +02:00
parent c9a081fd6a
commit 767f64153b

View file

@ -493,6 +493,17 @@ var packets = {
]
};
packet_optional_fields = {
0x64: {
condition: function(field_values) {
return field_values["inventoryType"] === 11;
},
fields: [
{ name: "entityId", type: "int" }
]
}
};
var types = {
'int': [readInt, writeInt, 4],
'short': [readShort, writeShort, 2],
@ -1308,6 +1319,13 @@ function createPacketBuffer(packetId, params, isServer) {
packet.forEach(function(fieldInfo) {
size += sizeOf(fieldInfo.type, params[fieldInfo.name]);
});
var optionalFields, i;
if (packet_optional_fields[packetId] && packet_optional_fields[packetId].condition && packet_optional_fields[packetId].condition(params)) {
optionalFields = packet_optional_fields[packetId].fields;
for (i = 0; i < optionalFields.length; ++i) {
size += sizeOf(optionalFields[i].type, params[optionalFields[i].name]);
}
}
var buffer = new Buffer(size);
var offset = writeUByte(packetId, buffer, 0);
packet.forEach(function(fieldInfo) {
@ -1320,6 +1338,21 @@ function createPacketBuffer(packetId, params, isServer) {
}
function parsePacket(buffer, isServer) {
function readPacketField(fieldInfo) {
var read = types[fieldInfo.type][0];
if (!read) {
return {
error: new Error("missing reader for data type: " + fieldInfo.type)
}
}
var readResults = read(buffer, size);
if (! readResults) return null; // buffer needs to be more full
if (readResults.error) return { error: readResults.error };
return readResults;
}
if (buffer.length < 1) return null;
var packetId = buffer.readUInt8(0);
var size = 1;
@ -1332,30 +1365,26 @@ function parsePacket(buffer, isServer) {
} else {
debug("read packetId " + packetId + " (0x" + packetId.toString(16) + ")");
}
var i, fieldInfo, read, readResults;
var i, fieldInfo, readResults;
for (i = 0; i < packetInfo.length; ++i) {
fieldInfo = packetInfo[i];
read = types[fieldInfo.type][0];
if (!read) {
return {
error: new Error("missing reader for data type: " + fieldInfo.type)
}
readResults = readPacketField(fieldInfo);
if (!readResults || readResults.error) {
return readResults;
}
readResults = read(buffer, size);
if (! readResults) return null; // buffer needs to be more full
if (readResults.error) return { error: readResults.error };
results[fieldInfo.name] = readResults.value;
size += readResults.size;
}
if (packetId === 0x64 && results["inventoryType"] === 11) {
read = types["int"][0];
readResults = read(buffer, size);
if (! readResults) return null; // buffer needs to be more full
if (readResults.error) return { error: readResults.error };
results["entityId"] = readResults.value;
size += readResults.size;
if (packet_optional_fields[packetId] && packet_optional_fields[packetId].condition(results)) {
for (i = 0; i < packet_optional_fields[packetId].fields.length; ++i) {
fieldInfo = packet_optional_fields[packetId].fields[i];
readResults = readPacketField(fieldInfo);
if (!readResults || readResults.error) {
return readResults;
}
results[fieldInfo.name] = readResults.value;
size += readResults.size;
}
}
debug(results);
return {