@esengine/server 1.1.4 → 1.2.0

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,237 @@
1
+ import { Connection } from '@esengine/rpc';
2
+
3
+ /**
4
+ * @zh 玩家类
5
+ * @en Player class
6
+ */
7
+
8
+ /**
9
+ * @zh 玩家接口
10
+ * @en Player interface
11
+ */
12
+ interface IPlayer<TData = Record<string, unknown>> {
13
+ readonly id: string;
14
+ readonly roomId: string;
15
+ data: TData;
16
+ send<T>(type: string, data: T): void;
17
+ leave(reason?: string): void;
18
+ }
19
+ /**
20
+ * @zh 玩家实现
21
+ * @en Player implementation
22
+ */
23
+ declare class Player<TData = Record<string, unknown>> implements IPlayer<TData> {
24
+ readonly id: string;
25
+ readonly roomId: string;
26
+ data: TData;
27
+ private _conn;
28
+ private _sendFn;
29
+ private _leaveFn;
30
+ constructor(options: {
31
+ id: string;
32
+ roomId: string;
33
+ conn: Connection<any>;
34
+ sendFn: (conn: Connection<any>, type: string, data: unknown) => void;
35
+ leaveFn: (player: Player<TData>, reason?: string) => void;
36
+ initialData?: TData;
37
+ });
38
+ /**
39
+ * @zh 获取底层连接
40
+ * @en Get underlying connection
41
+ */
42
+ get connection(): Connection<any>;
43
+ /**
44
+ * @zh 发送消息给玩家
45
+ * @en Send message to player
46
+ */
47
+ send<T>(type: string, data: T): void;
48
+ /**
49
+ * @zh 让玩家离开房间
50
+ * @en Make player leave the room
51
+ */
52
+ leave(reason?: string): void;
53
+ }
54
+
55
+ /**
56
+ * @zh 房间基类
57
+ * @en Room base class
58
+ */
59
+
60
+ /**
61
+ * @zh 房间配置
62
+ * @en Room options
63
+ */
64
+ interface RoomOptions {
65
+ [key: string]: unknown;
66
+ }
67
+ /**
68
+ * @zh 房间基类
69
+ * @en Room base class
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * class GameRoom extends Room {
74
+ * maxPlayers = 4
75
+ * tickRate = 20
76
+ *
77
+ * onJoin(player: Player) {
78
+ * this.broadcast('Joined', { id: player.id })
79
+ * }
80
+ *
81
+ * @onMessage('Move')
82
+ * handleMove(data: { x: number, y: number }, player: Player) {
83
+ * // handle move
84
+ * }
85
+ * }
86
+ * ```
87
+ */
88
+ declare abstract class Room<TState = any, TPlayerData = Record<string, unknown>> {
89
+ /**
90
+ * @zh 最大玩家数
91
+ * @en Maximum players
92
+ */
93
+ maxPlayers: number;
94
+ /**
95
+ * @zh Tick 速率(每秒),0 = 不自动 tick
96
+ * @en Tick rate (per second), 0 = no auto tick
97
+ */
98
+ tickRate: number;
99
+ /**
100
+ * @zh 空房间自动销毁
101
+ * @en Auto dispose when empty
102
+ */
103
+ autoDispose: boolean;
104
+ /**
105
+ * @zh 房间状态
106
+ * @en Room state
107
+ */
108
+ state: TState;
109
+ private _id;
110
+ private _players;
111
+ private _locked;
112
+ private _disposed;
113
+ private _tickInterval;
114
+ private _lastTickTime;
115
+ private _broadcastFn;
116
+ private _sendFn;
117
+ private _disposeFn;
118
+ /**
119
+ * @zh 房间 ID
120
+ * @en Room ID
121
+ */
122
+ get id(): string;
123
+ /**
124
+ * @zh 所有玩家
125
+ * @en All players
126
+ */
127
+ get players(): ReadonlyArray<Player<TPlayerData>>;
128
+ /**
129
+ * @zh 玩家数量
130
+ * @en Player count
131
+ */
132
+ get playerCount(): number;
133
+ /**
134
+ * @zh 是否已满
135
+ * @en Is full
136
+ */
137
+ get isFull(): boolean;
138
+ /**
139
+ * @zh 是否已锁定
140
+ * @en Is locked
141
+ */
142
+ get isLocked(): boolean;
143
+ /**
144
+ * @zh 是否已销毁
145
+ * @en Is disposed
146
+ */
147
+ get isDisposed(): boolean;
148
+ /**
149
+ * @zh 房间创建时调用
150
+ * @en Called when room is created
151
+ */
152
+ onCreate(options?: RoomOptions): void | Promise<void>;
153
+ /**
154
+ * @zh 玩家加入时调用
155
+ * @en Called when player joins
156
+ */
157
+ onJoin(player: Player<TPlayerData>): void | Promise<void>;
158
+ /**
159
+ * @zh 玩家离开时调用
160
+ * @en Called when player leaves
161
+ */
162
+ onLeave(player: Player<TPlayerData>, reason?: string): void | Promise<void>;
163
+ /**
164
+ * @zh 游戏循环
165
+ * @en Game tick
166
+ */
167
+ onTick(dt: number): void;
168
+ /**
169
+ * @zh 房间销毁时调用
170
+ * @en Called when room is disposed
171
+ */
172
+ onDispose(): void | Promise<void>;
173
+ /**
174
+ * @zh 广播消息给所有玩家
175
+ * @en Broadcast message to all players
176
+ */
177
+ broadcast<T>(type: string, data: T): void;
178
+ /**
179
+ * @zh 广播消息给除指定玩家外的所有玩家
180
+ * @en Broadcast message to all players except one
181
+ */
182
+ broadcastExcept<T>(except: Player<TPlayerData>, type: string, data: T): void;
183
+ /**
184
+ * @zh 获取玩家
185
+ * @en Get player by id
186
+ */
187
+ getPlayer(id: string): Player<TPlayerData> | undefined;
188
+ /**
189
+ * @zh 踢出玩家
190
+ * @en Kick player
191
+ */
192
+ kick(player: Player<TPlayerData>, reason?: string): void;
193
+ /**
194
+ * @zh 锁定房间
195
+ * @en Lock room
196
+ */
197
+ lock(): void;
198
+ /**
199
+ * @zh 解锁房间
200
+ * @en Unlock room
201
+ */
202
+ unlock(): void;
203
+ /**
204
+ * @zh 手动销毁房间
205
+ * @en Manually dispose room
206
+ */
207
+ dispose(): void;
208
+ /**
209
+ * @internal
210
+ */
211
+ _init(options: {
212
+ id: string;
213
+ sendFn: (conn: any, type: string, data: unknown) => void;
214
+ broadcastFn: (type: string, data: unknown) => void;
215
+ disposeFn: () => void;
216
+ }): void;
217
+ /**
218
+ * @internal
219
+ */
220
+ _create(options?: RoomOptions): Promise<void>;
221
+ /**
222
+ * @internal
223
+ */
224
+ _addPlayer(id: string, conn: any): Promise<Player<TPlayerData> | null>;
225
+ /**
226
+ * @internal
227
+ */
228
+ _removePlayer(id: string, reason?: string): Promise<void>;
229
+ /**
230
+ * @internal
231
+ */
232
+ _handleMessage(type: string, data: unknown, playerId: string): void;
233
+ private _startTick;
234
+ private _stopTick;
235
+ }
236
+
237
+ export { type IPlayer as I, Player as P, Room as R, type RoomOptions as a };