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

minor cleanup

This commit is contained in:
Robin Appelman 2017-09-03 14:10:47 +02:00
commit 2c8fe681d3
9 changed files with 93 additions and 54 deletions

View file

@ -11,7 +11,7 @@ import {GameEventDefinition} from './GameEvent';
import {EntityId, PacketEntity} from './PacketEntity'; import {EntityId, PacketEntity} from './PacketEntity';
import {Player} from './Player'; import {Player} from './Player';
import {PlayerResource} from './PlayerResource'; import {PlayerResource} from './PlayerResource';
import {SendTable} from './SendTable'; import {SendTable, SendTableName} from './SendTable';
import {ServerClass} from './ServerClass'; import {ServerClass} from './ServerClass';
import {StringTable} from './StringTable'; import {StringTable} from './StringTable';
import {Team, TeamNumber} from './Team'; import {Team, TeamNumber} from './Team';
@ -21,6 +21,7 @@ import {World} from './World';
import {Round} from './Round'; import {Round} from './Round';
import {Chat} from './Chat'; import {Chat} from './Chat';
import {GameEvent} from './GameEventTypes'; import {GameEvent} from './GameEventTypes';
import {Packet} from './Packet';
export class Match { export class Match {
public tick: number = 0; public tick: number = 0;
@ -38,7 +39,7 @@ export class Match {
}; };
public playerEntityMap: Map<EntityId, Player> = new Map(); public playerEntityMap: Map<EntityId, Player> = new Map();
public entityClasses: Map<EntityId, ServerClass> = new Map(); public entityClasses: Map<EntityId, ServerClass> = new Map();
public sendTables: Map<string, SendTable> = new Map(); public sendTables: Map<SendTableName, SendTable> = new Map();
public baseLineCache: Map<ServerClass, PacketEntity> = new Map(); public baseLineCache: Map<ServerClass, PacketEntity> = new Map();
public weaponMap: Map<EntityId, Weapon> = new Map(); public weaponMap: Map<EntityId, Weapon> = new Map();
public outerMap: Map<number, EntityId> = new Map(); public outerMap: Map<number, EntityId> = new Map();
@ -91,7 +92,7 @@ export class Match {
}; };
} }
public handlePacket(packet) { public handlePacket(packet: Packet) {
switch (packet.packetType) { switch (packet.packetType) {
case 'packetEntities': case 'packetEntities':
handlePacketEntities(packet, this); handlePacketEntities(packet, this);

View file

@ -270,7 +270,43 @@ export type Packet = BSPDecalPacket |
PreFetchPacket | PreFetchPacket |
GetCvarValuePacket; GetCvarValuePacket;
export enum PacketType { export type PacketType = Packet['packetType'];
export type PacketMapType = {
bSPDecal: BSPDecalPacket;
stringTable: StringTablePacket;
createStringTable: CreateStringTablePacket;
updateStringTable: UpdateStringTablePacket;
dataTable: DataTablePacket;
classInfo: ClassInfoPacket;
entityMessage: EntityMessagePacket;
gameEvent: GameEventPacket;
gameEventList: GameEventListPacket;
packetEntities: PacketEntitiesPacket;
parseSounds: ParseSoundsPacket;
setConVar: SetConVarPacket;
tempEntities: TempEntitiesPacket;
userMessage: UserMessagePacket;
voiceInit: VoiceInitPacket;
voiceData: VoiceDataPacket;
menu: MenuPacket;
consoleCmd: ConsoleCmdPacket;
cmdKeyValues: CmdKeyValuesPacket;
'void': VoidPacket;
file: FilePacket;
netTick: NetTickPacket;
stringCmd: StringCmdPacket;
sigOnState: SigOnStatePacket;
print: PrintPacket;
serverInfo: ServerInfoPacket;
setPause: SetPausePacket;
setView: SetViewPacket;
fixAngle: FixAnglePacket;
preFetch: PreFetchPacket;
getCvarValue: GetCvarValuePacket;
}
export enum PacketTypeId {
file = 2, file = 2,
netTick = 3, netTick = 3,
stringCmd = 4, stringCmd = 4,

View file

@ -1,13 +1,15 @@
import {SendPropDefinition, SendPropFlag, SendPropType} from './SendPropDefinition'; import {SendPropDefinition, SendPropFlag, SendPropType} from './SendPropDefinition';
export type SendTableName = string;
export class SendTable { export class SendTable {
public name: string; public name: SendTableName;
public props: SendPropDefinition[]; public props: SendPropDefinition[];
private cachedFlattenedProps: SendPropDefinition[]; private cachedFlattenedProps: SendPropDefinition[];
constructor(name) { constructor(name) {
this.name = name; this.name = name;
this.props = []; this.props = [];
this.cachedFlattenedProps = []; this.cachedFlattenedProps = [];
} }
@ -67,7 +69,7 @@ export class SendTable {
private flatten() { private flatten() {
const excludes: SendPropDefinition[] = this.excludes; const excludes: SendPropDefinition[] = this.excludes;
const props: SendPropDefinition[] = []; const props: SendPropDefinition[] = [];
this.getAllProps(excludes, props); this.getAllProps(excludes, props);
// sort often changed props before the others // sort often changed props before the others
@ -75,8 +77,8 @@ export class SendTable {
for (let i = 0; i < props.length; i++) { for (let i = 0; i < props.length; i++) {
if (props[i].hasFlag(SendPropFlag.SPROP_CHANGES_OFTEN)) { if (props[i].hasFlag(SendPropFlag.SPROP_CHANGES_OFTEN)) {
if (i !== start) { if (i !== start) {
const temp = props[i]; const temp = props[i];
props[i] = props[start]; props[i] = props[start];
props[start] = temp; props[start] = temp;
} }
start++; start++;

View file

@ -1,7 +1,7 @@
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import {Parser} from './Parser'; import {Parser} from './Parser';
import {StreamDemo} from './StreamDemo'; import {StreamDemo} from './StreamDemo';
import {PacketType} from './Data/Packet'; import {PacketTypeId} from './Data/Packet';
export {StreamDemo} from './StreamDemo'; export {StreamDemo} from './StreamDemo';
@ -30,9 +30,9 @@ export class Demo {
public getParser(fastMode: boolean = false) { public getParser(fastMode: boolean = false) {
if (!this.parser) { if (!this.parser) {
const skippedPackets = fastMode ? [ const skippedPackets = fastMode ? [
PacketType.packetEntities, PacketTypeId.packetEntities,
PacketType.tempEntities, PacketTypeId.tempEntities,
PacketType.entityMessage, PacketTypeId.entityMessage,
] : []; ] : [];
this.parser = new Parser(this.stream, skippedPackets); this.parser = new Parser(this.stream, skippedPackets);
} }

View file

@ -8,14 +8,14 @@ import {Packet} from './Parser/Message/Packet';
import {Parser as MessageParser} from './Parser/Message/Parser'; import {Parser as MessageParser} from './Parser/Message/Parser';
import {StringTable} from './Parser/Message/StringTable'; import {StringTable} from './Parser/Message/StringTable';
import {UserCmd} from './Parser/Message/UserCmd'; import {UserCmd} from './Parser/Message/UserCmd';
import {PacketType} from './Data/Packet'; import {PacketTypeId} from './Data/Packet';
export class Parser extends EventEmitter { export class Parser extends EventEmitter {
public stream: BitStream; public stream: BitStream;
public match: Match; public match: Match;
protected skipPackets: PacketType[]; protected skipPackets: PacketTypeId[];
constructor(stream: BitStream, skipPackets: PacketType[] = []) { constructor(stream: BitStream, skipPackets: PacketTypeId[] = []) {
super(); super();
this.stream = stream; this.stream = stream;
this.match = new Match(); this.match = new Match();

View file

@ -15,66 +15,66 @@ import {EncodeVoiceData, ParseVoiceData} from '../Packet/VoiceData';
import {EncodeVoiceInit, ParseVoiceInit} from '../Packet/VoiceInit'; import {EncodeVoiceInit, ParseVoiceInit} from '../Packet/VoiceInit';
import {Parser} from './Parser'; import {Parser} from './Parser';
import {Packet as IPacket, PacketType} from '../../Data/Packet'; import {Packet as IPacket, PacketTypeId} from '../../Data/Packet';
export class Packet extends Parser { export class Packet extends Parser {
private static parsers: Map<PacketType, PacketHandler<IPacket>> = new Map([ private static parsers: Map<PacketTypeId, PacketHandler<IPacket>> = new Map([
[PacketType.file, [PacketTypeId.file,
make('file', 'transferId{32}fileName{s}requested{b}')], make('file', 'transferId{32}fileName{s}requested{b}')],
[PacketType.netTick, [PacketTypeId.netTick,
make('netTick', 'tick{32}frameTime{16}stdDev{16}')], make('netTick', 'tick{32}frameTime{16}stdDev{16}')],
[PacketType.stringCmd, [PacketTypeId.stringCmd,
make('stringCmd', 'command{s}')], make('stringCmd', 'command{s}')],
[PacketType.setConVar, [PacketTypeId.setConVar,
{parser: ParseSetConVar, encoder: EncodeSetConVar}], {parser: ParseSetConVar, encoder: EncodeSetConVar}],
[PacketType.sigOnState, [PacketTypeId.sigOnState,
make('sigOnState', 'state{8}count{32}')], make('sigOnState', 'state{8}count{32}')],
[PacketType.print, [PacketTypeId.print,
make('print', 'value{s}')], make('print', 'value{s}')],
[PacketType.serverInfo, [PacketTypeId.serverInfo,
make('serverInfo', make('serverInfo',
'version{16}serverCount{32}stv{b}dedicated{b}maxCrc{32}maxClasses{16}' + 'version{16}serverCount{32}stv{b}dedicated{b}maxCrc{32}maxClasses{16}' +
'mapHash{128}playerCount{8}maxPlayerCount{8}intervalPerTick{f32}platform{s1}' + 'mapHash{128}playerCount{8}maxPlayerCount{8}intervalPerTick{f32}platform{s1}' +
'game{s}map{s}skybox{s}serverName{s}replay{b}')], 'game{s}map{s}skybox{s}serverName{s}replay{b}')],
[PacketType.classInfo, [PacketTypeId.classInfo,
{parser: ParseClassInfo, encoder: EncodeClassInfo}], {parser: ParseClassInfo, encoder: EncodeClassInfo}],
[PacketType.setPause, [PacketTypeId.setPause,
make('setPause', 'paused{b}')], make('setPause', 'paused{b}')],
[PacketType.createStringTable, [PacketTypeId.createStringTable,
{parser: ParseCreateStringTable, encoder: EncodeCreateStringTable}], {parser: ParseCreateStringTable, encoder: EncodeCreateStringTable}],
[PacketType.updateStringTable, [PacketTypeId.updateStringTable,
{parser: ParseUpdateStringTable, encoder: EncodeUpdateStringTable}], {parser: ParseUpdateStringTable, encoder: EncodeUpdateStringTable}],
[PacketType.voiceInit, [PacketTypeId.voiceInit,
{parser: ParseVoiceInit, encoder: EncodeVoiceInit}], {parser: ParseVoiceInit, encoder: EncodeVoiceInit}],
[PacketType.voiceData, [PacketTypeId.voiceData,
{parser: ParseVoiceData, encoder: EncodeVoiceData}], {parser: ParseVoiceData, encoder: EncodeVoiceData}],
[PacketType.parseSounds, [PacketTypeId.parseSounds,
{parser: ParseParseSounds, encoder: EncodeParseSounds}], {parser: ParseParseSounds, encoder: EncodeParseSounds}],
[PacketType.setView, [PacketTypeId.setView,
make('setView', 'index{11}')], make('setView', 'index{11}')],
[PacketType.fixAngle, [PacketTypeId.fixAngle,
make('fixAngle', 'relative{b}x{16}y{16}z{16}')], make('fixAngle', 'relative{b}x{16}y{16}z{16}')],
[PacketType.bspDecal, [PacketTypeId.bspDecal,
{parser: ParseBSPDecal, encoder: EncodeBSPDecal}], {parser: ParseBSPDecal, encoder: EncodeBSPDecal}],
[PacketType.userMessage, [PacketTypeId.userMessage,
{parser: ParseUserMessage, encoder: voidEncoder}], {parser: ParseUserMessage, encoder: voidEncoder}],
[PacketType.entityMessage, [PacketTypeId.entityMessage,
make('entityMessage', 'index{11}classId{9}length{11}data{$length}')], make('entityMessage', 'index{11}classId{9}length{11}data{$length}')],
[PacketType.gameEvent, [PacketTypeId.gameEvent,
{parser: ParseGameEvent, encoder: voidEncoder}], {parser: ParseGameEvent, encoder: voidEncoder}],
[PacketType.packetEntities, [PacketTypeId.packetEntities,
{parser: ParsePacketEntities, encoder: voidEncoder}], {parser: ParsePacketEntities, encoder: voidEncoder}],
[PacketType.tempEntities, [PacketTypeId.tempEntities,
{parser: ParseTempEntities, encoder: voidEncoder}], {parser: ParseTempEntities, encoder: voidEncoder}],
[PacketType.preFetch, [PacketTypeId.preFetch,
make('preFetch', 'index{14}')], make('preFetch', 'index{14}')],
[PacketType.menu, [PacketTypeId.menu,
make('menu', 'type{u16}length{u16}data{$length*8}')], make('menu', 'type{u16}length{u16}data{$length*8}')],
[PacketType.gameEventList, [PacketTypeId.gameEventList,
{parser: ParseGameEventList, encoder: EncodeGameEventList}], {parser: ParseGameEventList, encoder: EncodeGameEventList}],
[PacketType.getCvarValue, [PacketTypeId.getCvarValue,
make('getCvarValue', 'cookie{32}value{s}')], make('getCvarValue', 'cookie{32}value{s}')],
[PacketType.cmdKeyValues, [PacketTypeId.cmdKeyValues,
make('cmdKeyValues', 'length{32}data{$length}')], make('cmdKeyValues', 'length{32}data{$length}')],
]); ]);
@ -82,7 +82,7 @@ export class Packet extends Parser {
const packets: IPacket[] = []; const packets: IPacket[] = [];
let lastPacketType = 0; let lastPacketType = 0;
while (this.bitsLeft > 6) { // last 6 bits for NOOP while (this.bitsLeft > 6) { // last 6 bits for NOOP
const type = this.stream.readBits(6) as PacketType; const type = this.stream.readBits(6) as PacketTypeId;
if (type !== 0) { if (type !== 0) {
const parser = Packet.parsers.get(type); const parser = Packet.parsers.get(type);
if (parser) { if (parser) {
@ -90,7 +90,7 @@ export class Packet extends Parser {
const packet = parser.parser(this.stream, this.match, skip); const packet = parser.parser(this.stream, this.match, skip);
packets.push(packet); packets.push(packet);
} else { } else {
throw new Error(`Unknown packet type ${type} just parsed a ${PacketType[lastPacketType]}`); throw new Error(`Unknown packet type ${type} just parsed a ${PacketTypeId[lastPacketType]}`);
} }
lastPacketType = type; lastPacketType = type;
} }

View file

@ -1,6 +1,6 @@
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import {Match} from '../../Data/Match'; import {Match} from '../../Data/Match';
import {Packet, PacketType} from '../../Data/Packet'; import {Packet, PacketTypeId} from '../../Data/Packet';
import {MessageType} from '../../Parser'; import {MessageType} from '../../Parser';
export abstract class Parser { export abstract class Parser {
@ -9,9 +9,9 @@ export abstract class Parser {
protected stream: BitStream; protected stream: BitStream;
protected length: number; protected length: number;
protected match: Match; protected match: Match;
protected skippedPackets: PacketType[]; protected skippedPackets: PacketTypeId[];
constructor(type: MessageType, tick: number, stream: BitStream, length: number, match: Match, skippedPacket: PacketType[] = []) { constructor(type: MessageType, tick: number, stream: BitStream, length: number, match: Match, skippedPacket: PacketTypeId[] = []) {
this.type = type; this.type = type;
this.tick = tick; this.tick = tick;
this.stream = stream; this.stream = stream;

View file

@ -1,6 +1,6 @@
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import {Match} from '../../Data/Match'; import {Match} from '../../Data/Match';
import {Packet, PacketType, VoidPacket} from '../../Data/Packet'; import {Packet, VoidPacket} from '../../Data/Packet';
export type Parser<P extends Packet> = (stream: BitStream, match?: Match, skip?: boolean) => P; export type Parser<P extends Packet> = (stream: BitStream, match?: Match, skip?: boolean) => P;
export type Encoder<P extends Packet> = (packet: P, stream: BitStream, match?: Match) => void; export type Encoder<P extends Packet> = (packet: P, stream: BitStream, match?: Match) => void;

View file

@ -1,8 +1,8 @@
import {Packet} from '../../Data/Packet'; import {Packet, PacketType} from '../../Data/Packet';
import {Encoder, PacketHandler, Parser} from './Parser'; import {Encoder, PacketHandler, Parser} from './Parser';
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
export function make<P extends Packet>(name: P['packetType'], definition: string): PacketHandler<P> { export function make<P extends Packet>(name: PacketType, definition: string): PacketHandler<P> {
const parts = definition.split('}'); const parts = definition.split('}');
const items = parts.map((part) => { const items = parts.map((part) => {
return part.split('{'); return part.split('{');