mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 09:04:13 +02:00
include /build
This commit is contained in:
parent
6e50384883
commit
132ab1b47a
220 changed files with 9059 additions and 1 deletions
7
build/Parser/Message/ConsoleCmd.d.ts
vendored
Normal file
7
build/Parser/Message/ConsoleCmd.d.ts
vendored
Normal 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>;
|
||||
34
build/Parser/Message/ConsoleCmd.js
Normal file
34
build/Parser/Message/ConsoleCmd.js
Normal 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
|
||||
1
build/Parser/Message/ConsoleCmd.js.map
Normal file
1
build/Parser/Message/ConsoleCmd.js.map
Normal 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
2
build/Parser/Message/DataTable.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import { DataTablesMessage, MessageHandler } from '../../Data/Message';
|
||||
export declare const DataTableHandler: MessageHandler<DataTablesMessage>;
|
||||
205
build/Parser/Message/DataTable.js
Normal file
205
build/Parser/Message/DataTable.js
Normal 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
|
||||
1
build/Parser/Message/DataTable.js.map
Normal file
1
build/Parser/Message/DataTable.js.map
Normal file
File diff suppressed because one or more lines are too long
2
build/Parser/Message/Packet.d.ts
vendored
Normal file
2
build/Parser/Message/Packet.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import { MessageHandler, PacketMessage } from '../../Data/Message';
|
||||
export declare const PacketMessageHandler: MessageHandler<PacketMessage>;
|
||||
163
build/Parser/Message/Packet.js
Normal file
163
build/Parser/Message/Packet.js
Normal 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
|
||||
1
build/Parser/Message/Packet.js.map
Normal file
1
build/Parser/Message/Packet.js.map
Normal file
File diff suppressed because one or more lines are too long
14
build/Parser/Message/Parser.d.ts
vendored
Normal file
14
build/Parser/Message/Parser.d.ts
vendored
Normal 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[];
|
||||
}
|
||||
14
build/Parser/Message/Parser.js
Normal file
14
build/Parser/Message/Parser.js
Normal 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
|
||||
1
build/Parser/Message/Parser.js.map
Normal file
1
build/Parser/Message/Parser.js.map
Normal 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
2
build/Parser/Message/Stop.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import { MessageHandler, StopMessage } from '../../Data/Message';
|
||||
export declare const StopHandler: MessageHandler<StopMessage>;
|
||||
15
build/Parser/Message/Stop.js
Normal file
15
build/Parser/Message/Stop.js
Normal 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
|
||||
1
build/Parser/Message/Stop.js.map
Normal file
1
build/Parser/Message/Stop.js.map
Normal 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
2
build/Parser/Message/StringTable.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import { MessageHandler, StringTablesMessage } from '../../Data/Message';
|
||||
export declare const StringTableHandler: MessageHandler<StringTablesMessage>;
|
||||
94
build/Parser/Message/StringTable.js
Normal file
94
build/Parser/Message/StringTable.js
Normal 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
|
||||
1
build/Parser/Message/StringTable.js.map
Normal file
1
build/Parser/Message/StringTable.js.map
Normal 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
2
build/Parser/Message/SyncTick.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import { MessageHandler, SyncTickMessage } from '../../Data/Message';
|
||||
export declare const SyncTickHandler: MessageHandler<SyncTickMessage>;
|
||||
17
build/Parser/Message/SyncTick.js
Normal file
17
build/Parser/Message/SyncTick.js
Normal 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
|
||||
1
build/Parser/Message/SyncTick.js.map
Normal file
1
build/Parser/Message/SyncTick.js.map
Normal 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
2
build/Parser/Message/UserCmd.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import { MessageHandler, UserCmdMessage } from '../../Data/Message';
|
||||
export declare const UserCmdHandler: MessageHandler<UserCmdMessage>;
|
||||
21
build/Parser/Message/UserCmd.js
Normal file
21
build/Parser/Message/UserCmd.js
Normal 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
|
||||
1
build/Parser/Message/UserCmd.js.map
Normal file
1
build/Parser/Message/UserCmd.js.map
Normal 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"}
|
||||
Loading…
Add table
Add a link
Reference in a new issue