mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
Fix stringtable client table encoding
This commit is contained in:
parent
686f240c05
commit
a771702307
2 changed files with 21 additions and 17 deletions
|
|
@ -17,16 +17,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
|||
const tableName = messageStream.readASCIIString();
|
||||
const entryCount = messageStream.readUint16();
|
||||
for (let j = 0; j < entryCount; j++) {
|
||||
const entry: StringTableEntry = {
|
||||
text: messageStream.readUTF8String()
|
||||
};
|
||||
if (messageStream.readBoolean()) {
|
||||
const extraDataLength = messageStream.readUint16();
|
||||
if ((extraDataLength * 8) > messageStream.bitsLeft) {
|
||||
throw new Error(`to long extraData ${tableName}[${i}]`);
|
||||
}
|
||||
entry.extraData = messageStream.readBitStream(extraDataLength * 8);
|
||||
}
|
||||
const entry = readEntry(messageStream);
|
||||
entries.push(entry);
|
||||
}
|
||||
const table: StringTableObject = {
|
||||
|
|
@ -39,11 +30,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
|||
if (messageStream.readBoolean()) {
|
||||
const clientEntries = messageStream.readUint16();
|
||||
for (let j = 0; j < clientEntries; j++) {
|
||||
const entry: StringTableEntry = {text: messageStream.readUTF8String()};
|
||||
if (messageStream.readBoolean()) {
|
||||
const extraDataLength = messageStream.readBits(16);
|
||||
entry.extraData = messageStream.readBitStream(extraDataLength * 8);
|
||||
}
|
||||
const entry = readEntry(messageStream);
|
||||
(table.clientEntries as StringTableEntry[]).push(entry);
|
||||
}
|
||||
}
|
||||
|
|
@ -74,7 +61,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
|||
writeEntry(entry, stream);
|
||||
}
|
||||
|
||||
if (table.clientEntries) {
|
||||
if (table.clientEntries && table.clientEntries.length) {
|
||||
stream.writeBoolean(true);
|
||||
stream.writeUint16(table.clientEntries.length);
|
||||
for (const entry of table.clientEntries) {
|
||||
|
|
@ -98,6 +85,15 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
|||
}
|
||||
};
|
||||
|
||||
function readEntry(stream: BitStream): StringTableEntry {
|
||||
const entry: StringTableEntry = {text: stream.readUTF8String()};
|
||||
if (stream.readBoolean()) {
|
||||
const extraDataLength = stream.readUint16();
|
||||
entry.extraData = stream.readBitStream(extraDataLength * 8);
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
function writeEntry(entry: StringTableEntry, stream: BitStream) {
|
||||
stream.writeUTF8String(entry.text);
|
||||
if (entry.extraData) {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import {readFileSync} from 'fs';
|
|||
import {ParserState} from '../../../../Data/ParserState';
|
||||
import {StringTable, StringTableEntry} from '../../../../Data/StringTable';
|
||||
import {StringTableHandler} from '../../../../Parser/Message/StringTable';
|
||||
import {assertEncoder, assertParser, getStream} from '../Packet/PacketTest';
|
||||
import {assertEncoder, assertParser, assertReEncode, getStream} from '../Packet/PacketTest';
|
||||
|
||||
const encodeEntry = (entry: StringTableEntry) => {
|
||||
const result: any = {
|
||||
|
|
@ -87,4 +87,12 @@ suite('StringTable', () => {
|
|||
test('Encode StringTable message', () => {
|
||||
assertEncoder(parser, encoder, expectedRaw, 3690024);
|
||||
});
|
||||
|
||||
test('Re-encode StringTable message', () => {
|
||||
assertReEncode(
|
||||
(stream) => handler.parseMessage(stream, getParserState()),
|
||||
(message, stream) => handler.encodeMessage(message, stream, getParserState()),
|
||||
getStream(data)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue