1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 00:54:14 +02:00

add encoder for datatable message

This commit is contained in:
Robin Appelman 2017-09-25 00:37:29 +02:00
commit b94a79ab6d
7 changed files with 161 additions and 5 deletions

View file

@ -6,6 +6,8 @@ import {BitStream} from 'bit-buffer';
export const DataTableHandler: MessageHandler<DataTablesMessage> = {
parseMessage: (stream: BitStream) => {
const s = stream.index;
const tick = stream.readInt32();
const length = stream.readInt32();
@ -21,6 +23,7 @@ export const DataTableHandler: MessageHandler<DataTablesMessage> = {
const tableName = messageStream.readASCIIString();
const numProps = messageStream.readBits(10);
const table = new SendTable(tableName);
table.needsDecoder = needsDecoder;
// get props metadata
let arrayElementProp;
@ -106,10 +109,20 @@ export const DataTableHandler: MessageHandler<DataTablesMessage> = {
serverClasses.push(new ServerClass(classId, className, dataTable));
}
const bitsLeft = (this.length * 8) - messageStream.index;
if (bitsLeft > 7 || bitsLeft < 0) {
throw new Error('unexpected remaining data in datatable (' + bitsLeft + ' bits)');
if (messageStream.bitsLeft > 7) {
throw new Error('unexpected remaining data in datatable (' + messageStream.bitsLeft + ' bits)');
}
//
// const e = stream.index;
// stream.index = s;
// const d = {
// type: MessageType.DataTables,
// tick,
// tables,
// serverClasses,
// };
// require('fs').writeFileSync('src/tests/data/dataTableResult.json.gz', require('zlib').gzipSync(JSON.stringify(d)));
// process.exit();
return {
type: MessageType.DataTables,
@ -120,6 +133,79 @@ export const DataTableHandler: MessageHandler<DataTablesMessage> = {
};
},
encodeMessage: (message, stream) => {
throw new Error('Not implemented');
stream.writeUint32(message.tick);
const lengthStart = stream.index;
stream.index += 32;
const dataStart = stream.index;
for (const table of message.tables) {
stream.writeBoolean(true);
stream.writeBoolean(table.needsDecoder);
stream.writeASCIIString(table.name);
const numPropsStart = stream.index;
stream.index += 10;
let numProps = 0;
for (const definition of table.props) {
if (definition.arrayProperty) {
encodeSendPropDefinition(stream, definition.arrayProperty);
numProps++;
}
encodeSendPropDefinition(stream, definition);
numProps++;
}
const propDataEnd = stream.index;
stream.index = numPropsStart;
stream.writeBits(numProps, 10);
stream.index = propDataEnd;
}
stream.writeBoolean(false);
stream.writeUint16(message.serverClasses.length);
for (const serverClass of message.serverClasses) {
stream.writeUint16(serverClass.id);
stream.writeASCIIString(serverClass.name);
stream.writeASCIIString(serverClass.dataTable);
}
const dataEnd = stream.index;
stream.index = lengthStart;
const byteLength = Math.ceil((dataEnd - dataStart) / 8);
stream.writeUint32(byteLength);
// align to byte;
stream.index = dataStart + byteLength * 8;
}
};
function encodeSendPropDefinition(stream: BitStream, definition: SendPropDefinition) {
stream.writeBits(definition.type, 5);
stream.writeASCIIString(definition.name);
stream.writeBits(definition.flags, 16);
if (definition.type === SendPropType.DPT_DataTable) {
if (!definition.table) {
throw new Error('Missing linked table');
}
stream.writeASCIIString(definition.table.name);
} else {
if (definition.isExcludeProp()) {
if (!definition.excludeDTName) {
throw new Error('Missing linked table');
}
stream.writeASCIIString(definition.excludeDTName);
} else if (definition.type === SendPropType.DPT_Array) {
stream.writeBits(definition.numElements, 10);
} else {
stream.writeFloat32(definition.lowValue);
stream.writeFloat32(definition.highValue);
stream.writeBits(definition.bitCount, 7);
}
}
}