@esengine/network 2.1.1 → 3.0.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,172 @@
1
+ /**
2
+ * @zh 网络 AOI 系统
3
+ * @en Network AOI System
4
+ *
5
+ * @zh 集成 AOI 兴趣区域管理,过滤网络同步数据
6
+ * @en Integrates AOI interest management to filter network sync data
7
+ */
8
+ import { EntitySystem, type Entity } from '@esengine/ecs-framework';
9
+ import type { EntitySyncState } from '../protocol';
10
+ /**
11
+ * @zh AOI 事件类型
12
+ * @en AOI event type
13
+ */
14
+ export type NetworkAOIEventType = 'enter' | 'exit';
15
+ /**
16
+ * @zh AOI 事件
17
+ * @en AOI event
18
+ */
19
+ export interface NetworkAOIEvent {
20
+ /**
21
+ * @zh 事件类型
22
+ * @en Event type
23
+ */
24
+ type: NetworkAOIEventType;
25
+ /**
26
+ * @zh 观察者网络 ID(玩家)
27
+ * @en Observer network ID (player)
28
+ */
29
+ observerNetId: number;
30
+ /**
31
+ * @zh 目标网络 ID(进入/离开视野的实体)
32
+ * @en Target network ID (entity entering/exiting view)
33
+ */
34
+ targetNetId: number;
35
+ }
36
+ /**
37
+ * @zh AOI 事件监听器
38
+ * @en AOI event listener
39
+ */
40
+ export type NetworkAOIEventListener = (event: NetworkAOIEvent) => void;
41
+ /**
42
+ * @zh 网络 AOI 配置
43
+ * @en Network AOI configuration
44
+ */
45
+ export interface NetworkAOIConfig {
46
+ /**
47
+ * @zh 网格单元格大小
48
+ * @en Grid cell size
49
+ */
50
+ cellSize: number;
51
+ /**
52
+ * @zh 默认视野范围
53
+ * @en Default view range
54
+ */
55
+ defaultViewRange: number;
56
+ /**
57
+ * @zh 是否启用 AOI 过滤
58
+ * @en Whether to enable AOI filtering
59
+ */
60
+ enabled: boolean;
61
+ }
62
+ /**
63
+ * @zh 网络 AOI 系统
64
+ * @en Network AOI system
65
+ *
66
+ * @zh 管理网络实体的兴趣区域,过滤同步数据
67
+ * @en Manages network entities' areas of interest and filters sync data
68
+ */
69
+ export declare class NetworkAOISystem extends EntitySystem {
70
+ private readonly _config;
71
+ private readonly _observers;
72
+ private readonly _cells;
73
+ private readonly _listeners;
74
+ private readonly _entityNetIdMap;
75
+ private readonly _netIdEntityMap;
76
+ constructor(config?: Partial<NetworkAOIConfig>);
77
+ /**
78
+ * @zh 获取配置
79
+ * @en Get configuration
80
+ */
81
+ get config(): Readonly<NetworkAOIConfig>;
82
+ /**
83
+ * @zh 是否启用
84
+ * @en Is enabled
85
+ */
86
+ get enabled(): boolean;
87
+ set enabled(value: boolean);
88
+ /**
89
+ * @zh 观察者数量
90
+ * @en Observer count
91
+ */
92
+ get observerCount(): number;
93
+ /**
94
+ * @zh 添加观察者(通常是玩家实体)
95
+ * @en Add observer (usually player entity)
96
+ */
97
+ addObserver(netId: number, x: number, y: number, viewRange?: number): void;
98
+ /**
99
+ * @zh 移除观察者
100
+ * @en Remove observer
101
+ */
102
+ removeObserver(netId: number): boolean;
103
+ /**
104
+ * @zh 更新观察者位置
105
+ * @en Update observer position
106
+ */
107
+ updateObserverPosition(netId: number, x: number, y: number): void;
108
+ /**
109
+ * @zh 更新观察者视野范围
110
+ * @en Update observer view range
111
+ */
112
+ updateObserverViewRange(netId: number, viewRange: number): void;
113
+ /**
114
+ * @zh 注册网络实体
115
+ * @en Register network entity
116
+ */
117
+ registerEntity(entity: Entity, netId: number): void;
118
+ /**
119
+ * @zh 注销网络实体
120
+ * @en Unregister network entity
121
+ */
122
+ unregisterEntity(entity: Entity): void;
123
+ /**
124
+ * @zh 获取观察者能看到的实体网络 ID 列表
125
+ * @en Get list of entity network IDs visible to observer
126
+ */
127
+ getVisibleEntities(observerNetId: number): number[];
128
+ /**
129
+ * @zh 获取能看到指定实体的观察者网络 ID 列表
130
+ * @en Get list of observer network IDs that can see the entity
131
+ */
132
+ getObserversOf(entityNetId: number): number[];
133
+ /**
134
+ * @zh 检查观察者是否能看到目标
135
+ * @en Check if observer can see target
136
+ */
137
+ canSee(observerNetId: number, targetNetId: number): boolean;
138
+ /**
139
+ * @zh 过滤同步数据,只保留观察者能看到的实体
140
+ * @en Filter sync data to only include entities visible to observer
141
+ */
142
+ filterSyncData(observerNetId: number, entities: EntitySyncState[]): EntitySyncState[];
143
+ /**
144
+ * @zh 添加事件监听器
145
+ * @en Add event listener
146
+ */
147
+ addListener(listener: NetworkAOIEventListener): void;
148
+ /**
149
+ * @zh 移除事件监听器
150
+ * @en Remove event listener
151
+ */
152
+ removeListener(listener: NetworkAOIEventListener): void;
153
+ protected process(entities: readonly Entity[]): void;
154
+ private _updateAllObserversVisibility;
155
+ /**
156
+ * @zh 清除所有数据
157
+ * @en Clear all data
158
+ */
159
+ clear(): void;
160
+ protected onDestroy(): void;
161
+ private _getCellKey;
162
+ private _addToCell;
163
+ private _removeFromCell;
164
+ private _updateVisibility;
165
+ private _emitEvent;
166
+ }
167
+ /**
168
+ * @zh 创建网络 AOI 系统
169
+ * @en Create network AOI system
170
+ */
171
+ export declare function createNetworkAOISystem(config?: Partial<NetworkAOIConfig>): NetworkAOISystem;
172
+ //# sourceMappingURL=NetworkAOISystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkAOISystem.d.ts","sourceRoot":"","sources":["../../src/systems/NetworkAOISystem.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,34 @@
1
1
  /**
2
2
  * @zh 网络输入系统
3
3
  * @en Network Input System
4
+ *
5
+ * @zh 收集本地玩家输入并发送到服务器,支持与预测系统集成
6
+ * @en Collects local player input and sends to server, supports integration with prediction system
4
7
  */
5
8
  import { EntitySystem } from '@esengine/ecs-framework';
6
9
  import type { NetworkService } from '../services/NetworkService';
10
+ import type { NetworkPredictionSystem } from './NetworkPredictionSystem';
11
+ /**
12
+ * @zh 输入配置
13
+ * @en Input configuration
14
+ */
15
+ export interface NetworkInputConfig {
16
+ /**
17
+ * @zh 发送输入的最小间隔(毫秒)
18
+ * @en Minimum interval between input sends (milliseconds)
19
+ */
20
+ sendInterval: number;
21
+ /**
22
+ * @zh 是否合并相同输入
23
+ * @en Whether to merge identical inputs
24
+ */
25
+ mergeIdenticalInputs: boolean;
26
+ /**
27
+ * @zh 最大输入队列长度
28
+ * @en Maximum input queue length
29
+ */
30
+ maxQueueLength: number;
31
+ }
7
32
  /**
8
33
  * @zh 网络输入系统
9
34
  * @en Network input system
@@ -12,15 +37,41 @@ import type { NetworkService } from '../services/NetworkService';
12
37
  * @en Collects local player input and sends to server
13
38
  */
14
39
  export declare class NetworkInputSystem extends EntitySystem {
15
- private _networkService;
40
+ private readonly _networkService;
41
+ private readonly _config;
42
+ private _predictionSystem;
16
43
  private _frame;
44
+ private _inputSequence;
17
45
  private _inputQueue;
18
- constructor(networkService: NetworkService);
46
+ private _lastSendTime;
47
+ private _lastMoveDir;
48
+ constructor(networkService: NetworkService, config?: Partial<NetworkInputConfig>);
49
+ /**
50
+ * @zh 获取配置
51
+ * @en Get configuration
52
+ */
53
+ get config(): Readonly<NetworkInputConfig>;
54
+ /**
55
+ * @zh 获取当前帧号
56
+ * @en Get current frame number
57
+ */
58
+ get frame(): number;
59
+ /**
60
+ * @zh 获取当前输入序列号
61
+ * @en Get current input sequence
62
+ */
63
+ get inputSequence(): number;
64
+ /**
65
+ * @zh 设置预测系统引用
66
+ * @en Set prediction system reference
67
+ */
68
+ setPredictionSystem(system: NetworkPredictionSystem): void;
19
69
  /**
20
70
  * @zh 处理输入队列
21
71
  * @en Process input queue
22
72
  */
23
73
  protected process(): void;
74
+ private _mergeInputs;
24
75
  /**
25
76
  * @zh 添加移动输入
26
77
  * @en Add move input
@@ -31,6 +82,22 @@ export declare class NetworkInputSystem extends EntitySystem {
31
82
  * @en Add action input
32
83
  */
33
84
  addActionInput(action: string): void;
85
+ private _addToQueue;
86
+ /**
87
+ * @zh 清空输入队列
88
+ * @en Clear input queue
89
+ */
90
+ clearQueue(): void;
91
+ /**
92
+ * @zh 重置状态
93
+ * @en Reset state
94
+ */
95
+ reset(): void;
34
96
  protected onDestroy(): void;
35
97
  }
