@esengine/network 2.2.0 → 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.
package/dist/index.d.ts CHANGED
@@ -25,7 +25,7 @@ export type { NetworkPredictionConfig, MovementInput, PredictedTransform, } from
25
25
  export { NetworkAOISystem, createNetworkAOISystem, } from './systems/NetworkAOISystem';
26
26
  export type { NetworkAOIConfig, NetworkAOIEvent, NetworkAOIEventType, NetworkAOIEventListener, } from './systems/NetworkAOISystem';
27
27
  export type { IStateSnapshot, ITransformState, ITransformStateWithVelocity, ISnapshotBufferConfig, ISnapshotBuffer, } from './sync';
28
- export type { IInterpolator, IExtrapolator, IInputSnapshot, IPredictedState, IPredictor, ClientPredictionConfig, EntityDeltaState, DeltaSyncData, DeltaCompressionConfig, } from './sync';
29
- export { lerp, lerpAngle, smoothDamp, SnapshotBuffer, createSnapshotBuffer, TransformInterpolator, HermiteTransformInterpolator, createTransformInterpolator, createHermiteTransformInterpolator, ClientPrediction, createClientPrediction, DeltaFlags, StateDeltaCompressor, createStateDeltaCompressor, } from './sync';
28
+ export type { IInterpolator, IExtrapolator, IInputSnapshot, IPredictedState, IPredictor, ClientPredictionConfig, EntityDeltaState, DeltaSyncData, DeltaCompressionConfig, ComponentSyncEventType, ComponentSyncEvent, ComponentSyncEventListener, ComponentSyncConfig, } from './sync';
29
+ export { lerp, lerpAngle, smoothDamp, SnapshotBuffer, createSnapshotBuffer, TransformInterpolator, HermiteTransformInterpolator, createTransformInterpolator, createHermiteTransformInterpolator, ClientPrediction, createClientPrediction, DeltaFlags, StateDeltaCompressor, createStateDeltaCompressor, ComponentSyncSystem, createComponentSyncSystem, } from './sync';
30
30
  export { IsLocalPlayerTemplate, IsServerTemplate, HasAuthorityTemplate, GetNetworkIdTemplate, GetLocalPlayerIdTemplate, IsLocalPlayerExecutor, IsServerExecutor, HasAuthorityExecutor, GetNetworkIdExecutor, GetLocalPlayerIdExecutor, NetworkNodeDefinitions, } from './nodes';
