@esengine/network 1.0.0 → 2.1.1
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/NetworkPlugin.d.ts +56 -42
- package/dist/NetworkPlugin.d.ts.map +1 -1
- package/dist/index.d.ts +16 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +302 -184
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +160 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/services/NetworkService.d.ts +125 -39
- package/dist/services/NetworkService.d.ts.map +1 -1
- package/dist/systems/NetworkInputSystem.d.ts +14 -10
- package/dist/systems/NetworkInputSystem.d.ts.map +1 -1
- package/dist/systems/NetworkSpawnSystem.d.ts +49 -18
- package/dist/systems/NetworkSpawnSystem.d.ts.map +1 -1
- package/dist/systems/NetworkSyncSystem.d.ts +28 -17
- package/dist/systems/NetworkSyncSystem.d.ts.map +1 -1
- package/package.json +6 -7
package/dist/index.js
CHANGED
|
@@ -4,7 +4,46 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
5
|
|
|
6
6
|
// src/index.ts
|
|
7
|
-
import {
|
|
7
|
+
import { rpc as rpc2 } from "@esengine/rpc";
|
|
8
|
+
|
|
9
|
+
// src/protocol.ts
|
|
10
|
+
import { rpc } from "@esengine/rpc";
|
|
11
|
+
var gameProtocol = rpc.define({
|
|
12
|
+
api: {
|
|
13
|
+
/**
|
|
14
|
+
* @zh 加入房间
|
|
15
|
+
* @en Join room
|
|
16
|
+
*/
|
|
17
|
+
join: rpc.api(),
|
|
18
|
+
/**
|
|
19
|
+
* @zh 离开房间
|
|
20
|
+
* @en Leave room
|
|
21
|
+
*/
|
|
22
|
+
leave: rpc.api()
|
|
23
|
+
},
|
|
24
|
+
msg: {
|
|
25
|
+
/**
|
|
26
|
+
* @zh 玩家输入
|
|
27
|
+
* @en Player input
|
|
28
|
+
*/
|
|
29
|
+
input: rpc.msg(),
|
|
30
|
+
/**
|
|
31
|
+
* @zh 状态同步
|
|
32
|
+
* @en State sync
|
|
33
|
+
*/
|
|
34
|
+
sync: rpc.msg(),
|
|
35
|
+
/**
|
|
36
|
+
* @zh 实体生成
|
|
37
|
+
* @en Entity spawn
|
|
38
|
+
*/
|
|
39
|
+
spawn: rpc.msg(),
|
|
40
|
+
/**
|
|
41
|
+
* @zh 实体销毁
|
|
42
|
+
* @en Entity despawn
|
|
43
|
+
*/
|
|
44
|
+
despawn: rpc.msg()
|
|
45
|
+
}
|
|
46
|
+
});
|
|
8
47
|
|
|
9
48
|
// src/tokens.ts
|
|
10
49
|
import { createServiceToken } from "@esengine/ecs-framework";
|
|
@@ -17,128 +56,166 @@ var NetworkInputSystemToken = createServiceToken("networkInputSystem");
|
|
|
17
56
|
import { Core } from "@esengine/ecs-framework";
|
|
18
57
|
|
|
19
58
|
// src/services/NetworkService.ts
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return ENetworkState2;
|
|
59
|
+
import { RpcClient } from "@esengine/rpc/client";
|
|
60
|
+
var NetworkState = /* @__PURE__ */ (function(NetworkState2) {
|
|
61
|
+
NetworkState2[NetworkState2["Disconnected"] = 0] = "Disconnected";
|
|
62
|
+
NetworkState2[NetworkState2["Connecting"] = 1] = "Connecting";
|
|
63
|
+
NetworkState2[NetworkState2["Connected"] = 2] = "Connected";
|
|
64
|
+
return NetworkState2;
|
|
27
65
|
})({});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
json: true,
|
|
32
|
-
logLevel: "warn"
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
__name(createClient, "createClient");
|
|
36
|
-
var _NetworkService = class _NetworkService {
|
|
37
|
-
constructor() {
|
|
66
|
+
var _RpcService = class _RpcService {
|
|
67
|
+
constructor(_protocol) {
|
|
68
|
+
__publicField(this, "_protocol");
|
|
38
69
|
__publicField(this, "_client", null);
|
|
39
70
|
__publicField(this, "_state", 0);
|
|
40
|
-
|
|
41
|
-
__publicField(this, "_roomId", "");
|
|
42
|
-
__publicField(this, "_callbacks", {});
|
|
71
|
+
this._protocol = _protocol;
|
|
43
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* @zh 获取连接状态
|
|
75
|
+
* @en Get connection state
|
|
76
|
+
*/
|
|
44
77
|
get state() {
|
|
45
78
|
return this._state;
|
|
46
79
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return this._roomId;
|
|
52
|
-
}
|
|
80
|
+
/**
|
|
81
|
+
* @zh 是否已连接
|
|
82
|
+
* @en Whether connected
|
|
83
|
+
*/
|
|
53
84
|
get isConnected() {
|
|
54
85
|
return this._state === 2;
|
|
55
86
|
}
|
|
56
87
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
88
|
+
* @zh 获取底层 RPC 客户端
|
|
89
|
+
* @en Get underlying RPC client
|
|
59
90
|
*/
|
|
60
|
-
|
|
61
|
-
this.
|
|
62
|
-
...this._callbacks,
|
|
63
|
-
...callbacks
|
|
64
|
-
};
|
|
91
|
+
get client() {
|
|
92
|
+
return this._client;
|
|
65
93
|
}
|
|
66
94
|
/**
|
|
67
|
-
* 连接到服务器
|
|
68
|
-
* Connect to server
|
|
95
|
+
* @zh 连接到服务器
|
|
96
|
+
* @en Connect to server
|
|
69
97
|
*/
|
|
70
|
-
async connect(
|
|
98
|
+
async connect(options) {
|
|
71
99
|
if (this._state !== 0) {
|
|
72
|
-
|
|
100
|
+
throw new Error("Already connected or connecting");
|
|
73
101
|
}
|
|
74
102
|
this._state = 1;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
await this._client.
|
|
103
|
+
try {
|
|
104
|
+
this._client = new RpcClient(this._protocol, options.url, {
|
|
105
|
+
...options,
|
|
106
|
+
onConnect: /* @__PURE__ */ __name(() => {
|
|
107
|
+
this._state = 2;
|
|
108
|
+
options.onConnect?.();
|
|
109
|
+
}, "onConnect"),
|
|
110
|
+
onDisconnect: /* @__PURE__ */ __name((reason) => {
|
|
111
|
+
this._state = 0;
|
|
112
|
+
options.onDisconnect?.(reason);
|
|
113
|
+
}, "onDisconnect"),
|
|
114
|
+
onError: options.onError
|
|
115
|
+
});
|
|
116
|
+
await this._client.connect();
|
|
117
|
+
this._state = 2;
|
|
118
|
+
} catch (err) {
|
|
89
119
|
this._state = 0;
|
|
90
|
-
this.
|
|
91
|
-
|
|
120
|
+
this._client = null;
|
|
121
|
+
throw err;
|
|
92
122
|
}
|
|
93
|
-
this._clientId = joinResult.res.clientId;
|
|
94
|
-
this._roomId = joinResult.res.roomId;
|
|
95
|
-
this._state = 2;
|
|
96
|
-
this._callbacks.onConnected?.(this._clientId, this._roomId);
|
|
97
|
-
return true;
|
|
98
123
|
}
|
|
99
124
|
/**
|
|
100
|
-
* 断开连接
|
|
101
|
-
* Disconnect
|
|
125
|
+
* @zh 断开连接
|
|
126
|
+
* @en Disconnect
|
|
102
127
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
await this._client.disconnect();
|
|
106
|
-
}
|
|
107
|
-
this._state = 0;
|
|
108
|
-
this._clientId = 0;
|
|
109
|
-
this._roomId = "";
|
|
128
|
+
disconnect() {
|
|
129
|
+
this._client?.disconnect();
|
|
110
130
|
this._client = null;
|
|
131
|
+
this._state = 0;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @zh 调用 API
|
|
135
|
+
* @en Call API
|
|
136
|
+
*/
|
|
137
|
+
call(name, input) {
|
|
138
|
+
if (!this._client) {
|
|
139
|
+
return Promise.reject(new Error("Not connected"));
|
|
140
|
+
}
|
|
141
|
+
return this._client.call(name, input);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @zh 发送消息
|
|
145
|
+
* @en Send message
|
|
146
|
+
*/
|
|
147
|
+
send(name, data) {
|
|
148
|
+
this._client?.send(name, data);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* @zh 监听消息
|
|
152
|
+
* @en Listen to message
|
|
153
|
+
*/
|
|
154
|
+
on(name, handler) {
|
|
155
|
+
this._client?.on(name, handler);
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* @zh 取消监听消息
|
|
160
|
+
* @en Remove message listener
|
|
161
|
+
*/
|
|
162
|
+
off(name, handler) {
|
|
163
|
+
this._client?.off(name, handler);
|
|
164
|
+
return this;
|
|
111
165
|
}
|
|
112
166
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
167
|
+
* @zh 监听消息(只触发一次)
|
|
168
|
+
* @en Listen to message (once)
|
|
169
|
+
*/
|
|
170
|
+
once(name, handler) {
|
|
171
|
+
this._client?.once(name, handler);
|
|
172
|
+
return this;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
__name(_RpcService, "RpcService");
|
|
176
|
+
var RpcService = _RpcService;
|
|
177
|
+
var _GameNetworkService = class _GameNetworkService extends RpcService {
|
|
178
|
+
constructor() {
|
|
179
|
+
super(gameProtocol);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* @zh 发送玩家输入
|
|
183
|
+
* @en Send player input
|
|
115
184
|
*/
|
|
116
185
|
sendInput(input) {
|
|
117
|
-
|
|
118
|
-
this._client.sendMsg("Input", {
|
|
119
|
-
input
|
|
120
|
-
});
|
|
186
|
+
this.send("input", input);
|
|
121
187
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
this.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
188
|
+
/**
|
|
189
|
+
* @zh 监听状态同步
|
|
190
|
+
* @en Listen to state sync
|
|
191
|
+
*/
|
|
192
|
+
onSync(handler) {
|
|
193
|
+
return this.on("sync", handler);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* @zh 监听实体生成
|
|
197
|
+
* @en Listen to entity spawn
|
|
198
|
+
*/
|
|
199
|
+
onSpawn(handler) {
|
|
200
|
+
return this.on("spawn", handler);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* @zh 监听实体销毁
|
|
204
|
+
* @en Listen to entity despawn
|
|
205
|
+
*/
|
|
206
|
+
onDespawn(handler) {
|
|
207
|
+
return this.on("despawn", handler);
|
|
138
208
|
}
|
|
139
209
|
};
|
|
140
|
-
__name(
|
|
141
|
-
var
|
|
210
|
+
__name(_GameNetworkService, "GameNetworkService");
|
|
211
|
+
var GameNetworkService = _GameNetworkService;
|
|
212
|
+
function createNetworkService(protocol) {
|
|
213
|
+
if (protocol) {
|
|
214
|
+
return new RpcService(protocol);
|
|
215
|
+
}
|
|
216
|
+
return new GameNetworkService();
|
|
217
|
+
}
|
|
218
|
+
__name(createNetworkService, "createNetworkService");
|
|
142
219
|
|
|
143
220
|
// src/systems/NetworkSyncSystem.ts
|
|
144
221
|
import { EntitySystem, Matcher, Time } from "@esengine/ecs-framework";
|
|
@@ -379,21 +456,26 @@ NetworkTransform = _ts_decorate2([
|
|
|
379
456
|
|
|
380
457
|
// src/systems/NetworkSyncSystem.ts
|
|
381
458
|
var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem {
|
|
382
|
-
constructor(
|
|
459
|
+
constructor() {
|
|
383
460
|
super(Matcher.all(NetworkIdentity, NetworkTransform));
|
|
384
|
-
__publicField(this, "_networkService");
|
|
385
461
|
__publicField(this, "_netIdToEntity", /* @__PURE__ */ new Map());
|
|
386
|
-
this._networkService = networkService;
|
|
387
|
-
}
|
|
388
|
-
onInitialize() {
|
|
389
|
-
this._networkService.setCallbacks({
|
|
390
|
-
onSync: this._handleSync.bind(this)
|
|
391
|
-
});
|
|
392
462
|
}
|
|
393
463
|
/**
|
|
394
|
-
*
|
|
395
|
-
*
|
|
464
|
+
* @zh 处理同步消息
|
|
465
|
+
* @en Handle sync message
|
|
396
466
|
*/
|
|
467
|
+
handleSync(msg) {
|
|
468
|
+
for (const state of msg.entities) {
|
|
469
|
+
const entityId = this._netIdToEntity.get(state.netId);
|
|
470
|
+
if (entityId === void 0) continue;
|
|
471
|
+
const entity = this.scene?.findEntityById(entityId);
|
|
472
|
+
if (!entity) continue;
|
|
473
|
+
const transform = entity.getComponent(NetworkTransform);
|
|
474
|
+
if (transform && state.pos) {
|
|
475
|
+
transform.setTarget(state.pos.x, state.pos.y, state.rot ?? 0);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
397
479
|
process(entities) {
|
|
398
480
|
const deltaTime = Time.deltaTime;
|
|
399
481
|
for (const entity of entities) {
|
|
@@ -405,38 +487,26 @@ var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem {
|
|
|
405
487
|
}
|
|
406
488
|
}
|
|
407
489
|
/**
|
|
408
|
-
* 注册网络实体
|
|
409
|
-
* Register network entity
|
|
490
|
+
* @zh 注册网络实体
|
|
491
|
+
* @en Register network entity
|
|
410
492
|
*/
|
|
411
493
|
registerEntity(netId, entityId) {
|
|
412
494
|
this._netIdToEntity.set(netId, entityId);
|
|
413
495
|
}
|
|
414
496
|
/**
|
|
415
|
-
* 注销网络实体
|
|
416
|
-
* Unregister network entity
|
|
497
|
+
* @zh 注销网络实体
|
|
498
|
+
* @en Unregister network entity
|
|
417
499
|
*/
|
|
418
500
|
unregisterEntity(netId) {
|
|
419
501
|
this._netIdToEntity.delete(netId);
|
|
420
502
|
}
|
|
421
503
|
/**
|
|
422
|
-
* 根据网络 ID 获取实体 ID
|
|
423
|
-
* Get entity ID by network ID
|
|
504
|
+
* @zh 根据网络 ID 获取实体 ID
|
|
505
|
+
* @en Get entity ID by network ID
|
|
424
506
|
*/
|
|
425
507
|
getEntityId(netId) {
|
|
426
508
|
return this._netIdToEntity.get(netId);
|
|
427
509
|
}
|
|
428
|
-
_handleSync(msg) {
|
|
429
|
-
for (const state of msg.entities) {
|
|
430
|
-
const entityId = this._netIdToEntity.get(state.netId);
|
|
431
|
-
if (entityId === void 0) continue;
|
|
432
|
-
const entity = this.scene?.findEntityById(entityId);
|
|
433
|
-
if (!entity) continue;
|
|
434
|
-
const transform = entity.getComponent(NetworkTransform);
|
|
435
|
-
if (transform && state.pos) {
|
|
436
|
-
transform.setTarget(state.pos.x, state.pos.y, state.rot);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
510
|
_interpolate(transform, deltaTime) {
|
|
441
511
|
const t = Math.min(1, transform.lerpSpeed * deltaTime);
|
|
442
512
|
transform.currentX += (transform.targetX - transform.currentX) * t;
|
|
@@ -456,54 +526,49 @@ var NetworkSyncSystem = _NetworkSyncSystem;
|
|
|
456
526
|
// src/systems/NetworkSpawnSystem.ts
|
|
457
527
|
import { EntitySystem as EntitySystem2, Matcher as Matcher2 } from "@esengine/ecs-framework";
|
|
458
528
|
var _NetworkSpawnSystem = class _NetworkSpawnSystem extends EntitySystem2 {
|
|
459
|
-
constructor(
|
|
529
|
+
constructor(syncSystem) {
|
|
460
530
|
super(Matcher2.nothing());
|
|
461
|
-
__publicField(this, "_networkService");
|
|
462
531
|
__publicField(this, "_syncSystem");
|
|
463
532
|
__publicField(this, "_prefabFactories", /* @__PURE__ */ new Map());
|
|
464
|
-
this
|
|
533
|
+
__publicField(this, "_localPlayerId", 0);
|
|
465
534
|
this._syncSystem = syncSystem;
|
|
466
535
|
}
|
|
467
|
-
onInitialize() {
|
|
468
|
-
this._networkService.setCallbacks({
|
|
469
|
-
onSpawn: this._handleSpawn.bind(this),
|
|
470
|
-
onDespawn: this._handleDespawn.bind(this)
|
|
471
|
-
});
|
|
472
|
-
}
|
|
473
536
|
/**
|
|
474
|
-
*
|
|
475
|
-
*
|
|
537
|
+
* @zh 设置本地玩家 ID
|
|
538
|
+
* @en Set local player ID
|
|
476
539
|
*/
|
|
477
|
-
|
|
478
|
-
this.
|
|
540
|
+
setLocalPlayerId(id) {
|
|
541
|
+
this._localPlayerId = id;
|
|
479
542
|
}
|
|
480
543
|
/**
|
|
481
|
-
*
|
|
482
|
-
*
|
|
544
|
+
* @zh 处理生成消息
|
|
545
|
+
* @en Handle spawn message
|
|
483
546
|
*/
|
|
484
|
-
|
|
485
|
-
this.
|
|
486
|
-
}
|
|
487
|
-
_handleSpawn(msg) {
|
|
488
|
-
if (!this.scene) return;
|
|
547
|
+
handleSpawn(msg) {
|
|
548
|
+
if (!this.scene) return null;
|
|
489
549
|
const factory = this._prefabFactories.get(msg.prefab);
|
|
490
550
|
if (!factory) {
|
|
491
551
|
this.logger.warn(`Unknown prefab: ${msg.prefab}`);
|
|
492
|
-
return;
|
|
552
|
+
return null;
|
|
493
553
|
}
|
|
494
554
|
const entity = factory(this.scene, msg);
|
|
495
555
|
const identity = entity.addComponent(new NetworkIdentity());
|
|
496
556
|
identity.netId = msg.netId;
|
|
497
557
|
identity.ownerId = msg.ownerId;
|
|
498
558
|
identity.prefabType = msg.prefab;
|
|
499
|
-
identity.bHasAuthority = msg.ownerId === this.
|
|
559
|
+
identity.bHasAuthority = msg.ownerId === this._localPlayerId;
|
|
500
560
|
identity.bIsLocalPlayer = identity.bHasAuthority;
|
|
501
561
|
const transform = entity.addComponent(new NetworkTransform());
|
|
502
|
-
transform.setTarget(msg.pos.x, msg.pos.y, msg.rot);
|
|
562
|
+
transform.setTarget(msg.pos.x, msg.pos.y, msg.rot ?? 0);
|
|
503
563
|
transform.snap();
|
|
504
564
|
this._syncSystem.registerEntity(msg.netId, entity.id);
|
|
565
|
+
return entity;
|
|
505
566
|
}
|
|
506
|
-
|
|
567
|
+
/**
|
|
568
|
+
* @zh 处理销毁消息
|
|
569
|
+
* @en Handle despawn message
|
|
570
|
+
*/
|
|
571
|
+
handleDespawn(msg) {
|
|
507
572
|
const entityId = this._syncSystem.getEntityId(msg.netId);
|
|
508
573
|
if (entityId === void 0) return;
|
|
509
574
|
const entity = this.scene?.findEntityById(entityId);
|
|
@@ -512,6 +577,20 @@ var _NetworkSpawnSystem = class _NetworkSpawnSystem extends EntitySystem2 {
|
|
|
512
577
|
}
|
|
513
578
|
this._syncSystem.unregisterEntity(msg.netId);
|
|
514
579
|
}
|
|
580
|
+
/**
|
|
581
|
+
* @zh 注册预制体工厂
|
|
582
|
+
* @en Register prefab factory
|
|
583
|
+
*/
|
|
584
|
+
registerPrefab(prefabType, factory) {
|
|
585
|
+
this._prefabFactories.set(prefabType, factory);
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* @zh 注销预制体工厂
|
|
589
|
+
* @en Unregister prefab factory
|
|
590
|
+
*/
|
|
591
|
+
unregisterPrefab(prefabType) {
|
|
592
|
+
this._prefabFactories.delete(prefabType);
|
|
593
|
+
}
|
|
515
594
|
onDestroy() {
|
|
516
595
|
this._prefabFactories.clear();
|
|
517
596
|
}
|
|
@@ -530,8 +609,8 @@ var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem3 {
|
|
|
530
609
|
this._networkService = networkService;
|
|
531
610
|
}
|
|
532
611
|
/**
|
|
533
|
-
* 处理输入队列
|
|
534
|
-
* Process input queue
|
|
612
|
+
* @zh 处理输入队列
|
|
613
|
+
* @en Process input queue
|
|
535
614
|
*/
|
|
536
615
|
process() {
|
|
537
616
|
if (!this._networkService.isConnected) return;
|
|
@@ -543,8 +622,8 @@ var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem3 {
|
|
|
543
622
|
}
|
|
544
623
|
}
|
|
545
624
|
/**
|
|
546
|
-
* 添加移动输入
|
|
547
|
-
* Add move input
|
|
625
|
+
* @zh 添加移动输入
|
|
626
|
+
* @en Add move input
|
|
548
627
|
*/
|
|
549
628
|
addMoveInput(x, y) {
|
|
550
629
|
this._inputQueue.push({
|
|
@@ -556,8 +635,8 @@ var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem3 {
|
|
|
556
635
|
});
|
|
557
636
|
}
|
|
558
637
|
/**
|
|
559
|
-
* 添加动作输入
|
|
560
|
-
* Add action input
|
|
638
|
+
* @zh 添加动作输入
|
|
639
|
+
* @en Add action input
|
|
561
640
|
*/
|
|
562
641
|
addActionInput(action) {
|
|
563
642
|
const lastInput = this._inputQueue[this._inputQueue.length - 1];
|
|
@@ -584,104 +663,139 @@ var NetworkInputSystem = _NetworkInputSystem;
|
|
|
584
663
|
var _NetworkPlugin = class _NetworkPlugin {
|
|
585
664
|
constructor() {
|
|
586
665
|
__publicField(this, "name", "@esengine/network");
|
|
587
|
-
__publicField(this, "version", "
|
|
666
|
+
__publicField(this, "version", "2.0.0");
|
|
588
667
|
__publicField(this, "_networkService");
|
|
589
668
|
__publicField(this, "_syncSystem");
|
|
590
669
|
__publicField(this, "_spawnSystem");
|
|
591
670
|
__publicField(this, "_inputSystem");
|
|
671
|
+
__publicField(this, "_localPlayerId", 0);
|
|
592
672
|
}
|
|
593
673
|
/**
|
|
594
|
-
* 网络服务
|
|
595
|
-
* Network service
|
|
674
|
+
* @zh 网络服务
|
|
675
|
+
* @en Network service
|
|
596
676
|
*/
|
|
597
677
|
get networkService() {
|
|
598
678
|
return this._networkService;
|
|
599
679
|
}
|
|
600
680
|
/**
|
|
601
|
-
* 同步系统
|
|
602
|
-
* Sync system
|
|
681
|
+
* @zh 同步系统
|
|
682
|
+
* @en Sync system
|
|
603
683
|
*/
|
|
604
684
|
get syncSystem() {
|
|
605
685
|
return this._syncSystem;
|
|
606
686
|
}
|
|
607
687
|
/**
|
|
608
|
-
* 生成系统
|
|
609
|
-
* Spawn system
|
|
688
|
+
* @zh 生成系统
|
|
689
|
+
* @en Spawn system
|
|
610
690
|
*/
|
|
611
691
|
get spawnSystem() {
|
|
612
692
|
return this._spawnSystem;
|
|
613
693
|
}
|
|
614
694
|
/**
|
|
615
|
-
* 输入系统
|
|
616
|
-
* Input system
|
|
695
|
+
* @zh 输入系统
|
|
696
|
+
* @en Input system
|
|
617
697
|
*/
|
|
618
698
|
get inputSystem() {
|
|
619
699
|
return this._inputSystem;
|
|
620
700
|
}
|
|
621
701
|
/**
|
|
622
|
-
*
|
|
623
|
-
*
|
|
702
|
+
* @zh 本地玩家 ID
|
|
703
|
+
* @en Local player ID
|
|
704
|
+
*/
|
|
705
|
+
get localPlayerId() {
|
|
706
|
+
return this._localPlayerId;
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* @zh 是否已连接
|
|
710
|
+
* @en Is connected
|
|
624
711
|
*/
|
|
625
712
|
get isConnected() {
|
|
626
713
|
return this._networkService?.isConnected ?? false;
|
|
627
714
|
}
|
|
628
715
|
/**
|
|
629
|
-
* 安装插件
|
|
630
|
-
* Install plugin
|
|
716
|
+
* @zh 安装插件
|
|
717
|
+
* @en Install plugin
|
|
631
718
|
*/
|
|
632
719
|
install(_core, _services) {
|
|
633
|
-
this._networkService = new
|
|
720
|
+
this._networkService = new GameNetworkService();
|
|
634
721
|
const scene = Core.scene;
|
|
635
722
|
if (scene) {
|
|
636
723
|
this._setupSystems(scene);
|
|
637
724
|
}
|
|
638
725
|
}
|
|
639
726
|
/**
|
|
640
|
-
* 卸载插件
|
|
641
|
-
* Uninstall plugin
|
|
727
|
+
* @zh 卸载插件
|
|
728
|
+
* @en Uninstall plugin
|
|
642
729
|
*/
|
|
643
730
|
uninstall() {
|
|
644
731
|
this._networkService?.disconnect();
|
|
645
732
|
}
|
|
646
733
|
_setupSystems(scene) {
|
|
647
|
-
this._syncSystem = new NetworkSyncSystem(
|
|
648
|
-
this._spawnSystem = new NetworkSpawnSystem(this.
|
|
734
|
+
this._syncSystem = new NetworkSyncSystem();
|
|
735
|
+
this._spawnSystem = new NetworkSpawnSystem(this._syncSystem);
|
|
649
736
|
this._inputSystem = new NetworkInputSystem(this._networkService);
|
|
650
737
|
scene.addSystem(this._syncSystem);
|
|
651
738
|
scene.addSystem(this._spawnSystem);
|
|
652
739
|
scene.addSystem(this._inputSystem);
|
|
740
|
+
this._setupMessageHandlers();
|
|
741
|
+
}
|
|
742
|
+
_setupMessageHandlers() {
|
|
743
|
+
this._networkService.onSync((data) => {
|
|
744
|
+
this._syncSystem.handleSync({
|
|
745
|
+
entities: data.entities
|
|
746
|
+
});
|
|
747
|
+
}).onSpawn((data) => {
|
|
748
|
+
this._spawnSystem.handleSpawn(data);
|
|
749
|
+
}).onDespawn((data) => {
|
|
750
|
+
this._spawnSystem.handleDespawn(data);
|
|
751
|
+
});
|
|
653
752
|
}
|
|
654
753
|
/**
|
|
655
|
-
* 连接到服务器
|
|
656
|
-
* Connect to server
|
|
754
|
+
* @zh 连接到服务器
|
|
755
|
+
* @en Connect to server
|
|
657
756
|
*/
|
|
658
|
-
async connect(
|
|
659
|
-
|
|
757
|
+
async connect(options) {
|
|
758
|
+
try {
|
|
759
|
+
await this._networkService.connect(options);
|
|
760
|
+
const result = await this._networkService.call("join", {
|
|
761
|
+
playerName: options.playerName,
|
|
762
|
+
roomId: options.roomId
|
|
763
|
+
});
|
|
764
|
+
this._localPlayerId = result.playerId;
|
|
765
|
+
this._spawnSystem.setLocalPlayerId(this._localPlayerId);
|
|
766
|
+
return true;
|
|
767
|
+
} catch (err) {
|
|
768
|
+
return false;
|
|
769
|
+
}
|
|
660
770
|
}
|
|
661
771
|
/**
|
|
662
|
-
* 断开连接
|
|
663
|
-
* Disconnect
|
|
772
|
+
* @zh 断开连接
|
|
773
|
+
* @en Disconnect
|
|
664
774
|
*/
|
|
665
775
|
async disconnect() {
|
|
666
|
-
|
|
776
|
+
try {
|
|
777
|
+
await this._networkService.call("leave", void 0);
|
|
778
|
+
} catch {
|
|
779
|
+
}
|
|
780
|
+
this._networkService.disconnect();
|
|
667
781
|
}
|
|
668
782
|
/**
|
|
669
|
-
* 注册预制体工厂
|
|
670
|
-
* Register prefab factory
|
|
783
|
+
* @zh 注册预制体工厂
|
|
784
|
+
* @en Register prefab factory
|
|
671
785
|
*/
|
|
672
786
|
registerPrefab(prefabType, factory) {
|
|
673
787
|
this._spawnSystem?.registerPrefab(prefabType, factory);
|
|
674
788
|
}
|
|
675
789
|
/**
|
|
676
|
-
* 发送移动输入
|
|
677
|
-
* Send move input
|
|
790
|
+
* @zh 发送移动输入
|
|
791
|
+
* @en Send move input
|
|
678
792
|
*/
|
|
679
793
|
sendMoveInput(x, y) {
|
|
680
794
|
this._inputSystem?.addMoveInput(x, y);
|
|
681
795
|
}
|
|
682
796
|
/**
|
|
683
|
-
* 发送动作输入
|
|
684
|
-
* Send action input
|
|
797
|
+
* @zh 发送动作输入
|
|
798
|
+
* @en Send action input
|
|
685
799
|
*/
|
|
686
800
|
sendActionInput(action) {
|
|
687
801
|
this._inputSystem?.addActionInput(action);
|
|
@@ -1310,7 +1424,7 @@ var NetworkNodeDefinitions = {
|
|
|
1310
1424
|
};
|
|
1311
1425
|
export {
|
|
1312
1426
|
ClientPrediction,
|
|
1313
|
-
|
|
1427
|
+
GameNetworkService,
|
|
1314
1428
|
GetLocalPlayerIdExecutor,
|
|
1315
1429
|
GetLocalPlayerIdTemplate,
|
|
1316
1430
|
GetNetworkIdExecutor,
|
|
@@ -1327,22 +1441,26 @@ export {
|
|
|
1327
1441
|
NetworkInputSystemToken,
|
|
1328
1442
|
NetworkNodeDefinitions,
|
|
1329
1443
|
NetworkPlugin,
|
|
1330
|
-
NetworkService,
|
|
1444
|
+
GameNetworkService as NetworkService,
|
|
1331
1445
|
NetworkServiceToken,
|
|
1332
1446
|
NetworkSpawnSystem,
|
|
1333
1447
|
NetworkSpawnSystemToken,
|
|
1448
|
+
NetworkState,
|
|
1334
1449
|
NetworkSyncSystem,
|
|
1335
1450
|
NetworkSyncSystemToken,
|
|
1336
1451
|
NetworkTransform,
|
|
1452
|
+
RpcService,
|
|
1337
1453
|
SnapshotBuffer,
|
|
1338
1454
|
TransformInterpolator,
|
|
1339
1455
|
createClientPrediction,
|
|
1340
1456
|
createHermiteTransformInterpolator,
|
|
1457
|
+
createNetworkService,
|
|
1341
1458
|
createSnapshotBuffer,
|
|
1342
1459
|
createTransformInterpolator,
|
|
1460
|
+
gameProtocol,
|
|
1343
1461
|
lerp,
|
|
1344
1462
|
lerpAngle,
|
|
1345
|
-
|
|
1463
|
+
rpc2 as rpc,
|
|
1346
1464
|
smoothDamp
|
|
1347
1465
|
};
|
|
1348
1466
|
//# sourceMappingURL=index.js.map
|