mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2025-05-22 19:10:59 -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 = {
|
var types = {
|
||||||
'int': [readInt, writeInt, 4],
|
'int': [readInt, writeInt, 4],
|
||||||
'short': [readShort, writeShort, 2],
|
'short': [readShort, writeShort, 2],
|
||||||
|
@ -1308,6 +1319,13 @@ function createPacketBuffer(packetId, params, isServer) {
|
||||||
packet.forEach(function(fieldInfo) {
|
packet.forEach(function(fieldInfo) {
|
||||||
size += sizeOf(fieldInfo.type, params[fieldInfo.name]);
|
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 buffer = new Buffer(size);
|
||||||
var offset = writeUByte(packetId, buffer, 0);
|
var offset = writeUByte(packetId, buffer, 0);
|
||||||
packet.forEach(function(fieldInfo) {
|
packet.forEach(function(fieldInfo) {
|
||||||
|
@ -1320,6 +1338,21 @@ function createPacketBuffer(packetId, params, isServer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function parsePacket(buffer, 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;
|
if (buffer.length < 1) return null;
|
||||||
var packetId = buffer.readUInt8(0);
|
var packetId = buffer.readUInt8(0);
|
||||||
var size = 1;
|
var size = 1;
|
||||||
|
@ -1332,30 +1365,26 @@ function parsePacket(buffer, isServer) {
|
||||||
} else {
|
} else {
|
||||||
debug("read packetId " + packetId + " (0x" + packetId.toString(16) + ")");
|
debug("read packetId " + packetId + " (0x" + packetId.toString(16) + ")");
|
||||||
}
|
}
|
||||||
var i, fieldInfo, read, readResults;
|
var i, fieldInfo, readResults;
|
||||||
for (i = 0; i < packetInfo.length; ++i) {
|
for (i = 0; i < packetInfo.length; ++i) {
|
||||||
fieldInfo = packetInfo[i];
|
fieldInfo = packetInfo[i];
|
||||||
read = types[fieldInfo.type][0];
|
readResults = readPacketField(fieldInfo);
|
||||||
if (!read) {
|
if (!readResults || readResults.error) {
|
||||||
return {
|
return readResults;
|
||||||
error: new Error("missing reader for data type: " + fieldInfo.type)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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;
|
results[fieldInfo.name] = readResults.value;
|
||||||
size += readResults.size;
|
size += readResults.size;
|
||||||
}
|
}
|
||||||
if (packetId === 0x64 && results["inventoryType"] === 11) {
|
if (packet_optional_fields[packetId] && packet_optional_fields[packetId].condition(results)) {
|
||||||
read = types["int"][0];
|
for (i = 0; i < packet_optional_fields[packetId].fields.length; ++i) {
|
||||||
readResults = read(buffer, size);
|
fieldInfo = packet_optional_fields[packetId].fields[i];
|
||||||
if (! readResults) return null; // buffer needs to be more full
|
readResults = readPacketField(fieldInfo);
|
||||||
if (readResults.error) return { error: readResults.error };
|
if (!readResults || readResults.error) {
|
||||||
|
return readResults;
|
||||||
results["entityId"] = readResults.value;
|
}
|
||||||
size += readResults.size;
|
results[fieldInfo.name] = readResults.value;
|
||||||
|
size += readResults.size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
debug(results);
|
debug(results);
|
||||||
return {
|
return {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue