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

include /build

This commit is contained in:
Bryan C 2020-07-02 18:42:25 +08:00
commit 132ab1b47a
220 changed files with 9059 additions and 1 deletions

7
build/Parser/Message/ConsoleCmd.d.ts vendored Normal file
View file

@ -0,0 +1,7 @@
import { ConsoleCmdMessage, MessageHandler } from '../../Data/Message';
import { ConsoleCmdPacket } from '../../Data/Packet';
import { Parser } from './Parser';
export declare class ConsoleCmd extends Parser {
parse(): ConsoleCmdPacket[];
}
export declare const ConsoleCmdHandler: MessageHandler<ConsoleCmdMessage>;

View file

@ -0,0 +1,34 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const text_encoding_shim_1 = require("text-encoding-shim");
const Message_1 = require("../../Data/Message");
const Parser_1 = require("./Parser");
class ConsoleCmd extends Parser_1.Parser {
parse() {
return [{
packetType: 'consoleCmd',
command: this.stream.readUTF8String()
}];
}
}
exports.ConsoleCmd = ConsoleCmd;
exports.ConsoleCmdHandler = {
parseMessage: (stream) => {
const tick = stream.readInt32();
const length = stream.readInt32();
const messageStream = stream.readBitStream(length * 8);
return {
type: Message_1.MessageType.ConsoleCmd,
tick,
rawData: messageStream,
command: messageStream.readUTF8String()
};
},
encodeMessage: (message, stream) => {
stream.writeUint32(message.tick);
const byteLength = (new text_encoding_shim_1.TextEncoder('utf-8').encode(message.command)).length + 1; // +1 for null termination
stream.writeUint32(byteLength);
stream.writeUTF8String(message.command);
}
};
//# sourceMappingURL=ConsoleCmd.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"ConsoleCmd.js","sourceRoot":"","sources":["../../../src/Parser/Message/ConsoleCmd.ts"],"names":[],"mappings":";;AACA,2DAA+C;AAC/C,gDAAkF;AAElF,qCAAgC;AAEhC,MAAa,UAAW,SAAQ,eAAM;IAC9B,KAAK;QACX,OAAO,CAAC;gBACP,UAAU,EAAE,YAAY;gBACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;aACrC,CAAC,CAAC;IACJ,CAAC;CACD;AAPD,gCAOC;AAEY,QAAA,iBAAiB,GAAsC;IACnE,YAAY,EAAE,CAAC,MAAiB,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvD,OAAO;YACN,IAAI,EAAE,qBAAW,CAAC,UAAU;YAC5B,IAAI;YACJ,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE;SACvC,CAAC;IACH,CAAC;IACD,aAAa,EAAE,CAAC,OAA0B,EAAE,MAAiB,EAAE,EAAE;QAChE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,UAAU,GAAG,CAAC,IAAI,gCAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,0BAA0B;QAC5G,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAE/B,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACD,CAAC"}

2
build/Parser/Message/DataTable.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
import { DataTablesMessage, MessageHandler } from '../../Data/Message';
export declare const DataTableHandler: MessageHandler<DataTablesMessage>;

View file

@ -0,0 +1,205 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Message_1 = require("../../Data/Message");
const SendPropDefinition_1 = require("../../Data/SendPropDefinition");
const SendTable_1 = require("../../Data/SendTable");
const ServerClass_1 = require("../../Data/ServerClass");
exports.DataTableHandler = {
parseMessage: (stream) => {
const tick = stream.readInt32();
const length = stream.readInt32();
const messageStream = stream.readBitStream(length * 8);
// https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_common_eng.cpp#L356
// https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_recv_eng.cpp#L310
// https://github.com/PazerOP/DemoLib/blob/master/DemoLib/Commands/DemoDataTablesCommand.cs
const tables = [];
const tableMap = new Map();
while (messageStream.readBoolean()) {
const needsDecoder = messageStream.readBoolean();
const tableName = messageStream.readASCIIString();
const numProps = messageStream.readBits(10);
const table = new SendTable_1.SendTable(tableName);
table.needsDecoder = needsDecoder;
// get props metadata
let arrayElementProp;
for (let i = 0; i < numProps; i++) {
const propType = messageStream.readBits(5);
const propName = messageStream.readASCIIString();
const nFlagsBits = 16; // might be 11 (old?), 13 (new?), 16(networked) or 17(??)
const flags = messageStream.readBits(nFlagsBits);
const prop = new SendPropDefinition_1.SendPropDefinition(propType, propName, flags, tableName);
if (propType === SendPropDefinition_1.SendPropType.DPT_DataTable) {
prop.excludeDTName = messageStream.readASCIIString();
}
else {
if (prop.isExcludeProp()) {
prop.excludeDTName = messageStream.readASCIIString();
}
else if (prop.type === SendPropDefinition_1.SendPropType.DPT_Array) {
prop.numElements = messageStream.readBits(10);
}
else {
prop.lowValue = messageStream.readFloat32();
prop.highValue = messageStream.readFloat32();
prop.bitCount = messageStream.readBits(7);
}
}
if (prop.hasFlag(SendPropDefinition_1.SendPropFlag.SPROP_NOSCALE)) {
if (prop.type === SendPropDefinition_1.SendPropType.DPT_Float) {
prop.originalBitCount = prop.bitCount;
prop.bitCount = 32;
}
else if (prop.type === SendPropDefinition_1.SendPropType.DPT_Vector) {
if (!prop.hasFlag(SendPropDefinition_1.SendPropFlag.SPROP_NORMAL)) {
prop.originalBitCount = prop.bitCount;
prop.bitCount = 32 * 3;
}
}
}
if (arrayElementProp) {
if (prop.type !== SendPropDefinition_1.SendPropType.DPT_Array) {
throw new Error('expected prop of type array');
}
prop.arrayProperty = arrayElementProp;
arrayElementProp = null;
}
if (prop.hasFlag(SendPropDefinition_1.SendPropFlag.SPROP_INSIDEARRAY)) {
if (arrayElementProp) {
throw new Error('array element already set');
}
if (prop.hasFlag(SendPropDefinition_1.SendPropFlag.SPROP_CHANGES_OFTEN)) {
throw new Error('unexpected CHANGES_OFTEN prop in array');
}
arrayElementProp = prop;
}
else {
table.addProp(prop);
}
}
tables.push(table);
tableMap.set(table.name, table);
}
// link referenced tables
for (const table of tables) {
for (const prop of table.props) {
if (prop.type === SendPropDefinition_1.SendPropType.DPT_DataTable) {
if (prop.excludeDTName) {
const referencedTable = tableMap.get(prop.excludeDTName);
if (!referencedTable) {
throw new Error(`Unknown referenced table ${prop.excludeDTName}`);
}
prop.table = referencedTable;
prop.excludeDTName = null;
}
}
}
}
const numServerClasses = messageStream.readUint16(); // short
const serverClasses = [];
if (numServerClasses <= 0) {
throw new Error('expected one or more serverclasses');
}
for (let i = 0; i < numServerClasses; i++) {
const classId = messageStream.readUint16();
if (classId > numServerClasses) {
throw new Error('invalid class id');
}
const className = messageStream.readASCIIString();
const dataTable = messageStream.readASCIIString();
serverClasses.push(new ServerClass_1.ServerClass(classId, className, dataTable));
}
if (messageStream.bitsLeft > 7) {
throw new Error('unexpected remaining data in datatable (' + messageStream.bitsLeft + ' bits)');
}
return {
type: Message_1.MessageType.DataTables,
tick,
rawData: messageStream,
tables,
serverClasses
};
},
encodeMessage: (message, stream) => {
stream.writeUint32(message.tick);
const lengthStart = stream.index;
stream.index += 32;
const dataStart = stream.index;
for (const table of message.tables) {
stream.writeBoolean(true);
stream.writeBoolean(table.needsDecoder);
stream.writeASCIIString(table.name);
const numPropsStart = stream.index;
stream.index += 10;
let numProps = 0;
for (const definition of table.props) {
if (definition.arrayProperty) {
encodeSendPropDefinition(stream, definition.arrayProperty);
numProps++;
}
encodeSendPropDefinition(stream, definition);
numProps++;
}
const propDataEnd = stream.index;
stream.index = numPropsStart;
stream.writeBits(numProps, 10);
stream.index = propDataEnd;
}
stream.writeBoolean(false);
stream.writeUint16(message.serverClasses.length);
for (const serverClass of message.serverClasses) {
stream.writeUint16(serverClass.id);
stream.writeASCIIString(serverClass.name);
stream.writeASCIIString(serverClass.dataTable);
}
const dataEnd = stream.index;
stream.index = lengthStart;
const byteLength = Math.ceil((dataEnd - dataStart) / 8);
stream.writeUint32(byteLength);
// align to byte;
stream.index = dataStart + byteLength * 8;
}
};
function encodeSendPropDefinition(stream, definition) {
stream.writeBits(definition.type, 5);
stream.writeASCIIString(definition.name);
stream.writeBits(definition.flags, 16);
if (definition.type === SendPropDefinition_1.SendPropType.DPT_DataTable) {
if (!definition.table) {
throw new Error('Missing linked table');
}
stream.writeASCIIString(definition.table.name);
}
else {
if (definition.isExcludeProp()) {
if (!definition.excludeDTName) {
throw new Error('Missing linked table');
}
stream.writeASCIIString(definition.excludeDTName);
}
else if (definition.type === SendPropDefinition_1.SendPropType.DPT_Array) {
stream.writeBits(definition.numElements, 10);
}
else {
stream.writeFloat32(definition.lowValue);
stream.writeFloat32(definition.highValue);
// if (definition.originalBitCount === null || typeof definition.originalBitCount === 'undefined') {
// stream.writeBits(definition.bitCount, 7);
// } else {
// stream.writeBits(definition.originalBitCount, 7);
// }
if (definition.hasFlag(SendPropDefinition_1.SendPropFlag.SPROP_NOSCALE) && (definition.type === SendPropDefinition_1.SendPropType.DPT_Float ||
(definition.type === SendPropDefinition_1.SendPropType.DPT_Vector && !definition.hasFlag(SendPropDefinition_1.SendPropFlag.SPROP_NORMAL)))) {
if (definition.originalBitCount === null || typeof definition.originalBitCount === 'undefined') {
stream.writeBits(definition.bitCount / 3, 7);
}
else {
stream.writeBits(definition.originalBitCount, 7);
}
}
else {
stream.writeBits(definition.bitCount, 7);
}
}
}
}
//# sourceMappingURL=DataTable.js.map

