@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.
@@ -10,11 +10,21 @@
10
10
  * @en Player input
11
11
  */
12
12
  export interface PlayerInput {
13
+ /**
14
+ * @zh 输入序列号(用于客户端预测)
15
+ * @en Input sequence number (for client prediction)
16
+ */
17
+ seq: number;
13
18
  /**
14
19
  * @zh 帧序号
15
20
  * @en Frame number
16
21
  */
17
22
  frame: number;
23
+ /**
24
+ * @zh 客户端时间戳
25
+ * @en Client timestamp
26
+ */
27
+ timestamp: number;
18
28
  /**
19
29
  * @zh 移动方向
20
30
  * @en Move direction
@@ -34,12 +44,42 @@ export interface PlayerInput {
34
44
  * @en Entity sync state
35
45
  */
36
46
  export interface EntitySyncState {
47
+ /**
48
+ * @zh 网络实体 ID
49
+ * @en Network entity ID
50
+ */
37
51
  netId: number;
52
+ /**
53
+ * @zh 位置
54
+ * @en Position
55
+ */
38
56
  pos?: {
39
57
  x: number;
40
58
  y: number;
41
59
  };
60
+ /**
61
+ * @zh 旋转角度
62
+ * @en Rotation angle
63
+ */
42
64
  rot?: number;
65
+ /**
66
+ * @zh 速度(用于外推)
67
+ * @en Velocity (for extrapolation)
68
+ */
69
+ vel?: {
70
+ x: number;
71
+ y: number;
72
+ };
73
+ /**
74
+ * @zh 角速度
75
+ * @en Angular velocity
76
+ */
77
+ angVel?: number;
78
+ /**
79
+ * @zh 自定义数据
80
+ * @en Custom data
81
+ */
82
+ custom?: Record<string, unknown>;
43
83
  }
44
84
  /**
45
85
  * @zh 同步消息
@@ -51,6 +91,16 @@ export interface SyncData {
51
91
  * @en Server frame number
52
92
  */
53
93
  frame: number;
94
+ /**
95
+ * @zh 服务器时间戳(用于插值)
96
+ * @en Server timestamp (for interpolation)
97
+ */
98
+ timestamp: number;
99
+ /**
100
+ * @zh 已确认的输入序列号(用于客户端预测校正)
101
+ * @en Acknowledged input sequence (for client prediction reconciliation)
102
+ */
103
+ ackSeq?: number;
54
104
  /**
55
105
  * @zh 实体状态列表
56
106
  * @en Entity state list
@@ -78,6 +128,29 @@ export interface SpawnData {
78
128
  export interface DespawnData {
79
129
  netId: number;
80
130
  }
131
+ /**
132
+ * @zh 完整状态快照(用于重连)
133
+ * @en Full state snapshot (for reconnection)
134
+ */
135
+ export interface FullStateData {
136
+ /**
137
+ * @zh 服务器帧号
138
+ * @en Server frame number
139
+ */
140
+ frame: number;
141
+ /**
142
+ * @zh 服务器时间戳
143
+ * @en Server timestamp
144
+ */
145
+ timestamp: number;
146
+ /**
147
+ * @zh 所有实体状态
148
+ * @en All entity states
149
+ */
150
+ entities: Array<SpawnData & {
151
+ state?: EntitySyncState;
152
+ }>;
153
+ }
81
154
  /**
82
155
  * @zh 加入房间请求
83
156
  * @en Join room request
@@ -94,6 +167,48 @@ export interface JoinResponse {
94
167
  playerId: number;
95
168
  roomId: string;
96
169
  }
170
+ /**
171
+ * @zh 重连请求
172
+ * @en Reconnect request
173
+ */
174
+ export interface ReconnectRequest {
175
+ /**
176
+ * @zh 之前的玩家 ID
177
+ * @en Previous player ID
178
+ */
179
+ playerId: number;
180
+ /**
181
+ * @zh 房间 ID
182
+ * @en Room ID
183
+ */
184
+ roomId: string;
185
+ /**
186
+ * @zh 重连令牌
187
+ * @en Reconnection token
188
+ */
189
+ token: string;
190
+ }
191
+ /**
192
+ * @zh 重连响应
193
+ * @en Reconnect response
194
+ */
195
+ export interface ReconnectResponse {
196
+ /**
197
+ * @zh 是否成功
198
+ * @en Whether successful
199
+ */
200
+ success: boolean;
201
+ /**
202
+ * @zh 完整状态(成功时)
203
+ * @en Full state (when successful)
204
+ */
205
+ state?: FullStateData;
206
+ /**
207
+ * @zh 错误信息(失败时)
208
+ * @en Error message (when failed)
209
+ */
210
+ error?: string;
211
+ }
97
212
  /**
98
213
  * @zh 默认游戏网络协议
99
214
  * @en Default game network protocol
@@ -128,6 +243,11 @@ export declare const gameProtocol: {
128
243
  * @en Leave room
129
244
  */
130
245
  leave: import("@esengine/rpc").ApiDef<void, void>;
246
+ /**
247
+ * @zh 重连
248
+ * @en Reconnect
249
+ */
250
+ reconnect: import("@esengine/rpc").ApiDef<ReconnectRequest, ReconnectResponse>;
131
251
  };
132
252
  msg: {
133
253
  /**
@@ -150,6 +270,11 @@ export declare const gameProtocol: {
150
270
  * @en Entity despawn
151
271
  */
152
272
  despawn: import("@esengine/rpc").MsgDef<DespawnData>;
273
+ /**
274
+ * @zh 完整状态快照
275
+ * @en Full state snapshot
276
+ */
277
+ fullState: import("@esengine/rpc").MsgDef<FullStateData>;
153
278
  };
154
279
  };
155
280
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAElC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACrB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAA;CAChB;AAMD;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY;;QAEjB;;;WAGG;;QAGH;;;WAGG;;;;QAIH;;;WAGG;;QAGH;;;WAGG;;QAGH;;;WAGG;;QAGH;;;WAGG;;;CAGT,CAAA;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAA"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @zh 状态增量压缩
3
+ * @en State Delta Compression
4
+ *
5
+ * @zh 通过只发送变化的字段来减少网络带宽
6
+ * @en Reduces network bandwidth by only sending changed fields
7
+ */
8
+ import type { SyncData } from '../protocol';
9
+ /**
10
+ * @zh 增量类型标志
11
+ * @en Delta type flags
12
+ */
13
+ export declare const DeltaFlags: {
14
+ readonly NONE: 0;
15
+ readonly POSITION: number;
16
+ readonly ROTATION: number;
17
+ readonly VELOCITY: number;
18
+ readonly ANGULAR_VELOCITY: number;
19
+ readonly CUSTOM: number;
20
+ };
21
+ /**
22
+ * @zh 增量状态(只包含变化的字段)
23
+ * @en Delta state (only contains changed fields)
24
+ */
25
+ export interface EntityDeltaState {
26
+ /**
27
+ * @zh 网络标识
28
+ * @en Network identity
29
+ */
30
+ netId: number;
31
+ /**
32
+ * @zh 变化标志
33
+ * @en Change flags
34
+ */
35
+ flags: number;
36
+ /**
37
+ * @zh 位置(如果变化)
38
+ * @en Position (if changed)
39
+ */
40
+ pos?: {
41
+ x: number;
42
+ y: number;
43
+ };
44
+ /**
45
+ * @zh 旋转(如果变化)
46
+ * @en Rotation (if changed)
47
+ */
48
+ rot?: number;
49
+ /**
50
+ * @zh 速度(如果变化)
51
+ * @en Velocity (if changed)
52
+ */
53
+ vel?: {
54
+ x: number;
55
+ y: number;
56
+ };
57
+ /**
58
+ * @zh 角速度(如果变化)
59
+ * @en Angular velocity (if changed)
60
+ */
61
+ angVel?: number;
62
+ /**
63
+ * @zh 自定义数据(如果变化)
64
+ * @en Custom data (if changed)
65
+ */
66
+ custom?: Record<string, unknown>;
67
+ }
68
+ /**
69
+ * @zh 增量同步数据
70
+ * @en Delta sync data
71
+ */
72
+ export interface DeltaSyncData {
73
+ /**
74
+ * @zh 帧号
75
+ * @en Frame number
76
+ */
77
+ frame: number;
78
+ /**
79
+ * @zh 时间戳
80
+ * @en Timestamp
81
+ */
82
+ timestamp: number;
83
+ /**
84
+ * @zh 已确认的输入序列号
85
+ * @en Acknowledged input sequence
86
+ */
87
+ ackSeq?: number;
88
+ /**
89
+ * @zh 增量实体状态
90
+ * @en Delta entity states
91
+ */
92
+ entities: EntityDeltaState[];
93
+ /**
94
+ * @zh 是否为完整快照
95
+ * @en Whether this is a full snapshot
96
+ */
97
+ isFullSnapshot?: boolean;
98
+ }
99
+ /**
100
+ * @zh 增量压缩配置
101
+ * @en Delta compression configuration
102
+ */
103
+ export interface DeltaCompressionConfig {
104
+ /**
105
+ * @zh 位置变化阈值
106
+ * @en Position change threshold
107
+ */
108
+ positionThreshold: number;
109
+ /**
110
+ * @zh 旋转变化阈值(弧度)
111
+ * @en Rotation change threshold (radians)
112
+ */
113
+ rotationThreshold: number;
114
+ /**
115
+ * @zh 速度变化阈值
116
+ * @en Velocity change threshold
117
+ */
118
+ velocityThreshold: number;
119
+ /**
120
+ * @zh 强制完整快照间隔(帧数)
121
+ * @en Forced full snapshot interval (frames)
122
+ */
123
+ fullSnapshotInterval: number;
124
+ }
125
+ /**
126
+ * @zh 状态增量压缩器
127
+ * @en State delta compressor
128
+ *
129
+ * @zh 追踪实体状态变化,生成增量更新
130
+ * @en Tracks entity state changes and generates delta updates
131
+ */
132
+ export declare class StateDeltaCompressor {
133
+ private readonly _config;
134
+ private readonly _lastStates;
135
+ private _frameCounter;
136
+ constructor(config?: Partial<DeltaCompressionConfig>);
137
+ /**
138
+ * @zh 获取配置
139
+ * @en Get configuration
140
+ */
141
+ get config(): Readonly<DeltaCompressionConfig>;
142
+ /**
143
+ * @zh 压缩同步数据为增量格式
144
+ * @en Compress sync data to delta format
145
+ */
146
+ compress(data: SyncData): DeltaSyncData;
147
+ /**
148
+ * @zh 解压增量数据为完整同步数据
149
+ * @en Decompress delta data to full sync data
150
+ */
151
+ decompress(data: DeltaSyncData): SyncData;
152
+ /**
153
+ * @zh 移除实体状态
154
+ * @en Remove entity state
155
+ */
156
+ removeEntity(netId: number): void;
157
+ /**
158
+ * @zh 清除所有状态
159
+ * @en Clear all states
160
+ */
161
+ clear(): void;
162
+ /**
163
+ * @zh 强制下一次发送完整快照
164
+ * @en Force next send to be a full snapshot
165
+ */
166
+ forceFullSnapshot(): void;
167
+ private _createFullDelta;
168
+ private _calculateDelta;
169
+ private _applyDelta;
170
+ private _customDataEqual;
171
+ }
172
+ /**
173
+ * @zh 创建状态增量压缩器
174
+ * @en Create state delta compressor
175
+ */
176
+ export declare function createStateDeltaCompressor(config?: Partial<DeltaCompressionConfig>): StateDeltaCompressor;
177
+ //# sourceMappingURL=StateDelta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateDelta.d.ts","sourceRoot":"","sources":["../../src/sync/StateDelta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAmB,QAAQ,EAAE,MAAM,aAAa,CAAA;AAM5D;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAA;AAEV;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAE9B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IACH,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAE9B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAE5B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAA;CAC/B;AAaD;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IACtE,OAAO,CAAC,aAAa,CAAY;gBAErB,MAAM,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC;IAIpD;;;OAGG;IACH,IAAI,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAE7C;IAED;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa;IAiCvC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ;IAoBzC;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAQzB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,eAAe;IA2EvB,OAAO,CAAC,WAAW;IA8CnB,OAAO,CAAC,gBAAgB;CAkB3B;AAMD;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,MAAM,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,oBAAoB,CAEtB"}
@@ -12,4 +12,6 @@ export { lerp, lerpAngle, smoothDamp } from './IInterpolator';
12
12
  export { TransformInterpolator, HermiteTransformInterpolator, createTransformInterpolator, createHermiteTransformInterpolator } from './TransformInterpolator';
13
13
  export type { IInputSnapshot, IPredictedState, IPredictor, ClientPredictionConfig } from './ClientPrediction';
14
14
  export { ClientPrediction, createClientPrediction } from './ClientPrediction';
15
+ export type { EntityDeltaState, DeltaSyncData, DeltaCompressionConfig } from './StateDelta';
16
+ export { DeltaFlags, StateDeltaCompressor, createStateDeltaCompressor } from './StateDelta';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,YAAY,EACR,cAAc,EACd,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,eAAe,EAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAMxE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EACH,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,kCAAkC,EACrC,MAAM,yBAAyB,CAAC;AAMjC,YAAY,EACR,cAAc,EACd,eAAe,EACf,UAAU,EACV,sBAAsB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,YAAY,EACR,cAAc,EACd,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,eAAe,EAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAMxE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EACH,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,kCAAkC,EACrC,MAAM,yBAAyB,CAAC;AAMjC,YAAY,EACR,cAAc,EACd,eAAe,EACf,UAAU,EACV,sBAAsB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAM9E,YAAY,EACR,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,UAAU,EACV,oBAAoB,EACpB,0BAA0B,EAC7B,MAAM,cAAc,CAAC"}
@@ -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"}