quake2ts 0.0.557 → 0.0.562
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/package.json +3 -1
- package/packages/client/dist/browser/index.global.js +15 -15
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +343 -1
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +343 -1
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/client/dist/types/index.d.ts.map +1 -1
- package/packages/client/dist/types/net/connection.d.ts +2 -0
- package/packages/client/dist/types/net/connection.d.ts.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/render/bloom.d.ts +19 -0
- package/packages/engine/dist/types/render/bloom.d.ts.map +1 -0
- package/packages/engine/dist/types/render/frame.d.ts +2 -0
- package/packages/engine/dist/types/render/frame.d.ts.map +1 -1
- package/packages/engine/dist/types/render/renderer.d.ts +2 -0
- package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/server/dist/client.d.ts +51 -0
- package/packages/server/dist/client.js +100 -0
- package/packages/server/dist/dedicated.d.ts +69 -0
- package/packages/server/dist/dedicated.js +1013 -0
- package/packages/server/dist/index.cjs +27 -2
- package/packages/server/dist/index.d.ts +7 -161
- package/packages/server/dist/index.js +26 -2
- package/packages/server/dist/net/nodeWsDriver.d.ts +16 -0
- package/packages/server/dist/net/nodeWsDriver.js +122 -0
- package/packages/server/dist/protocol/player.d.ts +23 -0
- package/packages/server/dist/protocol/player.js +137 -0
- package/packages/server/dist/protocol/write.d.ts +7 -0
- package/packages/server/dist/protocol/write.js +167 -0
- package/packages/server/dist/protocol.d.ts +17 -0
- package/packages/server/dist/protocol.js +71 -0
- package/packages/server/dist/server.d.ts +50 -0
- package/packages/server/dist/server.js +12 -0
- package/packages/server/dist/server.test.d.ts +1 -0
- package/packages/server/dist/server.test.js +69 -0
- package/packages/server/dist/transport.d.ts +7 -0
- package/packages/server/dist/transport.js +1 -0
- package/packages/server/dist/transports/websocket.d.ts +11 -0
- package/packages/server/dist/transports/websocket.js +38 -0
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/test-utils/dist/index.cjs +498 -284
- package/packages/test-utils/dist/index.cjs.map +1 -1
- package/packages/test-utils/dist/index.d.cts +215 -146
- package/packages/test-utils/dist/index.d.ts +215 -146
- package/packages/test-utils/dist/index.js +488 -278
- package/packages/test-utils/dist/index.js.map +1 -1
- package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/server/dist/index.d.cts +0 -161
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { NetDriver, UserCommand, PlayerState, EntityState, NetChan } from '@quake2ts/shared';
|
|
2
|
+
import { Entity } from '@quake2ts/game';
|
|
3
|
+
export declare enum ClientState {
|
|
4
|
+
Free = 0,
|
|
5
|
+
Zombie = 1,// client has been disconnected, but don't reuse connection for a couple seconds
|
|
6
|
+
Connected = 2,// has been assigned to a client_t, but not in game yet
|
|
7
|
+
Spawned = 3,// client is fully in game
|
|
8
|
+
Active = 4
|
|
9
|
+
}
|
|
10
|
+
export interface ClientFrame {
|
|
11
|
+
areaBytes: number;
|
|
12
|
+
areaBits: Uint8Array;
|
|
13
|
+
playerState: PlayerState;
|
|
14
|
+
numEntities: number;
|
|
15
|
+
firstEntity: number;
|
|
16
|
+
sentTime: number;
|
|
17
|
+
entities: EntityState[];
|
|
18
|
+
packetCRC: number;
|
|
19
|
+
}
|
|
20
|
+
export interface Client {
|
|
21
|
+
index: number;
|
|
22
|
+
state: ClientState;
|
|
23
|
+
net: NetDriver;
|
|
24
|
+
netchan: NetChan;
|
|
25
|
+
userInfo: string;
|
|
26
|
+
lastFrame: number;
|
|
27
|
+
lastCmd: UserCommand;
|
|
28
|
+
commandMsec: number;
|
|
29
|
+
frameLatency: number[];
|
|
30
|
+
ping: number;
|
|
31
|
+
messageSize: number[];
|
|
32
|
+
rate: number;
|
|
33
|
+
suppressCount: number;
|
|
34
|
+
edict: Entity | null;
|
|
35
|
+
name: string;
|
|
36
|
+
messageLevel: number;
|
|
37
|
+
datagram: Uint8Array;
|
|
38
|
+
frames: ClientFrame[];
|
|
39
|
+
download?: Uint8Array;
|
|
40
|
+
downloadSize: number;
|
|
41
|
+
downloadCount: number;
|
|
42
|
+
lastMessage: number;
|
|
43
|
+
lastConnect: number;
|
|
44
|
+
challenge: number;
|
|
45
|
+
messageQueue: Uint8Array[];
|
|
46
|
+
lastPacketEntities: number[];
|
|
47
|
+
commandQueue: UserCommand[];
|
|
48
|
+
lastCommandTime: number;
|
|
49
|
+
commandCount: number;
|
|
50
|
+
}
|
|
51
|
+
export declare function createClient(index: number, net: NetDriver): Client;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { UPDATE_BACKUP, NetChan } from '@quake2ts/shared';
|
|
2
|
+
export var ClientState;
|
|
3
|
+
(function (ClientState) {
|
|
4
|
+
ClientState[ClientState["Free"] = 0] = "Free";
|
|
5
|
+
ClientState[ClientState["Zombie"] = 1] = "Zombie";
|
|
6
|
+
ClientState[ClientState["Connected"] = 2] = "Connected";
|
|
7
|
+
ClientState[ClientState["Spawned"] = 3] = "Spawned";
|
|
8
|
+
ClientState[ClientState["Active"] = 4] = "Active"; // In game (added to match existing code usage)
|
|
9
|
+
})(ClientState || (ClientState = {}));
|
|
10
|
+
export function createClient(index, net) {
|
|
11
|
+
// Initialize frames array
|
|
12
|
+
const frames = [];
|
|
13
|
+
for (let i = 0; i < UPDATE_BACKUP; i++) {
|
|
14
|
+
frames.push({
|
|
15
|
+
areaBytes: 0,
|
|
16
|
+
areaBits: new Uint8Array(0), // Size depends on map areas
|
|
17
|
+
playerState: createEmptyPlayerState(),
|
|
18
|
+
numEntities: 0,
|
|
19
|
+
firstEntity: 0,
|
|
20
|
+
sentTime: 0,
|
|
21
|
+
entities: [],
|
|
22
|
+
packetCRC: 0
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const netchan = new NetChan();
|
|
26
|
+
// Initialize qport - normally we would get this from userinfo or handshake
|
|
27
|
+
netchan.setup(Math.floor(Math.random() * 65536));
|
|
28
|
+
return {
|
|
29
|
+
index,
|
|
30
|
+
state: ClientState.Connected,
|
|
31
|
+
net,
|
|
32
|
+
netchan,
|
|
33
|
+
userInfo: '',
|
|
34
|
+
lastFrame: 0,
|
|
35
|
+
lastCmd: createEmptyUserCommand(),
|
|
36
|
+
commandMsec: 0,
|
|
37
|
+
frameLatency: [],
|
|
38
|
+
ping: 0,
|
|
39
|
+
messageSize: [],
|
|
40
|
+
rate: 25000, // Default rate
|
|
41
|
+
suppressCount: 0,
|
|
42
|
+
edict: null,
|
|
43
|
+
name: `Player ${index}`,
|
|
44
|
+
messageLevel: 0,
|
|
45
|
+
datagram: new Uint8Array(0),
|
|
46
|
+
frames,
|
|
47
|
+
downloadSize: 0,
|
|
48
|
+
downloadCount: 0,
|
|
49
|
+
lastMessage: 0,
|
|
50
|
+
lastConnect: Date.now(),
|
|
51
|
+
challenge: 0,
|
|
52
|
+
messageQueue: [],
|
|
53
|
+
lastPacketEntities: [],
|
|
54
|
+
commandQueue: [],
|
|
55
|
+
lastCommandTime: 0,
|
|
56
|
+
commandCount: 0
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function createEmptyUserCommand() {
|
|
60
|
+
return {
|
|
61
|
+
msec: 0,
|
|
62
|
+
buttons: 0,
|
|
63
|
+
angles: { x: 0, y: 0, z: 0 },
|
|
64
|
+
forwardmove: 0,
|
|
65
|
+
sidemove: 0,
|
|
66
|
+
upmove: 0,
|
|
67
|
+
sequence: 0,
|
|
68
|
+
lightlevel: 0,
|
|
69
|
+
impulse: 0
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function createEmptyPlayerState() {
|
|
73
|
+
return {
|
|
74
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
75
|
+
velocity: { x: 0, y: 0, z: 0 },
|
|
76
|
+
viewAngles: { x: 0, y: 0, z: 0 },
|
|
77
|
+
onGround: false,
|
|
78
|
+
waterLevel: 0,
|
|
79
|
+
watertype: 0,
|
|
80
|
+
mins: { x: -16, y: -16, z: -24 },
|
|
81
|
+
maxs: { x: 16, y: 16, z: 32 },
|
|
82
|
+
damageAlpha: 0,
|
|
83
|
+
damageIndicators: [],
|
|
84
|
+
blend: [0, 0, 0, 0],
|
|
85
|
+
// Stubs for new fields
|
|
86
|
+
stats: [],
|
|
87
|
+
kick_angles: { x: 0, y: 0, z: 0 },
|
|
88
|
+
kick_origin: { x: 0, y: 0, z: 0 },
|
|
89
|
+
gunoffset: { x: 0, y: 0, z: 0 },
|
|
90
|
+
gunangles: { x: 0, y: 0, z: 0 },
|
|
91
|
+
gunindex: 0,
|
|
92
|
+
pm_type: 0,
|
|
93
|
+
pm_time: 0,
|
|
94
|
+
pm_flags: 0,
|
|
95
|
+
gun_frame: 0,
|
|
96
|
+
rdflags: 0,
|
|
97
|
+
fov: 90,
|
|
98
|
+
renderfx: 0
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { GameEngine, Entity, MulticastType } from '@quake2ts/game';
|
|
2
|
+
import { ServerCommand } from '@quake2ts/shared';
|
|
3
|
+
import { NetworkTransport } from './transport.js';
|
|
4
|
+
export interface ClientInfo {
|
|
5
|
+
id: number;
|
|
6
|
+
name: string;
|
|
7
|
+
ping: number;
|
|
8
|
+
address: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ServerOptions {
|
|
11
|
+
mapName?: string;
|
|
12
|
+
maxPlayers?: number;
|
|
13
|
+
deathmatch?: boolean;
|
|
14
|
+
port?: number;
|
|
15
|
+
transport?: NetworkTransport;
|
|
16
|
+
}
|
|
17
|
+
export declare class DedicatedServer implements GameEngine {
|
|
18
|
+
private transport;
|
|
19
|
+
private svs;
|
|
20
|
+
private sv;
|
|
21
|
+
private game;
|
|
22
|
+
private frameTimeout;
|
|
23
|
+
private entityIndex;
|
|
24
|
+
private history;
|
|
25
|
+
private backup;
|
|
26
|
+
onClientConnected?: (clientId: number, name: string) => void;
|
|
27
|
+
onClientDisconnected?: (clientId: number) => void;
|
|
28
|
+
onServerError?: (error: Error) => void;
|
|
29
|
+
private options;
|
|
30
|
+
constructor(optionsOrPort?: ServerOptions | number);
|
|
31
|
+
setTransport(transport: NetworkTransport): void;
|
|
32
|
+
startServer(mapName?: string): Promise<void>;
|
|
33
|
+
stopServer(): void;
|
|
34
|
+
kickPlayer(clientId: number): void;
|
|
35
|
+
changeMap(mapName: string): Promise<void>;
|
|
36
|
+
getConnectedClients(): ClientInfo[];
|
|
37
|
+
private start;
|
|
38
|
+
private loadMap;
|
|
39
|
+
private initGame;
|
|
40
|
+
private populateBaselines;
|
|
41
|
+
private entityToState;
|
|
42
|
+
stop(): void;
|
|
43
|
+
private handleConnection;
|
|
44
|
+
private onClientMessage;
|
|
45
|
+
private onClientDisconnect;
|
|
46
|
+
private dropClient;
|
|
47
|
+
private handleMove;
|
|
48
|
+
private handleUserInfo;
|
|
49
|
+
private handleStringCmd;
|
|
50
|
+
private handleStatus;
|
|
51
|
+
private handleGetChallenge;
|
|
52
|
+
private handleConnect;
|
|
53
|
+
private handleBegin;
|
|
54
|
+
private spawnClient;
|
|
55
|
+
private sendServerData;
|
|
56
|
+
private SV_SetConfigString;
|
|
57
|
+
private SV_WriteConfigString;
|
|
58
|
+
private SV_ReadPackets;
|
|
59
|
+
private runFrame;
|
|
60
|
+
private SV_SendClientMessages;
|
|
61
|
+
private SV_SendClientFrame;
|
|
62
|
+
trace(start: any, end: any): any;
|
|
63
|
+
multicast(origin: any, type: MulticastType, event: ServerCommand, ...args: any[]): void;
|
|
64
|
+
unicast(ent: Entity, reliable: boolean, event: ServerCommand, ...args: any[]): void;
|
|
65
|
+
configstring(index: number, value: string): void;
|
|
66
|
+
private recordHistory;
|
|
67
|
+
setLagCompensation(active: boolean, client?: Entity, lagMs?: number): void;
|
|
68
|
+
}
|
|
69
|
+
export declare function createServer(options?: ServerOptions): DedicatedServer;
|