quake2ts 0.0.470 → 0.0.472

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.
@@ -0,0 +1,20 @@
1
+ export interface ChatMessage {
2
+ timestamp: number;
3
+ sender?: string;
4
+ text: string;
5
+ team: boolean;
6
+ }
7
+ export declare class ChatManager {
8
+ private history;
9
+ private maxHistory;
10
+ private listeners;
11
+ private sendCommand;
12
+ constructor(sendCommand: (cmd: string) => void);
13
+ addListener(listener: (sender: string, message: string, team: boolean) => void): void;
14
+ removeListener(listener: (sender: string, message: string, team: boolean) => void): void;
15
+ sendChatMessage(message: string, team?: boolean): void;
16
+ addMessage(level: number, text: string): void;
17
+ getHistory(): ChatMessage[];
18
+ private notifyListeners;
19
+ }
20
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,SAAS,CAAoE;IACrF,OAAO,CAAC,WAAW,CAAwB;gBAE/B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAIvC,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI;IAI9E,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI;IAOjF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe;IAOtD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAsDtC,UAAU,IAAI,WAAW,EAAE;IAIlC,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.test.d.ts","sourceRoot":"","sources":["../../src/chat.test.ts"],"names":[],"mappings":""}
@@ -17,6 +17,7 @@ export interface DemoHandlerCallbacks {
17
17
  onDamage?: (indicators: DamageIndicator[]) => void;
18
18
  onServerData?: (protocol: number, tickRate?: number) => void;
19
19
  onLocPrint?: (flags: number, base: string, args: string[]) => void;
20
+ onLayout?: (layout: string) => void;
20
21
  }
