Built and signed on GitHub ActionsBuilt and signed on GitHub Actions
Built and signed on GitHub Actions
latest
NeKzor/sdpWorks with
•JSR Score70%•This package works with Cloudflare Workers, Node.js, Deno, Bun, Browsers




Downloads4/wk
•Publisheda year ago (0.10.1)
Simple Source Engine demo parser. 🔧
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803// Copyright (c) 2018-2024, NeKz // SPDX-License-Identifier: MIT import { SoundInfo } from './SoundInfo.ts'; import { type GameEvent, GameEventDescriptor, GameEventManager } from './GameEventManager.ts'; import { SourceDemoBuffer } from '../buffer.ts'; import type { SourceDemo } from '../demo.ts'; import type { Vector } from './Vector.ts'; import { type UserMessage, UserMessages } from './UserMessages.ts'; export class NetMessage { type: number; constructor(type: number) { this.type = type; } getType(): number { return this.type; } getName(): string { return this.constructor.name; } read(_buf: SourceDemoBuffer, _demo: SourceDemo) { throw new Error(`read() for ${this.constructor.name} not implemented!`); } write(_buf: SourceDemoBuffer, _demo: SourceDemo) { throw new Error(`write() for ${this.constructor.name} not implemented!`); } } export class NetNop extends NetMessage { override read() {} override write() {} } export class NetDisconnect extends NetMessage { text?: string; override read(buf: SourceDemoBuffer) { this.text = buf.readASCIIString(); } override write(buf: SourceDemoBuffer) { buf.writeASCIIString(this.text!); } } export class NetFile extends NetMessage { transferId?: number; fileName?: string; fileRequested?: boolean; unk?: boolean; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.transferId = buf.readInt32(); this.fileName = buf.readASCIIString(); this.fileRequested = buf.readBoolean(); if (demo.demoProtocol === 4) { this.unk = buf.readBoolean(); } } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeInt32(this.transferId!); buf.writeASCIIString(this.fileName!); buf.writeBoolean(this.fileRequested!); if (demo.demoProtocol === 4) { buf.writeBoolean(this.unk!); } } } export class NetSplitScreenUser extends NetMessage { unk?: boolean; override read(buf: SourceDemoBuffer) { this.unk = buf.readBoolean(); } override write(buf: SourceDemoBuffer) { buf.writeBoolean(this.unk!); } } export class NetTick extends NetMessage { tick?: number; hostFrameTime?: number; hostFrameTimeStdDeviation?: number; override read(buf: SourceDemoBuffer) { const NET_TICK_SCALEUP = 100_000; this.tick = buf.readInt32(); this.hostFrameTime = buf.readInt16() / NET_TICK_SCALEUP; this.hostFrameTimeStdDeviation = buf.readInt16() / NET_TICK_SCALEUP; } override write(buf: SourceDemoBuffer) { const NET_TICK_SCALEUP = 100_000; buf.writeInt32(this.tick!); const [hostFrameTime, hostFrameTimeStdDeviation] = new Float32Array([ this.hostFrameTime! * NET_TICK_SCALEUP, this.hostFrameTimeStdDeviation! * NET_TICK_SCALEUP, ]); buf.writeInt16(hostFrameTime!); buf.writeInt16(hostFrameTimeStdDeviation!); } } export class NetStringCmd extends NetMessage { command?: string; override read(buf: SourceDemoBuffer) { this.command = buf.readASCIIString(); } override write(buf: SourceDemoBuffer) { buf.writeASCIIString(this.command!); } } export class NetSetConVar extends NetMessage { convars?: { name: string; value: string }[]; override read(buf: SourceDemoBuffer) { this.convars = []; let length = buf.readInt8(); while (length--) { this.convars.push({ name: buf.readASCIIString(), value: buf.readASCIIString(), }); } } override write(buf: SourceDemoBuffer) { buf.writeInt8(this.convars!.length); this.convars!.forEach(({ name, value }) => { buf.writeASCIIString(name); buf.writeASCIIString(value); }); } } export class NetSignonState extends NetMessage { signonState?: number; spawnCount?: number; numServerPlayers?: number; playersNetworkIdsCount?: number; playersNetworkIds?: Uint8Array; mapNameLength?: number; mapName?: string; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.signonState = buf.readInt8(); this.spawnCount = buf.readInt32(); if (demo.isNewEngine()) { this.numServerPlayers = buf.readInt32(); this.playersNetworkIdsCount = buf.readInt32(); if (this.playersNetworkIdsCount > 0) { this.playersNetworkIds = buf.readArrayBuffer(this.playersNetworkIdsCount); } this.mapNameLength = buf.readInt32(); if (this.mapNameLength > 0) { this.mapName = buf.readASCIIString(this.mapNameLength); } } } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeInt8(this.signonState!); buf.writeInt32(this.spawnCount!); if (demo.isNewEngine()) { buf.writeInt32(this.numServerPlayers!); buf.writeInt32(this.playersNetworkIdsCount!); if (this.playersNetworkIdsCount! > 0) { buf.writeArrayBuffer(this.playersNetworkIds!, this.playersNetworkIdsCount!); } buf.writeInt32(this.mapNameLength!); if (this.mapNameLength! > 0) { buf.writeASCIIString(this.mapName!, this.mapNameLength); } } } } export class SvcServerInfo extends NetMessage { protocol?: number; serverCount?: number; isHltv?: boolean; isDedicated?: boolean; clientCrc?: number; maxClasses?: number; mapCrc?: number; playerSlot?: number; maxClients?: number; unk?: number; tickInterval?: number; cOs?: string; gameDir?: string; mapName?: string; skyName?: string; hostName?: string; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.protocol = buf.readInt16(); this.serverCount = buf.readInt32(); this.isHltv = buf.readBoolean(); this.isDedicated = buf.readBoolean(); this.clientCrc = buf.readInt32(); this.maxClasses = buf.readInt16(); this.mapCrc = buf.readInt32(); this.playerSlot = buf.readInt8(); this.maxClients = buf.readInt8(); if (demo.isNewEngine()) { this.unk = buf.readInt32(); } else if (demo.networkProtocol === 24) { this.unk = buf.readBits(96); } this.tickInterval = buf.readFloat32(); this.cOs = String.fromCharCode(buf.readInt8()); this.gameDir = buf.readASCIIString(); this.mapName = buf.readASCIIString(); this.skyName = buf.readASCIIString(); this.hostName = buf.readASCIIString(); } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeInt16(this.protocol!); buf.writeInt32(this.serverCount!); buf.writeBoolean(this.isHltv!); buf.writeBoolean(this.isDedicated!); buf.writeInt32(this.clientCrc!); buf.writeInt16(this.maxClasses!); buf.writeInt32(this.mapCrc!); buf.writeInt8(this.playerSlot!); buf.writeInt8(this.maxClients!); if (demo.isNewEngine()) { buf.writeInt32(this.unk!); } else if (demo.networkProtocol === 24) { buf.writeBits(this.unk!, 96); } buf.writeFloat32(this.tickInterval!); buf.writeInt8(this.cOs!.charCodeAt(0)); buf.writeASCIIString(this.gameDir!); buf.writeASCIIString(this.mapName!); buf.writeASCIIString(this.skyName!); buf.writeASCIIString(this.hostName!); } } export class SvcSendTable extends NetMessage { needsDecoder?: boolean; propsLength?: number; props?: number; override read(buf: SourceDemoBuffer) { this.needsDecoder = buf.readBoolean(); this.propsLength = buf.readInt16(); this.props = buf.readBits(this.propsLength); } override write(buf: SourceDemoBuffer) { buf.writeBoolean(this.needsDecoder!); buf.writeInt16(this.propsLength!); buf.writeBits(this.props!, this.propsLength!); } } export class SvcClassInfo extends NetMessage { length?: number; createOnClient?: boolean; serverClasses?: { classId: number; className: string; dataTableName: string; }[]; override read(buf: SourceDemoBuffer) { this.length = buf.readInt16(); this.createOnClient = buf.readBoolean(); if (!this.createOnClient) { this.serverClasses = []; let count = this.length; while (count--) { this.serverClasses.push({ classId: buf.readBits(Math.log2(count) + 1), className: buf.readASCIIString(), dataTableName: buf.readASCIIString(), }); } } } override write(buf: SourceDemoBuffer) { buf.writeInt16(this.length!); buf.writeBoolean(this.createOnClient!); if (!this.createOnClient) { let count = this.length!; this.serverClasses!.forEach(({ classId, className, dataTableName }) => { --count; buf.writeBits(classId, Math.log2(count) + 1); buf.writeASCIIString(className); buf.writeASCIIString(dataTableName); }); } } } export class SvcSetPause extends NetMessage { paused?: boolean; override read(buf: SourceDemoBuffer) { this.paused = buf.readBoolean(); } override write(buf: SourceDemoBuffer) { buf.writeBoolean(this.paused!); } } export class SvcCreateStringTable extends NetMessage { name?: string; maxEntries?: number; numEntries?: number; userDataFixedSize?: boolean; userDataSize?: number; userDataSizeBits?: number; flags?: number; stringDataLength?: number; stringData?: SourceDemoBuffer; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.name = buf.readASCIIString(); this.maxEntries = buf.readInt16(); this.numEntries = buf.readBits(Math.log2(this.maxEntries) + 1); this.stringDataLength = buf.readBits(20); this.userDataFixedSize = buf.readBoolean(); this.userDataSize = this.userDataFixedSize ? buf.readBits(12) : 0; this.userDataSizeBits = this.userDataFixedSize ? buf.readBits(4) : 0; this.flags = buf.readBits(demo.isNewEngine() ? 2 : 1); this.stringData = buf.readBitStream(this.stringDataLength); } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeASCIIString(this.name!); buf.writeInt16(this.maxEntries!); buf.writeBits(this.numEntries!, Math.log2(this.maxEntries!) + 1); buf.writeBits(this.stringDataLength!, 20); buf.writeBoolean(this.userDataFixedSize!); this.userDataFixedSize && buf.writeBits(this.userDataSize!, 12); this.userDataFixedSize && buf.writeBits(this.userDataSizeBits!, 4); buf.writeBits(this.flags!, demo.isNewEngine() ? 2 : 1); buf.writeBitStream(this.stringData!, this.stringDataLength!); } } export class SvcUpdateStringTable extends NetMessage { tableId?: number; numChangedEntries?: number; stringDataLength?: number; stringData?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.tableId = buf.readBits(5); this.numChangedEntries = buf.readBoolean() ? buf.readInt16() : 1; this.stringDataLength = buf.readBits(20); this.stringData = buf.readBitStream(this.stringDataLength); } override write(buf: SourceDemoBuffer) { buf.writeBits(this.tableId!, 5); buf.writeBoolean(this.numChangedEntries !== 1); this.numChangedEntries !== 1 && buf.writeInt16(this.numChangedEntries!); buf.writeBits(this.stringDataLength!, 20); buf.writeBitStream(this.stringData!, this.stringDataLength!); } } export class SvcVoiceInit extends NetMessage { codec?: string; quality?: number; unk?: number; override read(buf: SourceDemoBuffer) { this.codec = buf.readASCIIString(); this.quality = buf.readInt8(); if (this.quality === 255) this.unk = buf.readFloat32(); } override write(buf: SourceDemoBuffer) { buf.writeASCIIString(this.codec!); buf.writeInt8(this.quality!); this.unk !== undefined && buf.writeFloat32(this.unk!); } } export class SvcVoiceData extends NetMessage { client?: number; proximity?: number; voiceDataLength?: number; voiceData?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.client = buf.readInt8(); this.proximity = buf.readInt8(); this.voiceDataLength = buf.readInt16(); this.voiceData = buf.readBitStream(this.voiceDataLength); } override write(buf: SourceDemoBuffer) { buf.writeInt8(this.client!); buf.writeInt8(this.proximity!); buf.writeInt16(this.voiceDataLength!); buf.writeBitStream(this.voiceData!, this.voiceDataLength!); } } export class SvcPrint extends NetMessage { message?: string; override read(buf: SourceDemoBuffer) { this.message = buf.readASCIIString(); } override write(buf: SourceDemoBuffer) { buf.writeASCIIString(this.message!); } } export class SvcSounds extends NetMessage { reliableSound?: boolean; soundsLength?: number; soundsDataLength?: number; soundsData?: SourceDemoBuffer; sounds?: SoundInfo[]; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.reliableSound = buf.readBoolean(); this.soundsLength = this.reliableSound ? 1 : buf.readBits(8); this.soundsDataLength = this.reliableSound ? buf.readBits(8) : buf.readBits(16); this.soundsData = buf.readBitStream(this.soundsDataLength); this.sounds = []; if (demo.demoProtocol === 3) { let sounds = this.soundsLength; while (sounds--) { const sound = new SoundInfo(); sound.read(this.soundsData); this.sounds.push(sound); } } } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeBoolean(this.reliableSound!); !this.reliableSound && buf.writeBits(this.soundsLength!, 8); if (demo.demoProtocol === 3) { const data = SourceDemoBuffer.allocateBits(this.soundsData!.length); this.sounds!.forEach((sound) => sound.write(data)); this.soundsData = data.clone(); } buf.writeBits(this.soundsDataLength!, this.reliableSound ? 8 : 16); buf.writeBitStream(this.soundsData!, this.soundsDataLength!); } } export class SvcSetView extends NetMessage { entityIndex?: number; override read(buf: SourceDemoBuffer) { this.entityIndex = buf.readBits(11); } override write(buf: SourceDemoBuffer) { buf.writeBits(this.entityIndex!, 11); } } export class SvcFixAngle extends NetMessage { relative?: boolean; angle?: [number, number, number]; override read(buf: SourceDemoBuffer) { this.relative = buf.readBoolean(); this.angle = [buf.readInt16(), buf.readInt16(), buf.readInt16()]; } override write(buf: SourceDemoBuffer) { buf.writeBoolean(this.relative!); this.angle!.forEach((ang) => buf.writeInt16(ang)); } } export class SvcCrosshairAngle extends NetMessage { angle?: [number, number, number]; override read(buf: SourceDemoBuffer) { this.angle = [buf.readInt16(), buf.readInt16(), buf.readInt16()]; } override write(buf: SourceDemoBuffer) { this.angle!.forEach((ang) => buf.writeInt16(ang)); } } export class SvcBspDecal extends NetMessage { pos?: Vector; decalTextureIndex?: number; entityIndex?: number; modelIndex?: number; lowPriority?: boolean; override read(buf: SourceDemoBuffer) { this.pos = buf.readVectorCoord(); this.decalTextureIndex = buf.readBits(9); if (buf.readBoolean()) { this.entityIndex = buf.readBits(11); this.modelIndex = buf.readBits(11); } this.lowPriority = buf.readBoolean(); } override write(buf: SourceDemoBuffer) { buf.writeVectorCoord(this.pos!); buf.writeBits(this.decalTextureIndex!, 9); buf.writeBoolean(this.entityIndex !== undefined); if (this.entityIndex !== undefined) { buf.writeBits(this.entityIndex!, 11); buf.writeBits(this.modelIndex!, 11); } buf.writeBoolean(this.lowPriority!); } } export class SvcSplitScreen extends NetMessage { unk?: number; dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.unk = buf.readBits(1); this.dataLength = buf.readBits(11); this.data = buf.readBitStream(this.dataLength); } override write(buf: SourceDemoBuffer) { buf.writeBits(this.unk!, 1); buf.writeBits(this.dataLength!, 11); buf.writeBitStream(this.data!, this.dataLength!); } } export class SvcUserMessage extends NetMessage { msgType?: number; msgDataLength?: number; msgData?: SourceDemoBuffer; userMessage?: UserMessage; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.msgType = buf.readInt8(); this.msgDataLength = buf.readBits(demo.isNewEngine() ? 12 : 11); this.msgData = buf.readBitStream(this.msgDataLength); if (demo.isPortal2Engine) { const userMessageType = UserMessages.Portal2Engine[this.msgType]; if (userMessageType) { this.userMessage = new userMessageType(this.msgType); this.userMessage.read(this.msgData, demo); } } } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeInt8(this.msgType!); if (this.userMessage) { const data = SourceDemoBuffer.from(this.msgData!); this.userMessage.write(data, demo); this.msgData = data.reset(); } buf.writeBits(this.msgDataLength!, demo.isNewEngine() ? 12 : 11); buf.writeBitStream(this.msgData!, this.msgDataLength!); } } export class SvcEntityMessage extends NetMessage { entityIndex?: number; classId?: number; dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.entityIndex = buf.readBits(11); this.classId = buf.readBits(9); this.dataLength = buf.readBits(11); this.data = buf.readBitStream(this.dataLength); } override write(buf: SourceDemoBuffer) { buf.writeBits(this.entityIndex!, 11); buf.writeBits(this.classId!, 9); buf.writeBits(this.dataLength!, 11); buf.writeBitStream(this.data!, this.dataLength!); } } export class SvcGameEvent extends NetMessage { event?: GameEvent; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.data = buf.readBitStream(buf.readBits(11)); if (demo.gameEventManager) { const data = SourceDemoBuffer.from(this.data); this.event = demo.gameEventManager.deserializeEvent(data); } } override write(buf: SourceDemoBuffer, demo: SourceDemo) { if (demo.gameEventManager) { const data = SourceDemoBuffer.from(this.data!); demo.gameEventManager.serializeEvent(this.event!, data); this.data = data.reset(); } buf.writeBits(this.data!.length!, 11); buf.writeBitStream(this.data!, this.data!.length); } } export class SvcPacketEntities extends NetMessage { maxEntries?: number; isDelta?: boolean; deltaFrom?: number; baseLine?: boolean; updatedEntries?: number; updateBaseline?: boolean; dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.maxEntries = buf.readBits(11); this.isDelta = buf.readBoolean(); this.deltaFrom = this.isDelta ? buf.readInt32() : 0; this.baseLine = buf.readBoolean(); this.updatedEntries = buf.readBits(11); this.dataLength = buf.readBits(20); this.updateBaseline = buf.readBoolean(); this.data = buf.readBitStream(this.dataLength); } override write(buf: SourceDemoBuffer) { buf.writeBits(this.maxEntries!, 11); buf.writeBoolean(this.isDelta!); this.isDelta && buf.writeInt32(this.deltaFrom!); buf.writeBoolean(this.baseLine!); buf.writeBits(this.updatedEntries!, 11); buf.writeBits(this.dataLength!, 20); buf.writeBoolean(this.updateBaseline!); buf.writeBitStream(this.data!, this.dataLength!); } } export class SvcTempEntities extends NetMessage { numEntries?: number; dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.numEntries = buf.readInt8(); this.dataLength = buf.readBits(17); this.data = buf.readBitStream(this.dataLength); } override write(buf: SourceDemoBuffer) { buf.writeInt8(this.numEntries!); buf.writeBits(this.data!.length, 17); buf.writeBitStream(this.data!, this.dataLength!); } } export class SvcPrefetch extends NetMessage { soundIndex?: number; override read(buf: SourceDemoBuffer) { this.soundIndex = buf.readBits(13); } override write(buf: SourceDemoBuffer) { buf.writeBits(this.soundIndex!, 13); } } export class SvcMenu extends NetMessage { menuType?: number; dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.menuType = buf.readInt16(); this.dataLength = buf.readInt32(); this.data = buf.readBitStream(this.dataLength); } override write(buf: SourceDemoBuffer) { buf.writeInt16(this.menuType!); buf.writeInt32(this.dataLength!); buf.writeBitStream(this.data!, this.dataLength!); } } export class SvcGameEventList extends NetMessage { events?: number; dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer, demo: SourceDemo) { this.events = buf.readBits(9); this.dataLength = buf.readBits(20); this.data = buf.readBitStream(this.dataLength); const gameEvents = []; let events = this.events; while (events--) { const descriptor = new GameEventDescriptor(); descriptor.read(this.data); gameEvents.push(descriptor); } demo.gameEventManager = new GameEventManager(gameEvents); } override write(buf: SourceDemoBuffer, demo: SourceDemo) { buf.writeBits(this.events!, 9); const data = SourceDemoBuffer.allocate(this.dataLength!); demo.gameEventManager!.gameEvents.forEach((descriptor) => descriptor.write(data)); this.data = data.clone(); buf.writeBits(this.dataLength!, 20); buf.writeBitStream(this.data!, this.dataLength!); } } export class SvcGetCvarValue extends NetMessage { cookie?: number; cvarName?: string; override read(buf: SourceDemoBuffer) { this.cookie = buf.readInt32(); this.cvarName = buf.readASCIIString(); } override write(buf: SourceDemoBuffer) { buf.writeInt32(this.cookie!); buf.writeASCIIString(this.cvarName!); } } export class SvcCmdKeyValues extends NetMessage { buffer?: Uint8Array; override read(buf: SourceDemoBuffer) { const length = buf.readInt32(); this.buffer = buf.readArrayBuffer(length); } override write(buf: SourceDemoBuffer) { buf.writeInt32(this.buffer!.byteLength); buf.writeArrayBuffer(this.buffer!.buffer, this.buffer!.byteLength); } } export class SvcPaintMapData extends NetMessage { dataLength?: number; data?: SourceDemoBuffer; override read(buf: SourceDemoBuffer) { this.dataLength = buf.readInt32(); this.data = buf.readBitStream(this.dataLength); } override write(buf: SourceDemoBuffer) { buf.writeInt32(this.data!.length); buf.writeBitStream(this.data!, this.dataLength!); } } export const NetMessages = { Portal2Engine: [ NetNop, // 0 NetDisconnect, // 1 NetFile, // 2 NetSplitScreenUser, // 3 NetTick, // 4 NetStringCmd, // 5 NetSetConVar, // 6 NetSignonState, // 7 SvcServerInfo, // 8 SvcSendTable, // 9 SvcClassInfo, // 10 SvcSetPause, // 11 SvcCreateStringTable, // 12 SvcUpdateStringTable, // 13 SvcVoiceInit, // 14 SvcVoiceData, // 15 SvcPrint, // 16 SvcSounds, // 17 SvcSetView, // 18 SvcFixAngle, // 19 SvcCrosshairAngle, // 20 SvcBspDecal, // 21 SvcSplitScreen, // 22 SvcUserMessage, // 23 SvcEntityMessage, // 24 SvcGameEvent, // 25 SvcPacketEntities, // 26 SvcTempEntities, // 27 SvcPrefetch, // 28 SvcMenu, // 29 SvcGameEventList, // 30 SvcGetCvarValue, // 31 SvcCmdKeyValues, // 32 SvcPaintMapData, // 33 ] as (typeof NetMessage | undefined)[], HalfLife2Engine: [ NetNop, // 0 NetDisconnect, // 1 NetFile, // 2 NetTick, // 3 NetStringCmd, // 4 NetSetConVar, // 5 NetSignonState, // 6 SvcPrint, // 7 SvcServerInfo, // 8 SvcSendTable, // 9 SvcClassInfo, // 10 SvcSetPause, // 11 SvcCreateStringTable, // 12 SvcUpdateStringTable, // 13 SvcVoiceInit, // 14 SvcVoiceData, // 15 undefined, SvcSounds, // 17 SvcSetView, // 18 SvcFixAngle, // 19 SvcCrosshairAngle, // 20 SvcBspDecal, // 21 undefined, SvcUserMessage, // 23 SvcEntityMessage, // 24 SvcGameEvent, // 25 SvcPacketEntities, // 26 SvcTempEntities, // 27 SvcPrefetch, // 28 SvcMenu, // 29 SvcGameEventList, // 30 SvcGetCvarValue, // 31 SvcCmdKeyValues, // 32 ] as (typeof NetMessage | undefined)[], NetMessage, NetNop, NetDisconnect, NetFile, NetSplitScreenUser, NetTick, NetStringCmd, NetSetConVar, NetSignonState, SvcServerInfo, SvcSendTable, SvcClassInfo, SvcSetPause, SvcCreateStringTable, SvcUpdateStringTable, SvcVoiceInit, SvcVoiceData, SvcPrint, SvcSounds, SvcSetView, SvcFixAngle, SvcCrosshairAngle, SvcBspDecal, SvcSplitScreen, SvcUserMessage, SvcEntityMessage, SvcGameEvent, SvcPacketEntities, SvcTempEntities, SvcPrefetch, SvcMenu, SvcGameEventList, SvcGetCvarValue, SvcCmdKeyValues, SvcPaintMapData, };