@esengine/network 2.1.0 → 2.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,113 @@
1
+ /**
2
+ * @zh 网络预测系统
3
+ * @en Network Prediction System
4
+ *
5
+ * @zh 处理本地玩家的客户端预测和服务器校正
6
+ * @en Handles client-side prediction and server reconciliation for local player
7
+ */
8
+ import { EntitySystem, type Entity } from '@esengine/ecs-framework';
9
+ import type { SyncData, PlayerInput } from '../protocol';
10
+ import { type ClientPredictionConfig, type ITransformState } from '../sync';
11
+ /**
12
+ * @zh 移动输入
13
+ * @en Movement input
14
+ */
15
+ export interface MovementInput {
16
+ x: number;
17
+ y: number;
18
+ actions?: string[];
19
+ }
20
+ /**
21
+ * @zh 预测状态(位置 + 旋转)
22
+ * @en Predicted state (position + rotation)
23
+ */
24
+ export interface PredictedTransform extends ITransformState {
25
+ velocityX: number;
26
+ velocityY: number;
27
+ }
28
+ /**
29
+ * @zh 预测系统配置
30
+ * @en Prediction system configuration
31
+ */
32
+ export interface NetworkPredictionConfig extends Partial<ClientPredictionConfig> {
33
+ /**
34
+ * @zh 移动速度(单位/秒)
35
+ * @en Movement speed (units/second)
36
+ */
37
+ moveSpeed: number;
38
+ /**
39
+ * @zh 是否启用预测
40
+ * @en Whether prediction is enabled
41
+ */
42
+ enabled: boolean;
43
+ }
44
+ /**
45
+ * @zh 网络预测系统
46
+ * @en Network prediction system
47
+ *
48
+ * @zh 处理本地玩家的输入预测和服务器状态校正
49
+ * @en Handles local player input prediction and server state reconciliation
50
+ */
51
+ export declare class NetworkPredictionSystem extends EntitySystem {
52
+ private readonly _config;
53
+ private readonly _predictor;
54
+ private _prediction;
55
+ private _localPlayerNetId;
56
+ private _currentInput;
57
+ private _inputSequence;
58
+ constructor(config?: Partial<NetworkPredictionConfig>);
59
+ /**
60
+ * @zh 获取配置
61
+ * @en Get configuration
62
+ */
63
+ get config(): Readonly<NetworkPredictionConfig>;
64
+ /**
65
+ * @zh 获取当前输入序列号
66
+ * @en Get current input sequence number
67
+ */
68
+ get inputSequence(): number;
69
+ /**
70
+ * @zh 获取待确认输入数量
71
+ * @en Get pending input count
72
+ */
73
+ get pendingInputCount(): number;
74
+ /**
75
+ * @zh 是否启用预测
76
+ * @en Whether prediction is enabled
77
+ */
78
+ get enabled(): boolean;
79
+ set enabled(value: boolean);
80
+ /**
81
+ * @zh 设置本地玩家网络 ID
82
+ * @en Set local player network ID
83
+ */
84
+ setLocalPlayerNetId(netId: number): void;
85
+ /**
86
+ * @zh 设置移动输入
87
+ * @en Set movement input
88
+ */
89
+ setInput(x: number, y: number, actions?: string[]): void;
90
+ /**
91
+ * @zh 获取下一个要发送的输入(带序列号)
92
+ * @en Get next input to send (with sequence number)
93
+ */
94
+ getInputToSend(): PlayerInput | null;
95
+ /**
96
+ * @zh 处理服务器同步数据进行校正
97
+ * @en Process server sync data for reconciliation
98
+ */
99
+ reconcileWithServer(data: SyncData): void;
100
+ protected process(entities: readonly Entity[]): void;
101
+ /**
102
+ * @zh 重置预测状态
103
+ * @en Reset prediction state
104
+ */
105
+ reset(): void;
106
+ protected onDestroy(): void;
107
+ }
108
+ /**
109
+ * @zh 创建网络预测系统
110
+ * @en Create network prediction system
111
+ */
112
+ export declare function createNetworkPredictionSystem(config?: Partial<NetworkPredictionConfig>): NetworkPredictionSystem;
113
+ //# sourceMappingURL=NetworkPredictionSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkPredictionSystem.d.ts","sourceRoot":"","sources":["../../src/systems/NetworkPredictionSystem.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAiB,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGlF,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAIH,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACvB,MAAM,SAAS,CAAA;AAMhB;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACvD,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,OAAO,CAAC,sBAAsB,CAAC;IAC5E;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAA;CACnB;AAuCD;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;IAC1E,OAAO,CAAC,WAAW,CAAmE;IACtF,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,cAAc,CAAY;gBAEtB,MAAM,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC;IAMrD;;;OAGG;IACH,IAAI,MAAM,IAAI,QAAQ,CAAC,uBAAuB,CAAC,CAE9C;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;OAGG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAEzB;IAED;;;OAGG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYxC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAIxD;;;OAGG;IACH,cAAc,IAAI,WAAW,GAAG,IAAI;IAepC;;;OAGG;IACH,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;cA0BtB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAoD7D;;;OAGG;IACH,KAAK,IAAI,IAAI;cAMM,SAAS,IAAI,IAAI;CAIvC;AAMD;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,MAAM,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC1C,uBAAuB,CAEzB"}
@@ -1,7 +1,16 @@
1
+ /**
2
+ * @zh 网络同步系统
3
+ * @en Network Sync System
4
+ *
5
+ * @zh 处理网络实体的状态同步、快照缓冲和插值
6
+ * @en Handles state synchronization, snapshot buffering, and interpolation for networked entities
7
+ */
1
8
  import { EntitySystem, type Entity } from '@esengine/ecs-framework';
9
+ import type { SyncData } from '../protocol';
10
+ import { SnapshotBuffer, type ITransformStateWithVelocity } from '../sync';
2
11
  /**
3
- * @zh 同步消息接口
4
- * @en Sync message interface
12
+ * @zh 同步消息接口(兼容旧版)
13
+ * @en Sync message interface (for backwards compatibility)
5
14
  */
6
15
  export interface SyncMessage {
7
16
  entities: Array<{
@@ -13,22 +22,83 @@ export interface SyncMessage {
13
22
  rot?: number;
14
23
  }>;
15
24
  }
25
+ /**
26
+ * @zh 同步系统配置
27
+ * @en Sync system configuration
28
+ */
29
+ export interface NetworkSyncConfig {
30
+ /**
31
+ * @zh 快照缓冲区大小
32
+ * @en Snapshot buffer size
33
+ */
34
+ bufferSize: number;
35
+ /**
36
+ * @zh 插值延迟(毫秒)
37
+ * @en Interpolation delay in milliseconds
38
+ */
39
+ interpolationDelay: number;
40
+ /**
41
+ * @zh 是否启用外推
42
+ * @en Whether to enable extrapolation
43
+ */
44
+ enableExtrapolation: boolean;
45
+ /**
46
+ * @zh 最大外推时间(毫秒)
47
+ * @en Maximum extrapolation time in milliseconds
48
+ */
49
+ maxExtrapolationTime: number;
50
+ /**
51
+ * @zh 使用赫尔米特插值(更平滑)
52
+ * @en Use Hermite interpolation (smoother)
53
+ */
54
+ useHermiteInterpolation: boolean;
55
+ }
16
56
  /**
17
57
  * @zh 网络同步系统
18
58
  * @en Network sync system
19
59
  *
20
- * @zh 处理网络实体的状态同步和插值
21
- * @en Handles state synchronization and interpolation for networked entities
60
+ * @zh 处理网络实体的状态同步和插值,支持快照缓冲、平滑插值和外推
61
+ * @en Handles state synchronization and interpolation for networked entities,
62
+ * supports snapshot buffering, smooth interpolation, and extrapolation
22
63
  */
23
64
  export declare class NetworkSyncSystem extends EntitySystem {
24
- private _netIdToEntity;
25
- constructor();
65
+ private readonly _netIdToEntity;
66
+ private readonly _entitySnapshots;
67
+ private readonly _interpolator;
68
+ private readonly _config;
69
+ private _serverTimeOffset;
70
+ private _lastSyncTime;
71
+ private _renderTime;
72
+ constructor(config?: Partial<NetworkSyncConfig>);
73
+ /**
74
+ * @zh 获取配置
75
+ * @en Get configuration
76
+ */
77
+ get config(): Readonly<NetworkSyncConfig>;
78
+ /**
79
+ * @zh 获取服务器时间偏移
80
+ * @en Get server time offset
81
+ */
82
+ get serverTimeOffset(): number;
83
+ /**
84
+ * @zh 获取当前渲染时间
85
+ * @en Get current render time
86
+ */
87
+ get renderTime(): number;
88
+ /**
89
+ * @zh 处理同步消息(新版,带时间戳)
90
+ * @en Handle sync message (new version with timestamp)
91
+ */
92
+ handleSyncData(data: SyncData): void;
26
93
  /**
27
- * @zh 处理同步消息
28
- * @en Handle sync message
94
+ * @zh 处理同步消息(兼容旧版)
95
+ * @en Handle sync message (backwards compatible)
29
96
  */
30
97
  handleSync(msg: SyncMessage): void;
98
+ private _processEntityState;
31
99
  protected process(entities: readonly Entity[]): void;
100
+ private _interpolateEntity;
101
+ private _simpleLerp;
32
102
  /**
33
103
  * @zh 注册网络实体
34
104
  * @en Register network entity
@@ -44,7 +114,16 @@ export declare class NetworkSyncSystem extends EntitySystem {
44
114
  * @en Get entity ID by network ID
45
115
  */
46
116
  getEntityId(netId: number): number | undefined;
47
- private _interpolate;
117
+ /**
118
+ * @zh 获取实体的快照缓冲区
119
+ * @en Get entity's snapshot buffer
120
+ */
121
+ getSnapshotBuffer(netId: number): SnapshotBuffer<ITransformStateWithVelocity> | undefined;
122
+ /**
123
+ * @zh 清空所有快照缓冲
124
+ * @en Clear all snapshot buffers
125
+ */
126
+ clearSnapshots(): void;
48
127
  protected onDestroy(): void;
49
128
  }
50
129
  //# sourceMappingURL=NetworkSyncSystem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkSyncSystem.d.ts","sourceRoot":"","sources":["../../src/systems/NetworkSyncSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIlF;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,GAAG,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;CACL;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IAC/C,OAAO,CAAC,cAAc,CAAiC;;IAMvD;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;cAef,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAa7D;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C,OAAO,CAAC,YAAY;cAYD,SAAS,IAAI,IAAI;CAGvC"}
1
+ {"version":3,"file":"NetworkSyncSystem.d.ts","sourceRoot":"","sources":["../../src/systems/NetworkSyncSystem.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAiB,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGlF,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAA;AAC5D,OAAO,EACH,cAAc,EAKd,KAAK,2BAA2B,EAEnC,MAAM,SAAS,CAAA;AAMhB;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,GAAG,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;CACL;AAWD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAA;IAE1B;;;OAGG;IACH,mBAAmB,EAAE,OAAO,CAAA;IAE5B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAA;IAE5B;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAA;CACnC;AAcD;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiC;IAChE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6C;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,WAAW,CAAY;gBAEnB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAM/C;;;OAGG;IACH,IAAI,MAAM,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CAExC;IAED;;;OAGG;IACH,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED;;;OAGG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAapC;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAuBlC,OAAO,CAAC,mBAAmB;cAoCR,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAoB7D,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,WAAW;IAYnB;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKrC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC,2BAA2B,CAAC,GAAG,SAAS;IAIzF;;;OAGG;IACH,cAAc,IAAI,IAAI;cAMH,SAAS,IAAI,IAAI;CAIvC"}
package/dist/tokens.d.ts CHANGED
@@ -6,6 +6,8 @@ import type { NetworkService } from './services/NetworkService';
6
6
  import type { NetworkSyncSystem } from './systems/NetworkSyncSystem';
7
7
  import type { NetworkSpawnSystem } from './systems/NetworkSpawnSystem';
8
8
  import type { NetworkInputSystem } from './systems/NetworkInputSystem';
9
+ import type { NetworkPredictionSystem } from './systems/NetworkPredictionSystem';
10
+ import type { NetworkAOISystem } from './systems/NetworkAOISystem';
9
11
  /**
10
12
  * 网络服务令牌
11
13
  * Network service token
@@ -26,4 +28,14 @@ export declare const NetworkSpawnSystemToken: import("@esengine/ecs-framework").
26
28
  * Network input system token
27
29
  */
28
30
  export declare const NetworkInputSystemToken: import("@esengine/ecs-framework").ServiceToken<NetworkInputSystem>;
31
+ /**
32
+ * 网络预测系统令牌
33
+ * Network prediction system token
34
+ */
35
+ export declare const NetworkPredictionSystemToken: import("@esengine/ecs-framework").ServiceToken<NetworkPredictionSystem>;
36
+ /**
37
+ * 网络 AOI 系统令牌
38
+ * Network AOI system token
39
+ */
40
+ export declare const NetworkAOISystemToken: import("@esengine/ecs-framework").ServiceToken<NetworkAOISystem>;
29
41
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAMvE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gEAAuD,CAAC;AAExF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,mEAA6D,CAAC;AAEjG;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAA+D,CAAC;AAEpG;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAA+D,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gEAAuD,CAAC;AAExF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,mEAA6D,CAAC;AAEjG;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAA+D,CAAC;AAEpG;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAA+D,CAAC;AAEpG;;;GAGG;AACH,eAAO,MAAM,4BAA4B,yEAAyE,CAAC;AAEnH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,kEAA2D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esengine/network",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Network synchronization for multiplayer games",
5
5
  "esengine": {
6
6
  "plugin": true,
@@ -22,7 +22,7 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@esengine/rpc": "1.1.0"
25
+ "@esengine/rpc": "1.1.1"
26
26
  },
27
27
  "devDependencies": {
28
28
  "rimraf": "^5.0.5",