@dcl/ecs 7.3.15-6201184205.commit-767716e → 7.3.15-6201308535.commit-dd17bb7
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/components/generated/AvatarBase.gen.d.ts +1 -0
- package/dist/components/generated/AvatarBase.gen.js +25 -0
- package/dist/components/generated/AvatarEmoteCommand.gen.d.ts +1 -0
- package/dist/components/generated/AvatarEmoteCommand.gen.js +25 -0
- package/dist/components/generated/AvatarEquippedData.gen.d.ts +1 -0
- package/dist/components/generated/AvatarEquippedData.gen.js +25 -0
- package/dist/components/generated/PlayerIdentityData.gen.d.ts +1 -0
- package/dist/components/generated/PlayerIdentityData.gen.js +25 -0
- package/dist/components/generated/component-names.gen.js +4 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_base.gen.d.ts +20 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_base.gen.js +78 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.d.ts +32 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.js +88 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.d.ts +20 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.js +50 -0
- package/dist/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.d.ts +21 -0
- package/dist/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.js +50 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.js +6 -0
- package/dist/components/manual/SyncComponents.d.ts +9 -0
- package/dist/components/manual/SyncComponents.js +8 -0
- package/dist/components/types.d.ts +1 -0
- package/dist/engine/component.d.ts +1 -1
- package/dist/engine/entity.d.ts +20 -1
- package/dist/engine/entity.js +48 -11
- package/dist/engine/grow-only-value-set-component-definition.js +3 -1
- package/dist/engine/index.js +19 -2
- package/dist/engine/lww-element-set-component-definition.d.ts +1 -1
- package/dist/engine/lww-element-set-component-definition.js +8 -1
- package/dist/engine/types.d.ts +13 -2
- package/dist/index.d.ts +7 -1
- package/dist/index.js +6 -0
- package/dist/systems/crdt/index.js +3 -1
- package/dist-cjs/components/generated/AvatarBase.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AvatarBase.gen.js +28 -0
- package/dist-cjs/components/generated/AvatarEmoteCommand.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AvatarEmoteCommand.gen.js +28 -0
- package/dist-cjs/components/generated/AvatarEquippedData.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AvatarEquippedData.gen.js +28 -0
- package/dist-cjs/components/generated/PlayerIdentityData.gen.d.ts +1 -0
- package/dist-cjs/components/generated/PlayerIdentityData.gen.js +28 -0
- package/dist-cjs/components/generated/component-names.gen.js +4 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_base.gen.d.ts +20 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_base.gen.js +84 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.d.ts +32 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.js +94 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.d.ts +20 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.js +56 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.d.ts +21 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.js +56 -0
- package/dist-cjs/components/index.d.ts +5 -0
- package/dist-cjs/components/index.js +8 -1
- package/dist-cjs/components/manual/SyncComponents.d.ts +9 -0
- package/dist-cjs/components/manual/SyncComponents.js +10 -0
- package/dist-cjs/components/types.d.ts +1 -0
- package/dist-cjs/engine/component.d.ts +1 -1
- package/dist-cjs/engine/entity.d.ts +20 -1
- package/dist-cjs/engine/entity.js +49 -12
- package/dist-cjs/engine/grow-only-value-set-component-definition.js +3 -1
- package/dist-cjs/engine/index.js +19 -2
- package/dist-cjs/engine/lww-element-set-component-definition.d.ts +1 -1
- package/dist-cjs/engine/lww-element-set-component-definition.js +8 -1
- package/dist-cjs/engine/types.d.ts +13 -2
- package/dist-cjs/index.d.ts +7 -1
- package/dist-cjs/index.js +7 -1
- package/dist-cjs/systems/crdt/index.js +3 -1
- package/package.json +2 -2
package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import _m0 from "protobufjs/minimal";
|
|
2
|
+
/**
|
|
3
|
+
* AvatarEquipData is used to read the information about the avatar's owneables.
|
|
4
|
+
* this component is written by the engine using the communications transports'
|
|
5
|
+
* data.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export interface PBAvatarEquippedData {
|
|
11
|
+
wearableUrns: string[];
|
|
12
|
+
emotesUrns: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export declare namespace PBAvatarEquippedData {
|
|
18
|
+
function encode(message: PBAvatarEquippedData, writer?: _m0.Writer): _m0.Writer;
|
|
19
|
+
function decode(input: _m0.Reader | Uint8Array, length?: number): PBAvatarEquippedData;
|
|
20
|
+
}
|
package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PBAvatarEquippedData = void 0;
|
|
7
|
+
/* eslint-disable */
|
|
8
|
+
const minimal_1 = __importDefault(require("protobufjs/minimal"));
|
|
9
|
+
const protobufPackageSarasa = "decentraland.sdk.components";
|
|
10
|
+
function createBasePBAvatarEquippedData() {
|
|
11
|
+
return { wearableUrns: [], emotesUrns: [] };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
var PBAvatarEquippedData;
|
|
17
|
+
(function (PBAvatarEquippedData) {
|
|
18
|
+
function encode(message, writer = minimal_1.default.Writer.create()) {
|
|
19
|
+
for (const v of message.wearableUrns) {
|
|
20
|
+
writer.uint32(10).string(v);
|
|
21
|
+
}
|
|
22
|
+
for (const v of message.emotesUrns) {
|
|
23
|
+
writer.uint32(18).string(v);
|
|
24
|
+
}
|
|
25
|
+
return writer;
|
|
26
|
+
}
|
|
27
|
+
PBAvatarEquippedData.encode = encode;
|
|
28
|
+
function decode(input, length) {
|
|
29
|
+
const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
|
|
30
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
|
31
|
+
const message = createBasePBAvatarEquippedData();
|
|
32
|
+
while (reader.pos < end) {
|
|
33
|
+
const tag = reader.uint32();
|
|
34
|
+
switch (tag >>> 3) {
|
|
35
|
+
case 1:
|
|
36
|
+
if (tag !== 10) {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
message.wearableUrns.push(reader.string());
|
|
40
|
+
continue;
|
|
41
|
+
case 2:
|
|
42
|
+
if (tag !== 18) {
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
message.emotesUrns.push(reader.string());
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if ((tag & 7) === 4 || tag === 0) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
reader.skipType(tag & 7);
|
|
52
|
+
}
|
|
53
|
+
return message;
|
|
54
|
+
}
|
|
55
|
+
PBAvatarEquippedData.decode = decode;
|
|
56
|
+
})(PBAvatarEquippedData = exports.PBAvatarEquippedData || (exports.PBAvatarEquippedData = {}));
|
package/dist-cjs/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import _m0 from "protobufjs/minimal";
|
|
2
|
+
/**
|
|
3
|
+
* PlayerIdentityData is used to read the information about the avatar's
|
|
4
|
+
* identity. this component is written by the engine using the communications
|
|
5
|
+
* transports' data.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export interface PBPlayerIdentityData {
|
|
11
|
+
/** ethereum address of this player */
|
|
12
|
+
address: string;
|
|
13
|
+
isGuest: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
export declare namespace PBPlayerIdentityData {
|
|
19
|
+
function encode(message: PBPlayerIdentityData, writer?: _m0.Writer): _m0.Writer;
|
|
20
|
+
function decode(input: _m0.Reader | Uint8Array, length?: number): PBPlayerIdentityData;
|
|
21
|
+
}
|
package/dist-cjs/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PBPlayerIdentityData = void 0;
|
|
7
|
+
/* eslint-disable */
|
|
8
|
+
const minimal_1 = __importDefault(require("protobufjs/minimal"));
|
|
9
|
+
const protobufPackageSarasa = "decentraland.sdk.components";
|
|
10
|
+
function createBasePBPlayerIdentityData() {
|
|
11
|
+
return { address: "", isGuest: false };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
var PBPlayerIdentityData;
|
|
17
|
+
(function (PBPlayerIdentityData) {
|
|
18
|
+
function encode(message, writer = minimal_1.default.Writer.create()) {
|
|
19
|
+
if (message.address !== "") {
|
|
20
|
+
writer.uint32(10).string(message.address);
|
|
21
|
+
}
|
|
22
|
+
if (message.isGuest === true) {
|
|
23
|
+
writer.uint32(24).bool(message.isGuest);
|
|
24
|
+
}
|
|
25
|
+
return writer;
|
|
26
|
+
}
|
|
27
|
+
PBPlayerIdentityData.encode = encode;
|
|
28
|
+
function decode(input, length) {
|
|
29
|
+
const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
|
|
30
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
|
31
|
+
const message = createBasePBPlayerIdentityData();
|
|
32
|
+
while (reader.pos < end) {
|
|
33
|
+
const tag = reader.uint32();
|
|
34
|
+
switch (tag >>> 3) {
|
|
35
|
+
case 1:
|
|
36
|
+
if (tag !== 10) {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
message.address = reader.string();
|
|
40
|
+
continue;
|
|
41
|
+
case 3:
|
|
42
|
+
if (tag !== 24) {
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
message.isGuest = reader.bool();
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if ((tag & 7) === 4 || tag === 0) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
reader.skipType(tag & 7);
|
|
52
|
+
}
|
|
53
|
+
return message;
|
|
54
|
+
}
|
|
55
|
+
PBPlayerIdentityData.decode = decode;
|
|
56
|
+
})(PBPlayerIdentityData = exports.PBPlayerIdentityData || (exports.PBPlayerIdentityData = {}));
|
|
@@ -6,6 +6,7 @@ import { MeshColliderComponentDefinitionExtended } from './extended/MeshCollider
|
|
|
6
6
|
import { MeshRendererComponentDefinitionExtended } from './extended/MeshRenderer';
|
|
7
7
|
import { LwwComponentGetter, GSetComponentGetter } from './generated/index.gen';
|
|
8
8
|
import { NameType } from './manual/Name';
|
|
9
|
+
import { ISyncComponentsType } from './manual/SyncComponents';
|
|
9
10
|
import { TransformComponentExtended } from './manual/Transform';
|
|
10
11
|
export * from './generated/index.gen';
|
|
11
12
|
export type { GrowOnlyValueSetComponentDefinition, LastWriteWinElementSetComponentDefinition, LwwComponentGetter, GSetComponentGetter };
|
|
@@ -18,3 +19,7 @@ export declare const MeshCollider: LwwComponentGetter<MeshColliderComponentDefin
|
|
|
18
19
|
* @alpha
|
|
19
20
|
*/
|
|
20
21
|
export declare const Name: (engine: Pick<IEngine, 'defineComponent'>) => LastWriteWinElementSetComponentDefinition<NameType>;
|
|
22
|
+
/**
|
|
23
|
+
* @alpha
|
|
24
|
+
*/
|
|
25
|
+
export declare const SyncComponents: (engine: Pick<IEngine, 'defineComponent'>) => LastWriteWinElementSetComponentDefinition<ISyncComponentsType>;
|
|
@@ -17,12 +17,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.Name = exports.MeshCollider = exports.MeshRenderer = exports.Animator = exports.Material = exports.Transform = void 0;
|
|
20
|
+
exports.SyncComponents = exports.Name = exports.MeshCollider = exports.MeshRenderer = exports.Animator = exports.Material = exports.Transform = void 0;
|
|
21
21
|
const Animator_1 = require("./extended/Animator");
|
|
22
22
|
const Material_1 = require("./extended/Material");
|
|
23
23
|
const MeshCollider_1 = require("./extended/MeshCollider");
|
|
24
24
|
const MeshRenderer_1 = require("./extended/MeshRenderer");
|
|
25
25
|
const Name_1 = __importDefault(require("./manual/Name"));
|
|
26
|
+
const SyncComponents_1 = __importDefault(require("./manual/SyncComponents"));
|
|
26
27
|
const Transform_1 = require("./manual/Transform");
|
|
27
28
|
__exportStar(require("./generated/index.gen"), exports);
|
|
28
29
|
/* @__PURE__ */
|
|
@@ -46,3 +47,9 @@ exports.MeshCollider = MeshCollider;
|
|
|
46
47
|
/* @__PURE__ */
|
|
47
48
|
const Name = (engine) => (0, Name_1.default)(engine);
|
|
48
49
|
exports.Name = Name;
|
|
50
|
+
/**
|
|
51
|
+
* @alpha
|
|
52
|
+
*/
|
|
53
|
+
/* @__PURE__ */
|
|
54
|
+
const SyncComponents = (engine) => (0, SyncComponents_1.default)(engine);
|
|
55
|
+
exports.SyncComponents = SyncComponents;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IEngine, LastWriteWinElementSetComponentDefinition } from '../../engine/types';
|
|
2
|
+
export interface ISyncComponentsType {
|
|
3
|
+
componentIds: number[];
|
|
4
|
+
}
|
|
5
|
+
export type ISyncComponents = LastWriteWinElementSetComponentDefinition<ISyncComponentsType>;
|
|
6
|
+
declare function defineSyncComponents(engine: Pick<IEngine, 'defineComponent'>): import("../../engine/types").MapComponentDefinition<import("../..").MapResult<{
|
|
7
|
+
componentIds: import("../../schemas").ISchema<number[]>;
|
|
8
|
+
}>>;
|
|
9
|
+
export default defineSyncComponents;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const schemas_1 = require("../../schemas");
|
|
4
|
+
function defineSyncComponents(engine) {
|
|
5
|
+
const SyncComponents = engine.defineComponent('core-schema::Sync-Components', {
|
|
6
|
+
componentIds: schemas_1.Schemas.Array(schemas_1.Schemas.Int64)
|
|
7
|
+
});
|
|
8
|
+
return SyncComponents;
|
|
9
|
+
}
|
|
10
|
+
exports.default = defineSyncComponents;
|
|
@@ -4,3 +4,4 @@ export type { MeshColliderComponentDefinitionExtended } from './extended/MeshCol
|
|
|
4
4
|
export type { TextureHelper, MaterialComponentDefinitionExtended } from './extended/Material';
|
|
5
5
|
export type { TransformComponentExtended, TransformTypeWithOptionals } from './manual/Transform';
|
|
6
6
|
export type { NameComponent, NameType } from './manual/Name';
|
|
7
|
+
export type { ISyncComponents, ISyncComponentsType } from './manual/SyncComponents';
|
|
@@ -43,7 +43,7 @@ export interface BaseComponent<T> {
|
|
|
43
43
|
* This function writes the whole state of the component into a ByteBuffer
|
|
44
44
|
* @public
|
|
45
45
|
*/
|
|
46
|
-
dumpCrdtStateToBuffer(buffer: ByteBuffer): void;
|
|
46
|
+
dumpCrdtStateToBuffer(buffer: ByteBuffer, filterEntity?: (entity: Entity) => boolean): void;
|
|
47
47
|
/**
|
|
48
48
|
* @public
|
|
49
49
|
* Marks the entity as deleted and signals it cannot be used ever again. It must
|
|
@@ -17,6 +17,24 @@ export type uint32 = number;
|
|
|
17
17
|
export type Entity = number & {
|
|
18
18
|
__entity_type: '';
|
|
19
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* This first 512 entities are reserved by the renderer
|
|
22
|
+
*/
|
|
23
|
+
export declare const RESERVED_STATIC_ENTITIES = 512;
|
|
24
|
+
export declare const RESERVED_LOCAL_ENTITIES = 65535;
|
|
25
|
+
/**
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export declare namespace EntityUtils {
|
|
29
|
+
/**
|
|
30
|
+
* @returns [entityNumber, entityVersion]
|
|
31
|
+
*/
|
|
32
|
+
function fromEntityId(entityId: Entity): [number, number];
|
|
33
|
+
/**
|
|
34
|
+
* @returns compound number from entityNumber and entityVerison
|
|
35
|
+
*/
|
|
36
|
+
function toEntityId(entityNumber: number, entityVersion: number): Entity;
|
|
37
|
+
}
|
|
20
38
|
/**
|
|
21
39
|
* @public
|
|
22
40
|
*/
|
|
@@ -39,11 +57,12 @@ export declare enum EntityState {
|
|
|
39
57
|
* @intenral
|
|
40
58
|
*/
|
|
41
59
|
export type EntityContainer = {
|
|
42
|
-
generateEntity(): Entity;
|
|
60
|
+
generateEntity(networked?: boolean): Entity;
|
|
43
61
|
removeEntity(entity: Entity): boolean;
|
|
44
62
|
getEntityState(entity: Entity): EntityState;
|
|
45
63
|
getExistingEntities(): Set<Entity>;
|
|
46
64
|
releaseRemovedEntities(): Entity[];
|
|
47
65
|
updateRemovedEntity(entity: Entity): boolean;
|
|
48
66
|
updateUsedEntity(entity: Entity): boolean;
|
|
67
|
+
setNetworkEntitiesRange(reservedLocalEntities: number, range: [number, number]): void;
|
|
49
68
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EntityContainer = exports.EntityState = exports.EntityUtils = exports.
|
|
3
|
+
exports.EntityContainer = exports.EntityState = exports.EntityUtils = exports.RESERVED_LOCAL_ENTITIES = exports.RESERVED_STATIC_ENTITIES = exports.MAX_ENTITY_NUMBER = exports.AMOUNT_VERSION_AVAILABLE = exports.MAX_U16 = void 0;
|
|
4
4
|
const gset_1 = require("../systems/crdt/gset");
|
|
5
5
|
/**
|
|
6
6
|
* @internal
|
|
@@ -14,15 +14,16 @@ exports.AMOUNT_VERSION_AVAILABLE = exports.MAX_U16 + 1;
|
|
|
14
14
|
// This type matches with @dcl/crdt entity type.
|
|
15
15
|
/**
|
|
16
16
|
* @internal
|
|
17
|
-
* This first 512 entities are reserved by the renderer
|
|
18
17
|
*/
|
|
19
|
-
exports.
|
|
18
|
+
exports.MAX_ENTITY_NUMBER = exports.MAX_U16;
|
|
20
19
|
/**
|
|
21
|
-
*
|
|
20
|
+
* This first 512 entities are reserved by the renderer
|
|
22
21
|
*/
|
|
23
|
-
exports.
|
|
22
|
+
exports.RESERVED_STATIC_ENTITIES = 512;
|
|
23
|
+
// Max amount of local entities that can be created
|
|
24
|
+
exports.RESERVED_LOCAL_ENTITIES = exports.MAX_ENTITY_NUMBER;
|
|
24
25
|
/**
|
|
25
|
-
* @
|
|
26
|
+
* @public
|
|
26
27
|
*/
|
|
27
28
|
var EntityUtils;
|
|
28
29
|
(function (EntityUtils) {
|
|
@@ -64,15 +65,32 @@ var EntityState;
|
|
|
64
65
|
* @internal
|
|
65
66
|
*/
|
|
66
67
|
function EntityContainer() {
|
|
68
|
+
// Local entities counter
|
|
67
69
|
let entityCounter = exports.RESERVED_STATIC_ENTITIES;
|
|
70
|
+
// Network entities counter
|
|
71
|
+
let networkEntityCounter;
|
|
72
|
+
// Network entities range that can be created by the user
|
|
73
|
+
let networkedEntitiesRange;
|
|
68
74
|
const usedEntities = new Set();
|
|
69
75
|
let toRemoveEntities = [];
|
|
70
76
|
const removedEntities = (0, gset_1.createVersionGSet)();
|
|
71
|
-
|
|
77
|
+
let localEntitiesAvailable = exports.RESERVED_LOCAL_ENTITIES;
|
|
78
|
+
function setNetworkEntitiesRange(reservedLocalEntities, range) {
|
|
79
|
+
localEntitiesAvailable = reservedLocalEntities;
|
|
80
|
+
networkedEntitiesRange = range;
|
|
81
|
+
networkEntityCounter = range[0];
|
|
82
|
+
}
|
|
83
|
+
function generateNewEntity(networked) {
|
|
72
84
|
if (entityCounter > exports.MAX_ENTITY_NUMBER - 1) {
|
|
73
85
|
throw new Error(`It fails trying to generate an entity out of range ${exports.MAX_ENTITY_NUMBER}.`);
|
|
74
86
|
}
|
|
75
|
-
|
|
87
|
+
if (networked && networkEntityCounter > networkedEntitiesRange[1]) {
|
|
88
|
+
throw new Error(`Max amount of network entities reached ${networkedEntitiesRange[1]} `);
|
|
89
|
+
}
|
|
90
|
+
if (!networked && entityCounter >= localEntitiesAvailable) {
|
|
91
|
+
throw new Error(`Max amount of local entities reached ${localEntitiesAvailable}`);
|
|
92
|
+
}
|
|
93
|
+
const entityNumber = networked ? networkEntityCounter++ : entityCounter++;
|
|
76
94
|
const entityVersion = removedEntities.getMap().has(entityNumber)
|
|
77
95
|
? removedEntities.getMap().get(entityNumber) + 1
|
|
78
96
|
: 0;
|
|
@@ -83,13 +101,31 @@ function EntityContainer() {
|
|
|
83
101
|
usedEntities.add(entity);
|
|
84
102
|
return entity;
|
|
85
103
|
}
|
|
86
|
-
function generateEntity() {
|
|
104
|
+
function generateEntity(networked) {
|
|
105
|
+
if (networked && !networkedEntitiesRange) {
|
|
106
|
+
throw new Error('Network entities ranged not initialized. Connect to a CRDT Server');
|
|
107
|
+
}
|
|
108
|
+
const usedNetworkSize = (networkedEntitiesRange &&
|
|
109
|
+
[...usedEntities.values()].filter(($) => {
|
|
110
|
+
const [entityId] = EntityUtils.fromEntityId($);
|
|
111
|
+
return entityId >= networkedEntitiesRange[0] && entityId <= networkedEntitiesRange[1];
|
|
112
|
+
}).length) ??
|
|
113
|
+
0;
|
|
114
|
+
const usedSize = usedEntities.size - usedNetworkSize;
|
|
87
115
|
// If all entities until `entityCounter` are being used, we need to generate another one
|
|
88
|
-
if (
|
|
89
|
-
return generateNewEntity();
|
|
116
|
+
if (!networked && usedSize + exports.RESERVED_STATIC_ENTITIES >= entityCounter) {
|
|
117
|
+
return generateNewEntity(networked);
|
|
118
|
+
}
|
|
119
|
+
// If all entities until `entityCounter` are being used, we need to generate another one
|
|
120
|
+
if (networked && usedNetworkSize + networkedEntitiesRange[0] >= networkEntityCounter) {
|
|
121
|
+
return generateNewEntity(networked);
|
|
90
122
|
}
|
|
91
123
|
for (const [number, version] of removedEntities.getMap()) {
|
|
92
124
|
if (version < exports.MAX_U16) {
|
|
125
|
+
if (networked && (number < networkedEntitiesRange[0] || number > networkedEntitiesRange[1]))
|
|
126
|
+
continue;
|
|
127
|
+
if (!networked && number >= localEntitiesAvailable)
|
|
128
|
+
continue;
|
|
93
129
|
const entity = EntityUtils.toEntityId(number, version + 1);
|
|
94
130
|
// If the entity is not being used, we can re-use it
|
|
95
131
|
// If the entity was removed in this tick, we're not counting for the usedEntities, but we have it in the toRemoveEntityArray
|
|
@@ -99,7 +135,7 @@ function EntityContainer() {
|
|
|
99
135
|
}
|
|
100
136
|
}
|
|
101
137
|
}
|
|
102
|
-
return generateNewEntity();
|
|
138
|
+
return generateNewEntity(networked);
|
|
103
139
|
}
|
|
104
140
|
function removeEntity(entity) {
|
|
105
141
|
if (entity < exports.RESERVED_STATIC_ENTITIES)
|
|
@@ -164,6 +200,7 @@ function EntityContainer() {
|
|
|
164
200
|
return EntityState.Unknown;
|
|
165
201
|
}
|
|
166
202
|
return {
|
|
203
|
+
setNetworkEntitiesRange,
|
|
167
204
|
generateEntity,
|
|
168
205
|
removeEntity,
|
|
169
206
|
getExistingEntities() {
|
|
@@ -130,8 +130,10 @@ function createValueSetComponentDefinitionFromSchema(componentName, componentId,
|
|
|
130
130
|
}
|
|
131
131
|
return [null, undefined];
|
|
132
132
|
},
|
|
133
|
-
dumpCrdtStateToBuffer: function (buffer) {
|
|
133
|
+
dumpCrdtStateToBuffer: function (buffer, filterEntity) {
|
|
134
134
|
for (const [entity, { raw }] of data) {
|
|
135
|
+
if (filterEntity && !filterEntity(entity))
|
|
136
|
+
continue;
|
|
135
137
|
for (const it of raw) {
|
|
136
138
|
const buf = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
137
139
|
schema.serialize(it.value, buf);
|
package/dist-cjs/engine/index.js
CHANGED
|
@@ -44,6 +44,7 @@ function preEngine() {
|
|
|
44
44
|
const entityContainer = (0, entity_1.EntityContainer)();
|
|
45
45
|
const componentsDefinition = new Map();
|
|
46
46
|
const systems = (0, systems_1.SystemContainer)();
|
|
47
|
+
let networkManager;
|
|
47
48
|
let sealed = false;
|
|
48
49
|
function addSystem(fn, priority = systems_1.SYSTEMS_REGULAR_PRIORITY, name) {
|
|
49
50
|
systems.add(fn, priority, name);
|
|
@@ -51,6 +52,18 @@ function preEngine() {
|
|
|
51
52
|
function removeSystem(selector) {
|
|
52
53
|
return systems.remove(selector);
|
|
53
54
|
}
|
|
55
|
+
function getNetworkManager() {
|
|
56
|
+
if (!networkManager)
|
|
57
|
+
throw new Error('Network manager not initialized. Start CRDT Server');
|
|
58
|
+
return networkManager;
|
|
59
|
+
}
|
|
60
|
+
function addNetworkManager(reservedLocalEntities, range) {
|
|
61
|
+
entityContainer.setNetworkEntitiesRange(reservedLocalEntities, range);
|
|
62
|
+
networkManager = {
|
|
63
|
+
addEntity: () => entityContainer.generateEntity(true)
|
|
64
|
+
};
|
|
65
|
+
return networkManager;
|
|
66
|
+
}
|
|
54
67
|
function addEntity() {
|
|
55
68
|
const entity = entityContainer.generateEntity();
|
|
56
69
|
return entity;
|
|
@@ -213,7 +226,9 @@ function preEngine() {
|
|
|
213
226
|
registerComponentDefinition,
|
|
214
227
|
entityContainer,
|
|
215
228
|
componentsIter,
|
|
216
|
-
seal
|
|
229
|
+
seal,
|
|
230
|
+
addNetworkManager,
|
|
231
|
+
getNetworkManager
|
|
217
232
|
};
|
|
218
233
|
}
|
|
219
234
|
/**
|
|
@@ -257,7 +272,9 @@ function Engine(options) {
|
|
|
257
272
|
CameraEntity: 2,
|
|
258
273
|
getEntityState: partialEngine.entityContainer.getEntityState,
|
|
259
274
|
addTransport: crdtSystem.addTransport,
|
|
260
|
-
entityContainer: partialEngine.entityContainer
|
|
275
|
+
entityContainer: partialEngine.entityContainer,
|
|
276
|
+
addNetworkManager: partialEngine.addNetworkManager,
|
|
277
|
+
getNetworkManager: partialEngine.getNetworkManager
|
|
261
278
|
};
|
|
262
279
|
}
|
|
263
280
|
exports.Engine = Engine;
|
|
@@ -3,6 +3,6 @@ import { ByteBuffer } from '../serialization/ByteBuffer';
|
|
|
3
3
|
import { PutComponentMessageBody, DeleteComponentMessageBody, CrdtMessageBody } from '../serialization/crdt';
|
|
4
4
|
import { Entity } from './entity';
|
|
5
5
|
export declare function incrementTimestamp(entity: Entity, timestamps: Map<Entity, number>): number;
|
|
6
|
-
export declare function createDumpLwwFunctionFromCrdt(componentId: number, timestamps: Map<Entity, number>, schema: Pick<ISchema<any>, 'serialize' | 'deserialize'>, data: Map<Entity, unknown>): (buffer: ByteBuffer) => void;
|
|
6
|
+
export declare function createDumpLwwFunctionFromCrdt(componentId: number, timestamps: Map<Entity, number>, schema: Pick<ISchema<any>, 'serialize' | 'deserialize'>, data: Map<Entity, unknown>): (buffer: ByteBuffer, filterEntity?: ((entity: Entity) => boolean) | undefined) => void;
|
|
7
7
|
export declare function createUpdateLwwFromCrdt(componentId: number, timestamps: Map<Entity, number>, schema: Pick<ISchema<any>, 'serialize' | 'deserialize'>, data: Map<Entity, unknown>): (msg: CrdtMessageBody) => [null | PutComponentMessageBody | DeleteComponentMessageBody, any];
|
|
8
8
|
export declare function createGetCrdtMessagesForLww(componentId: number, timestamps: Map<Entity, number>, dirtyIterator: Set<Entity>, schema: Pick<ISchema<any>, 'serialize'>, data: Map<Entity, unknown>): () => Generator<PutComponentMessageBody | DeleteComponentMessageBody, void, unknown>;
|
|
@@ -12,8 +12,15 @@ function incrementTimestamp(entity, timestamps) {
|
|
|
12
12
|
}
|
|
13
13
|
exports.incrementTimestamp = incrementTimestamp;
|
|
14
14
|
function createDumpLwwFunctionFromCrdt(componentId, timestamps, schema, data) {
|
|
15
|
-
return function dumpCrdtState(buffer) {
|
|
15
|
+
return function dumpCrdtState(buffer, filterEntity) {
|
|
16
16
|
for (const [entity, timestamp] of timestamps) {
|
|
17
|
+
/* istanbul ignore if */
|
|
18
|
+
if (filterEntity) {
|
|
19
|
+
// I swear that this is being tested on state-to-crdt.spec but jest is trolling me
|
|
20
|
+
/* istanbul ignore next */
|
|
21
|
+
if (!filterEntity(entity))
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
17
24
|
/* istanbul ignore else */
|
|
18
25
|
if (data.has(entity)) {
|
|
19
26
|
const it = data.get(entity);
|
|
@@ -46,10 +46,9 @@ export interface IEngine {
|
|
|
46
46
|
/**
|
|
47
47
|
* @public
|
|
48
48
|
* Increment the used entity counter and return the next one.
|
|
49
|
-
* @param dynamic - whether or no the entity should be considered as Dynamic (vs Static)
|
|
50
49
|
* @returns the next entity unused
|
|
51
50
|
*/
|
|
52
|
-
addEntity(
|
|
51
|
+
addEntity(): Entity;
|
|
53
52
|
/**
|
|
54
53
|
* @public
|
|
55
54
|
* Remove all components of an entity
|
|
@@ -228,4 +227,16 @@ export interface IEngine {
|
|
|
228
227
|
* components that will be available to this engine and to run optimizations.
|
|
229
228
|
*/
|
|
230
229
|
seal(): void;
|
|
230
|
+
/**
|
|
231
|
+
* @alpha
|
|
232
|
+
* Initialize network manager
|
|
233
|
+
*/
|
|
234
|
+
addNetworkManager(reservedLocalEntities: number, range: [number, number]): {
|
|
235
|
+
addEntity: IEngine['addEntity'];
|
|
236
|
+
};
|
|
237
|
+
/**
|
|
238
|
+
* @alpha
|
|
239
|
+
* Get netowrk manager to create entities.
|
|
240
|
+
*/
|
|
241
|
+
getNetworkManager(): ReturnType<IEngine['addNetworkManager']>;
|
|
231
242
|
}
|
package/dist-cjs/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export * from './systems/videoEvents';
|
|
|
10
10
|
export * from './systems/async-task';
|
|
11
11
|
export * from './engine/entity';
|
|
12
12
|
export * from './components/types';
|
|
13
|
-
import { MaterialComponentDefinitionExtended, MeshColliderComponentDefinitionExtended, MeshRendererComponentDefinitionExtended, TransformComponentExtended, AnimatorComponentDefinitionExtended } from './components/types';
|
|
13
|
+
import { MaterialComponentDefinitionExtended, MeshColliderComponentDefinitionExtended, MeshRendererComponentDefinitionExtended, TransformComponentExtended, AnimatorComponentDefinitionExtended, ISyncComponents } from './components/types';
|
|
14
14
|
import { NameComponent } from './components/manual/Name';
|
|
15
15
|
export declare const Transform: TransformComponentExtended;
|
|
16
16
|
export declare const Animator: AnimatorComponentDefinitionExtended;
|
|
@@ -18,6 +18,12 @@ export declare const Material: MaterialComponentDefinitionExtended;
|
|
|
18
18
|
export declare const MeshRenderer: MeshRendererComponentDefinitionExtended;
|
|
19
19
|
export declare const MeshCollider: MeshColliderComponentDefinitionExtended;
|
|
20
20
|
export declare const Name: NameComponent;
|
|
21
|
+
/**
|
|
22
|
+
* @alpha
|
|
23
|
+
* This is going to be used for sync components through a server.
|
|
24
|
+
* Can be modified in the future since it's still in research
|
|
25
|
+
*/
|
|
26
|
+
export declare const SyncComponents: ISyncComponents;
|
|
21
27
|
export * from './components/generated/global.gen';
|
|
22
28
|
export * from './components/generated/types.gen';
|
|
23
29
|
export * from './serialization/crdt';
|
package/dist-cjs/index.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
26
26
|
return result;
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.Name = exports.MeshCollider = exports.MeshRenderer = exports.Material = exports.Animator = exports.Transform = exports.components = exports.cyclicParentingChecker = void 0;
|
|
29
|
+
exports.SyncComponents = exports.Name = exports.MeshCollider = exports.MeshRenderer = exports.Material = exports.Animator = exports.Transform = exports.components = exports.cyclicParentingChecker = void 0;
|
|
30
30
|
// The order of the following imports matters. Please do not auto-sort
|
|
31
31
|
__exportStar(require("./engine"), exports);
|
|
32
32
|
__exportStar(require("./schemas"), exports);
|
|
@@ -52,6 +52,12 @@ exports.Material = components.Material(initialization_1.engine);
|
|
|
52
52
|
exports.MeshRenderer = components.MeshRenderer(initialization_1.engine);
|
|
53
53
|
exports.MeshCollider = components.MeshCollider(initialization_1.engine);
|
|
54
54
|
exports.Name = components.Name(initialization_1.engine);
|
|
55
|
+
/**
|
|
56
|
+
* @alpha
|
|
57
|
+
* This is going to be used for sync components through a server.
|
|
58
|
+
* Can be modified in the future since it's still in research
|
|
59
|
+
*/
|
|
60
|
+
exports.SyncComponents = components.SyncComponents(initialization_1.engine);
|
|
55
61
|
// export components for global engine
|
|
56
62
|
__exportStar(require("./components/generated/global.gen"), exports);
|
|
57
63
|
__exportStar(require("./components/generated/types.gen"), exports);
|
|
@@ -95,6 +95,7 @@ function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
95
95
|
for (const msg of messagesToProcess) {
|
|
96
96
|
if (msg.type === types_1.CrdtMessageType.DELETE_ENTITY) {
|
|
97
97
|
entitiesShouldBeCleaned.push(msg.entityId);
|
|
98
|
+
broadcastMessages.push(msg);
|
|
98
99
|
}
|
|
99
100
|
else {
|
|
100
101
|
const entityState = engine.entityContainer.getEntityState(msg.entityId);
|
|
@@ -143,7 +144,8 @@ function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
143
144
|
}
|
|
144
145
|
}
|
|
145
146
|
for (const definition of engine.componentsIter()) {
|
|
146
|
-
|
|
147
|
+
// TODO: check this with pato/pravus
|
|
148
|
+
definition.entityDeleted(entity, true);
|
|
147
149
|
}
|
|
148
150
|
engine.entityContainer.updateRemovedEntity(entity);
|
|
149
151
|
onProcessEntityComponentChange && onProcessEntityComponentChange(entity, types_1.CrdtMessageType.DELETE_ENTITY);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/ecs",
|
|
3
3
|
"description": "Decentraland ECS",
|
|
4
|
-
"version": "7.3.15-
|
|
4
|
+
"version": "7.3.15-6201308535.commit-dd17bb7",
|
|
5
5
|
"author": "DCL",
|
|
6
6
|
"bugs": "https://github.com/decentraland/ecs/issues",
|
|
7
7
|
"files": [
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
},
|
|
34
34
|
"types": "./dist/index.d.ts",
|
|
35
35
|
"typings": "./dist/index.d.ts",
|
|
36
|
-
"commit": "
|
|
36
|
+
"commit": "dd17bb77900cab91f1a031bffbc9e9e20697902a"
|
|
37
37
|
}
|