21
22
  export declare class ClientNetworkHandler implements NetworkMessageHandler {
22
23
  configstrings: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/demo/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/demo/handler.ts"],"names":[],"mappings":"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"}
@@ -89,6 +89,9 @@ export interface ClientExports extends ClientRenderer<PredictionState> {
89
89
  readonly dlightManager: DynamicLightManager;
90
90
  getScoreboard(): ScoreboardData;
91
91
  onScoreboardUpdate?: (scoreboard: ScoreboardData) => void;
92
+ sendChatMessage(message: string, team?: boolean): void;
93
+ onChatMessage?: (sender: string, message: string, team: boolean) => void;
94
+ getChatHistory(): any[];
92
95
  getHudData(): HudData | null;
93
96
  getStatusBar(): StatusBarData | null;
94
97
  getCrosshairInfo(): CrosshairInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EAEf,MAAM,EACN,QAAQ,EACR,sBAAsB,EAEtB,UAAU,EAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAmK,MAAM,kBAAkB,CAAC;AAGtN,OAAO,EAAE,gBAAgB,EAA8B,eAAe,EAA4B,MAAM,iBAAiB,CAAC;AAC1H,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI1D,OAAO,EAAE,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAO3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAwB,mBAAmB,EAA4B,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAInE,OAAO,EAAqB,cAAc,EAAmB,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,WAAW,EACX,eAAe,EACf,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEtE,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AAIjC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,GAAG,CAAC,EAAE;YAAE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;IACnG,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AAED,oBAAY,UAAU;IACpB,MAAM,IAAA;IACN,YAAY,IAAA;IACZ,WAAW,IAAA;CACZ;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,eAAe,CAAC;IAEpE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,CAAC;IAC/C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAGpD,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,YAAY,EAAE,sBAAsB,CAAC;IACrC,WAAW,EAAE,oBAAoB,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,gBAAgB,IAAI,IAAI,CAAC;IAGzB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9C,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,wBAAwB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IAC7C,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5C,WAAW,EAAE,qBAAqB,CAAC;IAGnC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,IAAI,IAAI,CAAC;IAGtB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC;IAGvV,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjD,UAAU,IAAI,IAAI,CAAC;IACnB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpD,kBAAkB,IAAI,aAAa,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAG5C,IAAI,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IACvD,QAAQ,IAAI,IAAI,CAAC;IACjB,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAGvD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAG5C,aAAa,IAAI,cAAc,CAAC;IAChC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;IAE1D,UAAU,IAAI,OAAO,GAAG,IAAI,CAAC;IAC7B,YAAY,IAAI,aAAa,GAAG,IAAI,CAAC;IACrC,gBAAgB,IAAI,aAAa,CAAC;IAClC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAWD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAqkClE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export interface ScoreboardEntry {
7
7
  id: number;
8
8
  skin?: string;
9
9
  model?: string;
10
+ team?: string;
10
11
  }
11
12
  export interface ScoreboardData {
12
13
  players: ScoreboardEntry[];
@@ -27,5 +28,21 @@ export declare class ScoreboardManager {
27
28
  getScoreboard(): ScoreboardData;
28
29
  private parsePlayerConfigString;
29
30
  updateScore(id: number, frags: number, deaths: number, ping: number): void;
31
+ /**
32
+ * Parses the layout string from svc_layout and updates player scores.
33
+ * Expected format example:
34
+ * xv 32 yv 32 string "%4i %4i %-12.12s %4i"
35
+ * followed by values? No, the string command draws text.
36
+ * In Q2, the layout message sends a series of drawing commands.
37
+ * The server formats the string:
38
+ * "xv 32 yv %i string \"%4i %4i %-12.12s %4i\" "
39
+ * The client receives the formatting commands AND the string data.
40
+ * Wait, svc_layout in Q2 sends a single string that the client parses and draws.
41
+ * The string contains tokens.
42
+ * Example:
43
+ * "xv 32 yv 32 string \" 10 50 PlayerName 10\""
44
+ * We need to regex this.
45
+ */
46
+ processScoreboardMessage(layout: string): void;
30
47
  }
31
48
  //# sourceMappingURL=scoreboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scoreboard.d.ts","sourceRoot":"","sources":["../../src/scoreboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,SAAS,CAA0C;IAG3D,OAAO,CAAC,OAAO,CAA2C;gBAE9C,aAAa,EAAE,mBAAmB;IAKvC,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAI3B,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI;IAIpD,cAAc,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI;IAOvD,YAAY;IAOnB,OAAO,CAAC,UAAU;IAWX,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IA2B5C,aAAa,IAAI,cAAc;IAyBtC,OAAO,CAAC,uBAAuB;IAmCxB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAS3E"}
1
+ {"version":3,"file":"scoreboard.d.ts","sourceRoot":"","sources":["../../src/scoreboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,SAAS,CAA0C;IAG3D,OAAO,CAAC,OAAO,CAA2C;gBAE9C,aAAa,EAAE,mBAAmB;IAKvC,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAI3B,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI;IAIpD,cAAc,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI;IAOvD,YAAY;IAOnB,OAAO,CAAC,UAAU;IAWX,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IA4B5C,aAAa,IAAI,cAAc;IAyBtC,OAAO,CAAC,uBAAuB;IAoCxB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAU1E;;;;;;;;;;;;;;OAcG;IACI,wBAAwB,CAAC,MAAM,EAAE,MAAM;CA0D/C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scoreboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoreboard.test.d.ts","sourceRoot":"","sources":["../../src/scoreboard.test.ts"],"names":[],"mappings":""}
@@ -34,7 +34,8 @@ __export(index_exports, {
34
34
  ClientState: () => ClientState,
35
35
  DedicatedServer: () => DedicatedServer,
36
36
  WebSocketNetDriver: () => WebSocketNetDriver,
37
- createClient: () => createClient
37
+ createClient: () => createClient,
38
+ createServer: () => createServer
38
39
  });
39
40
  module.exports = __toCommonJS(index_exports);
40
41
 
@@ -151,7 +152,6 @@ var WebSocketNetDriver = class {
151
152
  };
152
153
 
153
154
  // src/dedicated.ts
154
- var import_ws2 = require("ws");
155
155
  var import_game = require("@quake2ts/game");
156
156
 
157
157
  // src/client.ts
@@ -809,25 +809,71 @@ function writeTempEntity(writer, type, args) {
809
809
 
810
810
  // src/dedicated.ts
811
811
  var import_shared5 = require("@quake2ts/shared");
812
- var MAX_CLIENTS = 16;
812
+
813
+ // src/transports/websocket.ts
814
+ var import_ws2 = require("ws");
815
+ var WebSocketTransport = class {
816
+ constructor() {
817
+ this.wss = null;
818
+ this.connectionCallback = null;
819
+ this.errorCallback = null;
820
+ }
821
+ async listen(port) {
822
+ return new Promise((resolve) => {
823
+ this.wss = new import_ws2.WebSocketServer({ port });
824
+ this.wss.on("listening", () => resolve());
825
+ this.wss.on("connection", (ws, req) => {
826
+ const driver = new WebSocketNetDriver();
827
+ driver.attach(ws);
828
+ if (this.connectionCallback) {
829
+ this.connectionCallback(driver, req);
830
+ }
831
+ });
832
+ this.wss.on("error", (err) => {
833
+ if (this.errorCallback) this.errorCallback(err);
834
+ });
835
+ });
836
+ }
837
+ close() {
838
+ if (this.wss) {
839
+ this.wss.close();
840
+ this.wss = null;
841
+ }
842
+ }
843
+ onConnection(callback) {
844
+ this.connectionCallback = callback;
845
+ }
846
+ onError(callback) {
847
+ this.errorCallback = callback;
848
+ }
849
+ };
850
+
851
+ // src/dedicated.ts
852
+ var DEFAULT_MAX_CLIENTS = 16;
813
853
  var FRAME_RATE = 10;
814
854
  var FRAME_TIME_MS = 1e3 / FRAME_RATE;
815
855
  var DedicatedServer = class {
816
- constructor(port = 27910) {
817
- this.port = port;
818
- this.wss = null;
856
+ constructor(optionsOrPort = {}) {
819
857
  this.game = null;
820
858
  this.frameTimeout = null;
821
859
  this.entityIndex = null;
822
860
  // History buffer: Map<EntityIndex, HistoryArray>
823
861
  this.history = /* @__PURE__ */ new Map();
824
862
  this.backup = /* @__PURE__ */ new Map();
863
+ const options = typeof optionsOrPort === "number" ? { port: optionsOrPort } : optionsOrPort;
864
+ this.options = {
865
+ port: 27910,
866
+ maxPlayers: DEFAULT_MAX_CLIENTS,
867
+ deathmatch: true,
868
+ ...options
869
+ };
870
+ this.transport = this.options.transport || new WebSocketTransport();
825
871
  this.svs = {
826
872
  initialized: false,
827
873
  realTime: 0,
828
874
  mapCmd: "",
829
875
  spawnCount: 0,
830
- clients: new Array(MAX_CLIENTS).fill(null),
876
+ clients: new Array(this.options.maxPlayers).fill(null),
831
877
  lastHeartbeat: 0,
832
878
  challenges: []
833
879
  };
@@ -847,20 +893,114 @@ var DedicatedServer = class {
847
893
  };
848
894
  this.entityIndex = new import_shared4.CollisionEntityIndex();
849
895
  }
896
+ setTransport(transport) {
897
+ if (this.svs.initialized) {
898
+ throw new Error("Cannot set transport after server started");
899
+ }
900
+ this.transport = transport;
901
+ }
902
+ async startServer(mapName) {
903
+ const map = mapName || this.options.mapName;
904
+ if (!map) {
905
+ throw new Error("No map specified");
906
+ }
907
+ await this.start(map);
908
+ }
909
+ stopServer() {
910
+ this.stop();
911
+ }
912
+ kickPlayer(clientId) {
913
+ if (clientId < 0 || clientId >= this.svs.clients.length) return;
914
+ const client = this.svs.clients[clientId];
915
+ if (client && client.state >= 2 /* Connected */) {
916
+ console.log(`Kicking client ${clientId}`);
917
+ if (client.netchan) {
918
+ const writer = new import_shared4.BinaryWriter();
919
+ writer.writeByte(import_shared4.ServerCommand.print);
920
+ writer.writeByte(2);
921
+ writer.writeString("Kicked by server.\n");
922
+ try {
923
+ const packet = client.netchan.transmit(writer.getData());
924
+ client.net.send(packet);
925
+ } catch (e) {
926
+ }
927
+ }
928
+ this.dropClient(client);
929
+ }
930
+ }
931
+ async changeMap(mapName) {
932
+ console.log(`Changing map to ${mapName}`);
933
+ this.multicast(
934
+ { x: 0, y: 0, z: 0 },
935
+ import_game.MulticastType.All,
936
+ import_shared4.ServerCommand.print,
937
+ 2,
938
+ `Changing map to ${mapName}...
939
+ `
940
+ );
941
+ if (this.frameTimeout) clearTimeout(this.frameTimeout);
942
+ this.sv.state = 1 /* Loading */;
943
+ this.sv.collisionModel = null;
944
+ this.sv.time = 0;
945
+ this.sv.frame = 0;
946
+ this.sv.configStrings.fill("");
947
+ this.sv.baselines.fill(null);
948
+ this.history.clear();
949
+ this.entityIndex = new import_shared4.CollisionEntityIndex();
950
+ await this.loadMap(mapName);
951
+ this.initGame();
952
+ for (const client of this.svs.clients) {
953
+ if (client && client.state >= 2 /* Connected */) {
954
+ client.edict = null;
955
+ client.state = 2 /* Connected */;
956
+ this.sendServerData(client);
957
+ client.netchan.writeReliableByte(import_shared4.ServerCommand.stufftext);
958
+ client.netchan.writeReliableString(`map ${mapName}
959
+ `);
960
+ this.handleBegin(client);
961
+ }
962
+ }
963
+ this.runFrame();
964
+ }
965
+ getConnectedClients() {
966
+ const list = [];
967
+ for (const client of this.svs.clients) {
968
+ if (client && client.state >= 2 /* Connected */) {
969
+ list.push({
970
+ id: client.index,
971
+ name: "Player",
972
+ // TODO: Parse userinfo for name
973
+ ping: client.ping,
974
+ address: "unknown"
975
+ });
976
+ }
977
+ }
978
+ return list;
979
+ }
850
980
  async start(mapName) {
851
- console.log(`Starting Dedicated Server on port ${this.port}...`);
981
+ console.log(`Starting Dedicated Server on port ${this.options.port}...`);
852
982
  this.sv.name = mapName;
853
983
  this.svs.initialized = true;
854
984
  this.svs.spawnCount++;
855
- this.wss = new import_ws2.WebSocketServer({ port: this.port });
856
- this.wss.on("connection", (ws) => {
857
- console.log("New connection");
858
- this.handleConnection(ws);
985
+ this.transport.onConnection((driver, info) => {
986
+ console.log("New connection", info ? `from ${info.socket?.remoteAddress}` : "");
987
+ this.handleConnection(driver, info);
988
+ });
989
+ this.transport.onError((err) => {
990
+ if (this.onServerError) this.onServerError(err);
859
991
  });
992
+ await this.transport.listen(this.options.port);
993
+ await this.loadMap(mapName);
994
+ this.initGame();
995
+ this.runFrame();
996
+ console.log("Server started.");
997
+ }
998
+ async loadMap(mapName) {
860
999
  try {
861
- console.log(`Loading map ${this.sv.name}...`);
1000
+ console.log(`Loading map ${mapName}...`);
862
1001
  this.sv.state = 1 /* Loading */;
863
- const mapData = await import_promises.default.readFile(this.sv.name);
1002
+ this.sv.name = mapName;
1003
+ const mapData = await import_promises.default.readFile(mapName);
864
1004
  const arrayBuffer = mapData.buffer.slice(mapData.byteOffset, mapData.byteOffset + mapData.byteLength);
865
1005
  const bspMap = (0, import_engine.parseBsp)(arrayBuffer);
866
1006
  const planes = bspMap.planes.map((p) => {
@@ -937,7 +1077,10 @@ var DedicatedServer = class {
937
1077
  console.log(`Map loaded successfully.`);
938
1078
  } catch (e) {
939
1079
  console.warn("Failed to load map:", e);
1080
+ if (this.onServerError) this.onServerError(e);
940
1081
  }
1082
+ }
1083
+ initGame() {
941
1084
  this.sv.startTime = Date.now();
942
1085
  const imports = {
943
1086
  trace: (start, mins, maxs, end, passent, contentmask) => {
@@ -994,7 +1137,6 @@ var DedicatedServer = class {
994
1137
  };
995
1138
  },
996
1139
  pointcontents: (p) => 0,
997
- // Empty
998
1140
  linkentity: (ent) => {
999
1141
  if (!this.entityIndex) return;
1000
1142
  this.entityIndex.link({
@@ -1003,7 +1145,6 @@ var DedicatedServer = class {
1003
1145
  mins: ent.mins,
1004
1146
  maxs: ent.maxs,
1005
1147
  contents: ent.solid === 0 ? 0 : 1,
1006
- // Simplified contents
1007
1148
  surfaceFlags: 0
1008
1149
  });
1009
1150
  },
@@ -1021,14 +1162,12 @@ var DedicatedServer = class {
1021
1162
  };
1022
1163
  this.game = (0, import_game.createGame)(imports, this, {
1023
1164
  gravity: { x: 0, y: 0, z: -800 },
1024
- deathmatch: true
1165
+ deathmatch: this.options.deathmatch !== false
1025
1166
  });
1026
1167
  this.game.init(0);
1027
1168
  this.game.spawnWorld();
1028
1169
  this.populateBaselines();
1029
1170
  this.sv.state = 2 /* Game */;
1030
- this.runFrame();
1031
- console.log("Server started.");
1032
1171
  }
1033
1172
  populateBaselines() {
1034
1173
  if (!this.game) return;
@@ -1051,21 +1190,18 @@ var DedicatedServer = class {
1051
1190
  renderfx: ent.renderfx,
1052
1191
  solid: ent.solid,
1053
1192
  sound: ent.sounds,
1054
- // Assuming ent.sounds maps to 'sound' field in EntityState
1055
1193
  event: 0
1056
1194
  };
1057
1195
  }
1058
1196
  stop() {
1059
1197
  if (this.frameTimeout) clearTimeout(this.frameTimeout);
1060
- if (this.wss) this.wss.close();
1198
+ this.transport.close();
1061
1199
  this.game?.shutdown();
1062
1200
  this.sv.state = 0 /* Dead */;
1063
1201
  }
1064
- handleConnection(ws) {
1065
- const driver = new WebSocketNetDriver();
1066
- driver.attach(ws);
1202
+ handleConnection(driver, info) {
1067
1203
  let clientIndex = -1;
1068
- for (let i = 0; i < MAX_CLIENTS; i++) {
1204
+ for (let i = 0; i < this.options.maxPlayers; i++) {
1069
1205
  if (this.svs.clients[i] === null || this.svs.clients[i].state === 0 /* Free */) {
1070
1206
  clientIndex = i;
1071
1207
  break;
@@ -1073,14 +1209,14 @@ var DedicatedServer = class {
1073
1209
  }
1074
1210
  if (clientIndex === -1) {
1075
1211
  console.log("Server full, rejecting connection");
1076
- ws.close();
1212
+ driver.disconnect();
1077
1213
  return;
1078
1214
  }
1079
1215
  const client = createClient(clientIndex, driver);
1080
1216
  client.lastMessage = this.sv.frame;
1081
1217
  client.lastCommandTime = Date.now();
1082
1218
  this.svs.clients[clientIndex] = client;
1083
- console.log(`Client ${clientIndex} attached to slot from ${ws._socket?.remoteAddress || "unknown"}`);
1219
+ console.log(`Client ${clientIndex} attached to slot from ${info?.socket?.remoteAddress || "unknown"}`);
1084
1220
  driver.onMessage((data) => this.onClientMessage(client, data));
1085
1221
  driver.onClose(() => this.onClientDisconnect(client));
1086
1222
  }
@@ -1093,6 +1229,9 @@ var DedicatedServer = class {
1093
1229
  if (client.edict && this.game) {
1094
1230
  this.game.clientDisconnect(client.edict);
1095
1231
  }
1232
+ if (this.onClientDisconnected) {
1233
+ this.onClientDisconnected(client.index);
1234
+ }
1096
1235
  client.state = 0 /* Free */;
1097
1236
  this.svs.clients[client.index] = null;
1098
1237
  if (this.entityIndex && client.edict) {
@@ -1141,7 +1280,7 @@ var DedicatedServer = class {
1141
1280
  }
1142
1281
  let status = `map: ${this.sv.name}
1143
1282
  `;
1144
- status += `players: ${activeClients} active (${MAX_CLIENTS} max)
1283
+ status += `players: ${activeClients} active (${this.options.maxPlayers} max)
1145
1284
 
1146
1285
  `;
1147
1286
  status += `num score ping name lastmsg address qport rate
@@ -1182,6 +1321,9 @@ var DedicatedServer = class {
1182
1321
  client.state = 2 /* Connected */;
1183
1322
  client.userInfo = userInfo;
1184
1323
  console.log(`Client ${client.index} connected: ${userInfo}`);
1324
+ if (this.onClientConnected) {
1325
+ this.onClientConnected(client.index, "Player");
1326
+ }
1185
1327
  try {
1186
1328
  this.sendServerData(client);
1187
1329
  client.netchan.writeReliableByte(import_shared4.ServerCommand.stufftext);
@@ -1401,10 +1543,8 @@ var DedicatedServer = class {
1401
1543
  pm_time: snapshot.pm_time,
1402
1544
  pm_flags: snapshot.pmFlags,
1403
1545
  gravity: Math.abs(snapshot.gravity.z),
1404
- // Usually only Z is relevant for gravity value
1405
1546
  delta_angles: snapshot.deltaAngles,
1406
1547
  viewoffset: { x: 0, y: 0, z: 22 },
1407
- // Default view offset if not in snapshot
1408
1548
  viewangles: snapshot.viewangles,
1409
1549
  kick_angles: snapshot.kick_angles,
1410
1550
  gun_index: snapshot.gunindex,
@@ -1573,7 +1713,6 @@ var DedicatedServer = class {
1573
1713
  }
1574
1714
  if (i < 0) {
1575
1715
  i = 0;
1576
- } else if (i >= hist.length - 1) {
1577
1716
  }
1578
1717
  const s1 = hist[i];
1579
1718
  const s2 = i + 1 < hist.length ? hist[i + 1] : s1;
@@ -1599,7 +1738,6 @@ var DedicatedServer = class {
1599
1738
  maxs: { ...ent.maxs },
1600
1739
  angles: { ...ent.angles },
1601
1740
  link: true
1602
- // assume linked if we are tracking it
1603
1741
  });
1604
1742
  ent.origin = origin;
1605
1743
  ent.angles = angles;
@@ -1619,7 +1757,6 @@ var DedicatedServer = class {
1619
1757
  mins: ent.mins,
1620
1758
  maxs: ent.maxs,
1621
1759
  contents: ent.solid === 0 ? 0 : 1,
1622
- // Simplified
1623
1760
  surfaceFlags: 0
1624
1761
  });
1625
1762
  });
@@ -1645,11 +1782,15 @@ var DedicatedServer = class {
1645
1782
  }
1646
1783
  }
1647
1784
  };
1785
+ function createServer(options = {}) {
1786
+ return new DedicatedServer(options);
1787
+ }
1648
1788
  // Annotate the CommonJS export names for ESM import in node:
1649
1789
  0 && (module.exports = {
1650
1790
  ClientMessageParser,
1651
1791
  ClientState,
1652
1792
  DedicatedServer,
1653
1793
  WebSocketNetDriver,
1654
- createClient
1794
+ createClient,
1795
+ createServer
1655
1796
  });
@@ -17,9 +17,28 @@ declare class WebSocketNetDriver implements NetDriver {
17
17
  isConnected(): boolean;
18
18
  }
19
19
 
20
+ interface NetworkTransport {
21
+ listen(port: number): Promise<void>;
22
+ close(): void;
23
+ onConnection(callback: (driver: NetDriver, info?: any) => void): void;
24
+ onError(callback: (error: Error) => void): void;
25
+ }
26
+
27
+ interface ClientInfo {
28
+ id: number;
29
+ name: string;
30
+ ping: number;
31
+ address: string;
32
+ }
33
+ interface ServerOptions {
34
+ mapName?: string;
35
+ maxPlayers?: number;
36
+ deathmatch?: boolean;
37
+ port?: number;
38
+ transport?: NetworkTransport;
39
+ }
20
40
  declare class DedicatedServer implements GameEngine {
21
- private port;
22
- private wss;
41
+ private transport;
23
42
  private svs;
24
43
  private sv;
25
44
  private game;
@@ -27,8 +46,20 @@ declare class DedicatedServer implements GameEngine {
27
46
  private entityIndex;
28
47
  private history;
29
48
  private backup;
30
- constructor(port?: number);
31
- start(mapName: string): Promise<void>;
49
+ onClientConnected?: (clientId: number, name: string) => void;
50
+ onClientDisconnected?: (clientId: number) => void;
51
+ onServerError?: (error: Error) => void;
52
+ private options;
53
+ constructor(optionsOrPort?: ServerOptions | number);
54
+ setTransport(transport: NetworkTransport): void;
55
+ startServer(mapName?: string): Promise<void>;
56
+ stopServer(): void;
57
+ kickPlayer(clientId: number): void;
58
+ changeMap(mapName: string): Promise<void>;
59
+ getConnectedClients(): ClientInfo[];
60
+ private start;
61
+ private loadMap;
62
+ private initGame;
32
63
  private populateBaselines;
33
64
  private entityToState;
34
65
  stop(): void;
@@ -58,6 +89,7 @@ declare class DedicatedServer implements GameEngine {
58
89
  private recordHistory;
59
90
  setLagCompensation(active: boolean, client?: Entity, lagMs?: number): void;
60
91
  }
92
+ declare function createServer(options?: ServerOptions): DedicatedServer;
61
93
 
62
94
  declare enum ClientState {
63
95
  Free = 0,
@@ -126,4 +158,4 @@ declare class ClientMessageParser {
126
158
  private parseStringCmd;
127
159
  }
128
160
 
129
- export { type Client, type ClientFrame, type ClientMessageHandler, ClientMessageParser, ClientState, DedicatedServer, WebSocketNetDriver, createClient };
161
+ export { type Client, type ClientFrame, type ClientInfo, type ClientMessageHandler, ClientMessageParser, ClientState, DedicatedServer, type NetworkTransport, type ServerOptions, WebSocketNetDriver, createClient, createServer };
@@ -17,9 +17,28 @@ declare class WebSocketNetDriver implements NetDriver {
17
17
  isConnected(): boolean;
18
18
  }
19
19
 
20
+ interface NetworkTransport {
21
+ listen(port: number): Promise<void>;
22
+ close(): void;
23
+ onConnection(callback: (driver: NetDriver, info?: any) => void): void;
24
+ onError(callback: (error: Error) => void): void;
25
+ }
26
+
27
+ interface ClientInfo {
28
+ id: number;
29
+ name: string;
30
+ ping: number;
31
+ address: string;
32
+ }
33
+ interface ServerOptions {
34
+ mapName?: string;
35
+ maxPlayers?: number;
36
+ deathmatch?: boolean;
37
+ port?: number;
38
+ transport?: NetworkTransport;
39
+ }
20
40
  declare class DedicatedServer implements GameEngine {
21
- private port;
22
- private wss;
41
+ private transport;
23
42
  private svs;
24
43
  private sv;
25
44
  private game;
@@ -27,8 +46,20 @@ declare class DedicatedServer implements GameEngine {
27
46
  private entityIndex;
28
47
  private history;
29
48
  private backup;
30
- constructor(port?: number);
31
- start(mapName: string): Promise<void>;
49
+ onClientConnected?: (clientId: number, name: string) => void;
50
+ onClientDisconnected?: (clientId: number) => void;
51
+ onServerError?: (error: Error) => void;
52
+ private options;
53
+ constructor(optionsOrPort?: ServerOptions | number);
54
+ setTransport(transport: NetworkTransport): void;
55
+ startServer(mapName?: string): Promise<void>;
56
+ stopServer(): void;
57
+ kickPlayer(clientId: number): void;
58
+ changeMap(mapName: string): Promise<void>;
59
+ getConnectedClients(): ClientInfo[];
60
+ private start;
61
+ private loadMap;
62
+ private initGame;
32
63
  private populateBaselines;
33
64
  private entityToState;
34
65
  stop(): void;
@@ -58,6 +89,7 @@ declare class DedicatedServer implements GameEngine {
58
89
  private recordHistory;
59
90
  setLagCompensation(active: boolean, client?: Entity, lagMs?: number): void;
60
91
  }
92
+ declare function createServer(options?: ServerOptions): DedicatedServer;
61
93
 
62
94
  declare enum ClientState {
63
95
  Free = 0,
@@ -126,4 +158,4 @@ declare class ClientMessageParser {
126
158
  private parseStringCmd;
127
159
  }
128
160
 
129
- export { type Client, type ClientFrame, type ClientMessageHandler, ClientMessageParser, ClientState, DedicatedServer, WebSocketNetDriver, createClient };
161
+ export { type Client, type ClientFrame, type ClientInfo, type ClientMessageHandler, ClientMessageParser, ClientState, DedicatedServer, type NetworkTransport, type ServerOptions, WebSocketNetDriver, createClient, createServer };