@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.
Files changed (67) hide show
  1. package/dist/components/generated/AvatarBase.gen.d.ts +1 -0
  2. package/dist/components/generated/AvatarBase.gen.js +25 -0
  3. package/dist/components/generated/AvatarEmoteCommand.gen.d.ts +1 -0
  4. package/dist/components/generated/AvatarEmoteCommand.gen.js +25 -0
  5. package/dist/components/generated/AvatarEquippedData.gen.d.ts +1 -0
  6. package/dist/components/generated/AvatarEquippedData.gen.js +25 -0
  7. package/dist/components/generated/PlayerIdentityData.gen.d.ts +1 -0
  8. package/dist/components/generated/PlayerIdentityData.gen.js +25 -0
  9. package/dist/components/generated/component-names.gen.js +4 -0
  10. package/dist/components/generated/pb/decentraland/sdk/components/avatar_base.gen.d.ts +20 -0
  11. package/dist/components/generated/pb/decentraland/sdk/components/avatar_base.gen.js +78 -0
  12. package/dist/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.d.ts +32 -0
  13. package/dist/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.js +88 -0
  14. package/dist/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.d.ts +20 -0
  15. package/dist/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.js +50 -0
  16. package/dist/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.d.ts +21 -0
  17. package/dist/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.js +50 -0
  18. package/dist/components/index.d.ts +5 -0
  19. package/dist/components/index.js +6 -0
  20. package/dist/components/manual/SyncComponents.d.ts +9 -0
  21. package/dist/components/manual/SyncComponents.js +8 -0
  22. package/dist/components/types.d.ts +1 -0
  23. package/dist/engine/component.d.ts +1 -1
  24. package/dist/engine/entity.d.ts +20 -1
  25. package/dist/engine/entity.js +48 -11
  26. package/dist/engine/grow-only-value-set-component-definition.js +3 -1
  27. package/dist/engine/index.js +19 -2
  28. package/dist/engine/lww-element-set-component-definition.d.ts +1 -1
  29. package/dist/engine/lww-element-set-component-definition.js +8 -1
  30. package/dist/engine/types.d.ts +13 -2
  31. package/dist/index.d.ts +7 -1
  32. package/dist/index.js +6 -0
  33. package/dist/systems/crdt/index.js +3 -1
  34. package/dist-cjs/components/generated/AvatarBase.gen.d.ts +1 -0
  35. package/dist-cjs/components/generated/AvatarBase.gen.js +28 -0
  36. package/dist-cjs/components/generated/AvatarEmoteCommand.gen.d.ts +1 -0
  37. package/dist-cjs/components/generated/AvatarEmoteCommand.gen.js +28 -0
  38. package/dist-cjs/components/generated/AvatarEquippedData.gen.d.ts +1 -0
  39. package/dist-cjs/components/generated/AvatarEquippedData.gen.js +28 -0
  40. package/dist-cjs/components/generated/PlayerIdentityData.gen.d.ts +1 -0
  41. package/dist-cjs/components/generated/PlayerIdentityData.gen.js +28 -0
  42. package/dist-cjs/components/generated/component-names.gen.js +4 -0
  43. package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_base.gen.d.ts +20 -0
  44. package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_base.gen.js +84 -0
  45. package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.d.ts +32 -0
  46. package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_emote_command.gen.js +94 -0
  47. package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.d.ts +20 -0
  48. package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_equipped_data.gen.js +56 -0
  49. package/dist-cjs/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.d.ts +21 -0
  50. package/dist-cjs/components/generated/pb/decentraland/sdk/components/player_identity_data.gen.js +56 -0
  51. package/dist-cjs/components/index.d.ts +5 -0
  52. package/dist-cjs/components/index.js +8 -1
  53. package/dist-cjs/components/manual/SyncComponents.d.ts +9 -0
  54. package/dist-cjs/components/manual/SyncComponents.js +10 -0
  55. package/dist-cjs/components/types.d.ts +1 -0
  56. package/dist-cjs/engine/component.d.ts +1 -1
  57. package/dist-cjs/engine/entity.d.ts +20 -1
  58. package/dist-cjs/engine/entity.js +49 -12
  59. package/dist-cjs/engine/grow-only-value-set-component-definition.js +3 -1
  60. package/dist-cjs/engine/index.js +19 -2
  61. package/dist-cjs/engine/lww-element-set-component-definition.d.ts +1 -1
  62. package/dist-cjs/engine/lww-element-set-component-definition.js +8 -1
  63. package/dist-cjs/engine/types.d.ts +13 -2
  64. package/dist-cjs/index.d.ts +7 -1
  65. package/dist-cjs/index.js +7 -1
  66. package/dist-cjs/systems/crdt/index.js +3 -1
  67. package/package.json +2 -2
@@ -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
+ }
@@ -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 = {}));
@@ -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
+ }
@@ -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.MAX_ENTITY_NUMBER = exports.RESERVED_STATIC_ENTITIES = exports.AMOUNT_VERSION_AVAILABLE = exports.MAX_U16 = void 0;
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.RESERVED_STATIC_ENTITIES = 512;
18
+ exports.MAX_ENTITY_NUMBER = exports.MAX_U16;
20
19
  /**
21
- * @internal
20
+ * This first 512 entities are reserved by the renderer
22
21
  */
23
- exports.MAX_ENTITY_NUMBER = exports.MAX_U16;
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
- * @internal
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
- function generateNewEntity() {
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
- const entityNumber = entityCounter++;
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 (usedEntities.size + exports.RESERVED_STATIC_ENTITIES >= entityCounter) {
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);
@@ -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(dynamic?: boolean): Entity;
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
  }
@@ -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
- definition.entityDeleted(entity, false);
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-6201184205.commit-767716e",
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": "767716e15bf6dd69374fb501bf39e8310e67d810"
36
+ "commit": "dd17bb77900cab91f1a031bffbc9e9e20697902a"
37
37
  }