98
+ /**
99
+ * @zh 创建网络输入系统
100
+ * @en Create network input system
101
+ */
102
+ export declare function createNetworkInputSystem(networkService: NetworkService, config?: Partial<NetworkInputConfig>): NetworkInputSystem;
36
103
  //# sourceMappingURL=NetworkInputSystem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkInputSystem.d.ts","sourceRoot":"","sources":["../../src/systems/NetworkInputSystem.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAA;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAEhE;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAChD,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAoB;gBAE3B,cAAc,EAAE,cAAc;IAK1C;;;OAGG;cACgB,OAAO,IAAI,IAAI;IAYlC;;;OAGG;IACI,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAO/C;;;OAGG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;cAaxB,SAAS,IAAI,IAAI;CAGvC"}
1
+ {"version":3,"file":"NetworkInputSystem.d.ts","sourceRoot":"","sources":["../../src/systems/NetworkInputSystem.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAA;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAMxE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAA;IAE7B;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAA;CACzB;AAsBD;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,iBAAiB,CAAuC;IAEhE,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAA2C;gBAEnD,cAAc,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAMhF;;;OAGG;IACH,IAAI,MAAM,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAEzC;IAED;;;OAGG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAI1D;;;OAGG;cACgB,OAAO,IAAI,IAAI;IA6ClC,OAAO,CAAC,YAAY;IAoBpB;;;OAGG;IACI,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAqB/C;;;OAGG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAoB3C,OAAO,CAAC,WAAW;IASnB;;;OAGG;IACI,UAAU,IAAI,IAAI;IAKzB;;;OAGG;IACI,KAAK,IAAI,IAAI;cAMD,SAAS,IAAI,IAAI;CAIvC;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,CACpC,cAAc,EAAE,cAAc,EAC9B,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACrC,kBAAkB,CAEpB"}
@@ -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.1",
3
+ "version": "3.0.0",
4
4
  "description": "Network synchronization for multiplayer games",
5
5
  "esengine": {
6
6
  "plugin": true,
@@ -24,12 +24,21 @@
24
24
  "dependencies": {
25
25
  "@esengine/rpc": "1.1.1"
26
26
  },
27
+ "peerDependencies": {
28
+ "@esengine/ecs-framework": "2.5.0",
29
+ "@esengine/blueprint": "2.0.0"
30
+ },
31
+ "peerDependenciesMeta": {
32
+ "@esengine/blueprint": {
33
+ "optional": true
34
+ }
35
+ },
27
36
  "devDependencies": {
28
37
  "rimraf": "^5.0.5",
29
38
  "tsup": "^8.0.0",
30
39
  "typescript": "^5.3.3",
31
- "@esengine/blueprint": "1.0.2",
32
- "@esengine/ecs-framework": "2.4.4",
40
+ "@esengine/blueprint": "2.0.0",
41
+ "@esengine/ecs-framework": "2.5.0",
33
42
  "@esengine/build-config": "1.0.0"
34
43
  },
35
44
  "keywords": [