File diff suppressed because one or more lines are too long

2
build/Parser/Message/Packet.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
import { MessageHandler, PacketMessage } from '../../Data/Message';
export declare const PacketMessageHandler: MessageHandler<PacketMessage>;

View file

@ -0,0 +1,163 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const BSPDecal_1 = require("../Packet/BSPDecal");
const ClassInfo_1 = require("../Packet/ClassInfo");
const CreateStringTable_1 = require("../Packet/CreateStringTable");
const GameEvent_1 = require("../Packet/GameEvent");
const GameEventList_1 = require("../Packet/GameEventList");
const PacketEntities_1 = require("../Packet/PacketEntities");
const ParserGenerator_1 = require("../Packet/ParserGenerator");
const ParseSounds_1 = require("../Packet/ParseSounds");
const SetConVar_1 = require("../Packet/SetConVar");
const TempEntities_1 = require("../Packet/TempEntities");
const UpdateStringTable_1 = require("../Packet/UpdateStringTable");
const UserMessage_1 = require("../Packet/UserMessage");
const VoiceData_1 = require("../Packet/VoiceData");
const VoiceInit_1 = require("../Packet/VoiceInit");
const Message_1 = require("../../Data/Message");
const Packet_1 = require("../../Data/Packet");
const Vector_1 = require("../../Data/Vector");
const handlers = new Map([
[Packet_1.PacketTypeId.file,
ParserGenerator_1.make('file', 'transferId{32}fileName{s}requested{b}')],
[Packet_1.PacketTypeId.netTick,
ParserGenerator_1.make('netTick', 'tick{32}frameTime{16}stdDev{16}')],
[Packet_1.PacketTypeId.stringCmd,
ParserGenerator_1.make('stringCmd', 'command{s}')],
[Packet_1.PacketTypeId.setConVar,
{ parser: SetConVar_1.ParseSetConVar, encoder: SetConVar_1.EncodeSetConVar }],
[Packet_1.PacketTypeId.sigOnState,
ParserGenerator_1.make('sigOnState', 'state{8}count{32}')],
[Packet_1.PacketTypeId.print,
ParserGenerator_1.make('print', 'value{s}')],
[Packet_1.PacketTypeId.serverInfo,
ParserGenerator_1.make('serverInfo', 'version{16}serverCount{32}stv{b}dedicated{b}maxCrc{32}maxClasses{16}' +
'mapHash{128}playerCount{8}maxPlayerCount{8}intervalPerTick{f32}platform{s1}' +
'game{s}map{s}skybox{s}serverName{s}replay{b}')],
[Packet_1.PacketTypeId.classInfo,
{ parser: ClassInfo_1.ParseClassInfo, encoder: ClassInfo_1.EncodeClassInfo }],
[Packet_1.PacketTypeId.setPause,
ParserGenerator_1.make('setPause', 'paused{b}')],
[Packet_1.PacketTypeId.createStringTable,
{ parser: CreateStringTable_1.ParseCreateStringTable, encoder: CreateStringTable_1.EncodeCreateStringTable }],
[Packet_1.PacketTypeId.updateStringTable,
{ parser: UpdateStringTable_1.ParseUpdateStringTable, encoder: UpdateStringTable_1.EncodeUpdateStringTable }],
[Packet_1.PacketTypeId.voiceInit,
{ parser: VoiceInit_1.ParseVoiceInit, encoder: VoiceInit_1.EncodeVoiceInit }],
[Packet_1.PacketTypeId.voiceData,
{ parser: VoiceData_1.ParseVoiceData, encoder: VoiceData_1.EncodeVoiceData }],
[Packet_1.PacketTypeId.parseSounds,
{ parser: ParseSounds_1.ParseParseSounds, encoder: ParseSounds_1.EncodeParseSounds }],
[Packet_1.PacketTypeId.setView,
ParserGenerator_1.make('setView', 'index{11}')],
[Packet_1.PacketTypeId.fixAngle,
ParserGenerator_1.make('fixAngle', 'relative{b}x{16}y{16}z{16}')],
[Packet_1.PacketTypeId.bspDecal,
{ parser: BSPDecal_1.ParseBSPDecal, encoder: BSPDecal_1.EncodeBSPDecal }],
[Packet_1.PacketTypeId.userMessage,
{ parser: UserMessage_1.ParseUserMessage, encoder: UserMessage_1.EncodeUserMessage }],
[Packet_1.PacketTypeId.entityMessage,
ParserGenerator_1.make('entityMessage', 'index{11}classId{9}length{11}data{$length}')],
[Packet_1.PacketTypeId.gameEvent,
{ parser: GameEvent_1.ParseGameEvent, encoder: GameEvent_1.EncodeGameEvent }],
[Packet_1.PacketTypeId.packetEntities,
{ parser: PacketEntities_1.ParsePacketEntities, encoder: PacketEntities_1.EncodePacketEntities }],
[Packet_1.PacketTypeId.tempEntities,
{ parser: TempEntities_1.ParseTempEntities, encoder: TempEntities_1.EncodeTempEntities }],
[Packet_1.PacketTypeId.preFetch,
ParserGenerator_1.make('preFetch', 'index{14}')],
[Packet_1.PacketTypeId.menu,
ParserGenerator_1.make('menu', 'type{u16}length{u16}data{$length*8}')],
[Packet_1.PacketTypeId.gameEventList,
{ parser: GameEventList_1.ParseGameEventList, encoder: GameEventList_1.EncodeGameEventList }],
[Packet_1.PacketTypeId.getCvarValue,
ParserGenerator_1.make('getCvarValue', 'cookie{32}value{s}')],
[Packet_1.PacketTypeId.cmdKeyValues,
ParserGenerator_1.make('cmdKeyValues', 'length{32}data{$length}')]
]);
exports.PacketMessageHandler = {
parseMessage: (stream, state) => {
const tick = stream.readInt32();
const flags = stream.readInt32();
const viewOrigin = [new Vector_1.Vector(0, 0, 0), new Vector_1.Vector(0, 0, 0)];
const viewAngles = [new Vector_1.Vector(0, 0, 0), new Vector_1.Vector(0, 0, 0)];
const localViewAngles = [new Vector_1.Vector(0, 0, 0), new Vector_1.Vector(0, 0, 0)];
for (let j = 0; j < 2; j++) {
viewOrigin[j] = new Vector_1.Vector(stream.readFloat32(), stream.readFloat32(), stream.readFloat32());
viewAngles[j] = new Vector_1.Vector(stream.readFloat32(), stream.readFloat32(), stream.readFloat32());
localViewAngles[j] = new Vector_1.Vector(stream.readFloat32(), stream.readFloat32(), stream.readFloat32());
}
const sequenceIn = stream.readInt32();
const sequenceOut = stream.readInt32();
const length = stream.readInt32();
const messageStream = stream.readBitStream(length * 8);
const packets = [];
let lastPacketType = 0;
while (messageStream.bitsLeft > 6) { // last 6 bits for NOOP
const type = messageStream.readBits(6);
if (type !== 0) {
const handler = handlers.get(type);
if (handler) {
const skip = state.skippedPackets.indexOf(type) !== -1;
const packet = handler.parser(messageStream, state, skip);
packets.push(packet);
}
else {
throw new Error(`Unknown packet type ${type} just parsed a ${Packet_1.PacketTypeId[lastPacketType]}`);
}
lastPacketType = type;
}
}
return {
type: Message_1.MessageType.Packet,
tick,
rawData: messageStream,
packets,
flags,
viewOrigin,
viewAngles,
localViewAngles,
sequenceIn,
sequenceOut
};
},
encodeMessage: (message, stream, state) => {
stream.writeUint32(message.tick);
stream.writeUint32(message.flags);
for (let j = 0; j < 2; j++) {
stream.writeFloat32(message.viewOrigin[j].x);
stream.writeFloat32(message.viewOrigin[j].y);
stream.writeFloat32(message.viewOrigin[j].z);
stream.writeFloat32(message.viewAngles[j].x);
stream.writeFloat32(message.viewAngles[j].y);
stream.writeFloat32(message.viewAngles[j].z);
stream.writeFloat32(message.localViewAngles[j].x);
stream.writeFloat32(message.localViewAngles[j].y);
stream.writeFloat32(message.localViewAngles[j].z);
}
stream.writeUint32(message.sequenceIn);
stream.writeUint32(message.sequenceOut);
const lengthStart = stream.index;
stream.index += 32;
const dataStart = stream.index;
for (const packet of message.packets) {
const type = Packet_1.PacketTypeId[packet.packetType];
stream.writeBits(type, 6);
const handler = handlers.get(type);
if (handler) {
handler.encoder(packet, stream, state);
}
else {
throw new Error(`No handler for packet type ${packet.packetType}`);
}
}
stream.writeBits(0, 6);
const dataEnd = stream.index;
stream.index = lengthStart;
const byteLength = Math.ceil((dataEnd - dataStart) / 8);
stream.writeUint32(byteLength);
// align to byte;
stream.index = dataStart + byteLength * 8;
}
};
//# sourceMappingURL=Packet.js.map

File diff suppressed because one or more lines are too long

14
build/Parser/Message/Parser.d.ts vendored Normal file
View file

@ -0,0 +1,14 @@
import { BitStream } from 'bit-buffer';
import { MessageType } from '../../Data/Message';
import { Packet, PacketTypeId } from '../../Data/Packet';
import { ParserState } from '../../Data/ParserState';
export declare abstract class Parser {
protected type: any;
protected tick: number;
protected stream: BitStream;
protected length: number;
protected state: ParserState;
protected skippedPackets: PacketTypeId[];
constructor(type: MessageType, tick: number, stream: BitStream, length: number, state: ParserState, skippedPacket?: PacketTypeId[]);
abstract parse(): Packet[];
}

View file

@ -0,0 +1,14 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class Parser {
constructor(type, tick, stream, length, state, skippedPacket = []) {
this.type = type;
this.tick = tick;
this.stream = stream;
this.length = length; // length in bytes
this.state = state;
this.skippedPackets = skippedPacket;
}
}
exports.Parser = Parser;
//# sourceMappingURL=Parser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../../src/Parser/Message/Parser.ts"],"names":[],"mappings":";;AAKA,MAAsB,MAAM;IAQ3B,YAAY,IAAiB,EAAE,IAAY,EAAE,MAAiB,EAAE,MAAc,EAAE,KAAkB,EAAE,gBAAgC,EAAE;QACrI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,kBAAkB;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACrC,CAAC;CAGD;AAlBD,wBAkBC"}

2
build/Parser/Message/Stop.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
import { MessageHandler, StopMessage } from '../../Data/Message';
export declare const StopHandler: MessageHandler<StopMessage>;

View file

@ -0,0 +1,15 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Message_1 = require("../../Data/Message");
exports.StopHandler = {
parseMessage: (stream) => {
return {
type: Message_1.MessageType.Stop,
rawData: stream.readBitStream(0)
};
},
encodeMessage: (message, stream) => {
// noop
}
};
//# sourceMappingURL=Stop.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Stop.js","sourceRoot":"","sources":["../../../src/Parser/Message/Stop.ts"],"names":[],"mappings":";;AACA,gDAA6F;AAEhF,QAAA,WAAW,GAAgC;IACvD,YAAY,EAAE,CAAC,MAAiB,EAAE,EAAE;QACnC,OAAO;YACN,IAAI,EAAE,qBAAW,CAAC,IAAI;YACtB,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;SAChC,CAAC;IACH,CAAC;IACD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClC,OAAO;IACR,CAAC;CACD,CAAC"}

2
build/Parser/Message/StringTable.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
import { MessageHandler, StringTablesMessage } from '../../Data/Message';
export declare const StringTableHandler: MessageHandler<StringTablesMessage>;

View file

@ -0,0 +1,94 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Message_1 = require("../../Data/Message");
exports.StringTableHandler = {
parseMessage: (stream) => {
const tick = stream.readInt32();
const length = stream.readInt32();
const messageStream = stream.readBitStream(length * 8);
// https://github.com/StatsHelix/demoinfo/blob/3d28ea917c3d44d987b98bb8f976f1a3fcc19821/DemoInfo/ST/StringTableParser.cs
const tableCount = messageStream.readUint8();
const tables = [];
for (let i = 0; i < tableCount; i++) {
const entries = [];
const tableName = messageStream.readASCIIString();
const entryCount = messageStream.readUint16();
for (let j = 0; j < entryCount; j++) {
const entry = readEntry(messageStream);
entries.push(entry);
}
const table = {
entries,
name: tableName,
maxEntries: entryCount,
clientEntries: [],
compressed: false
};
if (messageStream.readBoolean()) {
const clientEntries = messageStream.readUint16();
for (let j = 0; j < clientEntries; j++) {
const entry = readEntry(messageStream);
table.clientEntries.push(entry);
}
}
tables.push(table);
}
return {
type: Message_1.MessageType.StringTables,
tick,
rawData: messageStream,
tables
};
},
encodeMessage: (message, stream) => {
stream.writeUint32(message.tick);
const lengthStart = stream.index;
stream.index += 32;
const dataStart = stream.index;
stream.writeUint8(message.tables.length);
for (const table of message.tables) {
stream.writeASCIIString(table.name);
stream.writeUint16(table.entries.length);
for (const entry of table.entries) {
writeEntry(entry, stream);
}
if (table.clientEntries && table.clientEntries.length) {
stream.writeBoolean(true);
stream.writeUint16(table.clientEntries.length);
for (const entry of table.clientEntries) {
writeEntry(entry, stream);
}
}
else {
stream.writeBoolean(false);
}
}
const dataEnd = stream.index;
stream.index = lengthStart;
const byteLength = Math.ceil((dataEnd - dataStart) / 8);
stream.writeUint32(byteLength);
// align to byte;
stream.index = dataStart + byteLength * 8;
}
};
function readEntry(stream) {
const entry = { text: stream.readUTF8String() };
if (stream.readBoolean()) {
const extraDataLength = stream.readUint16();
entry.extraData = stream.readBitStream(extraDataLength * 8);
}
return entry;
}
function writeEntry(entry, stream) {
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);
}
}
//# sourceMappingURL=StringTable.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StringTable.js","sourceRoot":"","sources":["../../../src/Parser/Message/StringTable.ts"],"names":[],"mappings":"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"}

2
build/Parser/Message/SyncTick.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
import { MessageHandler, SyncTickMessage } from '../../Data/Message';
export declare const SyncTickHandler: MessageHandler<SyncTickMessage>;

View file

@ -0,0 +1,17 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Message_1 = require("../../Data/Message");
exports.SyncTickHandler = {
parseMessage: (stream) => {
const tick = stream.readInt32();
return {
type: Message_1.MessageType.SyncTick,
tick,
rawData: stream.readBitStream(0)
};
},
encodeMessage: (message, stream) => {
stream.writeUint32(message.tick);
}
};
//# sourceMappingURL=SyncTick.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"SyncTick.js","sourceRoot":"","sources":["../../../src/Parser/Message/SyncTick.ts"],"names":[],"mappings":";;AACA,gDAAgF;AAEnE,QAAA,eAAe,GAAoC;IAC/D,YAAY,EAAE,CAAC,MAAiB,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEhC,OAAO;YACN,IAAI,EAAE,qBAAW,CAAC,QAAQ;YAC1B,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;SAChC,CAAC;IACH,CAAC;IACD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACD,CAAC"}

2
build/Parser/Message/UserCmd.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
import { MessageHandler, UserCmdMessage } from '../../Data/Message';
export declare const UserCmdHandler: MessageHandler<UserCmdMessage>;

View file

@ -0,0 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Message_1 = require("../../Data/Message");
exports.UserCmdHandler = {
parseMessage: (stream) => {
const tick = stream.readInt32();
const sequenceOut = stream.readInt32();
const length = stream.readInt32();
const messageStream = stream.readBitStream(length * 8);
return {
type: Message_1.MessageType.UserCmd,
tick,
rawData: messageStream,
sequenceOut
};
},
encodeMessage: (message, stream) => {
throw new Error('not implemented');
}
};
//# sourceMappingURL=UserCmd.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"UserCmd.js","sourceRoot":"","sources":["../../../src/Parser/Message/UserCmd.ts"],"names":[],"mappings":";;AACA,gDAA+E;AAElE,QAAA,cAAc,GAAmC;IAC7D,YAAY,EAAE,CAAC,MAAiB,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvD,OAAO;YACN,IAAI,EAAE,qBAAW,CAAC,OAAO;YACzB,IAAI;YACJ,OAAO,EAAE,aAAa;YACtB,WAAW;SACX,CAAC;IACH,CAAC;IACD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;CACD,CAAC"}