@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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +302 -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,292 @@ 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
|
+
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
|
|
1322
|
+
var _NetworkSyncSystem = class _NetworkSyncSystem extends EntitySystem2 {
|
|
1048
1323
|
constructor(config) {
|
|
1049
|
-
super(
|
|
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
|
-
...
|
|
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
|
|
1246
|
-
var _NetworkSpawnSystem = class _NetworkSpawnSystem extends
|
|
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(
|
|
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
|
|
1321
|
-
var
|
|
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
|
|
1601
|
+
var _NetworkInputSystem = class _NetworkInputSystem extends EntitySystem4 {
|
|
1327
1602
|
constructor(networkService, config) {
|
|
1328
|
-
super(
|
|
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
|
-
...
|
|
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
|
|
1513
|
-
var
|
|
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
|
|
1813
|
+
var _NetworkPredictionSystem = class _NetworkPredictionSystem extends EntitySystem5 {
|
|
1539
1814
|
constructor(config) {
|
|
1540
|
-
super(
|
|
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
|
-
...
|
|
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
|
|
1708
|
-
var
|
|
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
|
|
1988
|
+
var _NetworkAOISystem = class _NetworkAOISystem extends EntitySystem6 {
|
|
1714
1989
|
constructor(config) {
|
|
1715
|
-
super(
|
|
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
|
-
...
|
|
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
|
|
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
|
-
...
|
|
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,
|