@quake2ts/server 0.0.1 → 0.0.740
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index.cjs → cjs/index.cjs} +175 -224
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/{index.js → esm/index.js} +44 -82
- package/dist/esm/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/{client.d.ts → types/client.d.ts} +1 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/{dedicated.d.ts → types/dedicated.d.ts} +1 -0
- package/dist/types/dedicated.d.ts.map +1 -0
- package/dist/{index.d.ts → types/index.d.ts} +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{net → types/net}/nodeWsDriver.d.ts +1 -0
- package/dist/types/net/nodeWsDriver.d.ts.map +1 -0
- package/dist/{protocol → types/protocol}/player.d.ts +1 -0
- package/dist/types/protocol/player.d.ts.map +1 -0
- package/dist/{protocol → types/protocol}/write.d.ts +1 -0
- package/dist/types/protocol/write.d.ts.map +1 -0
- package/dist/{protocol.d.ts → types/protocol.d.ts} +1 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/{server.d.ts → types/server.d.ts} +1 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/{transport.d.ts → types/transport.d.ts} +1 -0
- package/dist/types/transport.d.ts.map +1 -0
- package/dist/{transports → types/transports}/websocket.d.ts +1 -0
- package/dist/types/transports/websocket.d.ts.map +1 -0
- package/package.json +26 -14
- package/tsconfig.json +11 -5
- package/tsup.config.ts +10 -0
- package/dist/client.js +0 -100
- package/dist/dedicated.js +0 -1104
- package/dist/net/nodeWsDriver.js +0 -122
- package/dist/protocol/player.js +0 -1
- package/dist/protocol/write.js +0 -167
- package/dist/protocol.js +0 -71
- package/dist/server.js +0 -12
- package/dist/transport.js +0 -1
- package/dist/transports/websocket.js +0 -38
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/net/nodeWsDriver.ts","../../src/client.ts","../../src/protocol.ts","../../src/server.ts","../../src/protocol/write.ts","../../src/transports/websocket.ts","../../src/dedicated.ts"],"names":["resolve","WebSocket","ClientState","UPDATE_BACKUP","NetChan","ClientCommand","ServerState","ServerCommand","TempEntity","WebSocketServer","MAX_CONFIGSTRINGS","MAX_EDICTS","CollisionEntityIndex","BinaryWriter","MulticastType","fs","path","PakArchive","parseBsp","brushes","traceBox","createGame","Solid","createPlayerInventory","createPlayerWeaponStates","writeDeltaEntity","BinaryStream","writePlayerState","writeRemoveEntity","crc8","ConfigStringIndex","inPVS","inPHS","lerpAngle"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NetDriver } from '@quake2ts/shared';\nimport WebSocket from 'ws';\n\nexport class WebSocketNetDriver implements NetDriver {\n private socket: WebSocket | null = null;\n private messageCallback: ((data: Uint8Array) => void) | null = null;\n private closeCallback: (() => void) | null = null;\n private errorCallback: ((error: Error) => void) | null = null;\n\n async connect(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = new WebSocket(url);\n this.socket.binaryType = 'arraybuffer';\n\n this.socket.onopen = () => {\n resolve();\n };\n\n this.socket.onerror = (event) => {\n const error = new Error('WebSocket connection error ' + event.message);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n reject(error);\n };\n\n this.socket.onclose = () => {\n if (this.closeCallback) {\n this.closeCallback();\n }\n this.socket = null;\n };\n\n this.socket.onmessage = (event) => {\n if (this.messageCallback) {\n if (event.data instanceof ArrayBuffer) {\n this.messageCallback(new Uint8Array(event.data));\n } else if (Buffer.isBuffer(event.data)) {\n // ws in Node might return Buffer\n this.messageCallback(new Uint8Array(event.data));\n } else if (Array.isArray(event.data)) {\n // Buffer[]\n const totalLength = event.data.reduce((acc, buf) => acc + buf.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const buf of event.data) {\n result.set(buf, offset);\n offset += buf.length;\n }\n this.messageCallback(result);\n } else {\n console.warn('Received non-binary message from server', typeof event.data);\n }\n }\n };\n\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // Method to attach an existing socket (server-side incoming connection)\n attach(socket: WebSocket) {\n this.socket = socket;\n this.socket.binaryType = 'arraybuffer';\n\n this.socket.onclose = () => {\n if (this.closeCallback) this.closeCallback();\n this.socket = null;\n };\n\n this.socket.onerror = (event) => {\n if (this.errorCallback) this.errorCallback(new Error(event.message));\n };\n\n this.socket.onmessage = (event) => {\n if (this.messageCallback) {\n if (event.data instanceof ArrayBuffer) {\n this.messageCallback(new Uint8Array(event.data));\n } else if (Buffer.isBuffer(event.data)) {\n this.messageCallback(new Uint8Array(event.data));\n } else if (Array.isArray(event.data)) { // ws specific\n // handle fragmentation if necessary, usually it's Buffer[]\n const totalLength = event.data.reduce((acc: number, buf: Buffer) => acc + buf.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const buf of event.data) {\n result.set(buf, offset);\n offset += buf.length;\n }\n this.messageCallback(result);\n }\n }\n };\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n }\n\n send(data: Uint8Array): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(data);\n } else {\n console.warn('Attempted to send data on closed or connecting socket');\n }\n }\n\n onMessage(callback: (data: Uint8Array) => void): void {\n this.messageCallback = callback;\n }\n\n onClose(callback: () => void): void {\n this.closeCallback = callback;\n }\n\n onError(callback: (error: Error) => void): void {\n this.errorCallback = callback;\n }\n\n isConnected(): boolean {\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\n }\n}\n","import { NetDriver, UserCommand, PlayerState, UPDATE_BACKUP, MAX_CONFIGSTRINGS, EntityState, NetChan } from '@quake2ts/shared';\nimport { Entity } from '@quake2ts/game';\n\nexport enum ClientState {\n Free = 0,\n Zombie = 1, // client has been disconnected, but don't reuse connection for a couple seconds\n Connected = 2, // has been assigned to a client_t, but not in game yet\n Spawned = 3, // client is fully in game\n Active = 4 // In game (added to match existing code usage)\n}\n\nexport interface ClientFrame {\n areaBytes: number;\n areaBits: Uint8Array;\n playerState: PlayerState;\n numEntities: number;\n firstEntity: number; // into the circular sv_packet_entities[]\n sentTime: number; // for ping calculations\n entities: EntityState[];\n packetCRC: number; // CRC of the packet sending this frame\n}\n\nexport interface Client {\n index: number; // Client index (0 to maxClients - 1)\n state: ClientState;\n net: NetDriver;\n netchan: NetChan; // Network channel for reliable communication\n userInfo: string;\n\n lastFrame: number; // for delta compression\n lastCmd: UserCommand;\n\n commandMsec: number; // For anti-cheat/speed control\n\n frameLatency: number[]; // [LATENCY_COUNTS]\n ping: number;\n\n messageSize: number[]; // [RATE_MESSAGES]\n rate: number;\n suppressCount: number;\n\n edict: Entity | null; // The player entity\n name: string;\n messageLevel: number;\n\n // The datagram is written to by sound calls, prints, temp ents, etc.\n datagram: Uint8Array; // This needs to be a growable buffer really\n\n frames: ClientFrame[]; // [UPDATE_BACKUP]\n\n // Download state\n download?: Uint8Array;\n downloadSize: number;\n downloadCount: number;\n\n lastMessage: number; // sv.framenum when packet was last received\n lastConnect: number;\n\n challenge: number;\n\n messageQueue: Uint8Array[]; // Queue for incoming packets\n lastPacketEntities: number[]; // List of entity numbers sent in the last packet\n\n // Rate limiting\n commandQueue: UserCommand[];\n lastCommandTime: number;\n commandCount: number;\n}\n\nexport function createClient(index: number, net: NetDriver): Client {\n // Initialize frames array\n const frames: ClientFrame[] = [];\n for (let i = 0; i < UPDATE_BACKUP; i++) {\n frames.push({\n areaBytes: 0,\n areaBits: new Uint8Array(0), // Size depends on map areas\n playerState: createEmptyPlayerState(),\n numEntities: 0,\n firstEntity: 0,\n sentTime: 0,\n entities: [],\n packetCRC: 0\n });\n }\n\n const netchan = new NetChan();\n // Initialize qport - normally we would get this from userinfo or handshake\n netchan.setup(Math.floor(Math.random() * 65536));\n\n return {\n index,\n state: ClientState.Connected,\n net,\n netchan,\n userInfo: '',\n\n lastFrame: 0,\n lastCmd: createEmptyUserCommand(),\n\n commandMsec: 0,\n frameLatency: [],\n ping: 0,\n messageSize: [],\n rate: 25000, // Default rate\n suppressCount: 0,\n\n edict: null,\n name: `Player ${index}`,\n messageLevel: 0,\n\n datagram: new Uint8Array(0),\n\n frames,\n\n downloadSize: 0,\n downloadCount: 0,\n\n lastMessage: 0,\n lastConnect: Date.now(),\n challenge: 0,\n\n messageQueue: [],\n lastPacketEntities: [],\n\n commandQueue: [],\n lastCommandTime: 0,\n commandCount: 0\n };\n}\n\nfunction createEmptyUserCommand(): UserCommand {\n return {\n msec: 0,\n buttons: 0,\n angles: { x: 0, y: 0, z: 0 },\n forwardmove: 0,\n sidemove: 0,\n upmove: 0,\n sequence: 0,\n lightlevel: 0,\n impulse: 0\n };\n}\n\nfunction createEmptyPlayerState(): PlayerState {\n return {\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewAngles: { x: 0, y: 0, z: 0 },\n onGround: false,\n waterLevel: 0,\n watertype: 0,\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n // Stubs for new fields\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n pm_type: 0,\n pm_time: 0,\n pm_flags: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0\n };\n}\n","import { BinaryStream, ClientCommand, UserCommand } from '@quake2ts/shared';\n\nexport interface ClientMessageHandler {\n onMove(checksum: number, lastFrame: number, userCmd: UserCommand): void;\n onUserInfo(info: string): void;\n onStringCmd(cmd: string): void;\n onNop(): void;\n onBad(): void;\n}\n\nexport class ClientMessageParser {\n private stream: BinaryStream;\n private handler: ClientMessageHandler;\n\n constructor(stream: BinaryStream, handler: ClientMessageHandler) {\n this.stream = stream;\n this.handler = handler;\n }\n\n public parseMessage(): void {\n while (this.stream.hasMore()) {\n const cmdId = this.stream.readByte();\n if (cmdId === -1) break;\n\n switch (cmdId) {\n case ClientCommand.move:\n this.parseMove();\n break;\n case ClientCommand.userinfo:\n this.parseUserInfo();\n break;\n case ClientCommand.stringcmd:\n this.parseStringCmd();\n break;\n case ClientCommand.nop:\n this.handler.onNop();\n break;\n default:\n console.warn(`Unknown client command: ${cmdId}`);\n this.handler.onBad();\n return;\n }\n }\n }\n\n private parseMove(): void {\n const checksum = this.stream.readByte();\n const lastFrame = this.stream.readLong();\n\n // Read UserCmd\n // TODO: support delta compression if needed (Q2 uses delta compression for usercmds)\n // For now, assume full UserCmd or implement basic read\n\n const msec = this.stream.readByte();\n const buttons = this.stream.readByte();\n const angles = {\n x: this.stream.readShort() * (360.0 / 65536.0),\n y: this.stream.readShort() * (360.0 / 65536.0),\n z: this.stream.readShort() * (360.0 / 65536.0),\n };\n const forwardmove = this.stream.readShort();\n const sidemove = this.stream.readShort();\n const upmove = this.stream.readShort();\n const impulse = this.stream.readByte();\n const lightlevel = this.stream.readByte(); // Used for light-based stealth, usually ignored by server logic except for stats\n\n const userCmd: UserCommand = {\n msec,\n buttons,\n angles,\n forwardmove,\n sidemove,\n upmove,\n impulse,\n lightlevel,\n sequence: 0 // Server doesn't read sequence from packet body in standard protocol, it tracks it\n };\n\n this.handler.onMove(checksum, lastFrame, userCmd);\n }\n\n private parseUserInfo(): void {\n const info = this.stream.readString();\n this.handler.onUserInfo(info);\n }\n\n private parseStringCmd(): void {\n const cmd = this.stream.readString();\n this.handler.onStringCmd(cmd);\n }\n}\n","import { CollisionModel } from \"@quake2ts/shared\";\nimport { EntityState, MAX_CONFIGSTRINGS, MAX_EDICTS, MAX_CHALLENGES } from \"@quake2ts/shared\";\nimport { Client } from \"./client.js\";\n\n/**\n * ServerState corresponds to server_state_t in the original source.\n */\nexport enum ServerState {\n Dead, // no map loaded\n Loading, // spawning level edicts\n Game, // actively running\n Cinematic,\n Demo,\n Pic\n}\n\nexport interface Challenge {\n adr: string; // IP address\n challenge: number;\n time: number;\n}\n\n/**\n * ServerStatic holds the state that is constant across server restarts.\n * Corresponds to server_static_t in the original source.\n */\nexport interface ServerStatic {\n initialized: boolean;\n realTime: number; // always increasing\n\n mapCmd: string; // ie: *intro.cin+base\n\n spawnCount: number; // incremented each server start\n\n clients: (Client | null)[];\n\n // In original this is: entity_state_t *client_entities;\n // We might need a different approach in TS, but keeping the concept:\n // This buffer holds entity states for all clients history.\n // For now we might store it on the client directly or here.\n // Original: client_entities[maxclients*UPDATE_BACKUP*MAX_PACKET_ENTITIES]\n\n lastHeartbeat: number;\n\n challenges: Challenge[];\n\n // Demo recording stuff\n demoFile?: any; // File handle\n}\n\n/**\n * Server holds the state for the current running server instance.\n * Corresponds to server_t in the original source.\n */\nexport interface Server {\n state: ServerState;\n\n attractLoop: boolean;\n loadGame: boolean;\n\n startTime: number; // Added back as it was used in dedicated.ts and is useful\n time: number; // sv.framenum * 100 msec\n frame: number;\n\n name: string; // map name\n\n // Models are handled by AssetManager in engine usually,\n // but server needs collision models.\n collisionModel: CollisionModel | null;\n\n configStrings: string[]; // [MAX_CONFIGSTRINGS]\n baselines: (EntityState | null)[]; // [MAX_EDICTS]\n\n // Multicast buffer\n multicastBuf: Uint8Array;\n}\n","import { BinaryWriter, ServerCommand, TempEntity, Vec3 } from '@quake2ts/shared';\nimport { Entity } from '@quake2ts/game';\n\n/**\n * Writes a server command and its arguments to a BinaryWriter.\n * This handles the serialization of generic arguments passed to multicast/unicast\n * into the specific binary format expected by the protocol.\n */\nexport function writeServerCommand(writer: BinaryWriter, event: ServerCommand, ...args: any[]): void {\n writer.writeByte(event);\n\n switch (event) {\n case ServerCommand.print: {\n // args: [level: number, text: string]\n const level = args[0] as number;\n const text = args[1] as string;\n writer.writeByte(level);\n writer.writeString(text);\n break;\n }\n\n case ServerCommand.centerprint: {\n // args: [text: string]\n const text = args[0] as string;\n writer.writeString(text);\n break;\n }\n\n case ServerCommand.stufftext: {\n // args: [text: string]\n const text = args[0] as string;\n writer.writeString(text);\n break;\n }\n\n case ServerCommand.sound: {\n // args: [flags, soundNum, volume?, attenuation?, offset?, ent?, pos?]\n const flags = args[0] as number;\n const soundNum = args[1] as number;\n const volume = args[2] as number | undefined;\n const attenuation = args[3] as number | undefined;\n const offset = args[4] as number | undefined;\n const ent = args[5] as number | undefined;\n const pos = args[6] as Vec3 | undefined;\n\n writer.writeByte(flags);\n writer.writeByte(soundNum);\n\n if (flags & 1) { // SND_VOLUME\n writer.writeByte(volume || 0);\n }\n if (flags & 2) { // SND_ATTENUATION\n writer.writeByte(attenuation || 0);\n }\n if (flags & 16) { // SND_OFFSET\n writer.writeByte(offset || 0);\n }\n if (flags & 8) { // SND_ENT\n writer.writeShort(ent || 0);\n }\n if (flags & 4) { // SND_POS\n if (pos) {\n writer.writePos(pos);\n } else {\n writer.writePos({x:0, y:0, z:0});\n }\n }\n break;\n }\n\n case ServerCommand.muzzleflash: {\n // args: [entityIndex: number, flashType: number]\n const entIndex = args[0] as number;\n const flashType = args[1] as number;\n writer.writeShort(entIndex);\n writer.writeByte(flashType);\n break;\n }\n\n case ServerCommand.temp_entity: {\n // args: [type: TempEntity, ...params]\n const type = args[0] as TempEntity;\n writer.writeByte(type);\n writeTempEntity(writer, type, args.slice(1));\n break;\n }\n\n default:\n console.warn(`writeServerCommand: Unhandled command ${event}`);\n break;\n }\n}\n\nfunction writeTempEntity(writer: BinaryWriter, type: TempEntity, args: any[]): void {\n switch (type) {\n case TempEntity.ROCKET_EXPLOSION:\n case TempEntity.GRENADE_EXPLOSION:\n case TempEntity.EXPLOSION1:\n case TempEntity.EXPLOSION2:\n case TempEntity.ROCKET_EXPLOSION_WATER:\n case TempEntity.GRENADE_EXPLOSION_WATER:\n case TempEntity.BFG_EXPLOSION:\n case TempEntity.BFG_BIGEXPLOSION:\n case TempEntity.PLASMA_EXPLOSION:\n case TempEntity.PLAIN_EXPLOSION:\n case TempEntity.TRACKER_EXPLOSION:\n case TempEntity.EXPLOSION1_BIG:\n case TempEntity.EXPLOSION1_NP:\n case TempEntity.EXPLOSION1_NL:\n case TempEntity.EXPLOSION2_NL:\n case TempEntity.BERSERK_SLAM:\n // Format: [pos]\n writer.writePos(args[0] as Vec3);\n break;\n\n case TempEntity.BLASTER:\n case TempEntity.FLECHETTE:\n // Format: [pos, dir]\n writer.writePos(args[0] as Vec3);\n writer.writeDir(args[1] as Vec3);\n break;\n\n case TempEntity.RAILTRAIL:\n case TempEntity.DEBUGTRAIL:\n case TempEntity.BUBBLETRAIL:\n case TempEntity.BUBBLETRAIL2:\n case TempEntity.BFG_LASER:\n case TempEntity.LIGHTNING_BEAM:\n case TempEntity.LIGHTNING:\n // Format: [start, end]\n writer.writePos(args[0] as Vec3);\n writer.writePos(args[1] as Vec3);\n break;\n\n case TempEntity.LASER_SPARKS:\n case TempEntity.WELDING_SPARKS:\n case TempEntity.TUNNEL_SPARKS:\n case TempEntity.ELECTRIC_SPARKS:\n case TempEntity.HEATBEAM_SPARKS:\n case TempEntity.HEATBEAM_STEAM:\n case TempEntity.STEAM:\n // Format: [count, pos, dir, color?]\n // Q2: writeByte(count), writePos(start), writeDir(normal), writeByte(skin/color)\n writer.writeByte(args[0] as number);\n writer.writePos(args[1] as Vec3);\n writer.writeDir(args[2] as Vec3);\n writer.writeByte(args[3] as number || 0);\n break;\n\n case TempEntity.PARASITE_ATTACK:\n case TempEntity.MEDIC_CABLE_ATTACK:\n // Format: [entIndex, start, end]\n // args[0] is Entity usually\n const ent = args[0] as Entity;\n writer.writeShort(ent ? ent.index : 0);\n writer.writePos(args[1] as Vec3);\n writer.writePos(args[2] as Vec3);\n break;\n\n case TempEntity.GUNSHOT:\n case TempEntity.BLOOD:\n case TempEntity.SPARKS:\n case TempEntity.BULLET_SPARKS:\n case TempEntity.SCREEN_SPARKS:\n case TempEntity.SHIELD_SPARKS:\n // Format: [pos, dir]\n writer.writePos(args[0] as Vec3);\n writer.writeDir(args[1] as Vec3);\n break;\n\n case TempEntity.SPLASH:\n case TempEntity.POWER_SPLASH:\n case TempEntity.WIDOWSPLASH:\n // Format: [count, pos, dir, color]\n writer.writeByte(args[0] as number);\n writer.writePos(args[1] as Vec3);\n writer.writeDir(args[2] as Vec3);\n writer.writeByte(args[3] as number || 0);\n break;\n\n default:\n console.warn(`writeTempEntity: Unhandled TempEntity ${type}`);\n break;\n }\n}\n","import { WebSocketServer } from 'ws';\nimport { WebSocketNetDriver } from '../net/nodeWsDriver.js';\nimport { NetworkTransport } from '../transport.js';\nimport { NetDriver } from '@quake2ts/shared';\n\nexport class WebSocketTransport implements NetworkTransport {\n private wss: WebSocketServer | null = null;\n private connectionCallback: ((driver: NetDriver, info?: any) => void) | null = null;\n private errorCallback: ((error: Error) => void) | null = null;\n\n async listen(port: number): Promise<void> {\n return new Promise((resolve) => {\n this.wss = new WebSocketServer({ port });\n this.wss.on('listening', () => resolve());\n this.wss.on('connection', (ws, req) => {\n const driver = new WebSocketNetDriver();\n driver.attach(ws);\n if (this.connectionCallback) {\n this.connectionCallback(driver, req);\n }\n });\n this.wss.on('error', (err) => {\n if (this.errorCallback) this.errorCallback(err);\n });\n });\n }\n\n close() {\n if (this.wss) {\n this.wss.close();\n this.wss = null;\n }\n }\n\n onConnection(callback: (driver: NetDriver, info?: any) => void) {\n this.connectionCallback = callback;\n }\n\n onError(callback: (error: Error) => void) {\n this.errorCallback = callback;\n }\n}\n","import { WebSocketNetDriver } from './net/nodeWsDriver.js';\nimport { createGame, GameExports, GameImports, GameEngine, Entity, MulticastType, GameStateSnapshot, Solid } from '@quake2ts/game';\nimport { Client, createClient, ClientState } from './client.js';\nimport { ClientMessageParser } from './protocol.js';\nimport { BinaryWriter, ServerCommand, BinaryStream, UserCommand, traceBox, CollisionModel, UPDATE_BACKUP, MAX_CONFIGSTRINGS, MAX_EDICTS, EntityState, CollisionEntityIndex, inPVS, inPHS, crc8, NetDriver, ConfigStringIndex } from '@quake2ts/shared';\nimport { parseBsp, PakArchive } from '@quake2ts/engine';\nimport fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { createPlayerInventory, createPlayerWeaponStates } from '@quake2ts/game';\nimport { Server, ServerState, ServerStatic } from './server.js';\nimport { writeDeltaEntity, writeRemoveEntity } from '@quake2ts/shared';\nimport { writePlayerState, ProtocolPlayerState } from './protocol/player.js';\nimport { writeServerCommand } from './protocol/write.js';\nimport { Vec3, lerpAngle } from '@quake2ts/shared';\nimport { NetworkTransport } from './transport.js';\nimport { WebSocketTransport } from './transports/websocket.js';\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nconst DEFAULT_MAX_CLIENTS = 16;\nconst FRAME_RATE = 10; // 10Hz dedicated server loop (Q2 standard)\nconst FRAME_TIME_MS = 1000 / FRAME_RATE;\n\n// Lag Compensation History\ninterface EntityHistory {\n time: number;\n origin: Vec3;\n mins: Vec3;\n maxs: Vec3;\n angles: Vec3;\n}\n\ninterface EntityBackup {\n origin: Vec3;\n mins: Vec3;\n maxs: Vec3;\n angles: Vec3;\n link: boolean;\n}\n\nexport interface ClientInfo {\n id: number;\n name: string;\n ping: number;\n address: string;\n}\n\nexport interface ServerOptions {\n mapName?: string;\n maxPlayers?: number;\n deathmatch?: boolean;\n port?: number;\n transport?: NetworkTransport;\n}\n\nexport class DedicatedServer implements GameEngine {\n private transport: NetworkTransport;\n private svs: ServerStatic;\n private sv: Server;\n private game: GameExports | null = null;\n private frameTimeout: NodeJS.Timeout | null = null;\n private entityIndex: CollisionEntityIndex | null = null;\n\n // History buffer: Map<EntityIndex, HistoryArray>\n private history = new Map<number, EntityHistory[]>();\n private backup = new Map<number, EntityBackup>();\n\n // Events\n public onClientConnected?: (clientId: number, name: string) => void;\n public onClientDisconnected?: (clientId: number) => void;\n public onServerError?: (error: Error) => void;\n\n private options: ServerOptions;\n\n constructor(optionsOrPort: ServerOptions | number = {}) {\n const options = typeof optionsOrPort === 'number' ? { port: optionsOrPort } : optionsOrPort;\n this.options = {\n port: 27910,\n maxPlayers: DEFAULT_MAX_CLIENTS,\n deathmatch: true,\n ...options\n };\n\n this.transport = this.options.transport || new WebSocketTransport();\n\n this.svs = {\n initialized: false,\n realTime: 0,\n mapCmd: '',\n spawnCount: 0,\n clients: new Array(this.options.maxPlayers!).fill(null),\n lastHeartbeat: 0,\n challenges: []\n };\n this.sv = {\n state: ServerState.Dead,\n attractLoop: false,\n loadGame: false,\n startTime: 0, // Initialize startTime\n time: 0,\n frame: 0,\n name: '',\n collisionModel: null,\n configStrings: new Array(MAX_CONFIGSTRINGS).fill(''),\n baselines: new Array(MAX_EDICTS).fill(null),\n multicastBuf: new Uint8Array(0)\n };\n this.entityIndex = new CollisionEntityIndex();\n }\n\n public setTransport(transport: NetworkTransport) {\n if (this.svs.initialized) {\n throw new Error('Cannot set transport after server started');\n }\n this.transport = transport;\n }\n\n public async startServer(mapName?: string) {\n const map = mapName || this.options.mapName;\n if (!map) {\n throw new Error('No map specified');\n }\n await this.start(map);\n }\n\n public stopServer() {\n this.stop();\n }\n\n public kickPlayer(clientId: number) {\n if (clientId < 0 || clientId >= this.svs.clients.length) return;\n const client = this.svs.clients[clientId];\n if (client && client.state >= ClientState.Connected) {\n console.log(`Kicking client ${clientId}`);\n // Send disconnect message if possible\n if (client.netchan) {\n const writer = new BinaryWriter();\n writer.writeByte(ServerCommand.print);\n writer.writeByte(2);\n writer.writeString('Kicked by server.\\n');\n try {\n const packet = client.netchan.transmit(writer.getData());\n client.net.send(packet);\n } catch (e) {}\n }\n this.dropClient(client);\n }\n }\n\n public async changeMap(mapName: string) {\n console.log(`Changing map to ${mapName}`);\n\n // Notify clients?\n this.multicast(\n {x:0,y:0,z:0},\n MulticastType.All,\n ServerCommand.print,\n 2,\n `Changing map to ${mapName}...\\n`\n );\n\n // Stop current game loop\n if (this.frameTimeout) clearTimeout(this.frameTimeout);\n\n // Reset Server State\n this.sv.state = ServerState.Loading;\n this.sv.collisionModel = null;\n this.sv.time = 0;\n this.sv.frame = 0;\n this.sv.configStrings.fill('');\n this.sv.baselines.fill(null);\n this.history.clear();\n this.entityIndex = new CollisionEntityIndex();\n\n // Load new Map\n await this.loadMap(mapName);\n\n // Re-init game\n this.initGame();\n\n // Send new serverdata to all connected clients and respawn them\n for (const client of this.svs.clients) {\n if (client && client.state >= ClientState.Connected) {\n // Reset client game state\n client.edict = null; // Will be respawned\n client.state = ClientState.Connected; // Move back to connected state to trigger spawn\n\n // Send new serverdata\n this.sendServerData(client);\n\n // Force them to reload/precache\n client.netchan.writeReliableByte(ServerCommand.stufftext);\n client.netchan.writeReliableString(`map ${mapName}\\n`);\n\n // Trigger spawn\n this.handleBegin(client);\n }\n }\n\n // Resume loop\n this.runFrame();\n }\n\n public getConnectedClients(): ClientInfo[] {\n const list: ClientInfo[] = [];\n for (const client of this.svs.clients) {\n if (client && client.state >= ClientState.Connected) {\n list.push({\n id: client.index,\n name: 'Player', // TODO: Parse userinfo for name\n ping: client.ping,\n address: 'unknown'\n });\n }\n }\n return list;\n }\n\n private async start(mapName: string) {\n console.log(`Starting Dedicated Server on port ${this.options.port}...`);\n this.sv.name = mapName;\n this.svs.initialized = true;\n this.svs.spawnCount++;\n\n // 1. Initialize Network\n this.transport.onConnection((driver, info) => {\n console.log('New connection', info ? `from ${info.socket?.remoteAddress}` : '');\n this.handleConnection(driver, info);\n });\n\n this.transport.onError((err) => {\n if (this.onServerError) this.onServerError(err);\n });\n\n await this.transport.listen(this.options.port!);\n\n // 2. Load Map\n await this.loadMap(mapName);\n\n // 3. Initialize Game\n this.initGame();\n\n // 4. Start Loop\n this.runFrame();\n console.log('Server started.');\n }\n\n private async loadMap(mapName: string) {\n try {\n console.log(`Loading map ${mapName}...`);\n this.sv.state = ServerState.Loading;\n this.sv.name = mapName;\n\n let arrayBuffer: ArrayBuffer;\n\n // Check if map exists on disk\n try {\n await fs.access(mapName);\n const mapData = await fs.readFile(mapName);\n arrayBuffer = mapData.buffer.slice(mapData.byteOffset, mapData.byteOffset + mapData.byteLength) as ArrayBuffer;\n } catch (e) {\n console.log(`Map file ${mapName} not found on disk, checking pak.pak...`);\n // Check pak.pak\n const possiblePakPaths = [\n path.resolve(process.cwd(), 'pak.pak'),\n path.resolve(process.cwd(), '../pak.pak'),\n path.resolve(process.cwd(), '../../pak.pak'),\n path.resolve('baseq2/pak.pak')\n ];\n\n let pakPath: string | null = null;\n for (const p of possiblePakPaths) {\n try {\n await fs.access(p);\n pakPath = p;\n break;\n } catch {}\n }\n\n if (!pakPath) {\n throw new Error(`Map ${mapName} not found and pak.pak not found.`);\n }\n\n const pakBuffer = await fs.readFile(pakPath);\n const pakArrayBuffer = pakBuffer.buffer.slice(pakBuffer.byteOffset, pakBuffer.byteOffset + pakBuffer.byteLength) as ArrayBuffer;\n const pak = PakArchive.fromArrayBuffer('pak.pak', pakArrayBuffer);\n\n const entry = pak.getEntry(mapName);\n if (!entry) {\n throw new Error(`Map ${mapName} not found in pak.pak`);\n }\n\n const data = pak.readFile(mapName);\n arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n }\n\n const bspMap = parseBsp(arrayBuffer);\n\n // Convert BspMap to CollisionModel manually\n const planes = bspMap.planes.map(p => {\n const normal = { x: p.normal[0], y: p.normal[1], z: p.normal[2] };\n let signbits = 0;\n if (normal.x < 0) signbits |= 1;\n if (normal.y < 0) signbits |= 2;\n if (normal.z < 0) signbits |= 4;\n return {\n normal,\n dist: p.dist,\n type: p.type,\n signbits\n };\n });\n\n const nodes = bspMap.nodes.map(n => ({\n plane: planes[n.planeIndex],\n children: n.children\n }));\n\n const leafBrushes: number[] = [];\n const leaves = bspMap.leafs.map((l, i) => {\n const brushes = bspMap.leafLists.leafBrushes[i];\n const firstLeafBrush = leafBrushes.length;\n leafBrushes.push(...brushes);\n return {\n contents: l.contents,\n cluster: l.cluster,\n area: l.area,\n firstLeafBrush,\n numLeafBrushes: brushes.length\n };\n });\n\n const brushes = bspMap.brushes.map(b => {\n const sides = [];\n for (let i = 0; i < b.numSides; i++) {\n const sideIndex = b.firstSide + i;\n const bspSide = bspMap.brushSides[sideIndex];\n const plane = planes[bspSide.planeIndex];\n const texInfo = bspMap.texInfo[bspSide.texInfo];\n const surfaceFlags = texInfo ? texInfo.flags : 0;\n\n sides.push({\n plane,\n surfaceFlags\n });\n }\n return {\n contents: b.contents,\n sides,\n checkcount: 0\n };\n });\n\n const bmodels = bspMap.models.map(m => ({\n mins: { x: m.mins[0], y: m.mins[1], z: m.mins[2] },\n maxs: { x: m.maxs[0], y: m.maxs[1], z: m.maxs[2] },\n origin: { x: m.origin[0], y: m.origin[1], z: m.origin[2] },\n headnode: m.headNode\n }));\n\n let visibility;\n if (bspMap.visibility) {\n visibility = {\n numClusters: bspMap.visibility.numClusters,\n clusters: bspMap.visibility.clusters\n };\n }\n\n this.sv.collisionModel = {\n planes,\n nodes,\n leaves,\n brushes,\n leafBrushes,\n bmodels,\n visibility\n };\n\n console.log(`Map loaded successfully.`);\n } catch (e) {\n console.warn('Failed to load map:', e);\n if (this.onServerError) this.onServerError(e as Error);\n }\n }\n\n private initGame() {\n this.sv.startTime = Date.now();\n const imports: GameImports = {\n trace: (start, mins, maxs, end, passent, contentmask) => {\n if (this.entityIndex) {\n const result = this.entityIndex.trace({\n start,\n end,\n mins: mins || undefined,\n maxs: maxs || undefined,\n model: this.sv.collisionModel as CollisionModel,\n passId: passent ? passent.index : undefined,\n contentMask: contentmask\n });\n\n let hitEntity: Entity | null = null;\n if (result.entityId !== null && result.entityId !== undefined && this.game) {\n hitEntity = this.game.entities.getByIndex(result.entityId) ?? null;\n }\n\n return {\n allsolid: result.allsolid,\n startsolid: result.startsolid,\n fraction: result.fraction,\n endpos: result.endpos,\n plane: result.plane || null,\n surfaceFlags: result.surfaceFlags || 0,\n contents: result.contents || 0,\n ent: hitEntity\n };\n }\n\n const worldResult = this.sv.collisionModel ? traceBox({\n start,\n end,\n mins: mins || undefined,\n maxs: maxs || undefined,\n model: this.sv.collisionModel,\n contentMask: contentmask\n }) : {\n fraction: 1.0,\n endpos: { ...end },\n allsolid: false,\n startsolid: false,\n plane: null,\n surfaceFlags: 0,\n contents: 0\n };\n\n return {\n allsolid: worldResult.allsolid,\n startsolid: worldResult.startsolid,\n fraction: worldResult.fraction,\n endpos: worldResult.endpos,\n plane: worldResult.plane || null,\n surfaceFlags: worldResult.surfaceFlags || 0,\n contents: worldResult.contents || 0,\n ent: null\n };\n },\n pointcontents: (p) => 0,\n linkentity: (ent) => {\n if (!this.entityIndex) return;\n this.entityIndex.link({\n id: ent.index,\n origin: ent.origin,\n mins: ent.mins,\n maxs: ent.maxs,\n contents: ent.solid === 0 ? 0 : 1,\n surfaceFlags: 0\n });\n },\n areaEdicts: (mins, maxs) => {\n if (!this.entityIndex) return [];\n return this.entityIndex.gatherTriggerTouches({ x: 0, y: 0, z: 0 }, mins, maxs, 0xFFFFFFFF);\n },\n multicast: (origin, type, event, ...args) => this.multicast(origin, type, event, ...args),\n unicast: (ent, reliable, event, ...args) => this.unicast(ent, reliable, event, ...args),\n configstring: (index, value) => this.SV_SetConfigString(index, value),\n serverCommand: (cmd) => { console.log(`Server command: ${cmd}`); },\n setLagCompensation: (active, client, lagMs) => this.setLagCompensation(active, client, lagMs)\n };\n\n this.game = createGame(imports, this, {\n gravity: { x: 0, y: 0, z: -800 },\n deathmatch: this.options.deathmatch !== false\n });\n\n this.game.init(0);\n this.game.spawnWorld();\n\n this.populateBaselines();\n\n this.sv.state = ServerState.Game;\n }\n\n private populateBaselines() {\n if (!this.game) return;\n\n this.game.entities.forEachEntity((ent) => {\n if (ent.index >= MAX_EDICTS) return;\n if (ent.modelindex > 0 || ent.solid !== Solid.Not) {\n this.sv.baselines[ent.index] = this.entityToState(ent);\n }\n });\n }\n\n private entityToState(ent: Entity): EntityState {\n return {\n number: ent.index,\n origin: { ...ent.origin },\n angles: { ...ent.angles },\n modelIndex: ent.modelindex,\n frame: ent.frame,\n skinNum: ent.skin,\n effects: ent.effects,\n renderfx: ent.renderfx,\n solid: ent.solid,\n sound: ent.sounds,\n event: 0\n };\n }\n\n public stop() {\n if (this.frameTimeout) clearTimeout(this.frameTimeout);\n this.transport.close();\n this.game?.shutdown();\n this.sv.state = ServerState.Dead;\n }\n\n private handleConnection(driver: NetDriver, info?: any) {\n let clientIndex = -1;\n for (let i = 0; i < this.options.maxPlayers!; i++) {\n if (this.svs.clients[i] === null || this.svs.clients[i]!.state === ClientState.Free) {\n clientIndex = i;\n break;\n }\n }\n\n if (clientIndex === -1) {\n console.log('Server full, rejecting connection');\n driver.disconnect();\n return;\n }\n\n const client = createClient(clientIndex, driver);\n client.lastMessage = this.sv.frame;\n client.lastCommandTime = Date.now();\n this.svs.clients[clientIndex] = client;\n\n console.log(`Client ${clientIndex} attached to slot from ${info?.socket?.remoteAddress || 'unknown'}`);\n\n driver.onMessage((data) => this.onClientMessage(client, data));\n driver.onClose(() => this.onClientDisconnect(client));\n }\n\n private onClientMessage(client: Client, data: Uint8Array) {\n const buffer = data.byteOffset === 0 && data.byteLength === data.buffer.byteLength\n ? data.buffer\n : data.slice().buffer;\n\n if (buffer instanceof ArrayBuffer) {\n client.messageQueue.push(new Uint8Array(buffer));\n } else {\n // SharedArrayBuffer fallback or other weirdness\n client.messageQueue.push(new Uint8Array(buffer as any));\n }\n }\n\n private onClientDisconnect(client: Client) {\n console.log(`Client ${client.index} disconnected`);\n if (client.edict && this.game) {\n this.game.clientDisconnect(client.edict);\n }\n\n if (this.onClientDisconnected) {\n this.onClientDisconnected(client.index);\n }\n\n client.state = ClientState.Free;\n\n this.svs.clients[client.index] = null;\n if (this.entityIndex && client.edict) {\n this.entityIndex.unlink(client.edict.index);\n }\n }\n\n private dropClient(client: Client) {\n if (client.net) {\n client.net.disconnect();\n }\n }\n\n private handleMove(client: Client, cmd: UserCommand, checksum: number, lastFrame: number) {\n if (lastFrame > 0 && lastFrame <= client.lastFrame && lastFrame > client.lastFrame - UPDATE_BACKUP) {\n const frameIdx = lastFrame % UPDATE_BACKUP;\n const frame = client.frames[frameIdx];\n\n if (frame.packetCRC !== checksum) {\n console.warn(`Client ${client.index} checksum mismatch for frame ${lastFrame}: expected ${frame.packetCRC}, got ${checksum}`);\n }\n }\n\n client.lastCmd = cmd;\n client.lastMessage = this.sv.frame;\n client.commandCount++;\n }\n\n private handleUserInfo(client: Client, info: string) {\n client.userInfo = info;\n }\n\n private handleStringCmd(client: Client, cmd: string) {\n console.log(`Client ${client.index} stringcmd: ${cmd}`);\n if (cmd === 'getchallenge') {\n this.handleGetChallenge(client);\n } else if (cmd.startsWith('connect ')) {\n const userInfo = cmd.substring(8);\n this.handleConnect(client, userInfo);\n } else if (cmd === 'begin') {\n this.handleBegin(client);\n } else if (cmd === 'status') {\n this.handleStatus(client);\n }\n }\n\n private handleStatus(client: Client) {\n let activeClients = 0;\n for (const c of this.svs.clients) {\n if (c && c.state >= ClientState.Connected) {\n activeClients++;\n }\n }\n\n let status = `map: ${this.sv.name}\\n`;\n status += `players: ${activeClients} active (${this.options.maxPlayers} max)\\n\\n`;\n status += `num score ping name lastmsg address qport rate\\n`;\n status += `--- ----- ---- --------------- ------- --------------------- ----- -----\\n`;\n\n for (const c of this.svs.clients) {\n if (c && c.state >= ClientState.Connected) {\n const score = 0;\n const ping = 0;\n const lastMsg = this.sv.frame - c.lastMessage;\n const address = 'unknown';\n status += `${c.index.toString().padStart(3)} ${score.toString().padStart(5)} ${ping.toString().padStart(4)} ${c.userInfo.substring(0, 15).padEnd(15)} ${lastMsg.toString().padStart(7)} ${address.padEnd(21)} ${c.netchan.qport.toString().padStart(5)} 0\\n`;\n }\n }\n\n const writer = new BinaryWriter();\n writer.writeByte(ServerCommand.print);\n writer.writeByte(2);\n writer.writeString(status);\n const packet = client.netchan.transmit(writer.getData());\n client.net.send(packet);\n }\n\n private handleGetChallenge(client: Client) {\n const challenge = Math.floor(Math.random() * 1000000) + 1;\n client.challenge = challenge;\n\n const writer = new BinaryWriter();\n writer.writeByte(ServerCommand.stufftext);\n writer.writeString(`challenge ${challenge}\\n`);\n const packet = client.netchan.transmit(writer.getData());\n client.net.send(packet);\n }\n\n private handleConnect(client: Client, userInfo: string) {\n if (!this.game) return;\n\n const result = this.game.clientConnect(client.edict || null, userInfo);\n if (result === true) {\n client.state = ClientState.Connected;\n client.userInfo = userInfo;\n console.log(`Client ${client.index} connected: ${userInfo}`);\n\n if (this.onClientConnected) {\n // Extract name from userinfo if possible, default to Player\n this.onClientConnected(client.index, 'Player');\n }\n\n try {\n this.sendServerData(client);\n\n client.netchan.writeReliableByte(ServerCommand.stufftext);\n client.netchan.writeReliableString(\"precache\\n\");\n\n const packet = client.netchan.transmit();\n client.net.send(packet);\n } catch (e) {\n console.warn(`Client ${client.index} reliable buffer overflow or connection error`);\n this.dropClient(client);\n }\n } else {\n console.log(`Client ${client.index} rejected: ${result}`);\n const writer = new BinaryWriter();\n writer.writeByte(ServerCommand.print);\n writer.writeByte(2);\n writer.writeString(`Connection rejected: ${result}\\n`);\n const packet = client.netchan.transmit(writer.getData());\n client.net.send(packet);\n }\n }\n\n private handleBegin(client: Client) {\n if (client.state === ClientState.Connected) {\n this.spawnClient(client);\n }\n }\n\n private spawnClient(client: Client) {\n if (!this.game) return;\n\n const ent = this.game.clientBegin({\n inventory: createPlayerInventory(),\n weaponStates: createPlayerWeaponStates(),\n buttons: 0,\n pm_type: 0,\n pm_time: 0,\n pm_flags: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n pers: {\n connected: true,\n inventory: [],\n health: 100,\n max_health: 100,\n savedFlags: 0,\n selected_item: 0\n }\n });\n\n client.edict = ent;\n client.state = ClientState.Active;\n\n console.log(`Client ${client.index} entered game`);\n }\n\n private sendServerData(client: Client) {\n client.netchan.writeReliableByte(ServerCommand.serverdata);\n client.netchan.writeReliableLong(34);\n client.netchan.writeReliableLong(this.sv.frame);\n client.netchan.writeReliableByte(0);\n client.netchan.writeReliableString(\"baseq2\");\n client.netchan.writeReliableShort(client.index);\n client.netchan.writeReliableString(this.sv.name || \"maps/test.bsp\");\n\n for (let i = 0; i < MAX_CONFIGSTRINGS; i++) {\n if (this.sv.configStrings[i]) {\n client.netchan.writeReliableByte(ServerCommand.configstring);\n client.netchan.writeReliableShort(i);\n client.netchan.writeReliableString(this.sv.configStrings[i]);\n }\n }\n\n const baselineWriter = new BinaryWriter();\n\n for (let i = 0; i < MAX_EDICTS; i++) {\n if (this.sv.baselines[i]) {\n baselineWriter.reset();\n baselineWriter.writeByte(ServerCommand.spawnbaseline);\n writeDeltaEntity({} as EntityState, this.sv.baselines[i]!, baselineWriter, true, true);\n\n const data = baselineWriter.getData();\n for(let j=0; j<data.length; j++) {\n client.netchan.writeReliableByte(data[j]);\n }\n }\n }\n }\n\n private SV_SetConfigString(index: number, value: string) {\n if (index < 0 || index >= MAX_CONFIGSTRINGS) return;\n\n this.sv.configStrings[index] = value;\n\n for (const client of this.svs.clients) {\n if (client && client.state >= ClientState.Connected) {\n if (client.netchan) {\n try {\n client.netchan.writeReliableByte(ServerCommand.configstring);\n client.netchan.writeReliableShort(index);\n client.netchan.writeReliableString(value);\n\n const packet = client.netchan.transmit();\n client.net.send(packet);\n } catch (e) {\n console.warn(`Client ${client.index} reliable buffer overflow`);\n this.dropClient(client);\n }\n }\n }\n }\n }\n\n private SV_WriteConfigString(writer: BinaryWriter, index: number, value: string) {\n writer.writeByte(ServerCommand.configstring);\n writer.writeShort(index);\n writer.writeString(value);\n }\n\n private SV_ReadPackets() {\n for (const client of this.svs.clients) {\n if (!client || client.state === ClientState.Free) continue;\n\n while (client.messageQueue.length > 0) {\n const rawData = client.messageQueue.shift();\n if (!rawData) continue;\n\n if (rawData.byteLength >= 10) {\n const view = new DataView(rawData.buffer, rawData.byteOffset, rawData.byteLength);\n const incomingQPort = view.getUint16(8, true);\n if (client.netchan.qport !== incomingQPort) {\n client.netchan.qport = incomingQPort;\n }\n }\n\n const data = client.netchan.process(rawData);\n if (!data) {\n continue;\n }\n\n if (data.length === 0) {\n continue;\n }\n\n let buffer: ArrayBuffer;\n if (data.buffer instanceof ArrayBuffer) {\n buffer = data.buffer;\n } else {\n buffer = new Uint8Array(data).buffer as ArrayBuffer;\n }\n\n const reader = new BinaryStream(buffer);\n const parser = new ClientMessageParser(reader, {\n onMove: (checksum, lastFrame, cmd) => this.handleMove(client, cmd, checksum, lastFrame),\n onUserInfo: (info) => this.handleUserInfo(client, info),\n onStringCmd: (cmd) => this.handleStringCmd(client, cmd),\n onNop: () => {},\n onBad: () => {\n console.warn(`Bad command from client ${client.index}`);\n }\n });\n\n try {\n parser.parseMessage();\n } catch (e) {\n console.error(`Error parsing message from client ${client.index}:`, e);\n }\n }\n }\n }\n\n private runFrame() {\n if (!this.game) return;\n\n const startTime = Date.now();\n\n this.sv.frame++;\n this.sv.time += 100; // 100ms per frame\n\n // 1. Read network packets\n this.SV_ReadPackets();\n\n // 2. Run client commands\n for (const client of this.svs.clients) {\n if (!client || client.state === ClientState.Free) continue;\n\n if (client.edict && client.edict.client) {\n client.edict.client.ping = client.ping;\n }\n\n if (client.state >= ClientState.Connected) {\n const timeoutFrames = 300;\n if (this.sv.frame - client.lastMessage > timeoutFrames) {\n console.log(`Client ${client.index} timed out`);\n this.dropClient(client);\n continue;\n }\n }\n\n if (client && client.state === ClientState.Active && client.edict) {\n const now = Date.now();\n if (now - client.lastCommandTime >= 1000) {\n client.lastCommandTime = now;\n client.commandCount = 0;\n }\n\n if (client.commandCount > 200) {\n console.warn(`Client ${client.index} kicked for command flooding (count: ${client.commandCount})`);\n this.dropClient(client);\n continue;\n }\n\n this.game.clientThink(client.edict, client.lastCmd);\n }\n }\n\n // 3. Run simulation\n const snapshot = this.game.frame({\n frame: this.sv.frame,\n deltaMs: FRAME_TIME_MS,\n nowMs: Date.now()\n });\n\n // 3.1 Record History for Lag Compensation\n this.recordHistory();\n\n // 4. Send Updates\n if (snapshot && snapshot.state) {\n this.SV_SendClientMessages(snapshot.state);\n }\n\n const endTime = Date.now();\n const elapsed = endTime - startTime;\n const sleepTime = Math.max(0, FRAME_TIME_MS - elapsed);\n\n if (this.sv.state === ServerState.Game) {\n this.frameTimeout = setTimeout(() => this.runFrame(), sleepTime);\n }\n }\n\n private SV_SendClientMessages(snapshot: GameStateSnapshot) {\n for (const client of this.svs.clients) {\n if (client && client.state === ClientState.Active) {\n this.SV_SendClientFrame(client, snapshot);\n }\n }\n }\n\n private SV_SendClientFrame(client: Client, snapshot: GameStateSnapshot) {\n const MTU = 1400;\n const writer = new BinaryWriter(MTU);\n writer.writeByte(ServerCommand.frame);\n writer.writeLong(this.sv.frame);\n\n let deltaFrame = 0;\n if (client.lastFrame && client.lastFrame < this.sv.frame && client.lastFrame >= this.sv.frame - UPDATE_BACKUP) {\n deltaFrame = client.lastFrame;\n }\n\n writer.writeLong(deltaFrame);\n writer.writeByte(0);\n writer.writeByte(0);\n\n writer.writeByte(ServerCommand.playerinfo);\n\n const ps: ProtocolPlayerState = {\n pm_type: snapshot.pmType,\n origin: snapshot.origin,\n velocity: snapshot.velocity,\n pm_time: snapshot.pm_time,\n pm_flags: snapshot.pmFlags,\n gravity: Math.abs(snapshot.gravity.z),\n delta_angles: snapshot.deltaAngles,\n viewoffset: { x: 0, y: 0, z: 22 },\n viewangles: snapshot.viewangles,\n kick_angles: snapshot.kick_angles,\n gun_index: snapshot.gunindex,\n gun_frame: snapshot.gun_frame,\n gun_offset: snapshot.gunoffset,\n gun_angles: snapshot.gunangles,\n blend: snapshot.blend,\n fov: snapshot.fov,\n rdflags: snapshot.rdflags,\n stats: snapshot.stats,\n watertype: snapshot.watertype // Populate watertype\n };\n\n writePlayerState(writer, ps);\n\n writer.writeByte(ServerCommand.packetentities);\n\n const entities = snapshot.packetEntities || [];\n const currentEntityIds: number[] = [];\n\n const frameIdx = this.sv.frame % UPDATE_BACKUP;\n const currentFrame = client.frames[frameIdx];\n currentFrame.entities = entities;\n\n let oldEntities: EntityState[] = [];\n if (deltaFrame > 0) {\n const oldFrameIdx = deltaFrame % UPDATE_BACKUP;\n oldEntities = client.frames[oldFrameIdx].entities;\n }\n\n for (const entityState of currentFrame.entities) {\n if (writer.getOffset() > MTU - 200) {\n console.warn('Packet MTU limit reached, dropping remaining entities');\n break;\n }\n\n currentEntityIds.push(entityState.number);\n\n const oldState = oldEntities.find(e => e.number === entityState.number);\n\n if (oldState) {\n writeDeltaEntity(oldState, entityState, writer, false, false);\n } else {\n writeDeltaEntity({} as EntityState, entityState, writer, false, true);\n }\n }\n\n for (const oldId of client.lastPacketEntities) {\n if (writer.getOffset() > MTU - 10) {\n console.warn('Packet MTU limit reached, dropping remaining removals');\n break;\n }\n\n if (!currentEntityIds.includes(oldId)) {\n writeRemoveEntity(oldId, writer);\n }\n }\n\n writer.writeShort(0);\n\n const frameData = writer.getData();\n currentFrame.packetCRC = crc8(frameData);\n\n const packet = client.netchan.transmit(frameData);\n client.net.send(packet);\n\n client.lastFrame = this.sv.frame;\n client.lastPacketEntities = currentEntityIds;\n }\n\n // GameEngine Implementation\n trace(start: any, end: any): any {\n return { fraction: 1.0 };\n }\n\n modelIndex(name: string): number {\n console.log(`modelIndex(${name}) called`);\n // Find existing\n const start = ConfigStringIndex.Models;\n const end = ConfigStringIndex.Sounds;\n for (let i = start + 1; i < end; i++) {\n if (this.sv.configStrings[i] === name) {\n return i - start;\n }\n }\n\n // Find empty slot\n for (let i = start + 1; i < end; i++) {\n if (!this.sv.configStrings[i]) {\n this.SV_SetConfigString(i, name);\n return i - start;\n }\n }\n\n console.warn(`MAX_MODELS overflow for ${name}`);\n return 0;\n }\n\n soundIndex(name: string): number {\n const start = ConfigStringIndex.Sounds;\n const end = ConfigStringIndex.Images;\n for (let i = start + 1; i < end; i++) {\n if (this.sv.configStrings[i] === name) {\n return i - start;\n }\n }\n\n for (let i = start + 1; i < end; i++) {\n if (!this.sv.configStrings[i]) {\n this.SV_SetConfigString(i, name);\n return i - start;\n }\n }\n\n console.warn(`MAX_SOUNDS overflow for ${name}`);\n return 0;\n }\n\n imageIndex(name: string): number {\n const start = ConfigStringIndex.Images;\n const end = ConfigStringIndex.Lights;\n for (let i = start + 1; i < end; i++) {\n if (this.sv.configStrings[i] === name) {\n return i - start;\n }\n }\n\n for (let i = start + 1; i < end; i++) {\n if (!this.sv.configStrings[i]) {\n this.SV_SetConfigString(i, name);\n return i - start;\n }\n }\n\n console.warn(`MAX_IMAGES overflow for ${name}`);\n return 0;\n }\n\n multicast(origin: any, type: MulticastType, event: ServerCommand, ...args: any[]): void {\n const writer = new BinaryWriter();\n\n writeServerCommand(writer, event, ...args);\n\n const data = writer.getData();\n const reliable = false;\n\n for (const client of this.svs.clients) {\n if (!client || client.state < ClientState.Active || !client.edict) {\n continue;\n }\n\n let send = false;\n switch (type) {\n case MulticastType.All:\n send = true;\n break;\n case MulticastType.Pvs:\n if (this.sv.collisionModel) {\n send = inPVS(origin, client.edict.origin, this.sv.collisionModel);\n } else {\n send = true;\n }\n break;\n case MulticastType.Phs:\n if (this.sv.collisionModel) {\n send = inPHS(origin, client.edict.origin, this.sv.collisionModel);\n } else {\n send = true;\n }\n break;\n }\n\n if (send) {\n if (reliable) {\n try {\n for (let i = 0; i < data.length; i++) {\n client.netchan.writeReliableByte(data[i]);\n }\n } catch (e) {\n }\n } else {\n const packet = client.netchan.transmit(data);\n client.net.send(packet);\n }\n }\n }\n }\n\n unicast(ent: Entity, reliable: boolean, event: ServerCommand, ...args: any[]): void {\n const client = this.svs.clients.find(c => c?.edict === ent);\n if (client && client.state >= ClientState.Connected) {\n const writer = new BinaryWriter();\n writeServerCommand(writer, event, ...args);\n const data = writer.getData();\n\n if (reliable) {\n try {\n for (let i = 0; i < data.length; i++) {\n client.netchan.writeReliableByte(data[i]);\n }\n const packet = client.netchan.transmit();\n client.net.send(packet);\n } catch (e) {\n console.warn(`Client ${client.index} reliable buffer overflow in unicast`);\n this.dropClient(client);\n }\n } else {\n const packet = client.netchan.transmit(data);\n client.net.send(packet);\n }\n }\n }\n\n configstring(index: number, value: string): void {\n this.SV_SetConfigString(index, value);\n }\n\n private recordHistory() {\n if (!this.game) return;\n const now = Date.now();\n const HISTORY_MAX_MS = 1000;\n\n this.game.entities.forEachEntity((ent) => {\n if (ent.solid !== Solid.Not || ent.takedamage) {\n let hist = this.history.get(ent.index);\n if (!hist) {\n hist = [];\n this.history.set(ent.index, hist);\n }\n\n hist.push({\n time: now,\n origin: { ...ent.origin },\n mins: { ...ent.mins },\n maxs: { ...ent.maxs },\n angles: { ...ent.angles }\n });\n\n while (hist.length > 0 && hist[0].time < now - HISTORY_MAX_MS) {\n hist.shift();\n }\n }\n });\n }\n\n setLagCompensation(active: boolean, client?: Entity, lagMs?: number): void {\n if (!this.game || !this.entityIndex) return;\n\n if (active) {\n if (!client || lagMs === undefined) return;\n\n const now = Date.now();\n const targetTime = now - lagMs;\n\n this.game.entities.forEachEntity((ent) => {\n if (ent === client) return;\n if (ent.solid === Solid.Not && !ent.takedamage) return;\n\n const hist = this.history.get(ent.index);\n if (!hist || hist.length === 0) return;\n\n let i = hist.length - 1;\n while (i >= 0 && hist[i].time > targetTime) {\n i--;\n }\n\n if (i < 0) {\n i = 0;\n }\n\n const s1 = hist[i];\n const s2 = (i + 1 < hist.length) ? hist[i + 1] : s1;\n\n let frac = 0;\n if (s1.time !== s2.time) {\n frac = (targetTime - s1.time) / (s2.time - s1.time);\n }\n if (frac < 0) frac = 0;\n if (frac > 1) frac = 1;\n\n const origin = {\n x: s1.origin.x + (s2.origin.x - s1.origin.x) * frac,\n y: s1.origin.y + (s2.origin.y - s1.origin.y) * frac,\n z: s1.origin.z + (s2.origin.z - s1.origin.z) * frac\n };\n\n const angles = {\n x: lerpAngle(s1.angles.x, s2.angles.x, frac),\n y: lerpAngle(s1.angles.y, s2.angles.y, frac),\n z: lerpAngle(s1.angles.z, s2.angles.z, frac)\n };\n\n this.backup.set(ent.index, {\n origin: { ...ent.origin },\n mins: { ...ent.mins },\n maxs: { ...ent.maxs },\n angles: { ...ent.angles },\n link: true\n });\n\n ent.origin = origin;\n ent.angles = angles;\n ent.mins = {\n x: s1.mins.x + (s2.mins.x - s1.mins.x) * frac,\n y: s1.mins.y + (s2.mins.y - s1.mins.y) * frac,\n z: s1.mins.z + (s2.mins.z - s1.mins.z) * frac\n };\n ent.maxs = {\n x: s1.maxs.x + (s2.maxs.x - s1.maxs.x) * frac,\n y: s1.maxs.y + (s2.maxs.y - s1.maxs.y) * frac,\n z: s1.maxs.z + (s2.maxs.z - s1.maxs.z) * frac\n };\n\n this.entityIndex!.link({\n id: ent.index,\n origin: ent.origin,\n mins: ent.mins,\n maxs: ent.maxs,\n contents: ent.solid === 0 ? 0 : 1,\n surfaceFlags: 0\n });\n });\n\n } else {\n this.backup.forEach((state, id) => {\n const ent = this.game?.entities.getByIndex(id);\n if (ent) {\n ent.origin = state.origin;\n ent.mins = state.mins;\n ent.maxs = state.maxs;\n ent.angles = state.angles;\n\n this.entityIndex!.link({\n id: ent.index,\n origin: ent.origin,\n mins: ent.mins,\n maxs: ent.maxs,\n contents: ent.solid === 0 ? 0 : 1,\n surfaceFlags: 0\n });\n }\n });\n this.backup.clear();\n }\n }\n}\n\nexport function createServer(options: ServerOptions = {}): DedicatedServer {\n return new DedicatedServer(options);\n}\n"]}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
import WebSocket, { WebSocketServer } from 'ws';
|
|
2
|
+
import { MulticastType, createGame, Solid, createPlayerWeaponStates, createPlayerInventory } from '@quake2ts/game';
|
|
3
|
+
import { UPDATE_BACKUP, NetChan, ClientCommand, MAX_EDICTS, MAX_CONFIGSTRINGS, CollisionEntityIndex, BinaryWriter, ServerCommand, writeDeltaEntity, BinaryStream, writePlayerState, writeRemoveEntity, crc8, ConfigStringIndex, inPHS, inPVS, lerpAngle, traceBox, TempEntity } from '@quake2ts/shared';
|
|
4
|
+
import { PakArchive, parseBsp } from '@quake2ts/engine';
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
|
|
1
8
|
// src/net/nodeWsDriver.ts
|
|
2
|
-
import WebSocket from "ws";
|
|
3
9
|
var WebSocketNetDriver = class {
|
|
4
10
|
constructor() {
|
|
5
11
|
this.socket = null;
|
|
@@ -109,12 +115,6 @@ var WebSocketNetDriver = class {
|
|
|
109
115
|
return this.socket !== null && this.socket.readyState === WebSocket.OPEN;
|
|
110
116
|
}
|
|
111
117
|
};
|
|
112
|
-
|
|
113
|
-
// src/dedicated.ts
|
|
114
|
-
import { createGame, MulticastType, Solid } from "@quake2ts/game";
|
|
115
|
-
|
|
116
|
-
// src/client.ts
|
|
117
|
-
import { UPDATE_BACKUP, NetChan } from "@quake2ts/shared";
|
|
118
118
|
var ClientState = /* @__PURE__ */ ((ClientState2) => {
|
|
119
119
|
ClientState2[ClientState2["Free"] = 0] = "Free";
|
|
120
120
|
ClientState2[ClientState2["Zombie"] = 1] = "Zombie";
|
|
@@ -214,9 +214,6 @@ function createEmptyPlayerState() {
|
|
|
214
214
|
renderfx: 0
|
|
215
215
|
};
|
|
216
216
|
}
|
|
217
|
-
|
|
218
|
-
// src/protocol.ts
|
|
219
|
-
import { ClientCommand } from "@quake2ts/shared";
|
|
220
217
|
var ClientMessageParser = class {
|
|
221
218
|
constructor(stream, handler) {
|
|
222
219
|
this.stream = stream;
|
|
@@ -285,13 +282,6 @@ var ClientMessageParser = class {
|
|
|
285
282
|
}
|
|
286
283
|
};
|
|
287
284
|
|
|
288
|
-
// src/dedicated.ts
|
|
289
|
-
import { BinaryWriter as BinaryWriter2, ServerCommand as ServerCommand2, BinaryStream as BinaryStream2, traceBox, UPDATE_BACKUP as UPDATE_BACKUP2, MAX_CONFIGSTRINGS as MAX_CONFIGSTRINGS2, MAX_EDICTS, CollisionEntityIndex, inPVS, inPHS, crc8, ConfigStringIndex } from "@quake2ts/shared";
|
|
290
|
-
import { parseBsp, PakArchive } from "@quake2ts/engine";
|
|
291
|
-
import fs from "fs/promises";
|
|
292
|
-
import * as path from "path";
|
|
293
|
-
import { createPlayerInventory, createPlayerWeaponStates } from "@quake2ts/game";
|
|
294
|
-
|
|
295
285
|
// src/server.ts
|
|
296
286
|
var ServerState = /* @__PURE__ */ ((ServerState2) => {
|
|
297
287
|
ServerState2[ServerState2["Dead"] = 0] = "Dead";
|
|
@@ -302,15 +292,6 @@ var ServerState = /* @__PURE__ */ ((ServerState2) => {
|
|
|
302
292
|
ServerState2[ServerState2["Pic"] = 5] = "Pic";
|
|
303
293
|
return ServerState2;
|
|
304
294
|
})(ServerState || {});
|
|
305
|
-
|
|
306
|
-
// src/dedicated.ts
|
|
307
|
-
import { writeDeltaEntity, writeRemoveEntity } from "@quake2ts/shared";
|
|
308
|
-
|
|
309
|
-
// src/protocol/player.ts
|
|
310
|
-
import { writePlayerState } from "@quake2ts/shared";
|
|
311
|
-
|
|
312
|
-
// src/protocol/write.ts
|
|
313
|
-
import { ServerCommand, TempEntity } from "@quake2ts/shared";
|
|
314
295
|
function writeServerCommand(writer, event, ...args) {
|
|
315
296
|
writer.writeByte(event);
|
|
316
297
|
switch (event) {
|
|
@@ -456,12 +437,6 @@ function writeTempEntity(writer, type, args) {
|
|
|
456
437
|
break;
|
|
457
438
|
}
|
|
458
439
|
}
|
|
459
|
-
|
|
460
|
-
// src/dedicated.ts
|
|
461
|
-
import { lerpAngle } from "@quake2ts/shared";
|
|
462
|
-
|
|
463
|
-
// src/transports/websocket.ts
|
|
464
|
-
import { WebSocketServer } from "ws";
|
|
465
440
|
var WebSocketTransport = class {
|
|
466
441
|
constructor() {
|
|
467
442
|
this.wss = null;
|
|
@@ -537,7 +512,7 @@ var DedicatedServer = class {
|
|
|
537
512
|
frame: 0,
|
|
538
513
|
name: "",
|
|
539
514
|
collisionModel: null,
|
|
540
|
-
configStrings: new Array(
|
|
515
|
+
configStrings: new Array(MAX_CONFIGSTRINGS).fill(""),
|
|
541
516
|
baselines: new Array(MAX_EDICTS).fill(null),
|
|
542
517
|
multicastBuf: new Uint8Array(0)
|
|
543
518
|
};
|
|
@@ -565,8 +540,8 @@ var DedicatedServer = class {
|
|
|
565
540
|
if (client && client.state >= 2 /* Connected */) {
|
|
566
541
|
console.log(`Kicking client ${clientId}`);
|
|
567
542
|
if (client.netchan) {
|
|
568
|
-
const writer = new
|
|
569
|
-
writer.writeByte(
|
|
543
|
+
const writer = new BinaryWriter();
|
|
544
|
+
writer.writeByte(ServerCommand.print);
|
|
570
545
|
writer.writeByte(2);
|
|
571
546
|
writer.writeString("Kicked by server.\n");
|
|
572
547
|
try {
|
|
@@ -583,7 +558,7 @@ var DedicatedServer = class {
|
|
|
583
558
|
this.multicast(
|
|
584
559
|
{ x: 0, y: 0, z: 0 },
|
|
585
560
|
MulticastType.All,
|
|
586
|
-
|
|
561
|
+
ServerCommand.print,
|
|
587
562
|
2,
|
|
588
563
|
`Changing map to ${mapName}...
|
|
589
564
|
`
|
|
@@ -604,7 +579,7 @@ var DedicatedServer = class {
|
|
|
604
579
|
client.edict = null;
|
|
605
580
|
client.state = 2 /* Connected */;
|
|
606
581
|
this.sendServerData(client);
|
|
607
|
-
client.netchan.writeReliableByte(
|
|
582
|
+
client.netchan.writeReliableByte(ServerCommand.stufftext);
|
|
608
583
|
client.netchan.writeReliableString(`map ${mapName}
|
|
609
584
|
`);
|
|
610
585
|
this.handleBegin(client);
|
|
@@ -931,8 +906,8 @@ var DedicatedServer = class {
|
|
|
931
906
|
}
|
|
932
907
|
}
|
|
933
908
|
handleMove(client, cmd, checksum, lastFrame) {
|
|
934
|
-
if (lastFrame > 0 && lastFrame <= client.lastFrame && lastFrame > client.lastFrame -
|
|
935
|
-
const frameIdx = lastFrame %
|
|
909
|
+
if (lastFrame > 0 && lastFrame <= client.lastFrame && lastFrame > client.lastFrame - UPDATE_BACKUP) {
|
|
910
|
+
const frameIdx = lastFrame % UPDATE_BACKUP;
|
|
936
911
|
const frame = client.frames[frameIdx];
|
|
937
912
|
if (frame.packetCRC !== checksum) {
|
|
938
913
|
console.warn(`Client ${client.index} checksum mismatch for frame ${lastFrame}: expected ${frame.packetCRC}, got ${checksum}`);
|
|
@@ -984,8 +959,8 @@ var DedicatedServer = class {
|
|
|
984
959
|
`;
|
|
985
960
|
}
|
|
986
961
|
}
|
|
987
|
-
const writer = new
|
|
988
|
-
writer.writeByte(
|
|
962
|
+
const writer = new BinaryWriter();
|
|
963
|
+
writer.writeByte(ServerCommand.print);
|
|
989
964
|
writer.writeByte(2);
|
|
990
965
|
writer.writeString(status);
|
|
991
966
|
const packet = client.netchan.transmit(writer.getData());
|
|
@@ -994,8 +969,8 @@ var DedicatedServer = class {
|
|
|
994
969
|
handleGetChallenge(client) {
|
|
995
970
|
const challenge = Math.floor(Math.random() * 1e6) + 1;
|
|
996
971
|
client.challenge = challenge;
|
|
997
|
-
const writer = new
|
|
998
|
-
writer.writeByte(
|
|
972
|
+
const writer = new BinaryWriter();
|
|
973
|
+
writer.writeByte(ServerCommand.stufftext);
|
|
999
974
|
writer.writeString(`challenge ${challenge}
|
|
1000
975
|
`);
|
|
1001
976
|
const packet = client.netchan.transmit(writer.getData());
|
|
@@ -1013,7 +988,7 @@ var DedicatedServer = class {
|
|
|
1013
988
|
}
|
|
1014
989
|
try {
|
|
1015
990
|
this.sendServerData(client);
|
|
1016
|
-
client.netchan.writeReliableByte(
|
|
991
|
+
client.netchan.writeReliableByte(ServerCommand.stufftext);
|
|
1017
992
|
client.netchan.writeReliableString("precache\n");
|
|
1018
993
|
const packet = client.netchan.transmit();
|
|
1019
994
|
client.net.send(packet);
|
|
@@ -1023,8 +998,8 @@ var DedicatedServer = class {
|
|
|
1023
998
|
}
|
|
1024
999
|
} else {
|
|
1025
1000
|
console.log(`Client ${client.index} rejected: ${result}`);
|
|
1026
|
-
const writer = new
|
|
1027
|
-
writer.writeByte(
|
|
1001
|
+
const writer = new BinaryWriter();
|
|
1002
|
+
writer.writeByte(ServerCommand.print);
|
|
1028
1003
|
writer.writeByte(2);
|
|
1029
1004
|
writer.writeString(`Connection rejected: ${result}
|
|
1030
1005
|
`);
|
|
@@ -1063,25 +1038,25 @@ var DedicatedServer = class {
|
|
|
1063
1038
|
console.log(`Client ${client.index} entered game`);
|
|
1064
1039
|
}
|
|
1065
1040
|
sendServerData(client) {
|
|
1066
|
-
client.netchan.writeReliableByte(
|
|
1041
|
+
client.netchan.writeReliableByte(ServerCommand.serverdata);
|
|
1067
1042
|
client.netchan.writeReliableLong(34);
|
|
1068
1043
|
client.netchan.writeReliableLong(this.sv.frame);
|
|
1069
1044
|
client.netchan.writeReliableByte(0);
|
|
1070
1045
|
client.netchan.writeReliableString("baseq2");
|
|
1071
1046
|
client.netchan.writeReliableShort(client.index);
|
|
1072
1047
|
client.netchan.writeReliableString(this.sv.name || "maps/test.bsp");
|
|
1073
|
-
for (let i = 0; i <
|
|
1048
|
+
for (let i = 0; i < MAX_CONFIGSTRINGS; i++) {
|
|
1074
1049
|
if (this.sv.configStrings[i]) {
|
|
1075
|
-
client.netchan.writeReliableByte(
|
|
1050
|
+
client.netchan.writeReliableByte(ServerCommand.configstring);
|
|
1076
1051
|
client.netchan.writeReliableShort(i);
|
|
1077
1052
|
client.netchan.writeReliableString(this.sv.configStrings[i]);
|
|
1078
1053
|
}
|
|
1079
1054
|
}
|
|
1080
|
-
const baselineWriter = new
|
|
1055
|
+
const baselineWriter = new BinaryWriter();
|
|
1081
1056
|
for (let i = 0; i < MAX_EDICTS; i++) {
|
|
1082
1057
|
if (this.sv.baselines[i]) {
|
|
1083
1058
|
baselineWriter.reset();
|
|
1084
|
-
baselineWriter.writeByte(
|
|
1059
|
+
baselineWriter.writeByte(ServerCommand.spawnbaseline);
|
|
1085
1060
|
writeDeltaEntity({}, this.sv.baselines[i], baselineWriter, true, true);
|
|
1086
1061
|
const data = baselineWriter.getData();
|
|
1087
1062
|
for (let j = 0; j < data.length; j++) {
|
|
@@ -1091,13 +1066,13 @@ var DedicatedServer = class {
|
|
|
1091
1066
|
}
|
|
1092
1067
|
}
|
|
1093
1068
|
SV_SetConfigString(index, value) {
|
|
1094
|
-
if (index < 0 || index >=
|
|
1069
|
+
if (index < 0 || index >= MAX_CONFIGSTRINGS) return;
|
|
1095
1070
|
this.sv.configStrings[index] = value;
|
|
1096
1071
|
for (const client of this.svs.clients) {
|
|
1097
1072
|
if (client && client.state >= 2 /* Connected */) {
|
|
1098
1073
|
if (client.netchan) {
|
|
1099
1074
|
try {
|
|
1100
|
-
client.netchan.writeReliableByte(
|
|
1075
|
+
client.netchan.writeReliableByte(ServerCommand.configstring);
|
|
1101
1076
|
client.netchan.writeReliableShort(index);
|
|
1102
1077
|
client.netchan.writeReliableString(value);
|
|
1103
1078
|
const packet = client.netchan.transmit();
|
|
@@ -1111,7 +1086,7 @@ var DedicatedServer = class {
|
|
|
1111
1086
|
}
|
|
1112
1087
|
}
|
|
1113
1088
|
SV_WriteConfigString(writer, index, value) {
|
|
1114
|
-
writer.writeByte(
|
|
1089
|
+
writer.writeByte(ServerCommand.configstring);
|
|
1115
1090
|
writer.writeShort(index);
|
|
1116
1091
|
writer.writeString(value);
|
|
1117
1092
|
}
|
|
@@ -1141,7 +1116,7 @@ var DedicatedServer = class {
|
|
|
1141
1116
|
} else {
|
|
1142
1117
|
buffer = new Uint8Array(data).buffer;
|
|
1143
1118
|
}
|
|
1144
|
-
const reader = new
|
|
1119
|
+
const reader = new BinaryStream(buffer);
|
|
1145
1120
|
const parser = new ClientMessageParser(reader, {
|
|
1146
1121
|
onMove: (checksum, lastFrame, cmd) => this.handleMove(client, cmd, checksum, lastFrame),
|
|
1147
1122
|
onUserInfo: (info) => this.handleUserInfo(client, info),
|
|
@@ -1218,17 +1193,17 @@ var DedicatedServer = class {
|
|
|
1218
1193
|
}
|
|
1219
1194
|
SV_SendClientFrame(client, snapshot) {
|
|
1220
1195
|
const MTU = 1400;
|
|
1221
|
-
const writer = new
|
|
1222
|
-
writer.writeByte(
|
|
1196
|
+
const writer = new BinaryWriter(MTU);
|
|
1197
|
+
writer.writeByte(ServerCommand.frame);
|
|
1223
1198
|
writer.writeLong(this.sv.frame);
|
|
1224
1199
|
let deltaFrame = 0;
|
|
1225
|
-
if (client.lastFrame && client.lastFrame < this.sv.frame && client.lastFrame >= this.sv.frame -
|
|
1200
|
+
if (client.lastFrame && client.lastFrame < this.sv.frame && client.lastFrame >= this.sv.frame - UPDATE_BACKUP) {
|
|
1226
1201
|
deltaFrame = client.lastFrame;
|
|
1227
1202
|
}
|
|
1228
1203
|
writer.writeLong(deltaFrame);
|
|
1229
1204
|
writer.writeByte(0);
|
|
1230
1205
|
writer.writeByte(0);
|
|
1231
|
-
writer.writeByte(
|
|
1206
|
+
writer.writeByte(ServerCommand.playerinfo);
|
|
1232
1207
|
const ps = {
|
|
1233
1208
|
pm_type: snapshot.pmType,
|
|
1234
1209
|
origin: snapshot.origin,
|
|
@@ -1252,15 +1227,15 @@ var DedicatedServer = class {
|
|
|
1252
1227
|
// Populate watertype
|
|
1253
1228
|
};
|
|
1254
1229
|
writePlayerState(writer, ps);
|
|
1255
|
-
writer.writeByte(
|
|
1230
|
+
writer.writeByte(ServerCommand.packetentities);
|
|
1256
1231
|
const entities = snapshot.packetEntities || [];
|
|
1257
1232
|
const currentEntityIds = [];
|
|
1258
|
-
const frameIdx = this.sv.frame %
|
|
1233
|
+
const frameIdx = this.sv.frame % UPDATE_BACKUP;
|
|
1259
1234
|
const currentFrame = client.frames[frameIdx];
|
|
1260
1235
|
currentFrame.entities = entities;
|
|
1261
1236
|
let oldEntities = [];
|
|
1262
1237
|
if (deltaFrame > 0) {
|
|
1263
|
-
const oldFrameIdx = deltaFrame %
|
|
1238
|
+
const oldFrameIdx = deltaFrame % UPDATE_BACKUP;
|
|
1264
1239
|
oldEntities = client.frames[oldFrameIdx].entities;
|
|
1265
1240
|
}
|
|
1266
1241
|
for (const entityState of currentFrame.entities) {
|
|
@@ -1350,10 +1325,9 @@ var DedicatedServer = class {
|
|
|
1350
1325
|
return 0;
|
|
1351
1326
|
}
|
|
1352
1327
|
multicast(origin, type, event, ...args) {
|
|
1353
|
-
const writer = new
|
|
1328
|
+
const writer = new BinaryWriter();
|
|
1354
1329
|
writeServerCommand(writer, event, ...args);
|
|
1355
1330
|
const data = writer.getData();
|
|
1356
|
-
const reliable = false;
|
|
1357
1331
|
for (const client of this.svs.clients) {
|
|
1358
1332
|
if (!client || client.state < 4 /* Active */ || !client.edict) {
|
|
1359
1333
|
continue;
|
|
@@ -1379,14 +1353,7 @@ var DedicatedServer = class {
|
|
|
1379
1353
|
break;
|
|
1380
1354
|
}
|
|
1381
1355
|
if (send) {
|
|
1382
|
-
|
|
1383
|
-
try {
|
|
1384
|
-
for (let i = 0; i < data.length; i++) {
|
|
1385
|
-
client.netchan.writeReliableByte(data[i]);
|
|
1386
|
-
}
|
|
1387
|
-
} catch (e) {
|
|
1388
|
-
}
|
|
1389
|
-
} else {
|
|
1356
|
+
{
|
|
1390
1357
|
const packet = client.netchan.transmit(data);
|
|
1391
1358
|
client.net.send(packet);
|
|
1392
1359
|
}
|
|
@@ -1396,7 +1363,7 @@ var DedicatedServer = class {
|
|
|
1396
1363
|
unicast(ent, reliable, event, ...args) {
|
|
1397
1364
|
const client = this.svs.clients.find((c) => c?.edict === ent);
|
|
1398
1365
|
if (client && client.state >= 2 /* Connected */) {
|
|
1399
|
-
const writer = new
|
|
1366
|
+
const writer = new BinaryWriter();
|
|
1400
1367
|
writeServerCommand(writer, event, ...args);
|
|
1401
1368
|
const data = writer.getData();
|
|
1402
1369
|
if (reliable) {
|
|
@@ -1532,12 +1499,7 @@ var DedicatedServer = class {
|
|
|
1532
1499
|
function createServer(options = {}) {
|
|
1533
1500
|
return new DedicatedServer(options);
|
|
1534
1501
|
}
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
ServerState,
|
|
1540
|
-
WebSocketNetDriver,
|
|
1541
|
-
createClient,
|
|
1542
|
-
createServer
|
|
1543
|
-
};
|
|
1502
|
+
|
|
1503
|
+
export { ClientMessageParser, ClientState, DedicatedServer, ServerState, WebSocketNetDriver, createClient, createServer };
|
|
1504
|
+
//# sourceMappingURL=index.js.map
|
|
1505
|
+
//# sourceMappingURL=index.js.map
|