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:
parent
00a3b82d4a
commit
b94a79ab6d
7 changed files with 161 additions and 5 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue