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/Packet/BSPDecal.d.ts vendored Normal file
View file

@ -0,0 +1,7 @@
import { BitStream } from 'bit-buffer';
import { BSPDecalPacket } from '../../Data/Packet';
import { Vector } from '../../Data/Vector';
export declare function getVecCoord(stream: BitStream): Vector;
export declare function encodeVecCoord(vector: Vector, stream: BitStream): void;
export declare function ParseBSPDecal(stream: BitStream): BSPDecalPacket;
export declare function EncodeBSPDecal(packet: BSPDecalPacket, stream: BitStream): void;

View file

@ -0,0 +1,65 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const SendPropEncoder_1 = require("../SendPropEncoder");
const SendPropParser_1 = require("../SendPropParser");
function getVecCoord(stream) {
const hasX = stream.readBoolean();
const hasY = stream.readBoolean();
const hasZ = stream.readBoolean();
return {
x: hasX ? SendPropParser_1.SendPropParser.readBitCoord(stream) : 0,
y: hasY ? SendPropParser_1.SendPropParser.readBitCoord(stream) : 0,
z: hasZ ? SendPropParser_1.SendPropParser.readBitCoord(stream) : 0
};
}
exports.getVecCoord = getVecCoord;
function encodeVecCoord(vector, stream) {
stream.writeBoolean(vector.x !== 0);
stream.writeBoolean(vector.y !== 0);
stream.writeBoolean(vector.z !== 0);
if (vector.x !== 0) {
SendPropEncoder_1.SendPropEncoder.writeBitCoord(vector.x, stream);
}
if (vector.y !== 0) {
SendPropEncoder_1.SendPropEncoder.writeBitCoord(vector.y, stream);
}
if (vector.z !== 0) {
SendPropEncoder_1.SendPropEncoder.writeBitCoord(vector.z, stream);
}
}
exports.encodeVecCoord = encodeVecCoord;
function ParseBSPDecal(stream) {
let modelIndex = 0;
let entIndex = 0;
const position = getVecCoord(stream);
const textureIndex = stream.readBits(9);
if (stream.readBoolean()) {
entIndex = stream.readBits(11);
modelIndex = stream.readBits(12);
}
const lowPriority = stream.readBoolean();
return {
packetType: 'bspDecal',
position,
textureIndex,
entIndex,
modelIndex,
lowPriority
};
}
exports.ParseBSPDecal = ParseBSPDecal;
function EncodeBSPDecal(packet, stream) {
encodeVecCoord(packet.position, stream);
stream.writeBits(packet.textureIndex, 9);
if (packet.entIndex || packet.modelIndex) {
stream.writeBoolean(true);
stream.writeBits(packet.entIndex, 11);
stream.writeBits(packet.modelIndex, 12);
}
else {
stream.writeBoolean(false);
}
stream.writeBoolean(packet.lowPriority);
}
exports.EncodeBSPDecal = EncodeBSPDecal;
//# sourceMappingURL=BSPDecal.js.map

View file

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

4
build/Parser/Packet/ClassInfo.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { ClassInfoPacket } from '../../Data/Packet';
export declare function ParseClassInfo(stream: BitStream): ClassInfoPacket;
export declare function EncodeClassInfo(packet: ClassInfoPacket, stream: BitStream): void;

View file

@ -0,0 +1,40 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Math_1 = require("../../Math");
function ParseClassInfo(stream) {
const count = stream.readUint16();
const create = stream.readBoolean();
const entries = [];
if (!create) {
const bits = Math_1.logBase2(count) + 1;
for (let i = 0; i < count; i++) {
const entry = {
classId: stream.readBits(bits),
className: stream.readASCIIString(),
dataTableName: stream.readASCIIString()
};
entries.push(entry);
}
}
return {
packetType: 'classInfo',
number: count,
create,
entries
};
}
exports.ParseClassInfo = ParseClassInfo;
function EncodeClassInfo(packet, stream) {
stream.writeUint16(packet.number);
stream.writeBoolean(packet.create);
if (!packet.create) {
const bits = Math_1.logBase2(packet.number) + 1;
for (const entry of packet.entries) {
stream.writeBits(entry.classId, bits);
stream.writeASCIIString(entry.className);
stream.writeASCIIString(entry.dataTableName);
}
}
}
exports.EncodeClassInfo = EncodeClassInfo;
//# sourceMappingURL=ClassInfo.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"ClassInfo.js","sourceRoot":"","sources":["../../../src/Parser/Packet/ClassInfo.ts"],"names":[],"mappings":";;AAEA,qCAAoC;AAEpC,SAAgB,cAAc,CAAC,MAAiB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,OAAO,GAIR,EAAE,CAAC;IACR,IAAI,CAAC,MAAM,EAAE;QACZ,MAAM,IAAI,GAAG,eAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG;gBACb,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC9B,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE;gBACnC,aAAa,EAAE,MAAM,CAAC,eAAe,EAAE;aACvC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpB;KACD;IACD,OAAO;QACN,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,KAAK;QACb,MAAM;QACN,OAAO;KACP,CAAC;AACH,CAAC;AAzBD,wCAyBC;AAED,SAAgB,eAAe,CAAC,MAAuB,EAAE,MAAiB;IACzE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QACnB,MAAM,IAAI,GAAG,eAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE;YACnC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;SAC7C;KACD;AACF,CAAC;AAXD,0CAWC"}

View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { CreateStringTablePacket } from '../../Data/Packet';
export declare function ParseCreateStringTable(stream: BitStream): CreateStringTablePacket;
export declare function EncodeCreateStringTable(packet: CreateStringTablePacket, stream: BitStream): void;

View file

@ -0,0 +1,89 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const bit_buffer_1 = require("bit-buffer");
const Math_1 = require("../../Math");
const readBitVar_1 = require("../readBitVar");
const snappyjs_1 = require("snappyjs");
const StringTableParser_1 = require("../StringTableParser");
function ParseCreateStringTable(stream) {
const tableName = stream.readASCIIString();
const maxEntries = stream.readUint16();
const encodeBits = Math_1.logBase2(maxEntries);
const entityCount = stream.readBits(encodeBits + 1);
const bitCount = readBitVar_1.readVarInt(stream);
let userDataSize = 0;
let userDataSizeBits = 0;
// userdata fixed size
if (stream.readBoolean()) {
userDataSize = stream.readBits(12);
userDataSizeBits = stream.readBits(4);
}
const isCompressed = stream.readBoolean();
let data = stream.readBitStream(bitCount);
if (isCompressed) {
const decompressedByteSize = data.readUint32();
const compressedByteSize = data.readUint32();
const magic = data.readASCIIString(4);
const compressedData = data.readArrayBuffer(compressedByteSize - 4); // 4 magic bytes
if (magic !== 'SNAP') {
throw new Error('Unknown compressed stringtable format');
}
const decompressedData = snappyjs_1.uncompress(compressedData);
if (decompressedData.byteLength !== decompressedByteSize) {
throw new Error('Incorrect length of decompressed stringtable');
}
data = new bit_buffer_1.BitStream(decompressedData.buffer);
}
const table = {
name: tableName,
entries: [],
maxEntries,
fixedUserDataSize: userDataSize,
fixedUserDataSizeBits: userDataSizeBits,
compressed: isCompressed
};
// console.log(`${tableName} ${entityCount} ${bitCount}`);
table.entries = StringTableParser_1.parseStringTableEntries(data, table, entityCount);
return {
packetType: 'createStringTable',
table
};
}
exports.ParseCreateStringTable = ParseCreateStringTable;
function EncodeCreateStringTable(packet, stream) {
stream.writeASCIIString(packet.table.name);
stream.writeUint16(packet.table.maxEntries);
const encodeBits = Math_1.logBase2(packet.table.maxEntries);
const numEntries = packet.table.entries.filter((entry) => entry).length;
stream.writeBits(numEntries, encodeBits + 1);
let entryData = new bit_buffer_1.BitStream(new ArrayBuffer(StringTableParser_1.guessStringTableEntryLength(packet.table, packet.table.entries)));
StringTableParser_1.encodeStringTableEntries(entryData, packet.table, packet.table.entries);
if (packet.table.compressed) {
const decompressedByteLength = Math.ceil(entryData.length / 8);
entryData.index = 0;
const compressedData = snappyjs_1.compress(entryData.readArrayBuffer(decompressedByteLength));
entryData = new bit_buffer_1.BitStream(new ArrayBuffer(decompressedByteLength));
entryData.writeUint32(decompressedByteLength);
entryData.writeUint32(compressedData.byteLength + 4); // 4 magic bytes
entryData.writeASCIIString('SNAP', 4);
const typeForce = compressedData.buffer;
entryData.writeArrayBuffer(typeForce);
}
const entryLength = entryData.index;
entryData.index = 0;
readBitVar_1.writeVarInt(entryLength, stream);
if (packet.table.fixedUserDataSize || packet.table.fixedUserDataSizeBits) {
stream.writeBoolean(true);
stream.writeBits(packet.table.fixedUserDataSize || 0, 12);
stream.writeBits(packet.table.fixedUserDataSizeBits || 0, 4);
}
else {
stream.writeBoolean(false);
}
stream.writeBoolean(packet.table.compressed);
if (entryLength) {
stream.writeBitStream(entryData, entryLength);
}
}
exports.EncodeCreateStringTable = EncodeCreateStringTable;
//# sourceMappingURL=CreateStringTable.js.map

View file

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

5
build/Parser/Packet/GameEvent.d.ts vendored Normal file
View file

@ -0,0 +1,5 @@
import { BitStream } from 'bit-buffer';
import { GameEventPacket } from '../../Data/Packet';
import { ParserState } from '../../Data/ParserState';
export declare function ParseGameEvent(stream: BitStream, state: ParserState): GameEventPacket;
export declare function EncodeGameEvent(packet: GameEventPacket, stream: BitStream, state: ParserState): void;

View file

@ -0,0 +1,116 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const GameEvent_1 = require("../../Data/GameEvent");
function parseGameEvent(definition, stream) {
const values = {};
for (const entry of definition.entries) {
const value = getGameEventValue(stream, entry);
if (value !== null) {
values[entry.name] = value;
}
}
const name = definition.name;
return {
name,
values
};
}
function encodeGameEvent(event, definition, stream) {
for (const entry of definition.entries) {
const value = event.values[entry.name];
if (typeof value === 'undefined') {
throw new Error('empty event value');
}
else {
encodeGameEventValue(value, stream, entry);
}
}
}
function getGameEventValue(stream, entry) {
switch (entry.type) {
case GameEvent_1.GameEventValueType.STRING:
return stream.readUTF8String();
case GameEvent_1.GameEventValueType.FLOAT:
return stream.readFloat32();
case GameEvent_1.GameEventValueType.LONG:
return stream.readUint32();
case GameEvent_1.GameEventValueType.SHORT:
return stream.readUint16();
case GameEvent_1.GameEventValueType.BYTE:
return stream.readUint8();
case GameEvent_1.GameEventValueType.BOOLEAN:
return stream.readBoolean();
case GameEvent_1.GameEventValueType.LOCAL:
return null;
}
}
function encodeGameEventValue(value, stream, entry) {
switch (entry.type) {
case GameEvent_1.GameEventValueType.STRING:
if (typeof value !== 'string') {
throw new Error(`Invalid value for game event, expected string got ${typeof value}`);
}
return stream.writeASCIIString(value);
case GameEvent_1.GameEventValueType.FLOAT:
if (typeof value !== 'number') {
throw new Error(`Invalid value for game event, expected number got ${typeof value}`);
}
return stream.writeFloat32(value);
case GameEvent_1.GameEventValueType.LONG:
if (typeof value !== 'number') {
throw new Error(`Invalid value for game event, expected number got ${typeof value}`);
}
return stream.writeUint32(value);
case GameEvent_1.GameEventValueType.SHORT:
if (typeof value !== 'number') {
throw new Error(`Invalid value for game event, expected number got ${typeof value}`);
}
return stream.writeUint16(value);
case GameEvent_1.GameEventValueType.BYTE:
if (typeof value !== 'number') {
throw new Error(`Invalid value for game event, expected number got ${typeof value}`);
}
return stream.writeUint8(value);
case GameEvent_1.GameEventValueType.BOOLEAN:
if (typeof value !== 'boolean') {
throw new Error(`Invalid value for game event, expected boolean got ${typeof value}`);
}
return stream.writeBoolean(value);
}
}
function ParseGameEvent(stream, state) {
const length = stream.readBits(11);
const eventData = stream.readBitStream(length);
const eventType = eventData.readBits(9);
const definition = state.eventDefinitions.get(eventType);
if (!definition) {
throw new Error(`Unknown game event type ${eventType}`);
}
const event = parseGameEvent(definition, eventData);
return {
packetType: 'gameEvent',
event: event
};
}
exports.ParseGameEvent = ParseGameEvent;
function EncodeGameEvent(packet, stream, state) {
const lengthStart = stream.index;
stream.index += 11;
const eventId = state.eventDefinitionTypes.get(packet.event.name);
if (typeof eventId === 'undefined') {
throw new Error(`Unknown game event type ${packet.event.name}`);
}
const eventDataStart = stream.index;
stream.writeBits(eventId, 9);
const definition = state.eventDefinitions.get(eventId);
if (typeof definition === 'undefined') {
throw new Error(`Unknown game event type ${packet.event.name}`);
}
encodeGameEvent(packet.event, definition, stream);
const eventDataEnd = stream.index;
stream.index = lengthStart;
stream.writeBits(eventDataEnd - eventDataStart, 11);
stream.index = eventDataEnd;
}
exports.EncodeGameEvent = EncodeGameEvent;
//# sourceMappingURL=GameEvent.js.map

View file

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

View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { GameEventListPacket } from '../../Data/Packet';
export declare function ParseGameEventList(stream: BitStream): GameEventListPacket;
export declare function EncodeGameEventList(packet: GameEventListPacket, stream: BitStream): void;

View file

@ -0,0 +1,54 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function ParseGameEventList(stream) {
// list of game events and parameters
const numEvents = stream.readBits(9);
const length = stream.readBits(20);
const listData = stream.readBitStream(length);
const eventList = new Map();
for (let i = 0; i < numEvents; i++) {
const id = listData.readBits(9);
const name = listData.readASCIIString();
let type = listData.readBits(3);
const entries = [];
while (type !== 0) {
entries.push({
type,
name: listData.readASCIIString()
});
type = listData.readBits(3);
}
eventList.set(id, {
id,
name,
entries
});
}
return {
packetType: 'gameEventList',
eventList
};
}
exports.ParseGameEventList = ParseGameEventList;
function EncodeGameEventList(packet, stream) {
const definitions = Array.from(packet.eventList.values());
stream.writeBits(definitions.length, 9);
const lengthStart = stream.index;
stream.index += 20;
const eventListStart = stream.index;
for (const definition of definitions) {
stream.writeBits(definition.id, 9);
stream.writeASCIIString(definition.name);
for (const entry of definition.entries) {
stream.writeBits(entry.type, 3);
stream.writeASCIIString(entry.name);
}
stream.writeBits(0, 3);
}
const eventListEnd = stream.index;
stream.index = lengthStart;
stream.writeBits(eventListEnd - eventListStart, 20);
stream.index = eventListEnd;
}
exports.EncodeGameEventList = EncodeGameEventList;
//# sourceMappingURL=GameEventList.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"GameEventList.js","sourceRoot":"","sources":["../../../src/Parser/Packet/GameEventList.ts"],"names":[],"mappings":";;AAKA,SAAgB,kBAAkB,CAAC,MAAiB;IACnD,qCAAqC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAoD,IAAI,GAAG,EAAE,CAAC;IAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,EAAuB,CAAC;QAC7D,IAAI,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,OAAO,IAAI,KAAK,CAAC,EAAE;YAClB,OAAO,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,QAAQ,CAAC,eAAe,EAAE;aAChC,CAAC,CAAC;YACH,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC5B;QACD,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;YACjB,EAAE;YACF,IAAI;YACJ,OAAO;SACP,CAAC,CAAC;KACH;IAED,OAAO;QACN,UAAU,EAAE,eAAe;QAC3B,SAAS;KACT,CAAC;AACH,CAAC;AA9BD,gDA8BC;AAED,SAAgB,mBAAmB,CAAC,MAA2B,EAAE,MAAiB;IACjF,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACjC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAEnB,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;IAEpC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;QACrC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE;YACvC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACpC;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACvB;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;IAElC,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC3B,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,cAAc,EAAE,EAAE,CAAC,CAAC;IAEpD,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;AAC7B,CAAC;AAzBD,kDAyBC"}

View file

@ -0,0 +1,5 @@
import { BitStream } from 'bit-buffer';
import { PacketEntitiesPacket } from '../../Data/Packet';
import { ParserState } from '../../Data/ParserState';
export declare function ParsePacketEntities(stream: BitStream, state: ParserState, skip?: boolean): PacketEntitiesPacket;
export declare function EncodePacketEntities(packet: PacketEntitiesPacket, stream: BitStream, state: ParserState): void;

View file

@ -0,0 +1,214 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const PacketEntity_1 = require("../../Data/PacketEntity");
const ParserState_1 = require("../../Data/ParserState");
const EntityDecoder_1 = require("../EntityDecoder");
const readBitVar_1 = require("../readBitVar");
const pvsMap = new Map([
[0, PacketEntity_1.PVS.PRESERVE],
[2, PacketEntity_1.PVS.ENTER],
[1, PacketEntity_1.PVS.LEAVE],
[3, PacketEntity_1.PVS.LEAVE + PacketEntity_1.PVS.DELETE]
]);
const pvsReverseMap = new Map([
[PacketEntity_1.PVS.PRESERVE, 0],
[PacketEntity_1.PVS.ENTER, 2],
[PacketEntity_1.PVS.LEAVE, 1],
[PacketEntity_1.PVS.LEAVE + PacketEntity_1.PVS.DELETE, 3]
]);
function readPVSType(stream) {
const pvs = stream.readBits(2);
return pvsMap.get(pvs);
}
function writePVSType(pvs, stream) {
const raw = pvsReverseMap.get(pvs);
if (typeof raw === 'undefined') {
throw new Error(`Unknown pvs ${pvs}`);
}
stream.writeBits(raw, 2);
}
function readEnterPVS(stream, entityId, state, baseLineIndex) {
// https://github.com/PazerOP/DemoLib/blob/5f9467650f942a4a70f9ec689eadcd3e0a051956/TF2Net/NetMessages/NetPacketEntitiesMessage.cs#L198
const classBits = ParserState_1.getClassBits(state);
const serverClass = state.serverClasses[stream.readBits(classBits)];
const serial = stream.readBits(10); // unused serial number
const sendTable = ParserState_1.getSendTable(state, serverClass.dataTable);
const instanceBaseline = state.instanceBaselines[baseLineIndex].get(entityId);
const entity = new PacketEntity_1.PacketEntity(serverClass, entityId, PacketEntity_1.PVS.ENTER);
entity.serialNumber = serial;
if (instanceBaseline) {
entity.props = instanceBaseline.map((prop) => prop.clone());
return entity;
}
else {
const staticBaseLine = state.staticBaseLines.get(serverClass.id);
if (staticBaseLine) {
let parsedBaseLine = state.staticBaselineCache.get(serverClass.id);
if (!parsedBaseLine) {
staticBaseLine.index = 0;
parsedBaseLine = EntityDecoder_1.getEntityUpdate(sendTable, staticBaseLine);
state.staticBaselineCache.set(serverClass.id, parsedBaseLine);
}
entity.props = parsedBaseLine.map((prop) => prop.clone());
// entity.applyPropUpdate(parsedBaseLine);
// if (staticBaseLine.bitsLeft > 7) {
// console.log(staticBaseLine.length, staticBaseLine.index);
// throw new Error('Unexpected data left at the end of staticBaseline, ' + staticBaseLine.bitsLeft + ' bits left');
// }
}
return entity;
}
}
function writeEnterPVS(entity, stream, state, baseLineIndex) {
const serverClassId = state.serverClasses.findIndex((existingServerClass) => existingServerClass && entity.serverClass.id === existingServerClass.id);
if (serverClassId === -1) {
throw new Error(`Unknown server class ${entity.serverClass.name}(${entity.serverClass.id})`);
}
// get the instance from the match, not the entity
const serverClass = state.serverClasses[serverClassId];
stream.writeBits(serverClassId, ParserState_1.getClassBits(state));
stream.writeBits(entity.serialNumber || 0, 10);
const sendTable = ParserState_1.getSendTable(state, serverClass.dataTable);
let instanceBaseLine = state.instanceBaselines[baseLineIndex].get(entity.entityIndex);
if (!instanceBaseLine) {
const staticBaseLine = state.staticBaseLines.get(serverClass.id);
if (staticBaseLine) {
instanceBaseLine = state.staticBaselineCache.get(serverClass.id);
if (!instanceBaseLine) {
staticBaseLine.index = 0;
instanceBaseLine = EntityDecoder_1.getEntityUpdate(sendTable, staticBaseLine);
state.staticBaselineCache.set(serverClass.id, instanceBaseLine);
}
}
}
const propsToEncode = instanceBaseLine ? entity.diffFromBaseLine(instanceBaseLine) : entity.props;
EntityDecoder_1.encodeEntityUpdate(propsToEncode, sendTable, stream);
}
function getPacketEntityForExisting(entityId, state, pvs) {
const serverClass = state.entityClasses.get(entityId);
if (!serverClass) {
throw new Error(`"unknown entity ${entityId} for ${PacketEntity_1.PVS[pvs]}(${pvs})`);
}
return new PacketEntity_1.PacketEntity(serverClass, entityId, pvs);
}
function ParsePacketEntities(stream, state, skip = false) {
// https://github.com/skadistats/smoke/blob/master/smoke/replay/handler/svc_packetentities.pyx
// https://github.com/StatsHelix/demoinfo/blob/3d28ea917c3d44d987b98bb8f976f1a3fcc19821/DemoInfo/DP/Handler/PacketEntitesHandler.cs
// https://github.com/StatsHelix/demoinfo/blob/3d28ea917c3d44d987b98bb8f976f1a3fcc19821/DemoInfo/DP/Entity.cs
// https://github.com/PazerOP/DemoLib/blob/5f9467650f942a4a70f9ec689eadcd3e0a051956/TF2Net/NetMessages/NetPacketEntitiesMessage.cs
const maxEntries = stream.readBits(11);
const isDelta = stream.readBoolean();
const delta = (isDelta) ? stream.readInt32() : 0;
const baseLine = stream.readBits(1);
const updatedEntries = stream.readBits(11);
const length = stream.readBits(20);
const updatedBaseLine = stream.readBoolean();
const start = stream.index;
const end = stream.index + length;
let entityId = -1;
const receivedEntities = [];
const removedEntityIds = [];
if (!skip) {
if (updatedBaseLine) {
state.instanceBaselines[1 - baseLine] = new Map(state.instanceBaselines[baseLine]);
// state.instanceBaselines[baseLine] = new Map();
}
for (let i = 0; i < updatedEntries; i++) {
const diff = readBitVar_1.readUBitVar(stream);
entityId += 1 + diff;
const pvs = readPVSType(stream);
if (pvs === PacketEntity_1.PVS.ENTER) {
const packetEntity = readEnterPVS(stream, entityId, state, baseLine);
const sendTable = ParserState_1.getSendTable(state, packetEntity.serverClass.dataTable);
const updatedProps = EntityDecoder_1.getEntityUpdate(sendTable, stream);
packetEntity.applyPropUpdate(updatedProps);
if (updatedBaseLine) {
state.instanceBaselines[1 - baseLine].set(entityId, packetEntity.clone().props);
}
packetEntity.inPVS = true;
receivedEntities.push(packetEntity);
}
else if (pvs === PacketEntity_1.PVS.PRESERVE) {
const packetEntity = getPacketEntityForExisting(entityId, state, pvs);
const sendTable = state.sendTables.get(packetEntity.serverClass.dataTable);
if (!sendTable) {
throw new Error(`Unknown sendTable ${packetEntity.serverClass.dataTable}`);
}
const updatedProps = EntityDecoder_1.getEntityUpdate(sendTable, stream);
packetEntity.applyPropUpdate(updatedProps);
receivedEntities.push(packetEntity);
}
else if (state.entityClasses.has(entityId)) {
const packetEntity = getPacketEntityForExisting(entityId, state, pvs);
receivedEntities.push(packetEntity);
}
else {
// throw new Error(`No existing entity to update with id ${entityId}`);
}
}
if (isDelta) {
while (stream.readBoolean()) {
removedEntityIds.push(stream.readBits(11));
}
}
}
stream.index = end;
return {
packetType: 'packetEntities',
entities: receivedEntities,
removedEntities: removedEntityIds,
maxEntries,
delta,
baseLine,
updatedBaseLine
};
}
exports.ParsePacketEntities = ParsePacketEntities;
function EncodePacketEntities(packet, stream, state) {
stream.writeBits(packet.maxEntries, 11);
const isDelta = packet.delta > 0;
stream.writeBoolean(isDelta);
if (isDelta) {
stream.writeInt32(packet.delta);
}
stream.writeBits(packet.baseLine, 1);
stream.writeBits(packet.entities.length, 11);
const lengthStart = stream.index;
stream.index += 20;
stream.writeBoolean(packet.updatedBaseLine);
const packetDataStart = stream.index;
let lastEntityId = -1;
if (packet.updatedBaseLine) {
state.instanceBaselines[1 - packet.baseLine] = new Map(state.instanceBaselines[packet.baseLine]);
// state.instanceBaselines[baseLine] = new Map();
}
for (const entity of packet.entities) {
const diff = entity.entityIndex - lastEntityId;
lastEntityId = entity.entityIndex;
readBitVar_1.writeBitVar(diff - 1, stream);
writePVSType(entity.pvs, stream);
if (entity.pvs === PacketEntity_1.PVS.ENTER) {
if (packet.updatedBaseLine) {
state.instanceBaselines[1 - packet.baseLine].set(entity.entityIndex, entity.clone().props);
}
writeEnterPVS(entity, stream, state, packet.baseLine);
}
else if (entity.pvs === PacketEntity_1.PVS.PRESERVE) {
const sendTable = ParserState_1.getSendTable(state, entity.serverClass.dataTable);
EntityDecoder_1.encodeEntityUpdate(entity.props, sendTable, stream);
}
}
if (isDelta) {
for (const removedEntity of packet.removedEntities) {
stream.writeBoolean(true);
stream.writeBits(removedEntity, 11);
}
stream.writeBoolean(false);
}
const packetDataEnd = stream.index;
stream.index = lengthStart;
stream.writeBits(packetDataEnd - packetDataStart, 20);
stream.index = packetDataEnd;
}
exports.EncodePacketEntities = EncodePacketEntities;
//# sourceMappingURL=PacketEntities.js.map

File diff suppressed because one or more lines are too long

4
build/Parser/Packet/ParseSounds.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { ParseSoundsPacket } from '../../Data/Packet';
export declare function ParseParseSounds(stream: BitStream): ParseSoundsPacket;
export declare function EncodeParseSounds(packet: ParseSoundsPacket, stream: BitStream): void;

View file

@ -0,0 +1,31 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function ParseParseSounds(stream) {
const reliable = stream.readBoolean();
const num = (reliable) ? 1 : stream.readUint8();
const length = (reliable) ? stream.readUint8() : stream.readUint16();
const data = stream.readBitStream(length);
return {
packetType: 'parseSounds',
reliable,
num,
length,
data
};
}
exports.ParseParseSounds = ParseParseSounds;
function EncodeParseSounds(packet, stream) {
stream.writeBoolean(packet.reliable);
if (packet.reliable) {
stream.writeUint8(packet.length);
}
else {
stream.writeUint8(packet.num);
stream.writeUint16(packet.length);
}
packet.data.index = 0;
stream.writeBitStream(packet.data, packet.length);
packet.data.index = 0;
}
exports.EncodeParseSounds = EncodeParseSounds;
//# sourceMappingURL=ParseSounds.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"ParseSounds.js","sourceRoot":"","sources":["../../../src/Parser/Packet/ParseSounds.ts"],"names":[],"mappings":";;AAGA,SAAgB,gBAAgB,CAAC,MAAiB;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO;QACN,UAAU,EAAE,aAAa;QACzB,QAAQ;QACR,GAAG;QACH,MAAM;QACN,IAAI;KACJ,CAAC;AACH,CAAC;AAbD,4CAaC;AAED,SAAgB,iBAAiB,CAAC,MAAyB,EAAE,MAAiB;IAC7E,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,QAAQ,EAAE;QACpB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACjC;SAAM;QACN,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KAClC;IAED,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACtB,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACvB,CAAC;AAZD,8CAYC"}

10
build/Parser/Packet/Parser.d.ts vendored Normal file
View file

@ -0,0 +1,10 @@
import { BitStream } from 'bit-buffer';
import { Packet, VoidPacket } from '../../Data/Packet';
import { ParserState } from '../../Data/ParserState';
export declare type Parser<P extends Packet> = (stream: BitStream, state?: ParserState, skip?: boolean) => P;
export declare type Encoder<P extends Packet> = (packet: P, stream: BitStream, state?: ParserState) => void;
export interface PacketHandler<P extends Packet> {
parser: Parser<P>;
encoder: Encoder<P>;
}
export declare const voidEncoder: Encoder<VoidPacket>;

View file

@ -0,0 +1,8 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.voidEncoder = () => {
return {
type: 'void'
};
};
//# sourceMappingURL=Parser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../../src/Parser/Packet/Parser.ts"],"names":[],"mappings":";;AAYa,QAAA,WAAW,GAAwB,GAAG,EAAE;IACpD,OAAO;QACN,IAAI,EAAE,MAAM;KACZ,CAAC;AACH,CAAC,CAAC"}

View file

@ -0,0 +1,7 @@
import { Packet, PacketMapType, PacketType } from '../../Data/Packet';
import { UserMessagePacketType } from '../../Data/UserMessage';
import { PacketHandler } from './Parser';
export interface NamedPacketHandler<P extends Packet, N extends PacketType | UserMessagePacketType> extends PacketHandler<P> {
name: N;
}
export declare function make<T extends PacketType | UserMessagePacketType>(name: T, definition: string, nameKey?: string, extraData?: any): NamedPacketHandler<PacketMapType[T], T>;

View file

@ -0,0 +1,96 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function make(name, definition, nameKey = 'packetType', extraData = {}) {
const parts = definition.split('}');
const items = parts.map((part) => {
return part.split('{');
}).filter((part) => part[0]);
const parser = (stream) => {
const result = Object.assign({}, extraData);
result[nameKey] = name;
try {
for (const group of items) {
const value = readItem(stream, group[1], result);
if (group[0] !== '_') {
result[group[0]] = value;
}
}
}
catch (e) {
throw new Error('Failed reading pattern ' + definition + '. ' + e);
}
return result;
};
const encoder = (packet, stream) => {
for (const group of items) {
writeItem(stream, group[1], packet, packet[group[0]]);
}
};
return { parser, encoder, name };
}
exports.make = make;
function readItem(stream, description, data) {
if (description[0] === 'b') {
return stream.readBoolean();
}
else if (description[0] === 's') {
if (description.length === 1) {
return stream.readUTF8String();
}
else {
const length = parseInt(description.substr(1), 10);
return stream.readASCIIString(length);
}
}
else if (description === 'f32') {
return stream.readFloat32();
}
else if (description[0] === 'u') {
const length = parseInt(description.substr(1), 10);
return stream.readBits(length);
}
else if (description[0] === '$' && description.substr(description.length - 2) === '*8') {
const variable = description.substr(1, description.length - 3);
return stream.readBitStream(data[variable] * 8);
}
else if (description[0] === '$') {
const variable = description.substr(1);
return stream.readBitStream(data[variable]);
}
else {
return stream.readBits(parseInt(description, 10), true);
}
}
function writeItem(stream, description, data, value) {
if (description[0] === 'b') {
return stream.writeBoolean(value);
}
else if (description[0] === 's') {
if (description.length === 1) {
return stream.writeUTF8String(value);
}
else {
const length = parseInt(description.substr(1), 10);
return stream.writeUTF8String(value, length);
}
}
else if (description === 'f32') {
return stream.writeFloat32(value);
}
else if (description[0] === 'u') {
const length = parseInt(description.substr(1), 10);
return stream.writeBits(value, length);
}
else if (description[0] === '$' && description.substr(description.length - 2) === '*8') {
const variable = description.substr(1, description.length - 3);
return stream.writeBitStream(value, data[variable] * 8);
}
else if (description[0] === '$') {
const variable = description.substr(1);
return stream.writeBitStream(value, data[variable]);
}
else {
return stream.writeBits(value, parseInt(description, 10));
}
}
//# sourceMappingURL=ParserGenerator.js.map

View file

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

4
build/Parser/Packet/SetConVar.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { SetConVarPacket } from '../../Data/Packet';
export declare function ParseSetConVar(stream: BitStream): SetConVarPacket;
export declare function EncodeSetConVar(packet: SetConVarPacket, stream: BitStream): void;

View file

@ -0,0 +1,25 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function ParseSetConVar(stream) {
const count = stream.readUint8();
const vars = new Map();
for (let i = 0; i < count; i++) {
const key = stream.readUTF8String();
const value = stream.readUTF8String();
vars.set(key, value);
}
return {
packetType: 'setConVar',
vars
};
}
exports.ParseSetConVar = ParseSetConVar;
function EncodeSetConVar(packet, stream) {
stream.writeUint8(packet.vars.size);
for (const [key, value] of packet.vars.entries()) {
stream.writeUTF8String(key);
stream.writeUTF8String(value);
}
}
exports.EncodeSetConVar = EncodeSetConVar;
//# sourceMappingURL=SetConVar.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"SetConVar.js","sourceRoot":"","sources":["../../../src/Parser/Packet/SetConVar.ts"],"names":[],"mappings":";;AAGA,SAAgB,cAAc,CAAC,MAAiB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACjC,MAAM,IAAI,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KACrB;IACD,OAAO;QACN,UAAU,EAAE,WAAW;QACvB,IAAI;KACJ,CAAC;AACH,CAAC;AAZD,wCAYC;AAED,SAAgB,eAAe,CAAC,MAAuB,EAAE,MAAiB;IACzE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;QACjD,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KAC9B;AACF,CAAC;AAND,0CAMC"}

5
build/Parser/Packet/TempEntities.d.ts vendored Normal file
View file

@ -0,0 +1,5 @@
import { BitStream } from 'bit-buffer';
import { TempEntitiesPacket } from '../../Data/Packet';
import { ParserState } from '../../Data/ParserState';
export declare function ParseTempEntities(stream: BitStream, state: ParserState, skip?: boolean): TempEntitiesPacket;
export declare function EncodeTempEntities(packet: TempEntitiesPacket, stream: BitStream, state: ParserState): void;

View file

@ -0,0 +1,78 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const PacketEntity_1 = require("../../Data/PacketEntity");
const ParserState_1 = require("../../Data/ParserState");
const DynamicBitStream_1 = require("../../DynamicBitStream");
const EntityDecoder_1 = require("../EntityDecoder");
const readBitVar_1 = require("../readBitVar");
function ParseTempEntities(stream, state, skip = false) {
const entityCount = stream.readUint8();
const length = readBitVar_1.readVarInt(stream);
const entityData = stream.readBitStream(length);
let entity = null;
const entities = [];
if (!skip) {
for (let i = 0; i < entityCount; i++) {
const delay = (entityData.readBoolean()) ? entityData.readUint8() / 100 : 0; // unused it seems
if (entityData.readBoolean()) {
const classId = entityData.readBits(ParserState_1.getClassBits(state));
// no clue why the -1 but it works
const serverClass = state.serverClasses[classId - 1];
if (!serverClass) {
throw new Error(`Unknown serverClass ${classId}`);
}
const sendTable = ParserState_1.getSendTable(state, serverClass.dataTable);
entity = new PacketEntity_1.PacketEntity(serverClass, 0, PacketEntity_1.PVS.ENTER);
entity.delay = delay;
entity.props = EntityDecoder_1.getEntityUpdate(sendTable, entityData);
entities.push(entity);
}
else {
if (entity) {
const sendTable = ParserState_1.getSendTable(state, entity.serverClass.dataTable);
const updatedProps = EntityDecoder_1.getEntityUpdate(sendTable, entityData);
entity = entity.clone();
entity.applyPropUpdate(updatedProps);
entities.push(entity);
}
else {
throw new Error('no entity set to update');
}
}
}
if (entityData.bitsLeft > 8) {
throw new Error(`unexpected content after TempEntities ${entityData.bitsLeft} bits`);
}
}
return {
packetType: 'tempEntities',
entities
};
}
exports.ParseTempEntities = ParseTempEntities;
function EncodeTempEntities(packet, stream, state) {
stream.writeUint8(packet.entities.length);
const entityStream = new DynamicBitStream_1.DynamicBitStream();
for (const entity of packet.entities) {
if (entity.delay) {
entityStream.writeBoolean(true);
entityStream.writeUint8(Math.round(entity.delay * 100));
}
else {
entityStream.writeBoolean(false);
}
entityStream.writeBoolean(true);
const classId = state.serverClasses.findIndex((serverClass) => serverClass && serverClass.name === entity.serverClass.name) + 1;
entityStream.writeBits(classId, ParserState_1.getClassBits(state));
const sendTable = ParserState_1.getSendTable(state, entity.serverClass.dataTable);
EntityDecoder_1.encodeEntityUpdate(entity.props, sendTable, entityStream);
}
const entityDataLength = entityStream.index;
entityStream.index = 0;
readBitVar_1.writeVarInt(entityDataLength, stream);
if (entityDataLength > 0) {
stream.writeBitStream(entityStream, entityDataLength);
}
}
exports.EncodeTempEntities = EncodeTempEntities;
//# sourceMappingURL=TempEntities.js.map

View file

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

View file

@ -0,0 +1,5 @@
import { BitStream } from 'bit-buffer';
import { UpdateStringTablePacket } from '../../Data/Packet';
import { ParserState } from '../../Data/ParserState';
export declare function ParseUpdateStringTable(stream: BitStream, state: ParserState): UpdateStringTablePacket;
export declare function EncodeUpdateStringTable(packet: UpdateStringTablePacket, stream: BitStream, state: ParserState): void;

View file

@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const StringTableParser_1 = require("../StringTableParser");
function ParseUpdateStringTable(stream, state) {
const tableId = stream.readBits(5);
const multipleChanged = stream.readBoolean();
const changedEntries = multipleChanged ? stream.readUint16() : 1;
const bitCount = stream.readBits(20);
const data = stream.readBitStream(bitCount);
data.index = 0;
if (!state.stringTables[tableId]) {
throw new Error(`Table not found for update: ${tableId}`);
}
const table = state.stringTables[tableId];
const updatedEntries = StringTableParser_1.parseStringTableEntries(data, table, changedEntries, table.entries);
return {
packetType: 'updateStringTable',
entries: updatedEntries,
tableId
};
}
exports.ParseUpdateStringTable = ParseUpdateStringTable;
function EncodeUpdateStringTable(packet, stream, state) {
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 (!state.stringTables[packet.tableId]) {
throw new Error(`Table not found for update: ${packet.tableId}`);
}
const lengthStart = stream.index;
stream.index += 20;
const lengthEnd = stream.index;
const table = state.stringTables[packet.tableId];
StringTableParser_1.encodeStringTableEntries(stream, table, packet.entries, table.entries);
const dataEnd = stream.index;
stream.index = lengthStart;
const entryLength = dataEnd - lengthEnd;
stream.writeBits(entryLength, 20);
stream.index = dataEnd;
}
exports.EncodeUpdateStringTable = EncodeUpdateStringTable;
//# sourceMappingURL=UpdateStringTable.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"UpdateStringTable.js","sourceRoot":"","sources":["../../../src/Parser/Packet/UpdateStringTable.ts"],"names":[],"mappings":";;AAGA,4DAAuF;AAEvF,SAAgB,sBAAsB,CAAC,MAAiB,EAAE,KAAkB;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,cAAc,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAEf,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QACjC,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;KAC1D;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,2CAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAE3F,OAAO;QACN,UAAU,EAAE,mBAAmB;QAC/B,OAAO,EAAE,cAAc;QACvB,OAAO;KACP,CAAC;AACH,CAAC;AAtBD,wDAsBC;AAED,SAAgB,uBAAuB,CAAC,MAA+B,EAAE,MAAiB,EAAE,KAAkB;IAC7G,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEpC,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,eAAe,GAAG,iBAAiB,GAAG,CAAC,CAAC;IAC9C,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAErC,IAAI,eAAe,EAAE;QACpB,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;KACtC;IAED,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;KACjE;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACjC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACnB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,4CAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7B,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC3B,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;AACxB,CAAC;AA3BD,0DA2BC"}

4
build/Parser/Packet/UserMessage.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { UserMessagePacket } from '../../Data/UserMessage';
export declare function ParseUserMessage(stream: BitStream): UserMessagePacket;
export declare function EncodeUserMessage(packet: UserMessagePacket, stream: BitStream): void;

View file

@ -0,0 +1,95 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const UserMessage_1 = require("../../Data/UserMessage");
const SayText2_1 = require("../UserMessage/SayText2");
const ParserGenerator_1 = require("./ParserGenerator");
function unknownPacketHandler(userMessageType) {
return {
parser: (data) => {
return {
packetType: 'userMessage',
userMessageType,
type: UserMessage_1.UserMessagePacketTypeMap.get(userMessageType),
data
};
},
encoder: (packet, data) => {
packet.data.index = 0;
data.writeBitStream(packet.data);
packet.data.index = 0;
},
name: userMessageType
};
}
const userMessageParsers = new Map([
[UserMessage_1.UserMessageType.SayText2, { parser: SayText2_1.ParseSayText2, encoder: SayText2_1.EncodeSayText2, name: 'sayText2' }],
[UserMessage_1.UserMessageType.TextMsg,
ParserGenerator_1.make('textMsg', 'destType{8}text{s}substitute1{s}substitute2{s}substitute3{s}substitute4{s}', 'userMessageType', {
packetType: 'userMessage'
})],
[UserMessage_1.UserMessageType.ResetHUD,
ParserGenerator_1.make('resetHUD', 'data{8}', 'userMessageType', {
packetType: 'userMessage'
})],
[UserMessage_1.UserMessageType.Train,
ParserGenerator_1.make('train', 'data{8}', 'userMessageType', {
packetType: 'userMessage'
})],
[UserMessage_1.UserMessageType.VoiceSubtitle,
ParserGenerator_1.make('voiceSubtitle', 'client{8}menu{8}item{8}', 'userMessageType', {
packetType: 'userMessage'
})],
[UserMessage_1.UserMessageType.BreakModel_Pumpkin, unknownPacketHandler('breakModelPumpkin')],
[UserMessage_1.UserMessageType.Shake,
ParserGenerator_1.make('shake', 'command{8}amplitude{f32}frequency{f32}duration{f32}', 'userMessageType', {
packetType: 'userMessage'
})]
]);
function ParseUserMessage(stream) {
const type = stream.readUint8();
const length = stream.readBits(11);
const messageData = stream.readBitStream(length);
const handler = userMessageParsers.get(type);
if (!handler) {
return {
packetType: 'userMessage',
userMessageType: 'unknownUserMessage',
type,
data: messageData
};
}
else {
return handler.parser(messageData);
}
}
exports.ParseUserMessage = ParseUserMessage;
function EncodeUserMessage(packet, stream) {
if (packet.userMessageType === 'unknownUserMessage') {
stream.writeUint8(packet.type);
stream.writeBits(packet.data.length, 11);
packet.data.index = 0;
stream.writeBitStream(packet.data);
packet.data.index = 0;
}
else {
const messageType = UserMessage_1.UserMessagePacketTypeMap.get(packet.userMessageType);
if (!messageType) {
throw new Error(`Unknown userMessage type ${messageType}`);
}
stream.writeUint8(messageType);
const lengthStart = stream.index;
stream.index += 11;
const messageDataStart = stream.index;
const handler = userMessageParsers.get(messageType);
if (!handler) {
throw new Error(`No encoder for userMessage ${packet.userMessageType}(${messageType})`);
}
handler.encoder(packet, stream);
const messageDataEnd = stream.index;
stream.index = lengthStart;
stream.writeBits(messageDataEnd - messageDataStart, 11);
stream.index = messageDataEnd;
}
}
exports.EncodeUserMessage = EncodeUserMessage;
//# sourceMappingURL=UserMessage.js.map

View file

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

4
build/Parser/Packet/VoiceData.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { VoiceDataPacket } from '../../Data/Packet';
export declare function ParseVoiceData(stream: BitStream): VoiceDataPacket;
export declare function EncodeVoiceData(packet: VoiceDataPacket, stream: BitStream): void;

View file

@ -0,0 +1,26 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function ParseVoiceData(stream) {
const client = stream.readUint8();
const proximity = stream.readUint8();
const length = stream.readUint16();
const data = stream.readBitStream(length);
return {
packetType: 'voiceData',
client,
proximity,
length,
data
};
}
exports.ParseVoiceData = ParseVoiceData;
function EncodeVoiceData(packet, stream) {
stream.writeUint8(packet.client);
stream.writeUint8(packet.proximity);
stream.writeUint16(packet.length);
packet.data.index = 0;
stream.writeBitStream(packet.data, packet.length);
packet.data.index = 0;
}
exports.EncodeVoiceData = EncodeVoiceData;
//# sourceMappingURL=VoiceData.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"VoiceData.js","sourceRoot":"","sources":["../../../src/Parser/Packet/VoiceData.ts"],"names":[],"mappings":";;AAGA,SAAgB,cAAc,CAAC,MAAiB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO;QACN,UAAU,EAAE,WAAW;QACvB,MAAM;QACN,SAAS;QACT,MAAM;QACN,IAAI;KACJ,CAAC;AACH,CAAC;AAbD,wCAaC;AAED,SAAgB,eAAe,CAAC,MAAuB,EAAE,MAAiB;IACzE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACtB,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACvB,CAAC;AAPD,0CAOC"}

4
build/Parser/Packet/VoiceInit.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
import { BitStream } from 'bit-buffer';
import { VoiceInitPacket } from '../../Data/Packet';
export declare function ParseVoiceInit(stream: BitStream): VoiceInitPacket;
export declare function EncodeVoiceInit(packet: VoiceInitPacket, stream: BitStream): void;

View file

@ -0,0 +1,35 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function ParseVoiceInit(stream) {
const codec = stream.readASCIIString();
const quality = stream.readUint8();
// no clue, from 2017-2-14 update
const extraData = readExtraData(stream, codec, quality);
return {
packetType: 'voiceInit',
codec,
quality,
extraData
};
}
exports.ParseVoiceInit = ParseVoiceInit;
function readExtraData(stream, codec, quality) {
if (quality === 255) {
return stream.readUint16();
}
else if (codec === 'vaudio_celt') {
return 11025;
}
else {
return 0;
}
}
function EncodeVoiceInit(packet, stream) {
stream.writeASCIIString(packet.codec);
stream.writeUint8(packet.quality);
if (packet.quality === 255) {
stream.writeUint16(packet.extraData);
}
}
exports.EncodeVoiceInit = EncodeVoiceInit;
//# sourceMappingURL=VoiceInit.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"VoiceInit.js","sourceRoot":"","sources":["../../../src/Parser/Packet/VoiceInit.ts"],"names":[],"mappings":";;AAGA,SAAgB,cAAc,CAAC,MAAiB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAEnC,iCAAiC;IACjC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAExD,OAAO;QACN,UAAU,EAAE,WAAW;QACvB,KAAK;QACL,OAAO;QACP,SAAS;KACT,CAAC;AACH,CAAC;AAbD,wCAaC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,KAAa,EAAE,OAAe;IACvE,IAAI,OAAO,KAAK,GAAG,EAAE;QACpB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;KAC3B;SAAM,IAAI,KAAK,KAAK,aAAa,EAAE;QACnC,OAAO,KAAK,CAAC;KACb;SAAM;QACN,OAAO,CAAC,CAAC;KACT;AACF,CAAC;AAED,SAAgB,eAAe,CAAC,MAAuB,EAAE,MAAiB;IACzE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,EAAE;QAC3B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KACrC;AACF,CAAC;AAND,0CAMC"}