mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
fix parsing client stringtables
This commit is contained in:
parent
0aad1e874b
commit
7505abc6d0
3 changed files with 34 additions and 34 deletions
4
Makefile
4
Makefile
|
|
@ -26,6 +26,10 @@ unit: node_modules
|
||||||
lint: node_modules
|
lint: node_modules
|
||||||
node_modules/.bin/tslint -p tsconfig.json
|
node_modules/.bin/tslint -p tsconfig.json
|
||||||
|
|
||||||
|
.PHONY: lint-fix
|
||||||
|
lint-fix: node_modules
|
||||||
|
node_modules/.bin/tslint -p tsconfig.json --fix
|
||||||
|
|
||||||
.PHONY: src/Data/GameEventTypes.ts
|
.PHONY: src/Data/GameEventTypes.ts
|
||||||
src/Data/GameEventTypes.ts:
|
src/Data/GameEventTypes.ts:
|
||||||
node bin/analyse.js --create-event-definitions src/tests/data/celt.dem > src/Data/GameEventTypes.ts
|
node bin/analyse.js --create-event-definitions src/tests/data/celt.dem > src/Data/GameEventTypes.ts
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ export interface StringTable {
|
||||||
maxEntries: number;
|
maxEntries: number;
|
||||||
fixedUserDataSize?: number;
|
fixedUserDataSize?: number;
|
||||||
fixedUserDataSizeBits?: number;
|
fixedUserDataSizeBits?: number;
|
||||||
tableEntry?: StringTableEntry;
|
clientEntries?: StringTableEntry[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface StringTableEntry {
|
export interface StringTableEntry {
|
||||||
|
|
|
||||||
|
|
@ -23,15 +23,7 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
||||||
if (messageStream.readBoolean()) {
|
if (messageStream.readBoolean()) {
|
||||||
const extraDataLength = messageStream.readUint16();
|
const extraDataLength = messageStream.readUint16();
|
||||||
if ((extraDataLength * 8) > messageStream.bitsLeft) {
|
if ((extraDataLength * 8) > messageStream.bitsLeft) {
|
||||||
// extradata to long, can't continue parsing the tables
|
throw new Error(`to long extraData ${tableName}[${i}]`);
|
||||||
// seems to happen in POV demos after the MyM update
|
|
||||||
throw new Error(`to long extraData ${extraDataLength} from ${messageStream.bitsLeft}`);
|
|
||||||
// return {
|
|
||||||
// type: MessageType.StringTables,
|
|
||||||
// tick,
|
|
||||||
// rawData: messageStream,
|
|
||||||
// tables,
|
|
||||||
// };
|
|
||||||
}
|
}
|
||||||
entry.extraData = messageStream.readBitStream(extraDataLength * 8);
|
entry.extraData = messageStream.readBitStream(extraDataLength * 8);
|
||||||
}
|
}
|
||||||
|
|
@ -40,14 +32,19 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
||||||
const table: StringTableObject = {
|
const table: StringTableObject = {
|
||||||
entries,
|
entries,
|
||||||
name: tableName,
|
name: tableName,
|
||||||
maxEntries: entryCount
|
maxEntries: entryCount,
|
||||||
|
clientEntries: []
|
||||||
};
|
};
|
||||||
|
|
||||||
if (messageStream.readBoolean()) {
|
if (messageStream.readBoolean()) {
|
||||||
table.tableEntry = {text: messageStream.readASCIIString()};
|
const clientEntries = messageStream.readUint16();
|
||||||
|
for (let j = 0; j < clientEntries; j++) {
|
||||||
|
const entry: StringTableEntry = {text: messageStream.readUTF8String()};
|
||||||
if (messageStream.readBoolean()) {
|
if (messageStream.readBoolean()) {
|
||||||
const extraDataLength = messageStream.readBits(16);
|
const extraDataLength = messageStream.readBits(16);
|
||||||
table.tableEntry.extraData = messageStream.readBitStream(extraDataLength);
|
entry.extraData = messageStream.readBitStream(extraDataLength * 8);
|
||||||
|
}
|
||||||
|
(table.clientEntries as StringTableEntry[]).push(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -74,28 +71,14 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
||||||
stream.writeUint16(table.entries.length);
|
stream.writeUint16(table.entries.length);
|
||||||
|
|
||||||
for (const entry of table.entries) {
|
for (const entry of table.entries) {
|
||||||
stream.writeUTF8String(entry.text);
|
writeEntry(entry, stream);
|
||||||
if (entry.extraData) {
|
|
||||||
stream.writeBoolean(true);
|
|
||||||
|
|
||||||
stream.writeUint16(Math.ceil(entry.extraData.length / 8));
|
|
||||||
entry.extraData.index = 0;
|
|
||||||
stream.writeBitStream(entry.extraData, entry.extraData.length);
|
|
||||||
} else {
|
|
||||||
stream.writeBoolean(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (table.tableEntry) {
|
if (table.clientEntries) {
|
||||||
stream.writeBoolean(true);
|
stream.writeBoolean(true);
|
||||||
stream.writeASCIIString(table.tableEntry.text);
|
stream.writeUint16(table.clientEntries.length);
|
||||||
if (table.tableEntry.extraData) {
|
for (const entry of table.clientEntries) {
|
||||||
stream.writeBoolean(true);
|
writeEntry(entry, stream);
|
||||||
stream.writeUint16(table.tableEntry.extraData.length);
|
|
||||||
table.tableEntry.extraData.index = 0;
|
|
||||||
stream.writeBitStream(table.tableEntry.extraData, table.tableEntry.extraData.length);
|
|
||||||
} else {
|
|
||||||
stream.writeBoolean(false);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stream.writeBoolean(false);
|
stream.writeBoolean(false);
|
||||||
|
|
@ -114,3 +97,16 @@ export const StringTableHandler: MessageHandler<StringTablesMessage> = {
|
||||||
stream.index = dataStart + byteLength * 8;
|
stream.index = dataStart + byteLength * 8;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function writeEntry(entry: StringTableEntry, stream: BitStream) {
|
||||||
|
stream.writeUTF8String(entry.text);
|
||||||
|
if (entry.extraData) {
|
||||||
|
stream.writeBoolean(true);
|
||||||
|
|
||||||
|
stream.writeUint16(Math.ceil(entry.extraData.length / 8));
|
||||||
|
entry.extraData.index = 0;
|
||||||
|
stream.writeBitStream(entry.extraData, entry.extraData.length);
|
||||||
|
} else {
|
||||||
|
stream.writeBoolean(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue