mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2025-05-10 05:10:27 -04:00
improved 0x64 packet support, code refactorized using an optional_fields hash
This commit is contained in:
parent
c9a081fd6a
commit
767f64153b
1 changed files with 47 additions and 18 deletions
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue