mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2025-07-12 20:54:18 -04:00
simplify and fix entityMetadata parsing and serializing
This commit is contained in:
parent
5b44fdfdf8
commit
0aa52864df
3 changed files with 37 additions and 38 deletions
lib
|
@ -510,30 +510,33 @@ for (var n in entityMetadataTypes) {
|
|||
|
||||
function EntityMetadataWriter(value) {
|
||||
this.value = [];
|
||||
this.size = 1;
|
||||
value.forEach(function(item) {
|
||||
this.size += 1;
|
||||
var Writer = types[item.type][1];
|
||||
this.size = 1 + value.length;
|
||||
var item, Writer, writer, dataType;
|
||||
for (var i = 0; i < value.length; ++i) {
|
||||
item = value[i];
|
||||
dataType = types[item.type];
|
||||
assert.ok(dataType, "unknown data type " + dataType);
|
||||
Writer = dataType[1];
|
||||
assert.ok(Writer, "missing writer for data type " + item.type);
|
||||
var writer = new Writer(item.value);
|
||||
writer = new Writer(item.value);
|
||||
this.size += writer.size;
|
||||
this.value.push({
|
||||
writer: writer,
|
||||
key: item.key,
|
||||
type: entityMetadataTypeBytes[item.type],
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
EntityMetadataWriter.prototype.write = function(buffer, offset) {
|
||||
this.value.forEach(function(item) {
|
||||
var headerByte = (item.type << 5) & item.key;
|
||||
buffer.write(headerByte, offset);
|
||||
var headerByte = (item.type << 5) | item.key;
|
||||
buffer.writeUInt8(headerByte, offset);
|
||||
offset += 1;
|
||||
item.writer.write(buffer, offset);
|
||||
offset += item.writer.size;
|
||||
});
|
||||
buffer.writeUInt8(127, offset);
|
||||
buffer.writeUInt8(0x7f, offset);
|
||||
}
|
||||
|
||||
function ObjectDataWriter(value) {
|
||||
|
@ -708,26 +711,34 @@ function readIntVector(buffer, offset) {
|
|||
|
||||
function readEntityMetadata(buffer, offset) {
|
||||
var cursor = offset;
|
||||
var metadata = {};
|
||||
var item, key, type, results, reader;
|
||||
var metadata = [];
|
||||
var item, key, type, results, reader, typeName, dataType;
|
||||
while (true) {
|
||||
if (cursor + 1 > buffer.length) return null;
|
||||
item = buffer.readUInt8(cursor);
|
||||
cursor += 1;
|
||||
if (item === 0x7f) break;
|
||||
if (item === 0x7f) {
|
||||
return {
|
||||
value: metadata,
|
||||
size: cursor - offset,
|
||||
};
|
||||
}
|
||||
key = item & 0x1f;
|
||||
type = item >> 5;
|
||||
reader = types[entityMetadataTypes[type]][0];
|
||||
typeName = entityMetadataTypes[type];
|
||||
dataType = types[typeName];
|
||||
assert.ok(dataType, "unrecognized entity metadata type " + type);
|
||||
reader = dataType[0];
|
||||
assert.ok(reader, "missing reader for entity metadata type " + type);
|
||||
results = reader(buffer, cursor);
|
||||
if (! results) return null;
|
||||
metadata[key] = results.value;
|
||||
metadata.push({
|
||||
key: key,
|
||||
value: results.value,
|
||||
type: typeName,
|
||||
});
|
||||
cursor += results.size;
|
||||
}
|
||||
return {
|
||||
value: metadata,
|
||||
size: cursor - offset,
|
||||
};
|
||||
}
|
||||
|
||||
function readObjectData(buffer, offset) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue