@lagless/core 0.0.33
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/README.md +970 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/di/di-container.d.ts +7 -0
- package/dist/lib/di/di-container.d.ts.map +1 -0
- package/dist/lib/di/di-container.js +25 -0
- package/dist/lib/di/di-container.js.map +1 -0
- package/dist/lib/di/di-decorators.d.ts +4 -0
- package/dist/lib/di/di-decorators.d.ts.map +1 -0
- package/dist/lib/di/di-decorators.js +96 -0
- package/dist/lib/di/di-decorators.js.map +1 -0
- package/dist/lib/di/index.d.ts +3 -0
- package/dist/lib/di/index.d.ts.map +1 -0
- package/dist/lib/di/index.js +4 -0
- package/dist/lib/di/index.js.map +1 -0
- package/dist/lib/ecs-config.d.ts +16 -0
- package/dist/lib/ecs-config.d.ts.map +1 -0
- package/dist/lib/ecs-config.js +28 -0
- package/dist/lib/ecs-config.js.map +1 -0
- package/dist/lib/ecs-runner.d.ts +20 -0
- package/dist/lib/ecs-runner.d.ts.map +1 -0
- package/dist/lib/ecs-runner.js +60 -0
- package/dist/lib/ecs-runner.js.map +1 -0
- package/dist/lib/ecs-simulation.d.ts +44 -0
- package/dist/lib/ecs-simulation.d.ts.map +1 -0
- package/dist/lib/ecs-simulation.js +138 -0
- package/dist/lib/ecs-simulation.js.map +1 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts +32 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts.map +1 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.js +49 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.js.map +1 -0
- package/dist/lib/hash-verification/create-hash-reporter.d.ts +16 -0
- package/dist/lib/hash-verification/create-hash-reporter.d.ts.map +1 -0
- package/dist/lib/hash-verification/create-hash-reporter.js +21 -0
- package/dist/lib/hash-verification/create-hash-reporter.js.map +1 -0
- package/dist/lib/hash-verification/divergence.signal.d.ts +11 -0
- package/dist/lib/hash-verification/divergence.signal.d.ts.map +1 -0
- package/dist/lib/hash-verification/divergence.signal.js +5 -0
- package/dist/lib/hash-verification/divergence.signal.js.map +1 -0
- package/dist/lib/hash-verification/index.d.ts +4 -0
- package/dist/lib/hash-verification/index.d.ts.map +1 -0
- package/dist/lib/hash-verification/index.js +5 -0
- package/dist/lib/hash-verification/index.js.map +1 -0
- package/dist/lib/input/abstract-input-provider.d.ts +61 -0
- package/dist/lib/input/abstract-input-provider.d.ts.map +1 -0
- package/dist/lib/input/abstract-input-provider.js +110 -0
- package/dist/lib/input/abstract-input-provider.js.map +1 -0
- package/dist/lib/input/index.d.ts +8 -0
- package/dist/lib/input/index.d.ts.map +1 -0
- package/dist/lib/input/index.js +9 -0
- package/dist/lib/input/index.js.map +1 -0
- package/dist/lib/input/input-provider-di-token.d.ts +6 -0
- package/dist/lib/input/input-provider-di-token.d.ts.map +1 -0
- package/dist/lib/input/input-provider-di-token.js +12 -0
- package/dist/lib/input/input-provider-di-token.js.map +1 -0
- package/dist/lib/input/input-registry.d.ts +8 -0
- package/dist/lib/input/input-registry.d.ts.map +1 -0
- package/dist/lib/input/input-registry.js +21 -0
- package/dist/lib/input/input-registry.js.map +1 -0
- package/dist/lib/input/local-input-provider.d.ts +6 -0
- package/dist/lib/input/local-input-provider.d.ts.map +1 -0
- package/dist/lib/input/local-input-provider.js +12 -0
- package/dist/lib/input/local-input-provider.js.map +1 -0
- package/dist/lib/input/replay-input-provider.d.ts +12 -0
- package/dist/lib/input/replay-input-provider.d.ts.map +1 -0
- package/dist/lib/input/replay-input-provider.js +46 -0
- package/dist/lib/input/replay-input-provider.js.map +1 -0
- package/dist/lib/input/rpc-history.d.ts +40 -0
- package/dist/lib/input/rpc-history.d.ts.map +1 -0
- package/dist/lib/input/rpc-history.js +308 -0
- package/dist/lib/input/rpc-history.js.map +1 -0
- package/dist/lib/input/rpc.d.ts +8 -0
- package/dist/lib/input/rpc.d.ts.map +1 -0
- package/dist/lib/input/rpc.js +9 -0
- package/dist/lib/input/rpc.js.map +1 -0
- package/dist/lib/mem/abstract-memory.interface.d.ts +6 -0
- package/dist/lib/mem/abstract-memory.interface.d.ts.map +1 -0
- package/dist/lib/mem/abstract-memory.interface.js +3 -0
- package/dist/lib/mem/abstract-memory.interface.js.map +1 -0
- package/dist/lib/mem/index.d.ts +5 -0
- package/dist/lib/mem/index.d.ts.map +1 -0
- package/dist/lib/mem/index.js +6 -0
- package/dist/lib/mem/index.js.map +1 -0
- package/dist/lib/mem/managers/components-manager.d.ts +15 -0
- package/dist/lib/mem/managers/components-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/components-manager.js +30 -0
- package/dist/lib/mem/managers/components-manager.js.map +1 -0
- package/dist/lib/mem/managers/entities-manager.d.ts +31 -0
- package/dist/lib/mem/managers/entities-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/entities-manager.js +106 -0
- package/dist/lib/mem/managers/entities-manager.js.map +1 -0
- package/dist/lib/mem/managers/filters-manager.d.ts +17 -0
- package/dist/lib/mem/managers/filters-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/filters-manager.js +46 -0
- package/dist/lib/mem/managers/filters-manager.js.map +1 -0
- package/dist/lib/mem/managers/player-resources-manager.d.ts +21 -0
- package/dist/lib/mem/managers/player-resources-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/player-resources-manager.js +52 -0
- package/dist/lib/mem/managers/player-resources-manager.js.map +1 -0
- package/dist/lib/mem/managers/prng-manager.d.ts +36 -0
- package/dist/lib/mem/managers/prng-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/prng-manager.js +126 -0
- package/dist/lib/mem/managers/prng-manager.js.map +1 -0
- package/dist/lib/mem/managers/singletons-manager.d.ts +13 -0
- package/dist/lib/mem/managers/singletons-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/singletons-manager.js +29 -0
- package/dist/lib/mem/managers/singletons-manager.js.map +1 -0
- package/dist/lib/mem/managers/tick-manager.d.ts +10 -0
- package/dist/lib/mem/managers/tick-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/tick-manager.js +18 -0
- package/dist/lib/mem/managers/tick-manager.js.map +1 -0
- package/dist/lib/mem/mem.d.ts +28 -0
- package/dist/lib/mem/mem.d.ts.map +1 -0
- package/dist/lib/mem/mem.js +63 -0
- package/dist/lib/mem/mem.js.map +1 -0
- package/dist/lib/prefab.d.ts +16 -0
- package/dist/lib/prefab.d.ts.map +1 -0
- package/dist/lib/prefab.js +17 -0
- package/dist/lib/prefab.js.map +1 -0
- package/dist/lib/signals/event-emitter.d.ts +9 -0
- package/dist/lib/signals/event-emitter.d.ts.map +1 -0
- package/dist/lib/signals/event-emitter.js +22 -0
- package/dist/lib/signals/event-emitter.js.map +1 -0
- package/dist/lib/signals/signal.d.ts +40 -0
- package/dist/lib/signals/signal.d.ts.map +1 -0
- package/dist/lib/signals/signal.js +133 -0
- package/dist/lib/signals/signal.js.map +1 -0
- package/dist/lib/signals/signals.registry.d.ts +9 -0
- package/dist/lib/signals/signals.registry.d.ts.map +1 -0
- package/dist/lib/signals/signals.registry.js +31 -0
- package/dist/lib/signals/signals.registry.js.map +1 -0
- package/dist/lib/types/abstract-filter.d.ts +16 -0
- package/dist/lib/types/abstract-filter.d.ts.map +1 -0
- package/dist/lib/types/abstract-filter.js +53 -0
- package/dist/lib/types/abstract-filter.js.map +1 -0
- package/dist/lib/types/ecs-types.d.ts +109 -0
- package/dist/lib/types/ecs-types.d.ts.map +1 -0
- package/dist/lib/types/ecs-types.js +3 -0
- package/dist/lib/types/ecs-types.js.map +1 -0
- package/dist/lib/types/index.d.ts +3 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +4 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// libs/core/src/lib/mem/mem.ts
|
|
2
|
+
import { ComponentsManager } from './managers/components-manager.js';
|
|
3
|
+
import { EntitiesManager } from './managers/entities-manager.js';
|
|
4
|
+
import { SingletonsManager } from './managers/singletons-manager.js';
|
|
5
|
+
import { FiltersManager } from './managers/filters-manager.js';
|
|
6
|
+
import { PlayerResourcesManager } from './managers/player-resources-manager.js';
|
|
7
|
+
import { TickManager } from './managers/tick-manager.js';
|
|
8
|
+
import { PRNGManager } from './managers/prng-manager.js';
|
|
9
|
+
import { MemoryTracker } from '@lagless/binary';
|
|
10
|
+
export class Mem {
|
|
11
|
+
exportSnapshot() {
|
|
12
|
+
return this._arrayBuffer.slice(0);
|
|
13
|
+
}
|
|
14
|
+
applySnapshot(arrayBuffer) {
|
|
15
|
+
if (arrayBuffer.byteLength !== this._arrayBuffer.byteLength) {
|
|
16
|
+
throw new Error('Snapshot size mismatch');
|
|
17
|
+
}
|
|
18
|
+
new Uint8Array(this._arrayBuffer).set(new Uint8Array(arrayBuffer));
|
|
19
|
+
}
|
|
20
|
+
calculateSize() {
|
|
21
|
+
const tracker = new MemoryTracker();
|
|
22
|
+
for (const memoryManager of this._memoryManagers){
|
|
23
|
+
memoryManager.calculateSize(tracker);
|
|
24
|
+
}
|
|
25
|
+
return tracker.ptr;
|
|
26
|
+
}
|
|
27
|
+
getHash() {
|
|
28
|
+
let hash = 0;
|
|
29
|
+
const dataView = new DataView(this._arrayBuffer);
|
|
30
|
+
for(let i = 0; i < this._arrayBuffer.byteLength; i++){
|
|
31
|
+
hash = hash * 31 + dataView.getUint8(i) >>> 0;
|
|
32
|
+
}
|
|
33
|
+
return hash;
|
|
34
|
+
}
|
|
35
|
+
constructor(_ECSConfig, _ECSDeps){
|
|
36
|
+
this._ECSConfig = _ECSConfig;
|
|
37
|
+
this._ECSDeps = _ECSDeps;
|
|
38
|
+
this.tickManager = new TickManager();
|
|
39
|
+
this.prngManager = new PRNGManager(this._ECSConfig);
|
|
40
|
+
this.componentsManager = new ComponentsManager(this._ECSConfig, this._ECSDeps);
|
|
41
|
+
this.singletonsManager = new SingletonsManager(this._ECSDeps);
|
|
42
|
+
this.filtersManager = new FiltersManager(this._ECSConfig, this._ECSDeps);
|
|
43
|
+
this.entitiesManager = new EntitiesManager(this._ECSConfig, this.componentsManager, this.filtersManager);
|
|
44
|
+
this.playerResourcesManager = new PlayerResourcesManager(this._ECSConfig, this._ECSDeps);
|
|
45
|
+
this._memoryManagers = [
|
|
46
|
+
this.tickManager,
|
|
47
|
+
this.prngManager,
|
|
48
|
+
this.componentsManager,
|
|
49
|
+
this.singletonsManager,
|
|
50
|
+
this.filtersManager,
|
|
51
|
+
this.entitiesManager,
|
|
52
|
+
this.playerResourcesManager
|
|
53
|
+
];
|
|
54
|
+
const arrayBufferSize = this.calculateSize();
|
|
55
|
+
this._arrayBuffer = new ArrayBuffer(arrayBufferSize);
|
|
56
|
+
const tracker = new MemoryTracker();
|
|
57
|
+
for (const memoryManager of this._memoryManagers){
|
|
58
|
+
memoryManager.init(this._arrayBuffer, tracker);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=mem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/mem/mem.ts"],"sourcesContent":["// libs/core/src/lib/mem/mem.ts\nimport { ECSDeps } from '../types/index.js';\nimport { ECSConfig } from '../ecs-config.js';\nimport { IAbstractMemory } from './abstract-memory.interface.js';\nimport { ComponentsManager } from './managers/components-manager.js';\nimport { EntitiesManager } from './managers/entities-manager.js';\nimport { SingletonsManager } from './managers/singletons-manager.js';\nimport { FiltersManager } from './managers/filters-manager.js';\nimport { PlayerResourcesManager } from './managers/player-resources-manager.js';\nimport { TickManager } from './managers/tick-manager.js';\nimport { PRNGManager } from './managers/prng-manager.js';\nimport { MemoryTracker } from '@lagless/binary';\n\nexport class Mem {\n public readonly tickManager: TickManager;\n public readonly prngManager: PRNGManager;\n public readonly componentsManager: ComponentsManager;\n public readonly singletonsManager: SingletonsManager;\n public readonly filtersManager: FiltersManager;\n public readonly entitiesManager: EntitiesManager;\n public readonly playerResourcesManager: PlayerResourcesManager;\n\n private readonly _arrayBuffer: ArrayBuffer;\n private readonly _memoryManagers: Array<IAbstractMemory>;\n\n constructor(private readonly _ECSConfig: ECSConfig, private readonly _ECSDeps: ECSDeps) {\n this.tickManager = new TickManager();\n this.prngManager = new PRNGManager(this._ECSConfig);\n this.componentsManager = new ComponentsManager(this._ECSConfig, this._ECSDeps);\n this.singletonsManager = new SingletonsManager(this._ECSDeps);\n this.filtersManager = new FiltersManager(this._ECSConfig, this._ECSDeps);\n this.entitiesManager = new EntitiesManager(this._ECSConfig, this.componentsManager, this.filtersManager);\n this.playerResourcesManager = new PlayerResourcesManager(this._ECSConfig, this._ECSDeps);\n\n this._memoryManagers = [\n this.tickManager,\n this.prngManager,\n this.componentsManager,\n this.singletonsManager,\n this.filtersManager,\n this.entitiesManager,\n this.playerResourcesManager,\n ];\n\n const arrayBufferSize = this.calculateSize();\n\n this._arrayBuffer = new ArrayBuffer(arrayBufferSize);\n\n const tracker = new MemoryTracker();\n\n for (const memoryManager of this._memoryManagers) {\n memoryManager.init(this._arrayBuffer, tracker);\n }\n }\n\n public exportSnapshot(): ArrayBuffer {\n return this._arrayBuffer.slice(0);\n }\n\n public applySnapshot(arrayBuffer: ArrayBuffer): void {\n if (arrayBuffer.byteLength !== this._arrayBuffer.byteLength) {\n throw new Error('Snapshot size mismatch');\n }\n\n new Uint8Array(this._arrayBuffer).set(new Uint8Array(arrayBuffer));\n }\n\n private calculateSize(): number {\n const tracker = new MemoryTracker();\n\n for (const memoryManager of this._memoryManagers) {\n memoryManager.calculateSize(tracker);\n }\n\n return tracker.ptr;\n }\n\n public getHash(): number {\n let hash = 0;\n const dataView = new DataView(this._arrayBuffer);\n for (let i = 0; i < this._arrayBuffer.byteLength; i++) {\n hash = (hash * 31 + dataView.getUint8(i)) >>> 0;\n }\n return hash;\n }\n}\n"],"names":["ComponentsManager","EntitiesManager","SingletonsManager","FiltersManager","PlayerResourcesManager","TickManager","PRNGManager","MemoryTracker","Mem","exportSnapshot","_arrayBuffer","slice","applySnapshot","arrayBuffer","byteLength","Error","Uint8Array","set","calculateSize","tracker","memoryManager","_memoryManagers","ptr","getHash","hash","dataView","DataView","i","getUint8","constructor","_ECSConfig","_ECSDeps","tickManager","prngManager","componentsManager","singletonsManager","filtersManager","entitiesManager","playerResourcesManager","arrayBufferSize","ArrayBuffer","init"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,+BAA+B;AAI/B,SAASA,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,sBAAsB,QAAQ,yCAAyC;AAChF,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,aAAa,QAAQ,kBAAkB;AAEhD,OAAO,MAAMC;IA0CJC,iBAA8B;QACnC,OAAO,IAAI,CAACC,YAAY,CAACC,KAAK,CAAC;IACjC;IAEOC,cAAcC,WAAwB,EAAQ;QACnD,IAAIA,YAAYC,UAAU,KAAK,IAAI,CAACJ,YAAY,CAACI,UAAU,EAAE;YAC3D,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIC,WAAW,IAAI,CAACN,YAAY,EAAEO,GAAG,CAAC,IAAID,WAAWH;IACvD;IAEQK,gBAAwB;QAC9B,MAAMC,UAAU,IAAIZ;QAEpB,KAAK,MAAMa,iBAAiB,IAAI,CAACC,eAAe,CAAE;YAChDD,cAAcF,aAAa,CAACC;QAC9B;QAEA,OAAOA,QAAQG,GAAG;IACpB;IAEOC,UAAkB;QACvB,IAAIC,OAAO;QACX,MAAMC,WAAW,IAAIC,SAAS,IAAI,CAAChB,YAAY;QAC/C,IAAK,IAAIiB,IAAI,GAAGA,IAAI,IAAI,CAACjB,YAAY,CAACI,UAAU,EAAEa,IAAK;YACrDH,OAAO,AAACA,OAAO,KAAKC,SAASG,QAAQ,CAACD,OAAQ;QAChD;QACA,OAAOH;IACT;IA3DAK,YAAY,AAAiBC,UAAqB,EAAE,AAAiBC,QAAiB,CAAE;aAA3DD,aAAAA;aAAwCC,WAAAA;QACnE,IAAI,CAACC,WAAW,GAAG,IAAI3B;QACvB,IAAI,CAAC4B,WAAW,GAAG,IAAI3B,YAAY,IAAI,CAACwB,UAAU;QAClD,IAAI,CAACI,iBAAiB,GAAG,IAAIlC,kBAAkB,IAAI,CAAC8B,UAAU,EAAE,IAAI,CAACC,QAAQ;QAC7E,IAAI,CAACI,iBAAiB,GAAG,IAAIjC,kBAAkB,IAAI,CAAC6B,QAAQ;QAC5D,IAAI,CAACK,cAAc,GAAG,IAAIjC,eAAe,IAAI,CAAC2B,UAAU,EAAE,IAAI,CAACC,QAAQ;QACvE,IAAI,CAACM,eAAe,GAAG,IAAIpC,gBAAgB,IAAI,CAAC6B,UAAU,EAAE,IAAI,CAACI,iBAAiB,EAAE,IAAI,CAACE,cAAc;QACvG,IAAI,CAACE,sBAAsB,GAAG,IAAIlC,uBAAuB,IAAI,CAAC0B,UAAU,EAAE,IAAI,CAACC,QAAQ;QAEvF,IAAI,CAACV,eAAe,GAAG;YACrB,IAAI,CAACW,WAAW;YAChB,IAAI,CAACC,WAAW;YAChB,IAAI,CAACC,iBAAiB;YACtB,IAAI,CAACC,iBAAiB;YACtB,IAAI,CAACC,cAAc;YACnB,IAAI,CAACC,eAAe;YACpB,IAAI,CAACC,sBAAsB;SAC5B;QAED,MAAMC,kBAAkB,IAAI,CAACrB,aAAa;QAE1C,IAAI,CAACR,YAAY,GAAG,IAAI8B,YAAYD;QAEpC,MAAMpB,UAAU,IAAIZ;QAEpB,KAAK,MAAMa,iBAAiB,IAAI,CAACC,eAAe,CAAE;YAChDD,cAAcqB,IAAI,CAAC,IAAI,CAAC/B,YAAY,EAAES;QACxC;IACF;AAgCF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TypedArrayConstructor } from '@lagless/binary';
|
|
2
|
+
import { IComponentConstructor } from './types/index.js';
|
|
3
|
+
type ComponentValues<TSchema extends Record<string, TypedArrayConstructor>> = {
|
|
4
|
+
[K in keyof TSchema]: number;
|
|
5
|
+
};
|
|
6
|
+
export declare class Prefab {
|
|
7
|
+
private readonly _data;
|
|
8
|
+
with<T extends IComponentConstructor>(Component: T, values?: Partial<ComponentValues<T['schema']>>): Prefab;
|
|
9
|
+
static create(): Prefab;
|
|
10
|
+
[Symbol.iterator](): IterableIterator<[
|
|
11
|
+
IComponentConstructor,
|
|
12
|
+
Partial<ComponentValues<IComponentConstructor['schema']>> | undefined
|
|
13
|
+
]>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=prefab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefab.d.ts","sourceRoot":"","sources":["../../src/lib/prefab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,KAAK,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI;KAC3E,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM;CAC7B,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2G;IAE1H,IAAI,CAAC,CAAC,SAAS,qBAAqB,EACzC,SAAS,EAAE,CAAC,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAC7C,MAAM;WAMK,MAAM,IAAI,MAAM;IAIvB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAC1C;QAAC,qBAAqB;QAAE,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS;KAAC,CAC/F;CAGF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class Prefab {
|
|
2
|
+
with(Component, values) {
|
|
3
|
+
this._data.set(Component, values);
|
|
4
|
+
return this;
|
|
5
|
+
}
|
|
6
|
+
static create() {
|
|
7
|
+
return new Prefab();
|
|
8
|
+
}
|
|
9
|
+
[Symbol.iterator]() {
|
|
10
|
+
return this._data.entries();
|
|
11
|
+
}
|
|
12
|
+
constructor(){
|
|
13
|
+
this._data = new Map();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=prefab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/prefab.ts"],"sourcesContent":["import { TypedArrayConstructor } from '@lagless/binary';\nimport { IComponentConstructor } from './types/index.js';\n\ntype ComponentValues<TSchema extends Record<string, TypedArrayConstructor>> = {\n [K in keyof TSchema]: number;\n};\n\nexport class Prefab {\n private readonly _data = new Map<IComponentConstructor, Partial<ComponentValues<IComponentConstructor['schema']>> | undefined>();\n\n public with<T extends IComponentConstructor>(\n Component: T,\n values?: Partial<ComponentValues<T['schema']>>,\n ): Prefab {\n this._data.set(Component, values as Partial<ComponentValues<IComponentConstructor['schema']>>);\n\n return this;\n }\n\n public static create(): Prefab {\n return new Prefab();\n }\n\n public [Symbol.iterator](): IterableIterator<\n [IComponentConstructor, Partial<ComponentValues<IComponentConstructor['schema']>> | undefined]\n > {\n return this._data.entries();\n }\n}\n"],"names":["Prefab","with","Component","values","_data","set","create","Symbol","iterator","entries","Map"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAOA,OAAO,MAAMA;IAGJC,KACLC,SAAY,EACZC,MAA8C,EACtC;QACR,IAAI,CAACC,KAAK,CAACC,GAAG,CAACH,WAAWC;QAE1B,OAAO,IAAI;IACb;IAEA,OAAcG,SAAiB;QAC7B,OAAO,IAAIN;IACb;IAEO,CAACO,OAAOC,QAAQ,CAAC,GAEtB;QACA,OAAO,IAAI,CAACJ,KAAK,CAACK,OAAO;IAC3B;;aAnBiBL,QAAQ,IAAIM;;AAoB/B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type Listener<T> = (event: T) => void;
|
|
2
|
+
export declare class EventEmitter<TEvent> {
|
|
3
|
+
private readonly _listeners;
|
|
4
|
+
subscribe(listener: Listener<TEvent>): () => void;
|
|
5
|
+
emit(event: TEvent): void;
|
|
6
|
+
clear(): void;
|
|
7
|
+
get hasListeners(): boolean;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../../src/lib/signals/event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAE7C,qBAAa,YAAY,CAAC,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAEnD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI;IAKjD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMzB,KAAK,IAAI,IAAI;IAIpB,IAAW,YAAY,IAAI,OAAO,CAEjC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class EventEmitter {
|
|
2
|
+
subscribe(listener) {
|
|
3
|
+
this._listeners.add(listener);
|
|
4
|
+
return ()=>this._listeners.delete(listener);
|
|
5
|
+
}
|
|
6
|
+
emit(event) {
|
|
7
|
+
for (const listener of this._listeners){
|
|
8
|
+
listener(event);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
clear() {
|
|
12
|
+
this._listeners.clear();
|
|
13
|
+
}
|
|
14
|
+
get hasListeners() {
|
|
15
|
+
return this._listeners.size > 0;
|
|
16
|
+
}
|
|
17
|
+
constructor(){
|
|
18
|
+
this._listeners = new Set();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=event-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/signals/event-emitter.ts"],"sourcesContent":["export type Listener<T> = (event: T) => void;\n\nexport class EventEmitter<TEvent> {\n private readonly _listeners = new Set<Listener<TEvent>>();\n\n public subscribe(listener: Listener<TEvent>): () => void {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n public emit(event: TEvent): void {\n for (const listener of this._listeners) {\n listener(event);\n }\n }\n\n public clear(): void {\n this._listeners.clear();\n }\n\n public get hasListeners(): boolean {\n return this._listeners.size > 0;\n }\n}\n"],"names":["EventEmitter","subscribe","listener","_listeners","add","delete","emit","event","clear","hasListeners","size","Set"],"rangeMappings":";;;;;;;;;;;;;;;;;;;","mappings":"AAEA,OAAO,MAAMA;IAGJC,UAAUC,QAA0B,EAAc;QACvD,IAAI,CAACC,UAAU,CAACC,GAAG,CAACF;QACpB,OAAO,IAAM,IAAI,CAACC,UAAU,CAACE,MAAM,CAACH;IACtC;IAEOI,KAAKC,KAAa,EAAQ;QAC/B,KAAK,MAAML,YAAY,IAAI,CAACC,UAAU,CAAE;YACtCD,SAASK;QACX;IACF;IAEOC,QAAc;QACnB,IAAI,CAACL,UAAU,CAACK,KAAK;IACvB;IAEA,IAAWC,eAAwB;QACjC,OAAO,IAAI,CAACN,UAAU,CAACO,IAAI,GAAG;IAChC;;aAnBiBP,aAAa,IAAIQ;;AAoBpC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { EventEmitter } from './event-emitter.js';
|
|
2
|
+
import { ECSConfig } from '../ecs-config.js';
|
|
3
|
+
export interface SignalEvent<TData> {
|
|
4
|
+
tick: number;
|
|
5
|
+
data: TData;
|
|
6
|
+
}
|
|
7
|
+
export interface ISignalConstructor {
|
|
8
|
+
new (...args: any[]): Signal<any>;
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class Signal<TData = unknown> {
|
|
11
|
+
protected readonly _ECSConfig: ECSConfig;
|
|
12
|
+
readonly Predicted: EventEmitter<SignalEvent<TData>>;
|
|
13
|
+
readonly Verified: EventEmitter<SignalEvent<TData>>;
|
|
14
|
+
readonly Cancelled: EventEmitter<SignalEvent<TData>>;
|
|
15
|
+
private readonly _pending;
|
|
16
|
+
private readonly _awaitingVerification;
|
|
17
|
+
private readonly _maxInputDelayTick;
|
|
18
|
+
constructor(_ECSConfig: ECSConfig);
|
|
19
|
+
emit(tick: number, data: TData): void;
|
|
20
|
+
/**
|
|
21
|
+
* Проверка Verified/Cancelled (вызывается каждый тик из SignalsRegistry)
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
_onTick(currentTick: number): void;
|
|
25
|
+
/**
|
|
26
|
+
* Перед rollback — очищаем pending для тиков которые будут пересимулированы
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
_onBeforeRollback(toTick: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Очистка данных для тика после verification
|
|
32
|
+
*/
|
|
33
|
+
private _cleanupTick;
|
|
34
|
+
/**
|
|
35
|
+
* Shallow comparison данных. Override для custom сравнения.
|
|
36
|
+
*/
|
|
37
|
+
protected _dataEquals(a: TData, b: TData): boolean;
|
|
38
|
+
dispose(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../../src/lib/signals/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,WAAW,WAAW,CAAC,KAAK;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IAEjC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;CACnC;AAED,8BACsB,MAAM,CAAC,KAAK,GAAG,OAAO;IAS9B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS;IARpD,SAAgB,SAAS,mCAA0C;IACnE,SAAgB,QAAQ,mCAA0C;IAClE,SAAgB,SAAS,mCAA0C;IAEnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA8B;IACpE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEb,UAAU,EAAE,SAAS;IAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;IA4B5C;;;OAGG;IACI,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAmCzC;;;OAGG;IACI,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAS9C;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,OAAO;IAoB3C,OAAO,IAAI,IAAI;CAOvB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { _ as _ts_decorate } from "@swc/helpers/_/_ts_decorate";
|
|
2
|
+
import { _ as _ts_metadata } from "@swc/helpers/_/_ts_metadata";
|
|
3
|
+
import { EventEmitter } from './event-emitter.js';
|
|
4
|
+
import { ECSConfig } from '../ecs-config.js';
|
|
5
|
+
import { ECSSignal } from '../di/index.js';
|
|
6
|
+
export class Signal {
|
|
7
|
+
emit(tick, data) {
|
|
8
|
+
// 1. Добавляем в pending (текущее состояние симуляции)
|
|
9
|
+
let pending = this._pending.get(tick);
|
|
10
|
+
if (!pending) {
|
|
11
|
+
pending = [];
|
|
12
|
+
this._pending.set(tick, pending);
|
|
13
|
+
}
|
|
14
|
+
pending.push(data);
|
|
15
|
+
// 2. Проверяем — уже был Predicted для такого tick+data?
|
|
16
|
+
// (случается при rollback + пересимуляции с теми же данными)
|
|
17
|
+
const awaiting = this._awaitingVerification.get(tick);
|
|
18
|
+
const alreadyPredicted = awaiting == null ? void 0 : awaiting.some((a)=>this._dataEquals(a, data));
|
|
19
|
+
if (!alreadyPredicted) {
|
|
20
|
+
// Первый раз видим это событие — Predicted
|
|
21
|
+
this.Predicted.emit({
|
|
22
|
+
tick,
|
|
23
|
+
data
|
|
24
|
+
});
|
|
25
|
+
// Добавляем в awaiting для будущей verification
|
|
26
|
+
let aw = this._awaitingVerification.get(tick);
|
|
27
|
+
if (!aw) {
|
|
28
|
+
aw = [];
|
|
29
|
+
this._awaitingVerification.set(tick, aw);
|
|
30
|
+
}
|
|
31
|
+
aw.push(data);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Проверка Verified/Cancelled (вызывается каждый тик из SignalsRegistry)
|
|
36
|
+
* @internal
|
|
37
|
+
*/ _onTick(currentTick) {
|
|
38
|
+
const verifyTick = currentTick - this._maxInputDelayTick;
|
|
39
|
+
if (verifyTick < 0) return;
|
|
40
|
+
const awaiting = this._awaitingVerification.get(verifyTick);
|
|
41
|
+
if (!awaiting || awaiting.length === 0) {
|
|
42
|
+
this._cleanupTick(verifyTick);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
var _this__pending_get;
|
|
46
|
+
const pending = (_this__pending_get = this._pending.get(verifyTick)) != null ? _this__pending_get : [];
|
|
47
|
+
const pendingMatched = new Array(pending.length).fill(false);
|
|
48
|
+
for (const awaitingData of awaiting){
|
|
49
|
+
// Ищем matching событие в pending
|
|
50
|
+
let matchIdx = -1;
|
|
51
|
+
for(let i = 0; i < pending.length; i++){
|
|
52
|
+
if (!pendingMatched[i] && this._dataEquals(pending[i], awaitingData)) {
|
|
53
|
+
matchIdx = i;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (matchIdx >= 0) {
|
|
58
|
+
pendingMatched[matchIdx] = true;
|
|
59
|
+
this.Verified.emit({
|
|
60
|
+
tick: verifyTick,
|
|
61
|
+
data: awaitingData
|
|
62
|
+
});
|
|
63
|
+
} else {
|
|
64
|
+
// Событие было Predicted, но нет в pending после rollback
|
|
65
|
+
this.Cancelled.emit({
|
|
66
|
+
tick: verifyTick,
|
|
67
|
+
data: awaitingData
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this._cleanupTick(verifyTick);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Перед rollback — очищаем pending для тиков которые будут пересимулированы
|
|
75
|
+
* @internal
|
|
76
|
+
*/ _onBeforeRollback(toTick) {
|
|
77
|
+
for (const tick of this._pending.keys()){
|
|
78
|
+
if (tick > toTick) {
|
|
79
|
+
this._pending.delete(tick);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// _awaitingVerification НЕ очищаем — проверим при verification
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Очистка данных для тика после verification
|
|
86
|
+
*/ _cleanupTick(tick) {
|
|
87
|
+
this._awaitingVerification.delete(tick);
|
|
88
|
+
this._pending.delete(tick);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Shallow comparison данных. Override для custom сравнения.
|
|
92
|
+
*/ _dataEquals(a, b) {
|
|
93
|
+
if (a === b) return true;
|
|
94
|
+
if (typeof a !== 'object' || typeof b !== 'object') return false;
|
|
95
|
+
if (a === null || b === null) return false;
|
|
96
|
+
const objA = a;
|
|
97
|
+
const objB = b;
|
|
98
|
+
const keysA = Object.keys(objA);
|
|
99
|
+
const keysB = Object.keys(objB);
|
|
100
|
+
if (keysA.length !== keysB.length) return false;
|
|
101
|
+
for (const key of keysA){
|
|
102
|
+
if (objA[key] !== objB[key]) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
dispose() {
|
|
109
|
+
this._pending.clear();
|
|
110
|
+
this._awaitingVerification.clear();
|
|
111
|
+
this.Predicted.clear();
|
|
112
|
+
this.Verified.clear();
|
|
113
|
+
this.Cancelled.clear();
|
|
114
|
+
}
|
|
115
|
+
constructor(_ECSConfig){
|
|
116
|
+
this._ECSConfig = _ECSConfig;
|
|
117
|
+
this.Predicted = new EventEmitter();
|
|
118
|
+
this.Verified = new EventEmitter();
|
|
119
|
+
this.Cancelled = new EventEmitter();
|
|
120
|
+
this._pending = new Map();
|
|
121
|
+
this._awaitingVerification = new Map();
|
|
122
|
+
this._maxInputDelayTick = _ECSConfig.maxInputDelayTick;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
Signal = _ts_decorate([
|
|
126
|
+
ECSSignal(),
|
|
127
|
+
_ts_metadata("design:type", Function),
|
|
128
|
+
_ts_metadata("design:paramtypes", [
|
|
129
|
+
typeof ECSConfig === "undefined" ? Object : ECSConfig
|
|
130
|
+
])
|
|
131
|
+
], Signal);
|
|
132
|
+
|
|
133
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/signals/signal.ts"],"sourcesContent":["import { EventEmitter } from './event-emitter.js';\nimport { ECSConfig } from '../ecs-config.js';\nimport { ECSSignal } from '../di/index.js';\n\nexport interface SignalEvent<TData> {\n tick: number;\n data: TData;\n}\n\nexport interface ISignalConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): Signal<any>;\n}\n\n@ECSSignal()\nexport abstract class Signal<TData = unknown> {\n public readonly Predicted = new EventEmitter<SignalEvent<TData>>();\n public readonly Verified = new EventEmitter<SignalEvent<TData>>();\n public readonly Cancelled = new EventEmitter<SignalEvent<TData>>();\n\n private readonly _pending = new Map<number, TData[]>();\n private readonly _awaitingVerification = new Map<number, TData[]>();\n private readonly _maxInputDelayTick: number;\n\n constructor(protected readonly _ECSConfig: ECSConfig) {\n this._maxInputDelayTick = _ECSConfig.maxInputDelayTick;\n }\n\n public emit(tick: number, data: TData): void {\n // 1. Добавляем в pending (текущее состояние симуляции)\n let pending = this._pending.get(tick);\n if (!pending) {\n pending = [];\n this._pending.set(tick, pending);\n }\n pending.push(data);\n\n // 2. Проверяем — уже был Predicted для такого tick+data?\n // (случается при rollback + пересимуляции с теми же данными)\n const awaiting = this._awaitingVerification.get(tick);\n const alreadyPredicted = awaiting?.some((a) => this._dataEquals(a, data));\n\n if (!alreadyPredicted) {\n // Первый раз видим это событие — Predicted\n this.Predicted.emit({ tick, data });\n\n // Добавляем в awaiting для будущей verification\n let aw = this._awaitingVerification.get(tick);\n if (!aw) {\n aw = [];\n this._awaitingVerification.set(tick, aw);\n }\n aw.push(data);\n }\n }\n\n /**\n * Проверка Verified/Cancelled (вызывается каждый тик из SignalsRegistry)\n * @internal\n */\n public _onTick(currentTick: number): void {\n const verifyTick = currentTick - this._maxInputDelayTick;\n if (verifyTick < 0) return;\n\n const awaiting = this._awaitingVerification.get(verifyTick);\n if (!awaiting || awaiting.length === 0) {\n this._cleanupTick(verifyTick);\n return;\n }\n\n const pending = this._pending.get(verifyTick) ?? [];\n const pendingMatched = new Array(pending.length).fill(false);\n\n for (const awaitingData of awaiting) {\n // Ищем matching событие в pending\n let matchIdx = -1;\n for (let i = 0; i < pending.length; i++) {\n if (!pendingMatched[i] && this._dataEquals(pending[i], awaitingData)) {\n matchIdx = i;\n break;\n }\n }\n\n if (matchIdx >= 0) {\n pendingMatched[matchIdx] = true;\n this.Verified.emit({ tick: verifyTick, data: awaitingData });\n } else {\n // Событие было Predicted, но нет в pending после rollback\n this.Cancelled.emit({ tick: verifyTick, data: awaitingData });\n }\n }\n\n this._cleanupTick(verifyTick);\n }\n\n /**\n * Перед rollback — очищаем pending для тиков которые будут пересимулированы\n * @internal\n */\n public _onBeforeRollback(toTick: number): void {\n for (const tick of this._pending.keys()) {\n if (tick > toTick) {\n this._pending.delete(tick);\n }\n }\n // _awaitingVerification НЕ очищаем — проверим при verification\n }\n\n /**\n * Очистка данных для тика после verification\n */\n private _cleanupTick(tick: number): void {\n this._awaitingVerification.delete(tick);\n this._pending.delete(tick);\n }\n\n /**\n * Shallow comparison данных. Override для custom сравнения.\n */\n protected _dataEquals(a: TData, b: TData): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n if (a === null || b === null) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n return true;\n }\n\n public dispose(): void {\n this._pending.clear();\n this._awaitingVerification.clear();\n this.Predicted.clear();\n this.Verified.clear();\n this.Cancelled.clear();\n }\n}\n"],"names":["EventEmitter","ECSConfig","ECSSignal","Signal","emit","tick","data","pending","_pending","get","set","push","awaiting","_awaitingVerification","alreadyPredicted","some","a","_dataEquals","Predicted","aw","_onTick","currentTick","verifyTick","_maxInputDelayTick","length","_cleanupTick","pendingMatched","Array","fill","awaitingData","matchIdx","i","Verified","Cancelled","_onBeforeRollback","toTick","keys","delete","b","objA","objB","keysA","Object","keysB","key","dispose","clear","constructor","_ECSConfig","Map","maxInputDelayTick"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Signal } from './signal.js';
|
|
2
|
+
export declare class SignalsRegistry {
|
|
3
|
+
private readonly _signals;
|
|
4
|
+
init(signals: Signal[]): void;
|
|
5
|
+
onTick(currentTick: number): void;
|
|
6
|
+
onBeforeRollback(toTick: number): void;
|
|
7
|
+
dispose(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=signals.registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.registry.d.ts","sourceRoot":"","sources":["../../../src/lib/signals/signals.registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAElC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAS7B,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMjC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMtC,OAAO,IAAI,IAAI;CAMvB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class SignalsRegistry {
|
|
2
|
+
init(signals) {
|
|
3
|
+
if (this._signals.length !== 0) {
|
|
4
|
+
throw new Error('Signals already registered');
|
|
5
|
+
}
|
|
6
|
+
for (const signal of signals){
|
|
7
|
+
this._signals.push(signal);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
onTick(currentTick) {
|
|
11
|
+
for (const signal of this._signals){
|
|
12
|
+
signal._onTick(currentTick);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
onBeforeRollback(toTick) {
|
|
16
|
+
for (const signal of this._signals){
|
|
17
|
+
signal._onBeforeRollback(toTick);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
dispose() {
|
|
21
|
+
for (const signal of this._signals){
|
|
22
|
+
signal.dispose();
|
|
23
|
+
}
|
|
24
|
+
this._signals.length = 0;
|
|
25
|
+
}
|
|
26
|
+
constructor(){
|
|
27
|
+
this._signals = [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=signals.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/signals/signals.registry.ts"],"sourcesContent":["import { Signal } from './signal.js';\n\nexport class SignalsRegistry {\n private readonly _signals: Signal[] = [];\n\n public init(signals: Signal[]): void {\n if (this._signals.length !== 0) {\n throw new Error('Signals already registered');\n }\n for (const signal of signals) {\n this._signals.push(signal);\n }\n }\n\n public onTick(currentTick: number): void {\n for (const signal of this._signals) {\n signal._onTick(currentTick);\n }\n }\n\n public onBeforeRollback(toTick: number): void {\n for (const signal of this._signals) {\n signal._onBeforeRollback(toTick);\n }\n }\n\n public dispose(): void {\n for (const signal of this._signals) {\n signal.dispose();\n }\n this._signals.length = 0;\n }\n}\n"],"names":["SignalsRegistry","init","signals","_signals","length","Error","signal","push","onTick","currentTick","_onTick","onBeforeRollback","toTick","_onBeforeRollback","dispose"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,OAAO,MAAMA;IAGJC,KAAKC,OAAiB,EAAQ;QACnC,IAAI,IAAI,CAACC,QAAQ,CAACC,MAAM,KAAK,GAAG;YAC9B,MAAM,IAAIC,MAAM;QAClB;QACA,KAAK,MAAMC,UAAUJ,QAAS;YAC5B,IAAI,CAACC,QAAQ,CAACI,IAAI,CAACD;QACrB;IACF;IAEOE,OAAOC,WAAmB,EAAQ;QACvC,KAAK,MAAMH,UAAU,IAAI,CAACH,QAAQ,CAAE;YAClCG,OAAOI,OAAO,CAACD;QACjB;IACF;IAEOE,iBAAiBC,MAAc,EAAQ;QAC5C,KAAK,MAAMN,UAAU,IAAI,CAACH,QAAQ,CAAE;YAClCG,OAAOO,iBAAiB,CAACD;QAC3B;IACF;IAEOE,UAAgB;QACrB,KAAK,MAAMR,UAAU,IAAI,CAACH,QAAQ,CAAE;YAClCG,OAAOQ,OAAO;QAChB;QACA,IAAI,CAACX,QAAQ,CAACC,MAAM,GAAG;IACzB;;aA5BiBD,WAAqB,EAAE;;AA6B1C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MemoryTracker } from '@lagless/binary';
|
|
2
|
+
export declare abstract class AbstractFilter {
|
|
3
|
+
private readonly _maxEntities;
|
|
4
|
+
abstract readonly includeMask: number;
|
|
5
|
+
abstract readonly excludeMask: number;
|
|
6
|
+
protected readonly _length: Uint32Array;
|
|
7
|
+
protected readonly _entities: Uint32Array;
|
|
8
|
+
constructor(_maxEntities: number, buffer: ArrayBuffer, memoryTracker: MemoryTracker);
|
|
9
|
+
static calculateSize(maxEntities: number, memoryTracker: MemoryTracker): void;
|
|
10
|
+
get length(): number;
|
|
11
|
+
protected set length(value: number);
|
|
12
|
+
addEntityToFilter(entity: number): void;
|
|
13
|
+
removeEntityFromFilter(entity: number): void;
|
|
14
|
+
[Symbol.iterator](): IterableIterator<number>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=abstract-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-filter.d.ts","sourceRoot":"","sources":["../../../src/lib/types/abstract-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,8BAAsB,cAAc;IAOtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IANzC,kBAAyB,WAAW,EAAE,MAAM,CAAC;IAC7C,kBAAyB,WAAW,EAAE,MAAM,CAAC;IAE7C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;gBAEb,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa;WAOtF,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa;IAK7E,IAAW,MAAM,IAIW,MAAM,CAFjC;IAED,SAAS,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,EAKjC;IAEM,iBAAiB,CAAC,MAAM,EAAE,MAAM;IAUhC,sBAAsB,CAAC,MAAM,EAAE,MAAM;IAoBpC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC;CAKtD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class AbstractFilter {
|
|
2
|
+
static calculateSize(maxEntities, memoryTracker) {
|
|
3
|
+
memoryTracker.add(Uint32Array.BYTES_PER_ELEMENT); // for length
|
|
4
|
+
memoryTracker.add(maxEntities * Uint32Array.BYTES_PER_ELEMENT);
|
|
5
|
+
}
|
|
6
|
+
get length() {
|
|
7
|
+
return this._length[0];
|
|
8
|
+
}
|
|
9
|
+
set length(value) {
|
|
10
|
+
if (value < 0 || value > this._entities.length) {
|
|
11
|
+
throw new Error('Invalid length value');
|
|
12
|
+
}
|
|
13
|
+
this._length[0] = value;
|
|
14
|
+
}
|
|
15
|
+
addEntityToFilter(entity) {
|
|
16
|
+
// Scan only the active portion [0..length)
|
|
17
|
+
for(let i = 0; i < this.length; i++){
|
|
18
|
+
if (this._entities[i] === entity) return; // Already in filter
|
|
19
|
+
}
|
|
20
|
+
this._entities[this.length] = entity;
|
|
21
|
+
this.length++;
|
|
22
|
+
}
|
|
23
|
+
removeEntityFromFilter(entity) {
|
|
24
|
+
// Scan only the active portion [0..length)
|
|
25
|
+
let entityIdx = -1;
|
|
26
|
+
for(let i = 0; i < this.length; i++){
|
|
27
|
+
if (this._entities[i] === entity) {
|
|
28
|
+
entityIdx = i;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (entityIdx === -1) return; // Not in filter
|
|
33
|
+
const lastIndex = this.length - 1;
|
|
34
|
+
if (entityIdx !== lastIndex) {
|
|
35
|
+
this._entities[entityIdx] = this._entities[lastIndex];
|
|
36
|
+
}
|
|
37
|
+
this.length--;
|
|
38
|
+
}
|
|
39
|
+
*[Symbol.iterator]() {
|
|
40
|
+
for(let i = 0; i < this.length; i++){
|
|
41
|
+
yield this._entities[i];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
constructor(_maxEntities, buffer, memoryTracker){
|
|
45
|
+
this._maxEntities = _maxEntities;
|
|
46
|
+
this._length = new Uint32Array(buffer, memoryTracker.ptr, 1);
|
|
47
|
+
memoryTracker.add(this._length.byteLength);
|
|
48
|
+
this._entities = new Uint32Array(buffer, memoryTracker.ptr, this._maxEntities);
|
|
49
|
+
memoryTracker.add(this._entities.byteLength);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=abstract-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/types/abstract-filter.ts"],"sourcesContent":["import { MemoryTracker } from '@lagless/binary';\n\nexport abstract class AbstractFilter {\n public readonly abstract includeMask: number;\n public readonly abstract excludeMask: number;\n\n protected readonly _length: Uint32Array;\n protected readonly _entities: Uint32Array;\n\n constructor(private readonly _maxEntities: number, buffer: ArrayBuffer, memoryTracker: MemoryTracker) {\n this._length = new Uint32Array(buffer, memoryTracker.ptr, 1);\n memoryTracker.add(this._length.byteLength);\n this._entities = new Uint32Array(buffer, memoryTracker.ptr, this._maxEntities);\n memoryTracker.add(this._entities.byteLength);\n }\n\n public static calculateSize(maxEntities: number, memoryTracker: MemoryTracker) {\n memoryTracker.add(Uint32Array.BYTES_PER_ELEMENT); // for length\n memoryTracker.add(maxEntities * Uint32Array.BYTES_PER_ELEMENT);\n }\n\n public get length() {\n return this._length[0];\n }\n\n protected set length(value: number) {\n if (value < 0 || value > this._entities.length) {\n throw new Error('Invalid length value');\n }\n this._length[0] = value;\n }\n\n public addEntityToFilter(entity: number) {\n // Scan only the active portion [0..length)\n for (let i = 0; i < this.length; i++) {\n if (this._entities[i] === entity) return; // Already in filter\n }\n\n this._entities[this.length] = entity;\n this.length++;\n }\n\n public removeEntityFromFilter(entity: number) {\n // Scan only the active portion [0..length)\n let entityIdx = -1;\n for (let i = 0; i < this.length; i++) {\n if (this._entities[i] === entity) {\n entityIdx = i;\n break;\n }\n }\n if (entityIdx === -1) return; // Not in filter\n\n const lastIndex = this.length - 1;\n\n if (entityIdx !== lastIndex) {\n this._entities[entityIdx] = this._entities[lastIndex];\n }\n\n this.length--;\n }\n\n public *[Symbol.iterator](): IterableIterator<number> {\n for (let i = 0; i < this.length; i++) {\n yield this._entities[i];\n }\n }\n}\n"],"names":["AbstractFilter","calculateSize","maxEntities","memoryTracker","add","Uint32Array","BYTES_PER_ELEMENT","length","_length","value","_entities","Error","addEntityToFilter","entity","i","removeEntityFromFilter","entityIdx","lastIndex","Symbol","iterator","constructor","_maxEntities","buffer","ptr","byteLength"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,OAAO,MAAeA;IAcpB,OAAcC,cAAcC,WAAmB,EAAEC,aAA4B,EAAE;QAC7EA,cAAcC,GAAG,CAACC,YAAYC,iBAAiB,GAAG,aAAa;QAC/DH,cAAcC,GAAG,CAACF,cAAcG,YAAYC,iBAAiB;IAC/D;IAEA,IAAWC,SAAS;QAClB,OAAO,IAAI,CAACC,OAAO,CAAC,EAAE;IACxB;IAEA,IAAcD,OAAOE,KAAa,EAAE;QAClC,IAAIA,QAAQ,KAAKA,QAAQ,IAAI,CAACC,SAAS,CAACH,MAAM,EAAE;YAC9C,MAAM,IAAII,MAAM;QAClB;QACA,IAAI,CAACH,OAAO,CAAC,EAAE,GAAGC;IACpB;IAEOG,kBAAkBC,MAAc,EAAE;QACvC,2CAA2C;QAC3C,IAAK,IAAIC,IAAI,GAAGA,IAAI,IAAI,CAACP,MAAM,EAAEO,IAAK;YACpC,IAAI,IAAI,CAACJ,SAAS,CAACI,EAAE,KAAKD,QAAQ,QAAQ,oBAAoB;QAChE;QAEA,IAAI,CAACH,SAAS,CAAC,IAAI,CAACH,MAAM,CAAC,GAAGM;QAC9B,IAAI,CAACN,MAAM;IACb;IAEOQ,uBAAuBF,MAAc,EAAE;QAC5C,2CAA2C;QAC3C,IAAIG,YAAY,CAAC;QACjB,IAAK,IAAIF,IAAI,GAAGA,IAAI,IAAI,CAACP,MAAM,EAAEO,IAAK;YACpC,IAAI,IAAI,CAACJ,SAAS,CAACI,EAAE,KAAKD,QAAQ;gBAChCG,YAAYF;gBACZ;YACF;QACF;QACA,IAAIE,cAAc,CAAC,GAAG,QAAQ,gBAAgB;QAE9C,MAAMC,YAAY,IAAI,CAACV,MAAM,GAAG;QAEhC,IAAIS,cAAcC,WAAW;YAC3B,IAAI,CAACP,SAAS,CAACM,UAAU,GAAG,IAAI,CAACN,SAAS,CAACO,UAAU;QACvD;QAEA,IAAI,CAACV,MAAM;IACb;IAEA,CAAQ,CAACW,OAAOC,QAAQ,CAAC,GAA6B;QACpD,IAAK,IAAIL,IAAI,GAAGA,IAAI,IAAI,CAACP,MAAM,EAAEO,IAAK;YACpC,MAAM,IAAI,CAACJ,SAAS,CAACI,EAAE;QACzB;IACF;IAzDAM,YAAY,AAAiBC,YAAoB,EAAEC,MAAmB,EAAEnB,aAA4B,CAAE;aAAzEkB,eAAAA;QAC3B,IAAI,CAACb,OAAO,GAAG,IAAIH,YAAYiB,QAAQnB,cAAcoB,GAAG,EAAE;QAC1DpB,cAAcC,GAAG,CAAC,IAAI,CAACI,OAAO,CAACgB,UAAU;QACzC,IAAI,CAACd,SAAS,GAAG,IAAIL,YAAYiB,QAAQnB,cAAcoB,GAAG,EAAE,IAAI,CAACF,YAAY;QAC7ElB,cAAcC,GAAG,CAAC,IAAI,CAACM,SAAS,CAACc,UAAU;IAC7C;AAqDF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { InputFieldDefinition, MemoryTracker, TypedArray, TypedArrayConstructor } from '@lagless/binary';
|
|
2
|
+
import { AbstractFilter } from './abstract-filter.js';
|
|
3
|
+
export interface FieldDefinition {
|
|
4
|
+
type: string;
|
|
5
|
+
isArray: boolean;
|
|
6
|
+
arrayLength?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ComponentDefinition {
|
|
9
|
+
name: string;
|
|
10
|
+
id: number;
|
|
11
|
+
fields: Record<string, FieldDefinition>;
|
|
12
|
+
}
|
|
13
|
+
export interface IComponentConstructor {
|
|
14
|
+
name: string;
|
|
15
|
+
ID: number;
|
|
16
|
+
schema: Record<string, TypedArrayConstructor>;
|
|
17
|
+
calculateSize(maxEntities: number, memTracker: MemoryTracker): void;
|
|
18
|
+
new (maxEntities: number, buffer: ArrayBuffer, memTracker: MemoryTracker): IComponentInstance;
|
|
19
|
+
}
|
|
20
|
+
export interface IComponentInstance {
|
|
21
|
+
unsafe: Record<string, TypedArray>;
|
|
22
|
+
}
|
|
23
|
+
export interface SingletonDefinition {
|
|
24
|
+
name: string;
|
|
25
|
+
fields: Record<string, FieldDefinition>;
|
|
26
|
+
}
|
|
27
|
+
export interface ISingletonConstructor {
|
|
28
|
+
name: string;
|
|
29
|
+
schema: Record<string, TypedArrayConstructor>;
|
|
30
|
+
calculateSize(memTracker: MemoryTracker): void;
|
|
31
|
+
new (buffer: ArrayBuffer, memTracker: MemoryTracker): ISingletonInstance;
|
|
32
|
+
}
|
|
33
|
+
export interface ISingletonInstance {
|
|
34
|
+
safe?: Record<string, number>;
|
|
35
|
+
unsafe: Record<string, TypedArray>;
|
|
36
|
+
}
|
|
37
|
+
export interface PlayerResourceDefinition {
|
|
38
|
+
name: string;
|
|
39
|
+
fields: Record<string, FieldDefinition>;
|
|
40
|
+
}
|
|
41
|
+
export interface IPlayerResourceConstructor {
|
|
42
|
+
name: string;
|
|
43
|
+
schema: Record<string, TypedArrayConstructor>;
|
|
44
|
+
calculateSize(memTracker: MemoryTracker): void;
|
|
45
|
+
new (buffer: ArrayBuffer, memTracker: MemoryTracker): ISingletonInstance;
|
|
46
|
+
}
|
|
47
|
+
export interface IPlayerResourceInstance {
|
|
48
|
+
unsafe: Record<string, TypedArray>;
|
|
49
|
+
}
|
|
50
|
+
export interface FilterDefinition {
|
|
51
|
+
name: string;
|
|
52
|
+
include: ComponentDefinition[];
|
|
53
|
+
exclude: ComponentDefinition[];
|
|
54
|
+
}
|
|
55
|
+
export interface IFilterConstructor {
|
|
56
|
+
name: string;
|
|
57
|
+
include: IComponentConstructor[];
|
|
58
|
+
exclude: IComponentConstructor[];
|
|
59
|
+
calculateSize(maxEntities: number, memTracker: MemoryTracker): void;
|
|
60
|
+
new (maxEntities: number, buffer: ArrayBuffer, memTracker: MemoryTracker): IFilterInstance;
|
|
61
|
+
}
|
|
62
|
+
export interface IFilterInstance extends AbstractFilter {
|
|
63
|
+
includeMask: number;
|
|
64
|
+
excludeMask: number;
|
|
65
|
+
[Symbol.iterator](): IterableIterator<number>;
|
|
66
|
+
}
|
|
67
|
+
export interface IInputDefinition {
|
|
68
|
+
name: string;
|
|
69
|
+
id: number;
|
|
70
|
+
fields: Array<InputFieldDefinition>;
|
|
71
|
+
}
|
|
72
|
+
export interface IAbstractInputConstructor {
|
|
73
|
+
readonly id: number;
|
|
74
|
+
new (): IAbstractInput;
|
|
75
|
+
}
|
|
76
|
+
export interface IAbstractInput {
|
|
77
|
+
readonly id: number;
|
|
78
|
+
readonly byteLength: number;
|
|
79
|
+
readonly fields: ReadonlyArray<InputFieldDefinition>;
|
|
80
|
+
readonly schema: Record<string, TypedArray | number>;
|
|
81
|
+
}
|
|
82
|
+
export type InputMeta = {
|
|
83
|
+
tick: number;
|
|
84
|
+
seq: number;
|
|
85
|
+
ordinal: number;
|
|
86
|
+
playerSlot: number;
|
|
87
|
+
};
|
|
88
|
+
export type InputData<TInput extends IAbstractInput> = TInput['schema'];
|
|
89
|
+
export interface IECSSystem {
|
|
90
|
+
update(tick: number): void;
|
|
91
|
+
}
|
|
92
|
+
export interface IECSSystemConstructor {
|
|
93
|
+
new (...args: any[]): IECSSystem;
|
|
94
|
+
}
|
|
95
|
+
export interface ECSSchema {
|
|
96
|
+
components: ComponentDefinition[];
|
|
97
|
+
singletons: SingletonDefinition[];
|
|
98
|
+
playerResources: PlayerResourceDefinition[];
|
|
99
|
+
filters: FilterDefinition[];
|
|
100
|
+
inputs: IInputDefinition[];
|
|
101
|
+
}
|
|
102
|
+
export interface ECSDeps {
|
|
103
|
+
components: IComponentConstructor[];
|
|
104
|
+
singletons: ISingletonConstructor[];
|
|
105
|
+
playerResources: IPlayerResourceConstructor[];
|
|
106
|
+
filters: IFilterConstructor[];
|
|
107
|
+
inputs: IAbstractInputConstructor[];
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ecs-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecs-types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/ecs-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/types/ecs-types.ts"],"sourcesContent":["import { InputFieldDefinition, MemoryTracker, TypedArray, TypedArrayConstructor } from '@lagless/binary';\nimport { AbstractFilter } from './abstract-filter.js';\n\nexport interface FieldDefinition {\n type: string;\n isArray: boolean;\n arrayLength?: number;\n}\n\nexport interface ComponentDefinition {\n name: string;\n id: number;\n fields: Record<string, FieldDefinition>;\n}\n\nexport interface IComponentConstructor {\n name: string;\n ID: number;\n schema: Record<string, TypedArrayConstructor>;\n\n calculateSize(maxEntities: number, memTracker: MemoryTracker): void;\n\n new (maxEntities: number, buffer: ArrayBuffer, memTracker: MemoryTracker): IComponentInstance;\n}\n\nexport interface IComponentInstance {\n unsafe: Record<string, TypedArray>;\n}\n\nexport interface SingletonDefinition {\n name: string;\n fields: Record<string, FieldDefinition>;\n}\n\nexport interface ISingletonConstructor {\n name: string;\n schema: Record<string, TypedArrayConstructor>;\n\n calculateSize(memTracker: MemoryTracker): void;\n\n new (buffer: ArrayBuffer, memTracker: MemoryTracker): ISingletonInstance;\n}\n\nexport interface ISingletonInstance {\n safe?: Record<string, number>;\n unsafe: Record<string, TypedArray>;\n}\n\nexport interface PlayerResourceDefinition {\n name: string;\n fields: Record<string, FieldDefinition>;\n}\n\nexport interface IPlayerResourceConstructor {\n name: string;\n schema: Record<string, TypedArrayConstructor>;\n\n calculateSize(memTracker: MemoryTracker): void;\n\n new (buffer: ArrayBuffer, memTracker: MemoryTracker): ISingletonInstance;\n}\n\nexport interface IPlayerResourceInstance {\n unsafe: Record<string, TypedArray>;\n}\n\nexport interface FilterDefinition {\n name: string;\n include: ComponentDefinition[];\n exclude: ComponentDefinition[];\n}\n\nexport interface IFilterConstructor {\n name: string;\n include: IComponentConstructor[];\n exclude: IComponentConstructor[];\n\n calculateSize(maxEntities: number, memTracker: MemoryTracker): void;\n\n new (maxEntities: number, buffer: ArrayBuffer, memTracker: MemoryTracker): IFilterInstance;\n}\n\nexport interface IFilterInstance extends AbstractFilter {\n includeMask: number;\n excludeMask: number;\n\n [Symbol.iterator](): IterableIterator<number>;\n}\n\nexport interface IInputDefinition {\n name: string;\n id: number;\n fields: Array<InputFieldDefinition>;\n}\n\nexport interface IAbstractInputConstructor {\n readonly id: number;\n\n new (): IAbstractInput;\n}\n\nexport interface IAbstractInput {\n readonly id: number;\n readonly byteLength: number;\n readonly fields: ReadonlyArray<InputFieldDefinition>;\n readonly schema: Record<string, TypedArray | number>;\n}\n\nexport type InputMeta = {\n tick: number;\n seq: number;\n ordinal: number;\n playerSlot: number;\n};\n\nexport type InputData<TInput extends IAbstractInput> = TInput['schema'];\n\nexport interface IECSSystem {\n update(tick: number): void;\n}\n\nexport interface IECSSystemConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): IECSSystem;\n}\n\nexport interface ECSSchema {\n components: ComponentDefinition[];\n singletons: SingletonDefinition[];\n playerResources: PlayerResourceDefinition[];\n filters: FilterDefinition[];\n inputs: IInputDefinition[];\n}\n\nexport interface ECSDeps {\n components: IComponentConstructor[];\n singletons: ISingletonConstructor[];\n playerResources: IPlayerResourceConstructor[];\n filters: IFilterConstructor[];\n inputs: IAbstractInputConstructor[];\n}\n"],"names":[],"rangeMappings":"","mappings":"AAsIA,WAMC"}
|