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

Fix stringtable client table encoding

This commit is contained in:
Robin Appelman 2017-11-24 22:16:47 +01:00
commit a771702307
2 changed files with 21 additions and 17 deletions

View file

@ -17,16 +17,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
const tableName = messageStream.readASCIIString(); const tableName = messageStream.readASCIIString();
const entryCount = messageStream.readUint16(); const entryCount = messageStream.readUint16();
for (let j = 0; j < entryCount; j++) { for (let j = 0; j < entryCount; j++) {
const entry: StringTableEntry = { const entry = readEntry(messageStream);
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);
}
entries.push(entry); entries.push(entry);
} }
const table: StringTableObject = { const table: StringTableObject = {
@ -39,11 +30,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
if (messageStream.readBoolean()) { if (messageStream.readBoolean()) {
const clientEntries = messageStream.readUint16(); const clientEntries = messageStream.readUint16();
for (let j = 0; j < clientEntries; j++) { for (let j = 0; j < clientEntries; j++) {
const entry: StringTableEntry = {text: messageStream.readUTF8String()}; const entry = readEntry(messageStream);
if (messageStream.readBoolean()) {
const extraDataLength = messageStream.readBits(16);
entry.extraData = messageStream.readBitStream(extraDataLength * 8);
}
(table.clientEntries as StringTableEntry[]).push(entry); (table.clientEntries as StringTableEntry[]).push(entry);
} }
} }
@ -74,7 +61,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
writeEntry(entry, stream); writeEntry(entry, stream);
} }
if (table.clientEntries) { if (table.clientEntries && table.clientEntries.length) {
stream.writeBoolean(true); stream.writeBoolean(true);
stream.writeUint16(table.clientEntries.length); stream.writeUint16(table.clientEntries.length);
for (const entry of table.clientEntries) { 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) { function writeEntry(entry: StringTableEntry, stream: BitStream) {
stream.writeUTF8String(entry.text); stream.writeUTF8String(entry.text);
if (entry.extraData) { if (entry.extraData) {

View file

@ -3,7 +3,7 @@ import {readFileSync} from 'fs';
import {ParserState} from '../../../../Data/ParserState'; import {ParserState} from '../../../../Data/ParserState';
import {StringTable, StringTableEntry} from '../../../../Data/StringTable'; import {StringTable, StringTableEntry} from '../../../../Data/StringTable';
import {StringTableHandler} from '../../../../Parser/Message/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 encodeEntry = (entry: StringTableEntry) => {
const result: any = { const result: any = {
@ -87,4 +87,12 @@ suite('StringTable', () => {
test('Encode StringTable message', () => { test('Encode StringTable message', () => {
assertEncoder(parser, encoder, expectedRaw, 3690024); 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)
);
});
}); });