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

encoder for updateStringTable

This commit is contained in:
Robin Appelman 2017-08-16 01:33:01 +02:00
commit ae79b6a0d4
11 changed files with 280 additions and 57 deletions

View file

@ -70,8 +70,8 @@ export function EncodeCreateStringTable(packet: CreateStringTablePacket, stream:
const encodeBits = logBase2(packet.table.maxEntries);
stream.writeBits(packet.table.entries.length, encodeBits + 1);
const entryData = new BitStream(new ArrayBuffer(guessStringTableEntryLength(packet.table)));
encodeStringTableEntries(entryData, packet.table);
const entryData = new BitStream(new ArrayBuffer(guessStringTableEntryLength(packet.table, packet.table.entries)));
encodeStringTableEntries(entryData, packet.table, packet.table.entries);
const entryLength = entryData.index;
entryData.index = 0;

View file

@ -1,32 +1,53 @@
import {BitStream} from 'bit-buffer';
import {Match} from '../../Data/Match';
import {UpdateStringTablePacket} from '../../Data/Packet';
import {parseStringTableEntries} from '../StringTableParser';
import {encodeStringTableEntries, guessStringTableEntryLength, parseStringTableEntries} from '../StringTableParser';
export function ParseUpdateStringTable(stream: BitStream, match: Match): UpdateStringTablePacket { // 12: updateStringTable
const tableId = stream.readBits(5);
const multipleChanged = stream.readBoolean();
const changedEntries = (multipleChanged) ? stream.readBits(16) : 1;
const changedEntries = multipleChanged ? stream.readUint16() : 1;
const bitCount = stream.readBits(20);
const data = stream.readBitStream(bitCount);
data.index = 0;
if (!match.stringTables[tableId]) {
throw new Error('Table not found for update');
throw new Error(`Table not found for update: ${tableId}`);
}
const table = match.stringTables[tableId];
const updatedEntries = parseStringTableEntries(data, table, changedEntries, table.entries);
for (let i = 0; i < updatedEntries.length; i++) {
if (updatedEntries[i]) {
table.entries[i] = updatedEntries[i];
}
}
return {
packetType: 'updateStringTable',
table: table,
entries: updatedEntries,
tableId
};
}
export function EncodeUpdateStringTable(packet: UpdateStringTablePacket, stream: BitStream, match: Match) {
stream.writeBits(packet.tableId, 5);
const changedEntryCount = packet.entries.filter(entry => entry).length;
const multipleChanged = changedEntryCount > 1;
stream.writeBoolean(multipleChanged);
if (multipleChanged) {
stream.writeUint16(changedEntryCount);
}
if (!match.stringTables[packet.tableId]) {
throw new Error(`Table not found for update: ${packet.tableId}`);
}
const table = match.stringTables[packet.tableId];
const entryData = new BitStream(new ArrayBuffer(guessStringTableEntryLength(table, packet.entries)));
encodeStringTableEntries(entryData, table, packet.entries);
const entryLength = entryData.index;
entryData.index = 0;
stream.writeBits(entryLength, 20);
stream.writeBitStream(entryData, entryLength);
}