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:
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 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) {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue