@esengine/network 2.2.0 → 3.0.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/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +298 -25
- package/dist/index.js.map +1 -1
- package/dist/sync/ComponentSync.d.ts +173 -0
- package/dist/sync/ComponentSync.d.ts.map +1 -0
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/package.json +12 -3
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,288 @@ function createStateDeltaCompressor(config) {
|
|
|
1036
1036
|
}
|
|
1037
1037
|
__name(createStateDeltaCompressor, "createStateDeltaCompressor");
|
|
1038
1038
|
|
|
1039
|
-
// src/
|
|
1039
|
+
// src/sync/ComponentSync.ts
|
|
1040
|
+
import {
|
|
1041
|
+
EntitySystem,
|
|
1042
|
+
Matcher,
|
|
1043
|
+
SyncOperation,
|
|
1044
|
+
CHANGE_TRACKER,
|
|
1045
|
+
encodeSnapshot,
|
|
1046
|
+
encodeSpawn,
|
|
1047
|
+
encodeDespawn,
|
|
1048
|
+
decodeSnapshot,
|
|
1049
|
+
decodeSpawn,
|
|
1050
|
+
processDespawn,
|
|
1051
|
+
GlobalComponentRegistry
|
|
1052
|
+
} from "@esengine/ecs-framework";
|
|
1040
1053
|
var DEFAULT_CONFIG2 = {
|
|
1054
|
+
enableDeltaSync: true,
|
|
1055
|
+
syncInterval: 50
|
|
1056
|
+
};
|
|
1057
|
+
var _ComponentSyncSystem = class _ComponentSyncSystem extends EntitySystem {
|
|
1058
|
+
constructor(config, isServer = false) {
|
|
1059
|
+
super(Matcher.all(NetworkIdentity));
|
|
1060
|
+
__publicField(this, "_config");
|
|
1061
|
+
__publicField(this, "_syncEntityMap", /* @__PURE__ */ new Map());
|
|
1062
|
+
__publicField(this, "_syncListeners", /* @__PURE__ */ new Set());
|
|
1063
|
+
__publicField(this, "_lastSyncTime", 0);
|
|
1064
|
+
__publicField(this, "_isServer", false);
|
|
1065
|
+
this._config = {
|
|
1066
|
+
...DEFAULT_CONFIG2,
|
|
1067
|
+
...config
|
|
1068
|
+
};
|
|
1069
|
+
this._isServer = isServer;
|
|
1070
|
+
}
|
|
1071
|
+
/**
|
|
1072
|
+
* @zh 设置是否为服务端模式
|
|
1073
|
+
* @en Set whether in server mode
|
|
1074
|
+
*/
|
|
1075
|
+
set isServer(value) {
|
|
1076
|
+
this._isServer = value;
|
|
1077
|
+
}
|
|
1078
|
+
/**
|
|
1079
|
+
* @zh 获取是否为服务端模式
|
|
1080
|
+
* @en Get whether in server mode
|
|
1081
|
+
*/
|
|
1082
|
+
get isServer() {
|
|
1083
|
+
return this._isServer;
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* @zh 获取配置
|
|
1087
|
+
* @en Get configuration
|
|
1088
|
+
*/
|
|
1089
|
+
get config() {
|
|
1090
|
+
return this._config;
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* @zh 添加同步事件监听器
|
|
1094
|
+
* @en Add sync event listener
|
|
1095
|
+
*/
|
|
1096
|
+
addSyncListener(listener) {
|
|
1097
|
+
this._syncListeners.add(listener);
|
|
1098
|
+
}
|
|
1099
|
+
/**
|
|
1100
|
+
* @zh 移除同步事件监听器
|
|
1101
|
+
* @en Remove sync event listener
|
|
1102
|
+
*/
|
|
1103
|
+
removeSyncListener(listener) {
|
|
1104
|
+
this._syncListeners.delete(listener);
|
|
1105
|
+
}
|
|
1106
|
+
/**
|
|
1107
|
+
* @zh 注册同步组件类型
|
|
1108
|
+
* @en Register sync component type
|
|
1109
|
+
*
|
|
1110
|
+
* @zh 客户端需要调用此方法注册所有需要同步的组件类型
|
|
1111
|
+
* @en Client needs to call this to register all component types to be synced
|
|
1112
|
+
*/
|
|
1113
|
+
registerComponent(componentClass) {
|
|
1114
|
+
GlobalComponentRegistry.register(componentClass);
|
|
1115
|
+
}
|
|
1116
|
+
// =========================================================================
|
|
1117
|
+
// Server-side: Encoding | 服务端:编码
|
|
1118
|
+
// =========================================================================
|
|
1119
|
+
/**
|
|
1120
|
+
* @zh 编码所有实体状态
|
|
1121
|
+
* @en Encode all entities state
|
|
1122
|
+
*
|
|
1123
|
+
* @param fullSync - @zh 是否完整同步(首次连接时使用)@en Whether to do full sync (for initial connection)
|
|
1124
|
+
* @returns @zh 编码后的二进制数据 @en Encoded binary data
|
|
1125
|
+
*/
|
|
1126
|
+
encodeAllEntities(fullSync = false) {
|
|
1127
|
+
const entities = this.getMatchingEntities();
|
|
1128
|
+
const operation = fullSync ? SyncOperation.FULL : SyncOperation.DELTA;
|
|
1129
|
+
const data = encodeSnapshot(entities, operation);
|
|
1130
|
+
if (!fullSync) {
|
|
1131
|
+
this._clearChangeTrackers(entities);
|
|
1132
|
+
}
|
|
1133
|
+
return data;
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* @zh 编码有变更的实体
|
|
1137
|
+
* @en Encode entities with changes
|
|
1138
|
+
*
|
|
1139
|
+
* @returns @zh 编码后的二进制数据,如果没有变更返回 null @en Encoded binary data, or null if no changes
|
|
1140
|
+
*/
|
|
1141
|
+
encodeDelta() {
|
|
1142
|
+
const entities = this.getMatchingEntities();
|
|
1143
|
+
const changedEntities = entities.filter((entity) => this._hasChanges(entity));
|
|
1144
|
+
if (changedEntities.length === 0) {
|
|
1145
|
+
return null;
|
|
1146
|
+
}
|
|
1147
|
+
const data = encodeSnapshot(changedEntities, SyncOperation.DELTA);
|
|
1148
|
+
this._clearChangeTrackers(changedEntities);
|
|
1149
|
+
return data;
|
|
1150
|
+
}
|
|
1151
|
+
/**
|
|
1152
|
+
* @zh 编码实体生成消息
|
|
1153
|
+
* @en Encode entity spawn message
|
|
1154
|
+
*/
|
|
1155
|
+
encodeSpawn(entity, prefabType) {
|
|
1156
|
+
return encodeSpawn(entity, prefabType);
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* @zh 编码实体销毁消息
|
|
1160
|
+
* @en Encode entity despawn message
|
|
1161
|
+
*/
|
|
1162
|
+
encodeDespawn(entityId) {
|
|
1163
|
+
return encodeDespawn(entityId);
|
|
1164
|
+
}
|
|
1165
|
+
// =========================================================================
|
|
1166
|
+
// Client-side: Decoding | 客户端:解码
|
|
1167
|
+
// =========================================================================
|
|
1168
|
+
/**
|
|
1169
|
+
* @zh 应用状态快照
|
|
1170
|
+
* @en Apply state snapshot
|
|
1171
|
+
*
|
|
1172
|
+
* @param data - @zh 二进制数据 @en Binary data
|
|
1173
|
+
* @returns @zh 解码结果 @en Decode result
|
|
1174
|
+
*/
|
|
1175
|
+
applySnapshot(data) {
|
|
1176
|
+
if (!this.scene) {
|
|
1177
|
+
throw new Error("ComponentSyncSystem not attached to a scene");
|
|
1178
|
+
}
|
|
1179
|
+
const result = decodeSnapshot(this.scene, data, this._syncEntityMap);
|
|
1180
|
+
for (const entityResult of result.entities) {
|
|
1181
|
+
if (entityResult.isNew) {
|
|
1182
|
+
this._emitEvent({
|
|
1183
|
+
type: "entitySpawned",
|
|
1184
|
+
entityId: entityResult.entityId
|
|
1185
|
+
});
|
|
1186
|
+
} else {
|
|
1187
|
+
this._emitEvent({
|
|
1188
|
+
type: "stateUpdated",
|
|
1189
|
+
entityId: entityResult.entityId
|
|
1190
|
+
});
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
return result;
|
|
1194
|
+
}
|
|
1195
|
+
/**
|
|
1196
|
+
* @zh 应用实体生成消息
|
|
1197
|
+
* @en Apply entity spawn message
|
|
1198
|
+
*
|
|
1199
|
+
* @param data - @zh 二进制数据 @en Binary data
|
|
1200
|
+
* @returns @zh 解码结果,如果不是 SPAWN 消息返回 null @en Decode result, or null if not a SPAWN message
|
|
1201
|
+
*/
|
|
1202
|
+
applySpawn(data) {
|
|
1203
|
+
if (!this.scene) {
|
|
1204
|
+
throw new Error("ComponentSyncSystem not attached to a scene");
|
|
1205
|
+
}
|
|
1206
|
+
const result = decodeSpawn(this.scene, data, this._syncEntityMap);
|
|
1207
|
+
if (result) {
|
|
1208
|
+
this._emitEvent({
|
|
1209
|
+
type: "entitySpawned",
|
|
1210
|
+
entityId: result.entity.id,
|
|
1211
|
+
prefabType: result.prefabType
|
|
1212
|
+
});
|
|
1213
|
+
}
|
|
1214
|
+
return result;
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* @zh 应用实体销毁消息
|
|
1218
|
+
* @en Apply entity despawn message
|
|
1219
|
+
*
|
|
1220
|
+
* @param data - @zh 二进制数据 @en Binary data
|
|
1221
|
+
* @returns @zh 销毁的实体 ID 列表 @en List of despawned entity IDs
|
|
1222
|
+
*/
|
|
1223
|
+
applyDespawn(data) {
|
|
1224
|
+
if (!this.scene) {
|
|
1225
|
+
throw new Error("ComponentSyncSystem not attached to a scene");
|
|
1226
|
+
}
|
|
1227
|
+
const entityIds = processDespawn(this.scene, data, this._syncEntityMap);
|
|
1228
|
+
for (const entityId of entityIds) {
|
|
1229
|
+
this._emitEvent({
|
|
1230
|
+
type: "entityDespawned",
|
|
1231
|
+
entityId
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
return entityIds;
|
|
1235
|
+
}
|
|
1236
|
+
// =========================================================================
|
|
1237
|
+
// Entity Management | 实体管理
|
|
1238
|
+
// =========================================================================
|
|
1239
|
+
/**
|
|
1240
|
+
* @zh 通过网络 ID 获取实体
|
|
1241
|
+
* @en Get entity by network ID
|
|
1242
|
+
*/
|
|
1243
|
+
getEntityById(entityId) {
|
|
1244
|
+
return this._syncEntityMap.get(entityId);
|
|
1245
|
+
}
|
|
1246
|
+
/**
|
|
1247
|
+
* @zh 获取所有匹配的实体
|
|
1248
|
+
* @en Get all matching entities
|
|
1249
|
+
*/
|
|
1250
|
+
getMatchingEntities() {
|
|
1251
|
+
return this.entities.slice();
|
|
1252
|
+
}
|
|
1253
|
+
// =========================================================================
|
|
1254
|
+
// Internal | 内部方法
|
|
1255
|
+
// =========================================================================
|
|
1256
|
+
process(entities) {
|
|
1257
|
+
if (this._isServer && this._config.enableDeltaSync) {
|
|
1258
|
+
const now = Date.now();
|
|
1259
|
+
if (now - this._lastSyncTime >= this._config.syncInterval) {
|
|
1260
|
+
this._lastSyncTime = now;
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
for (const entity of entities) {
|
|
1264
|
+
const identity = entity.getComponent(NetworkIdentity);
|
|
1265
|
+
if (identity) {
|
|
1266
|
+
this._syncEntityMap.set(entity.id, entity);
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
_hasChanges(entity) {
|
|
1271
|
+
for (const component of entity.components) {
|
|
1272
|
+
const tracker = component[CHANGE_TRACKER];
|
|
1273
|
+
if (tracker?.hasChanges()) {
|
|
1274
|
+
return true;
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
return false;
|
|
1278
|
+
}
|
|
1279
|
+
_clearChangeTrackers(entities) {
|
|
1280
|
+
for (const entity of entities) {
|
|
1281
|
+
for (const component of entity.components) {
|
|
1282
|
+
const tracker = component[CHANGE_TRACKER];
|
|
1283
|
+
if (tracker) {
|
|
1284
|
+
tracker.clear();
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
_emitEvent(event) {
|
|
1290
|
+
for (const listener of this._syncListeners) {
|
|
1291
|
+
try {
|
|
1292
|
+
listener(event);
|
|
1293
|
+
} catch (error) {
|
|
1294
|
+
console.error("ComponentSyncSystem: event listener error:", error);
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
onDestroy() {
|
|
1299
|
+
this._syncEntityMap.clear();
|
|
1300
|
+
this._syncListeners.clear();
|
|
1301
|
+
}
|
|
1302
|
+
};
|
|
1303
|
+
__name(_ComponentSyncSystem, "ComponentSyncSystem");
|
|
1304
|
+
var ComponentSyncSystem = _ComponentSyncSystem;
|
|
1305
|
+
function createComponentSyncSystem(config, isServer = false) {
|
|
1306
|
+
return new ComponentSyncSystem(config, isServer);
|
|
1307
|
+
}
|
|
1308
|
+
__name(createComponentSyncSystem, "createComponentSyncSystem");
|
|
1309
|
+
|
|
1310
|
+
// src/systems/NetworkSyncSystem.ts
|
|
1311
|
+
var DEFAULT_CONFIG3 = {
|
|
1041
1312
|
bufferSize: 30,
|
|
1042
1313
|
interpolationDelay: 100,
|
|
1043
1314
|
enableExtrapolation: true,
|
|
1044
1315
|
maxExtrapolationTime: 200,
|
|
1045
1316
|
useHermiteInterpolation: false
|
|
1046
1317
|
};
|
|
1047
|
-
var _NetworkSyncSystem = class _NetworkSyncSystem extends
|
|
1318
|
+
var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem2 {
|
|
1048
1319
|
constructor(config) {
|
|
1049
|
-
super(
|
|
1320
|
+
super(Matcher2.all(NetworkIdentity, NetworkTransform));
|
|
1050
1321
|
__publicField(this, "_netIdToEntity", /* @__PURE__ */ new Map());
|
|
1051
1322
|
__publicField(this, "_entitySnapshots", /* @__PURE__ */ new Map());
|
|
1052
1323
|
__publicField(this, "_interpolator");
|
|
@@ -1055,7 +1326,7 @@ var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem {
|
|
|
1055
1326
|
__publicField(this, "_lastSyncTime", 0);
|
|
1056
1327
|
__publicField(this, "_renderTime", 0);
|
|
1057
1328
|
this._config = {
|
|
1058
|
-
...
|
|
1329
|
+
...DEFAULT_CONFIG3,
|
|
1059
1330
|
...config
|
|
1060
1331
|
};
|
|
1061
1332
|
this._interpolator = createTransformInterpolator();
|
|
@@ -1242,10 +1513,10 @@ __name(_NetworkSyncSystem, "NetworkSyncSystem");
|
|
|
1242
1513
|
var NetworkSyncSystem = _NetworkSyncSystem;
|
|
1243
1514
|
|
|
1244
1515
|
// src/systems/NetworkSpawnSystem.ts
|
|
1245
|
-
import { EntitySystem as
|
|
1246
|
-
var _NetworkSpawnSystem = class _NetworkSpawnSystem extends
|
|
1516
|
+
import { EntitySystem as EntitySystem3, Matcher as Matcher3 } from "@esengine/ecs-framework";
|
|
1517
|
+
var _NetworkSpawnSystem = class _NetworkSpawnSystem extends EntitySystem3 {
|
|
1247
1518
|
constructor(syncSystem) {
|
|
1248
|
-
super(
|
|
1519
|
+
super(Matcher3.nothing());
|
|
1249
1520
|
__publicField(this, "_syncSystem");
|
|
1250
1521
|
__publicField(this, "_prefabFactories", /* @__PURE__ */ new Map());
|
|
1251
1522
|
__publicField(this, "_localPlayerId", 0);
|
|
@@ -1317,15 +1588,15 @@ __name(_NetworkSpawnSystem, "NetworkSpawnSystem");
|
|
|
1317
1588
|
var NetworkSpawnSystem = _NetworkSpawnSystem;
|
|
1318
1589
|
|
|
1319
1590
|
// src/systems/NetworkInputSystem.ts
|
|
1320
|
-
import { EntitySystem as
|
|
1321
|
-
var
|
|
1591
|
+
import { EntitySystem as EntitySystem4, Matcher as Matcher4 } from "@esengine/ecs-framework";
|
|
1592
|
+
var DEFAULT_CONFIG4 = {
|
|
1322
1593
|
sendInterval: 16,
|
|
1323
1594
|
mergeIdenticalInputs: true,
|
|
1324
1595
|
maxQueueLength: 10
|
|
1325
1596
|
};
|
|
1326
|
-
var _NetworkInputSystem = class _NetworkInputSystem extends
|
|
1597
|
+
var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem4 {
|
|
1327
1598
|
constructor(networkService, config) {
|
|
1328
|
-
super(
|
|
1599
|
+
super(Matcher4.nothing());
|
|
1329
1600
|
__publicField(this, "_networkService");
|
|
1330
1601
|
__publicField(this, "_config");
|
|
1331
1602
|
__publicField(this, "_predictionSystem", null);
|
|
@@ -1339,7 +1610,7 @@ var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem3 {
|
|
|
1339
1610
|
});
|
|
1340
1611
|
this._networkService = networkService;
|
|
1341
1612
|
this._config = {
|
|
1342
|
-
...
|
|
1613
|
+
...DEFAULT_CONFIG4,
|
|
1343
1614
|
...config
|
|
1344
1615
|
};
|
|
1345
1616
|
}
|
|
@@ -1509,8 +1780,8 @@ function createNetworkInputSystem(networkService, config) {
|
|
|
1509
1780
|
__name(createNetworkInputSystem, "createNetworkInputSystem");
|
|
1510
1781
|
|
|
1511
1782
|
// src/systems/NetworkPredictionSystem.ts
|
|
1512
|
-
import { EntitySystem as
|
|
1513
|
-
var
|
|
1783
|
+
import { EntitySystem as EntitySystem5, Matcher as Matcher5, Time as Time2 } from "@esengine/ecs-framework";
|
|
1784
|
+
var DEFAULT_CONFIG5 = {
|
|
1514
1785
|
moveSpeed: 200,
|
|
1515
1786
|
enabled: true,
|
|
1516
1787
|
maxUnacknowledgedInputs: 60,
|
|
@@ -1535,9 +1806,9 @@ var SimpleMovementPredictor = (_a = class {
|
|
|
1535
1806
|
};
|
|
1536
1807
|
}
|
|
1537
1808
|
}, __name(_a, "SimpleMovementPredictor"), _a);
|
|
1538
|
-
var _NetworkPredictionSystem = class _NetworkPredictionSystem extends
|
|
1809
|
+
var _NetworkPredictionSystem = class _NetworkPredictionSystem extends EntitySystem5 {
|
|
1539
1810
|
constructor(config) {
|
|
1540
|
-
super(
|
|
1811
|
+
super(Matcher5.all(NetworkIdentity, NetworkTransform));
|
|
1541
1812
|
__publicField(this, "_config");
|
|
1542
1813
|
__publicField(this, "_predictor");
|
|
1543
1814
|
__publicField(this, "_prediction", null);
|
|
@@ -1548,7 +1819,7 @@ var _NetworkPredictionSystem = class _NetworkPredictionSystem extends EntitySyst
|
|
|
1548
1819
|
});
|
|
1549
1820
|
__publicField(this, "_inputSequence", 0);
|
|
1550
1821
|
this._config = {
|
|
1551
|
-
...
|
|
1822
|
+
...DEFAULT_CONFIG5,
|
|
1552
1823
|
...config
|
|
1553
1824
|
};
|
|
1554
1825
|
this._predictor = new SimpleMovementPredictor(this._config.moveSpeed);
|
|
@@ -1704,15 +1975,15 @@ function createNetworkPredictionSystem(config) {
|
|
|
1704
1975
|
__name(createNetworkPredictionSystem, "createNetworkPredictionSystem");
|
|
1705
1976
|
|
|
1706
1977
|
// src/systems/NetworkAOISystem.ts
|
|
1707
|
-
import { EntitySystem as
|
|
1708
|
-
var
|
|
1978
|
+
import { EntitySystem as EntitySystem6, Matcher as Matcher6 } from "@esengine/ecs-framework";
|
|
1979
|
+
var DEFAULT_CONFIG6 = {
|
|
1709
1980
|
cellSize: 100,
|
|
1710
1981
|
defaultViewRange: 500,
|
|
1711
1982
|
enabled: true
|
|
1712
1983
|
};
|
|
1713
|
-
var _NetworkAOISystem = class _NetworkAOISystem extends
|
|
1984
|
+
var _NetworkAOISystem = class _NetworkAOISystem extends EntitySystem6 {
|
|
1714
1985
|
constructor(config) {
|
|
1715
|
-
super(
|
|
1986
|
+
super(Matcher6.all(NetworkIdentity, NetworkTransform));
|
|
1716
1987
|
__publicField(this, "_config");
|
|
1717
1988
|
__publicField(this, "_observers", /* @__PURE__ */ new Map());
|
|
1718
1989
|
__publicField(this, "_cells", /* @__PURE__ */ new Map());
|
|
@@ -1720,7 +1991,7 @@ var _NetworkAOISystem = class _NetworkAOISystem extends EntitySystem5 {
|
|
|
1720
1991
|
__publicField(this, "_entityNetIdMap", /* @__PURE__ */ new Map());
|
|
1721
1992
|
__publicField(this, "_netIdEntityMap", /* @__PURE__ */ new Map());
|
|
1722
1993
|
this._config = {
|
|
1723
|
-
...
|
|
1994
|
+
...DEFAULT_CONFIG6,
|
|
1724
1995
|
...config
|
|
1725
1996
|
};
|
|
1726
1997
|
}
|
|
@@ -2032,7 +2303,7 @@ function createNetworkAOISystem(config) {
|
|
|
2032
2303
|
__name(createNetworkAOISystem, "createNetworkAOISystem");
|
|
2033
2304
|
|
|
2034
2305
|
// src/NetworkPlugin.ts
|
|
2035
|
-
var
|
|
2306
|
+
var DEFAULT_CONFIG7 = {
|
|
2036
2307
|
enablePrediction: true,
|
|
2037
2308
|
enableAutoReconnect: true,
|
|
2038
2309
|
maxReconnectAttempts: 5,
|
|
@@ -2055,7 +2326,7 @@ var _NetworkPlugin = class _NetworkPlugin {
|
|
|
2055
2326
|
__publicField(this, "_reconnectTimer", null);
|
|
2056
2327
|
__publicField(this, "_lastConnectOptions", null);
|
|
2057
2328
|
this._config = {
|
|
2058
|
-
...
|
|
2329
|
+
...DEFAULT_CONFIG7,
|
|
2059
2330
|
...config
|
|
2060
2331
|
};
|
|
2061
2332
|
}
|
|
@@ -2684,6 +2955,7 @@ var NetworkNodeDefinitions = {
|
|
|
2684
2955
|
};
|
|
2685
2956
|
export {
|
|
2686
2957
|
ClientPrediction,
|
|
2958
|
+
ComponentSyncSystem,
|
|
2687
2959
|
DeltaFlags,
|
|
2688
2960
|
GameNetworkService,
|
|
2689
2961
|
GetLocalPlayerIdExecutor,
|
|
@@ -2719,6 +2991,7 @@ export {
|
|
|
2719
2991
|
StateDeltaCompressor,
|
|
2720
2992
|
TransformInterpolator,
|
|
2721
2993
|
createClientPrediction,
|
|
2994
|
+
createComponentSyncSystem,
|
|
2722
2995
|
createHermiteTransformInterpolator,
|
|
2723
2996
|
createNetworkAOISystem,
|
|
2724
2997
|
createNetworkInputSystem,
|