31
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACnC,YAAY,EACR,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,GACX,MAAM,eAAe,CAAA;AAMtB,OAAO,EACH,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACzB,MAAM,YAAY,CAAA;AAMnB,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,GACxB,MAAM,UAAU,CAAA;AAMjB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAM/C,OAAO,EACH,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,oBAAoB,GACvB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAMtE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAMhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EACH,uBAAuB,EACvB,6BAA6B,GAChC,MAAM,mCAAmC,CAAA;AAC1C,YAAY,EACR,uBAAuB,EACvB,aAAa,EACb,kBAAkB,GACrB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EACH,gBAAgB,EAChB,sBAAsB,GACzB,MAAM,4BAA4B,CAAA;AACnC,YAAY,EACR,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GAC1B,MAAM,4BAA4B,CAAA;AAMnC,YAAY,EACR,cAAc,EACd,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,eAAe,GAClB,MAAM,QAAQ,CAAA;AAEf,YAAY,EACR,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,UAAU,EACV,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,sBAAsB,GACzB,MAAM,QAAQ,CAAA;AAEf,OAAO,EACH,IAAI,EACJ,SAAS,EACT,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,kCAAkC,EAClC,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,0BAA0B,GAC7B,MAAM,QAAQ,CAAA;AAMf,OAAO,EACH,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GACzB,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -230,7 +230,7 @@ function createNetworkService(protocol) {
230
230
  __name(createNetworkService, "createNetworkService");
231
231
 
232
232
  // src/systems/NetworkSyncSystem.ts
233
- import { EntitySystem, Matcher, Time } from "@esengine/ecs-framework";
233
+ import { EntitySystem as EntitySystem2, Matcher as Matcher2, Time } from "@esengine/ecs-framework";
234
234
 
235
235
  // src/components/NetworkIdentity.ts
236
236
  import { Component, ECSComponent, Serialize, Serializable, Property } from "@esengine/ecs-framework";
@@ -1036,17 +1036,292 @@ function createStateDeltaCompressor(config) {
1036
1036
  }
1037
1037
  __name(createStateDeltaCompressor, "createStateDeltaCompressor");
1038
1038
 
1039
- // src/systems/NetworkSyncSystem.ts
1039
+ // src/sync/ComponentSync.ts
1040
+ import {
1041
+ EntitySystem,
1042
+ Matcher,
1043
+ SyncOperation,
1044
+ SYNC_METADATA,
1045
+ CHANGE_TRACKER,
1046
+ encodeSnapshot,
1047
+ encodeSpawn,
1048
+ encodeDespawn,
1049
+ decodeSnapshot,
1050
+ decodeSpawn,
1051
+ processDespawn,
1052
+ registerSyncComponent
1053
+ } from "@esengine/ecs-framework";
1040
1054
  var DEFAULT_CONFIG2 = {
1055
+ enableDeltaSync: true,
1056
+ syncInterval: 50
1057
+ };
1058
+ var _ComponentSyncSystem = class _ComponentSyncSystem extends EntitySystem {
1059
+ constructor(config, isServer = false) {
1060
+ super(Matcher.all(NetworkIdentity));
1061
+ __publicField(this, "_config");
1062
+ __publicField(this, "_syncEntityMap", /* @__PURE__ */ new Map());
1063
+ __publicField(this, "_syncListeners", /* @__PURE__ */ new Set());
1064
+ __publicField(this, "_lastSyncTime", 0);
1065
+ __publicField(this, "_isServer", false);
1066
+ this._config = {
1067
+ ...DEFAULT_CONFIG2,
1068
+ ...config
1069
+ };
1070
+ this._isServer = isServer;
1071
+ }
1072
+ /**
1073
+ * @zh 设置是否为服务端模式
1074
+ * @en Set whether in server mode
1075
+ */
1076
+ set isServer(value) {
1077
+ this._isServer = value;
1078
+ }
1079
+ /**
1080
+ * @zh 获取是否为服务端模式
1081
+ * @en Get whether in server mode
1082
+ */
1083
+ get isServer() {
1084
+ return this._isServer;
1085
+ }
1086
+ /**
1087
+ * @zh 获取配置
1088
+ * @en Get configuration
1089
+ */
1090
+ get config() {
1091
+ return this._config;
1092
+ }
1093
+ /**
1094
+ * @zh 添加同步事件监听器
1095
+ * @en Add sync event listener
1096
+ */
1097
+ addSyncListener(listener) {
1098
+ this._syncListeners.add(listener);
1099
+ }
1100
+ /**
1101
+ * @zh 移除同步事件监听器
1102
+ * @en Remove sync event listener
1103
+ */
1104
+ removeSyncListener(listener) {
1105
+ this._syncListeners.delete(listener);
1106
+ }
1107
+ /**
1108
+ * @zh 注册同步组件类型
1109
+ * @en Register sync component type
1110
+ *
1111
+ * @zh 客户端需要调用此方法注册所有需要同步的组件类型
1112
+ * @en Client needs to call this to register all component types to be synced
1113
+ */
1114
+ registerComponent(componentClass) {
1115
+ const metadata = componentClass[SYNC_METADATA];
1116
+ if (metadata) {
1117
+ registerSyncComponent(metadata.typeId, componentClass);
1118
+ }
1119
+ }
1120
+ // =========================================================================
1121
+ // Server-side: Encoding | 服务端:编码
1122
+ // =========================================================================
1123
+ /**
1124
+ * @zh 编码所有实体状态
1125
+ * @en Encode all entities state
1126
+ *
1127
+ * @param fullSync - @zh 是否完整同步(首次连接时使用)@en Whether to do full sync (for initial connection)
1128
+ * @returns @zh 编码后的二进制数据 @en Encoded binary data
1129
+ */
1130
+ encodeAllEntities(fullSync = false) {
1131
+ const entities = this.getMatchingEntities();
1132
+ const operation = fullSync ? SyncOperation.FULL : SyncOperation.DELTA;
1133
+ const data = encodeSnapshot(entities, operation);
1134
+ if (!fullSync) {
1135
+ this._clearChangeTrackers(entities);
1136
+ }
1137
+ return data;
1138
+ }
1139
+ /**
1140
+ * @zh 编码有变更的实体
1141
+ * @en Encode entities with changes
1142
+ *
1143
+ * @returns @zh 编码后的二进制数据,如果没有变更返回 null @en Encoded binary data, or null if no changes
1144
+ */
1145
+ encodeDelta() {
1146
+ const entities = this.getMatchingEntities();
1147
+ const changedEntities = entities.filter((entity) => this._hasChanges(entity));
1148
+ if (changedEntities.length === 0) {
1149
+ return null;
1150
+ }
1151
+ const data = encodeSnapshot(changedEntities, SyncOperation.DELTA);
1152
+ this._clearChangeTrackers(changedEntities);
1153
+ return data;
1154
+ }
1155
+ /**
1156
+ * @zh 编码实体生成消息
1157
+ * @en Encode entity spawn message
1158
+ */
1159
+ encodeSpawn(entity, prefabType) {
1160
+ return encodeSpawn(entity, prefabType);
1161
+ }
1162
+ /**
1163
+ * @zh 编码实体销毁消息
1164
+ * @en Encode entity despawn message
1165
+ */
1166
+ encodeDespawn(entityId) {
1167
+ return encodeDespawn(entityId);
1168
+ }
1169
+ // =========================================================================
1170
+ // Client-side: Decoding | 客户端:解码
1171
+ // =========================================================================
1172
+ /**
1173
+ * @zh 应用状态快照
1174
+ * @en Apply state snapshot
1175
+ *
1176
+ * @param data - @zh 二进制数据 @en Binary data
1177
+ * @returns @zh 解码结果 @en Decode result
1178
+ */
1179
+ applySnapshot(data) {
1180
+ if (!this.scene) {
1181
+ throw new Error("ComponentSyncSystem not attached to a scene");
1182
+ }
1183
+ const result = decodeSnapshot(this.scene, data, this._syncEntityMap);
1184
+ for (const entityResult of result.entities) {
1185
+ if (entityResult.isNew) {
1186
+ this._emitEvent({
1187
+ type: "entitySpawned",
1188
+ entityId: entityResult.entityId
1189
+ });
1190
+ } else {
1191
+ this._emitEvent({
1192
+ type: "stateUpdated",
1193
+ entityId: entityResult.entityId
1194
+ });
1195
+ }
1196
+ }
1197
+ return result;
1198
+ }
1199
+ /**
1200
+ * @zh 应用实体生成消息
1201
+ * @en Apply entity spawn message
1202
+ *
1203
+ * @param data - @zh 二进制数据 @en Binary data
1204
+ * @returns @zh 解码结果,如果不是 SPAWN 消息返回 null @en Decode result, or null if not a SPAWN message
1205
+ */
1206
+ applySpawn(data) {
1207
+ if (!this.scene) {
1208
+ throw new Error("ComponentSyncSystem not attached to a scene");
1209
+ }
1210
+ const result = decodeSpawn(this.scene, data, this._syncEntityMap);
1211
+ if (result) {
1212
+ this._emitEvent({
1213
+ type: "entitySpawned",
1214
+ entityId: result.entity.id,
1215
+ prefabType: result.prefabType
1216
+ });
1217
+ }
1218
+ return result;
1219
+ }
1220
+ /**
1221
+ * @zh 应用实体销毁消息
1222
+ * @en Apply entity despawn message
1223
+ *
1224
+ * @param data - @zh 二进制数据 @en Binary data
1225
+ * @returns @zh 销毁的实体 ID 列表 @en List of despawned entity IDs
1226
+ */
1227
+ applyDespawn(data) {
1228
+ if (!this.scene) {
1229
+ throw new Error("ComponentSyncSystem not attached to a scene");
1230
+ }
1231
+ const entityIds = processDespawn(this.scene, data, this._syncEntityMap);
1232
+ for (const entityId of entityIds) {
1233
+ this._emitEvent({
1234
+ type: "entityDespawned",
1235
+ entityId
1236
+ });
1237
+ }
1238
+ return entityIds;
1239
+ }
1240
+ // =========================================================================
1241
+ // Entity Management | 实体管理
1242
+ // =========================================================================
1243
+ /**
1244
+ * @zh 通过网络 ID 获取实体
1245
+ * @en Get entity by network ID
1246
+ */
1247
+ getEntityById(entityId) {
1248
+ return this._syncEntityMap.get(entityId);
1249
+ }
1250
+ /**
1251
+ * @zh 获取所有匹配的实体
1252
+ * @en Get all matching entities
1253
+ */
1254
+ getMatchingEntities() {
1255
+ return this.entities.slice();
1256
+ }
1257
+ // =========================================================================
1258
+ // Internal | 内部方法
1259
+ // =========================================================================
1260
+ process(entities) {
1261
+ if (this._isServer && this._config.enableDeltaSync) {
1262
+ const now = Date.now();
1263
+ if (now - this._lastSyncTime >= this._config.syncInterval) {
1264
+ this._lastSyncTime = now;
1265
+ }
1266
+ }
1267
+ for (const entity of entities) {
1268
+ const identity = entity.getComponent(NetworkIdentity);
1269
+ if (identity) {
1270
+ this._syncEntityMap.set(entity.id, entity);
1271
+ }
1272
+ }
1273
+ }
1274
+ _hasChanges(entity) {
1275
+ for (const component of entity.components) {
1276
+ const tracker = component[CHANGE_TRACKER];
1277
+ if (tracker?.hasChanges()) {
1278
+ return true;
1279
+ }
1280
+ }
1281
+ return false;
1282
+ }
1283
+ _clearChangeTrackers(entities) {
1284
+ for (const entity of entities) {
1285
+ for (const component of entity.components) {
1286
+ const tracker = component[CHANGE_TRACKER];
1287
+ if (tracker) {
1288
+ tracker.clear();
1289
+ }
1290
+ }
1291
+ }
1292
+ }
1293
+ _emitEvent(event) {
1294
+ for (const listener of this._syncListeners) {
1295
+ try {
1296
+ listener(event);
1297
+ } catch (error) {
1298
+ console.error("ComponentSyncSystem: event listener error:", error);
1299
+ }
1300
+ }
1301
+ }
1302
+ onDestroy() {
1303
+ this._syncEntityMap.clear();
1304
+ this._syncListeners.clear();
1305
+ }
1306
+ };
1307
+ __name(_ComponentSyncSystem, "ComponentSyncSystem");
1308
+ var ComponentSyncSystem = _ComponentSyncSystem;
1309
+ function createComponentSyncSystem(config, isServer = false) {
1310
+ return new ComponentSyncSystem(config, isServer);
1311
+ }
1312
+ __name(createComponentSyncSystem, "createComponentSyncSystem");
1313
+
1314
+ // src/systems/NetworkSyncSystem.ts
1315
+ var DEFAULT_CONFIG3 = {
1041
1316
  bufferSize: 30,
1042
1317
  interpolationDelay: 100,
1043
1318
  enableExtrapolation: true,
1044
1319
  maxExtrapolationTime: 200,
1045
1320
  useHermiteInterpolation: false
1046
1321
  };
1047
- var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem {
1322
+ var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem2 {
1048
1323
  constructor(config) {
1049
- super(Matcher.all(NetworkIdentity, NetworkTransform));
1324
+ super(Matcher2.all(NetworkIdentity, NetworkTransform));
1050
1325
  __publicField(this, "_netIdToEntity", /* @__PURE__ */ new Map());
1051
1326
  __publicField(this, "_entitySnapshots", /* @__PURE__ */ new Map());
1052
1327
  __publicField(this, "_interpolator");
@@ -1055,7 +1330,7 @@ var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem {
1055
1330
  __publicField(this, "_lastSyncTime", 0);
1056
1331
  __publicField(this, "_renderTime", 0);
1057
1332
  this._config = {
1058
- ...DEFAULT_CONFIG2,
1333
+ ...DEFAULT_CONFIG3,
1059
1334
  ...config
1060
1335
  };
1061
1336
  this._interpolator = createTransformInterpolator();
@@ -1242,10 +1517,10 @@ __name(_NetworkSyncSystem, "NetworkSyncSystem");
1242
1517
  var NetworkSyncSystem = _NetworkSyncSystem;
1243
1518
 
1244
1519
  // src/systems/NetworkSpawnSystem.ts
1245
- import { EntitySystem as EntitySystem2, Matcher as Matcher2 } from "@esengine/ecs-framework";
1246
- var _NetworkSpawnSystem = class _NetworkSpawnSystem extends EntitySystem2 {
1520
+ import { EntitySystem as EntitySystem3, Matcher as Matcher3 } from "@esengine/ecs-framework";
1521
+ var _NetworkSpawnSystem = class _NetworkSpawnSystem extends EntitySystem3 {
1247
1522
  constructor(syncSystem) {
1248
- super(Matcher2.nothing());
1523
+ super(Matcher3.nothing());
1249
1524
  __publicField(this, "_syncSystem");
1250
1525
  __publicField(this, "_prefabFactories", /* @__PURE__ */ new Map());
1251
1526
  __publicField(this, "_localPlayerId", 0);
@@ -1317,15 +1592,15 @@ __name(_NetworkSpawnSystem, "NetworkSpawnSystem");
1317
1592
  var NetworkSpawnSystem = _NetworkSpawnSystem;
1318
1593
 
1319
1594
  // src/systems/NetworkInputSystem.ts
1320
- import { EntitySystem as EntitySystem3, Matcher as Matcher3 } from "@esengine/ecs-framework";
1321
- var DEFAULT_CONFIG3 = {
1595
+ import { EntitySystem as EntitySystem4, Matcher as Matcher4 } from "@esengine/ecs-framework";
1596
+ var DEFAULT_CONFIG4 = {
1322
1597
  sendInterval: 16,
1323
1598
  mergeIdenticalInputs: true,
1324
1599
  maxQueueLength: 10
1325
1600
  };
1326
- var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem3 {
1601
+ var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem4 {
1327
1602
  constructor(networkService, config) {
1328
- super(Matcher3.nothing());
1603
+ super(Matcher4.nothing());
1329
1604
  __publicField(this, "_networkService");
1330
1605
  __publicField(this, "_config");
1331
1606
  __publicField(this, "_predictionSystem", null);
@@ -1339,7 +1614,7 @@ var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem3 {
1339
1614
  });
1340
1615
  this._networkService = networkService;
1341
1616
  this._config = {
1342
- ...DEFAULT_CONFIG3,
1617
+ ...DEFAULT_CONFIG4,
1343
1618
  ...config
1344
1619
  };
1345
1620
  }
@@ -1509,8 +1784,8 @@ function createNetworkInputSystem(networkService, config) {
1509
1784
  __name(createNetworkInputSystem, "createNetworkInputSystem");
1510
1785
 
1511
1786
  // src/systems/NetworkPredictionSystem.ts
1512
- import { EntitySystem as EntitySystem4, Matcher as Matcher4, Time as Time2 } from "@esengine/ecs-framework";
1513
- var DEFAULT_CONFIG4 = {
1787
+ import { EntitySystem as EntitySystem5, Matcher as Matcher5, Time as Time2 } from "@esengine/ecs-framework";
1788
+ var DEFAULT_CONFIG5 = {
1514
1789
  moveSpeed: 200,
1515
1790
  enabled: true,
1516
1791
  maxUnacknowledgedInputs: 60,
@@ -1535,9 +1810,9 @@ var SimpleMovementPredictor = (_a = class {
1535
1810
  };
1536
1811
  }
1537
1812
  }, __name(_a, "SimpleMovementPredictor"), _a);
1538
- var _NetworkPredictionSystem = class _NetworkPredictionSystem extends EntitySystem4 {
1813
+ var _NetworkPredictionSystem = class _NetworkPredictionSystem extends EntitySystem5 {
1539
1814
  constructor(config) {
1540
- super(Matcher4.all(NetworkIdentity, NetworkTransform));
1815
+ super(Matcher5.all(NetworkIdentity, NetworkTransform));
1541
1816
  __publicField(this, "_config");
1542
1817
  __publicField(this, "_predictor");
1543
1818
  __publicField(this, "_prediction", null);
@@ -1548,7 +1823,7 @@ var _NetworkPredictionSystem = class _NetworkPredictionSystem extends EntitySyst
1548
1823
  });
1549
1824
  __publicField(this, "_inputSequence", 0);
1550
1825
  this._config = {
1551
- ...DEFAULT_CONFIG4,
1826
+ ...DEFAULT_CONFIG5,
1552
1827
  ...config
1553
1828
  };
1554
1829
  this._predictor = new SimpleMovementPredictor(this._config.moveSpeed);
@@ -1704,15 +1979,15 @@ function createNetworkPredictionSystem(config) {
1704
1979
  __name(createNetworkPredictionSystem, "createNetworkPredictionSystem");
1705
1980
 
1706
1981
  // src/systems/NetworkAOISystem.ts
1707
- import { EntitySystem as EntitySystem5, Matcher as Matcher5 } from "@esengine/ecs-framework";
1708
- var DEFAULT_CONFIG5 = {
1982
+ import { EntitySystem as EntitySystem6, Matcher as Matcher6 } from "@esengine/ecs-framework";
1983
+ var DEFAULT_CONFIG6 = {
1709
1984
  cellSize: 100,
1710
1985
  defaultViewRange: 500,
1711
1986
  enabled: true
1712
1987
  };
1713
- var _NetworkAOISystem = class _NetworkAOISystem extends EntitySystem5 {
1988
+ var _NetworkAOISystem = class _NetworkAOISystem extends EntitySystem6 {
1714
1989
  constructor(config) {
1715
- super(Matcher5.all(NetworkIdentity, NetworkTransform));
1990
+ super(Matcher6.all(NetworkIdentity, NetworkTransform));
1716
1991
  __publicField(this, "_config");
1717
1992
  __publicField(this, "_observers", /* @__PURE__ */ new Map());
1718
1993
  __publicField(this, "_cells", /* @__PURE__ */ new Map());
@@ -1720,7 +1995,7 @@ var _NetworkAOISystem = class _NetworkAOISystem extends EntitySystem5 {
1720
1995
  __publicField(this, "_entityNetIdMap", /* @__PURE__ */ new Map());
1721
1996
  __publicField(this, "_netIdEntityMap", /* @__PURE__ */ new Map());
1722
1997
  this._config = {
1723
- ...DEFAULT_CONFIG5,
1998
+ ...DEFAULT_CONFIG6,
1724
1999
  ...config
1725
2000
  };
1726
2001
  }
@@ -2032,7 +2307,7 @@ function createNetworkAOISystem(config) {
2032
2307
  __name(createNetworkAOISystem, "createNetworkAOISystem");
2033
2308
 
2034
2309
  // src/NetworkPlugin.ts
2035
- var DEFAULT_CONFIG6 = {
2310
+ var DEFAULT_CONFIG7 = {
2036
2311
  enablePrediction: true,
2037
2312
  enableAutoReconnect: true,
2038
2313
  maxReconnectAttempts: 5,
@@ -2055,7 +2330,7 @@ var _NetworkPlugin = class _NetworkPlugin {
2055
2330
  __publicField(this, "_reconnectTimer", null);
2056
2331
  __publicField(this, "_lastConnectOptions", null);
2057
2332
  this._config = {
2058
- ...DEFAULT_CONFIG6,
2333
+ ...DEFAULT_CONFIG7,
2059
2334
  ...config
2060
2335
  };
2061
2336
  }
@@ -2684,6 +2959,7 @@ var NetworkNodeDefinitions = {
2684
2959
  };
2685
2960
  export {
2686
2961
  ClientPrediction,
2962
+ ComponentSyncSystem,
2687
2963
  DeltaFlags,
2688
2964
  GameNetworkService,
2689
2965
  GetLocalPlayerIdExecutor,
@@ -2719,6 +2995,7 @@ export {
2719
2995
  StateDeltaCompressor,
2720
2996
  TransformInterpolator,
2721
2997
  createClientPrediction,
2998
+ createComponentSyncSystem,
2722
2999
  createHermiteTransformInterpolator,
2723
3000
  createNetworkAOISystem,
2724
3001
  createNetworkInputSystem,