@dcl/sdk 7.3.40-7698451743.commit-c9c61fe → 7.3.40-7717066166.commit-ece036d

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/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
3
  "description": "",
4
- "version": "7.3.40-7698451743.commit-c9c61fe",
4
+ "version": "7.3.40-7717066166.commit-ece036d",
5
5
  "author": "Decentraland",
6
6
  "dependencies": {
7
- "@dcl/ecs": "7.3.40-7698451743.commit-c9c61fe",
7
+ "@dcl/ecs": "7.3.40-7717066166.commit-ece036d",
8
8
  "@dcl/ecs-math": "2.0.2",
9
9
  "@dcl/explorer": "1.0.159327-20240122142059.commit-58ce257",
10
- "@dcl/js-runtime": "7.3.40-7698451743.commit-c9c61fe",
11
- "@dcl/react-ecs": "7.3.40-7698451743.commit-c9c61fe",
12
- "@dcl/sdk-commands": "7.3.40-7698451743.commit-c9c61fe",
10
+ "@dcl/js-runtime": "7.3.40-7717066166.commit-ece036d",
11
+ "@dcl/react-ecs": "7.3.40-7717066166.commit-ece036d",
12
+ "@dcl/sdk-commands": "7.3.40-7717066166.commit-ece036d",
13
13
  "text-encoding": "0.7.0"
14
14
  },
15
15
  "keywords": [],
@@ -35,5 +35,5 @@
35
35
  },
36
36
  "types": "./index.d.ts",
37
37
  "typings": "./index.d.ts",
38
- "commit": "c9c61fe791438f55937546344bdd16b4f8f0cd6c"
38
+ "commit": "ece036db9e954a6f07bc175aa6f139d48680be87"
39
39
  }
@@ -0,0 +1,23 @@
1
+ import { Entity, TransformType } from '@dcl/ecs';
2
+ import { PBAvatarBase, PBAvatarEquippedData } from '@dcl/ecs/dist/components';
3
+ type GetPlayerDataReq = {
4
+ userId: string;
5
+ };
6
+ type GetPlayerDataRes = {
7
+ entity: Entity;
8
+ name: string;
9
+ isGuest: boolean;
10
+ userId: string;
11
+ avatar?: PBAvatarBase;
12
+ wearables: PBAvatarEquippedData['wearableUrns'];
13
+ emotes: PBAvatarEquippedData['emoteUrns'];
14
+ position: TransformType['position'] | undefined;
15
+ };
16
+ declare const players: {
17
+ onEnterScene(cb: (player: GetPlayerDataRes) => void): void;
18
+ onLeaveScene(cb: (userId: string) => void): void;
19
+ getPlayer(user?: GetPlayerDataReq): GetPlayerDataRes | null;
20
+ };
21
+ declare const getPlayer: (user?: GetPlayerDataReq) => GetPlayerDataRes | null, onEnterScene: (cb: (player: GetPlayerDataRes) => void) => void, onLeaveScene: (cb: (userId: string) => void) => void;
22
+ export { getPlayer, onEnterScene, onLeaveScene };
23
+ export default players;
@@ -0,0 +1,73 @@
1
+ import { engine } from '@dcl/ecs';
2
+ import { PlayerIdentityData as definePlayerIdenityData, AvatarBase as defineAvatarBase, AvatarEquippedData as defineAvatarEquippedData, Transform as defineTransform } from '@dcl/ecs/dist/components';
3
+ function definePlayerHelper(engine) {
4
+ const Transform = defineTransform(engine);
5
+ const PlayerIdentityData = definePlayerIdenityData(engine);
6
+ const AvatarEquippedData = defineAvatarEquippedData(engine);
7
+ const AvatarBase = defineAvatarBase(engine);
8
+ const playerEntities = new Map();
9
+ let onEnterSceneCb = undefined;
10
+ let onLeaveSceneCb = undefined;
11
+ engine.addSystem(() => {
12
+ const players = Array.from(engine.getEntitiesWith(PlayerIdentityData, AvatarBase));
13
+ if (players.length === playerEntities.size)
14
+ return;
15
+ for (const [entity, identity] of players) {
16
+ if (!playerEntities.has(entity)) {
17
+ playerEntities.set(entity, identity.address);
18
+ if (onEnterSceneCb) {
19
+ onEnterSceneCb(getPlayer({ userId: identity.address }));
20
+ }
21
+ AvatarBase.onChange(entity, (value) => {
22
+ if (!value && onLeaveSceneCb && playerEntities.get(entity)) {
23
+ onLeaveSceneCb(playerEntities.get(entity));
24
+ playerEntities.delete(entity);
25
+ }
26
+ });
27
+ }
28
+ }
29
+ });
30
+ return {
31
+ onEnterScene(cb) {
32
+ onEnterSceneCb = cb;
33
+ },
34
+ onLeaveScene(cb) {
35
+ onLeaveSceneCb = cb;
36
+ },
37
+ getPlayer(user) {
38
+ function getEntity() {
39
+ if (!user?.userId)
40
+ return engine.PlayerEntity;
41
+ for (const [entity, data] of engine.getEntitiesWith(PlayerIdentityData)) {
42
+ if (data.address === user.userId) {
43
+ return entity;
44
+ }
45
+ }
46
+ return undefined;
47
+ }
48
+ const userEntity = getEntity();
49
+ if (!userEntity)
50
+ return null;
51
+ const playerData = PlayerIdentityData.getOrNull(userEntity);
52
+ const avatarData = AvatarBase.getOrNull(userEntity);
53
+ const wearablesData = AvatarEquippedData.getOrNull(userEntity);
54
+ if (!playerData && !avatarData && !wearablesData)
55
+ return null;
56
+ return {
57
+ entity: userEntity,
58
+ name: avatarData?.name ?? '',
59
+ isGuest: !!playerData?.isGuest ?? false,
60
+ userId: playerData?.address ?? '',
61
+ avatar: avatarData ?? undefined,
62
+ wearables: wearablesData?.wearableUrns ?? [],
63
+ emotes: wearablesData?.emoteUrns ?? [],
64
+ position: Transform.getOrNull(userEntity)?.position
65
+ };
66
+ }
67
+ };
68
+ }
69
+ const players = definePlayerHelper(engine);
70
+ const { getPlayer, onEnterScene, onLeaveScene } = players;
71
+ export { getPlayer, onEnterScene, onLeaveScene };
72
+ export default players;
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGxheWVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtDLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRSxPQUFPLEVBQ0wsa0JBQWtCLElBQUksdUJBQXVCLEVBQzdDLFVBQVUsSUFBSSxnQkFBZ0IsRUFDOUIsa0JBQWtCLElBQUksd0JBQXdCLEVBRzlDLFNBQVMsSUFBSSxlQUFlLEVBQzdCLE1BQU0sMEJBQTBCLENBQUE7QUFnQmpDLFNBQVMsa0JBQWtCLENBQUMsTUFBZTtJQUN6QyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDekMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMxRCxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0lBQ2hELElBQUksY0FBYyxHQUFxRCxTQUFTLENBQUE7SUFDaEYsSUFBSSxjQUFjLEdBQTJDLFNBQVMsQ0FBQTtJQUV0RSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNwQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUNsRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLElBQUk7WUFBRSxPQUFNO1FBRWxELEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxPQUFPLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQy9CLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFHNUMsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFFLENBQUMsQ0FBQTtpQkFDekQ7Z0JBR0QsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDMUQsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFFLENBQUMsQ0FBQTt3QkFDM0MsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtxQkFDOUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7YUFDSDtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixPQUFPO1FBQ0wsWUFBWSxDQUFDLEVBQXNDO1lBQ2pELGNBQWMsR0FBRyxFQUFFLENBQUE7UUFDckIsQ0FBQztRQUNELFlBQVksQ0FBQyxFQUE0QjtZQUN2QyxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ3JCLENBQUM7UUFJRCxTQUFTLENBQUMsSUFBdUI7WUFDL0IsU0FBUyxTQUFTO2dCQUNoQixJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU07b0JBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFBO2dCQUM3QyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO29CQUN2RSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDaEMsT0FBTyxNQUFNLENBQUE7cUJBQ2Q7aUJBQ0Y7Z0JBQ0QsT0FBTyxTQUFTLENBQUE7WUFDbEIsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLFNBQVMsRUFBRSxDQUFBO1lBQzlCLElBQUksQ0FBQyxVQUFVO2dCQUFFLE9BQU8sSUFBSSxDQUFBO1lBRTVCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMzRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ25ELE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUU5RCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsYUFBYTtnQkFBRSxPQUFPLElBQUksQ0FBQTtZQUU3RCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUM1QixPQUFPLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLElBQUksS0FBSztnQkFDdkMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLElBQUksRUFBRTtnQkFDakMsTUFBTSxFQUFFLFVBQVUsSUFBSSxTQUFTO2dCQUMvQixTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksSUFBSSxFQUFFO2dCQUM1QyxNQUFNLEVBQUUsYUFBYSxFQUFFLFNBQVMsSUFBSSxFQUFFO2dCQUN0QyxRQUFRLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRO2FBQ3BELENBQUE7UUFDSCxDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUMxQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUE7QUFFekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUE7QUFDaEQsZUFBZSxPQUFPLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIElFbmdpbmUsIFRyYW5zZm9ybVR5cGUsIGVuZ2luZSB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHtcbiAgUGxheWVySWRlbnRpdHlEYXRhIGFzIGRlZmluZVBsYXllcklkZW5pdHlEYXRhLFxuICBBdmF0YXJCYXNlIGFzIGRlZmluZUF2YXRhckJhc2UsXG4gIEF2YXRhckVxdWlwcGVkRGF0YSBhcyBkZWZpbmVBdmF0YXJFcXVpcHBlZERhdGEsXG4gIFBCQXZhdGFyQmFzZSxcbiAgUEJBdmF0YXJFcXVpcHBlZERhdGEsXG4gIFRyYW5zZm9ybSBhcyBkZWZpbmVUcmFuc2Zvcm1cbn0gZnJvbSAnQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzJ1xuXG50eXBlIEdldFBsYXllckRhdGFSZXEgPSB7XG4gIHVzZXJJZDogc3RyaW5nXG59XG50eXBlIEdldFBsYXllckRhdGFSZXMgPSB7XG4gIGVudGl0eTogRW50aXR5XG4gIG5hbWU6IHN0cmluZ1xuICBpc0d1ZXN0OiBib29sZWFuXG4gIHVzZXJJZDogc3RyaW5nXG4gIGF2YXRhcj86IFBCQXZhdGFyQmFzZVxuICB3ZWFyYWJsZXM6IFBCQXZhdGFyRXF1aXBwZWREYXRhWyd3ZWFyYWJsZVVybnMnXVxuICBlbW90ZXM6IFBCQXZhdGFyRXF1aXBwZWREYXRhWydlbW90ZVVybnMnXVxuICBwb3NpdGlvbjogVHJhbnNmb3JtVHlwZVsncG9zaXRpb24nXSB8IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBkZWZpbmVQbGF5ZXJIZWxwZXIoZW5naW5lOiBJRW5naW5lKSB7XG4gIGNvbnN0IFRyYW5zZm9ybSA9IGRlZmluZVRyYW5zZm9ybShlbmdpbmUpXG4gIGNvbnN0IFBsYXllcklkZW50aXR5RGF0YSA9IGRlZmluZVBsYXllcklkZW5pdHlEYXRhKGVuZ2luZSlcbiAgY29uc3QgQXZhdGFyRXF1aXBwZWREYXRhID0gZGVmaW5lQXZhdGFyRXF1aXBwZWREYXRhKGVuZ2luZSlcbiAgY29uc3QgQXZhdGFyQmFzZSA9IGRlZmluZUF2YXRhckJhc2UoZW5naW5lKVxuICBjb25zdCBwbGF5ZXJFbnRpdGllcyA9IG5ldyBNYXA8RW50aXR5LCBzdHJpbmc+KClcbiAgbGV0IG9uRW50ZXJTY2VuZUNiOiAoKHBsYXllcjogR2V0UGxheWVyRGF0YVJlcykgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgbGV0IG9uTGVhdmVTY2VuZUNiOiAoKHVzZXJJZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gIGVuZ2luZS5hZGRTeXN0ZW0oKCkgPT4ge1xuICAgIGNvbnN0IHBsYXllcnMgPSBBcnJheS5mcm9tKGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoUGxheWVySWRlbnRpdHlEYXRhLCBBdmF0YXJCYXNlKSlcbiAgICBpZiAocGxheWVycy5sZW5ndGggPT09IHBsYXllckVudGl0aWVzLnNpemUpIHJldHVyblxuXG4gICAgZm9yIChjb25zdCBbZW50aXR5LCBpZGVudGl0eV0gb2YgcGxheWVycykge1xuICAgICAgaWYgKCFwbGF5ZXJFbnRpdGllcy5oYXMoZW50aXR5KSkge1xuICAgICAgICBwbGF5ZXJFbnRpdGllcy5zZXQoZW50aXR5LCBpZGVudGl0eS5hZGRyZXNzKVxuXG4gICAgICAgIC8vIENhbGwgb25FbnRlciBjYWxsYmFja1xuICAgICAgICBpZiAob25FbnRlclNjZW5lQ2IpIHtcbiAgICAgICAgICBvbkVudGVyU2NlbmVDYihnZXRQbGF5ZXIoeyB1c2VySWQ6IGlkZW50aXR5LmFkZHJlc3MgfSkhKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMvcmVtb3ZlIGNhbGxiYWNrc1xuICAgICAgICBBdmF0YXJCYXNlLm9uQ2hhbmdlKGVudGl0eSwgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSAmJiBvbkxlYXZlU2NlbmVDYiAmJiBwbGF5ZXJFbnRpdGllcy5nZXQoZW50aXR5KSkge1xuICAgICAgICAgICAgb25MZWF2ZVNjZW5lQ2IocGxheWVyRW50aXRpZXMuZ2V0KGVudGl0eSkhKVxuICAgICAgICAgICAgcGxheWVyRW50aXRpZXMuZGVsZXRlKGVudGl0eSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgb25FbnRlclNjZW5lKGNiOiAocGxheWVyOiBHZXRQbGF5ZXJEYXRhUmVzKSA9PiB2b2lkKSB7XG4gICAgICBvbkVudGVyU2NlbmVDYiA9IGNiXG4gICAgfSxcbiAgICBvbkxlYXZlU2NlbmUoY2I6ICh1c2VySWQ6IHN0cmluZykgPT4gdm9pZCkge1xuICAgICAgb25MZWF2ZVNjZW5lQ2IgPSBjYlxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5mbyBvZiB0aGUgcGxheWVyIGlmIGl0J3MgaW4gdGhlIHNjZW5lLlxuICAgICAqL1xuICAgIGdldFBsYXllcih1c2VyPzogR2V0UGxheWVyRGF0YVJlcSk6IEdldFBsYXllckRhdGFSZXMgfCBudWxsIHtcbiAgICAgIGZ1bmN0aW9uIGdldEVudGl0eSgpIHtcbiAgICAgICAgaWYgKCF1c2VyPy51c2VySWQpIHJldHVybiBlbmdpbmUuUGxheWVyRW50aXR5XG4gICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgZGF0YV0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChQbGF5ZXJJZGVudGl0eURhdGEpKSB7XG4gICAgICAgICAgaWYgKGRhdGEuYWRkcmVzcyA9PT0gdXNlci51c2VySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VyRW50aXR5ID0gZ2V0RW50aXR5KClcbiAgICAgIGlmICghdXNlckVudGl0eSkgcmV0dXJuIG51bGxcblxuICAgICAgY29uc3QgcGxheWVyRGF0YSA9IFBsYXllcklkZW50aXR5RGF0YS5nZXRPck51bGwodXNlckVudGl0eSlcbiAgICAgIGNvbnN0IGF2YXRhckRhdGEgPSBBdmF0YXJCYXNlLmdldE9yTnVsbCh1c2VyRW50aXR5KVxuICAgICAgY29uc3Qgd2VhcmFibGVzRGF0YSA9IEF2YXRhckVxdWlwcGVkRGF0YS5nZXRPck51bGwodXNlckVudGl0eSlcblxuICAgICAgaWYgKCFwbGF5ZXJEYXRhICYmICFhdmF0YXJEYXRhICYmICF3ZWFyYWJsZXNEYXRhKSByZXR1cm4gbnVsbFxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnRpdHk6IHVzZXJFbnRpdHksXG4gICAgICAgIG5hbWU6IGF2YXRhckRhdGE/Lm5hbWUgPz8gJycsXG4gICAgICAgIGlzR3Vlc3Q6ICEhcGxheWVyRGF0YT8uaXNHdWVzdCA/PyBmYWxzZSxcbiAgICAgICAgdXNlcklkOiBwbGF5ZXJEYXRhPy5hZGRyZXNzID8/ICcnLFxuICAgICAgICBhdmF0YXI6IGF2YXRhckRhdGEgPz8gdW5kZWZpbmVkLFxuICAgICAgICB3ZWFyYWJsZXM6IHdlYXJhYmxlc0RhdGE/LndlYXJhYmxlVXJucyA/PyBbXSxcbiAgICAgICAgZW1vdGVzOiB3ZWFyYWJsZXNEYXRhPy5lbW90ZVVybnMgPz8gW10sXG4gICAgICAgIHBvc2l0aW9uOiBUcmFuc2Zvcm0uZ2V0T3JOdWxsKHVzZXJFbnRpdHkpPy5wb3NpdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBwbGF5ZXJzID0gZGVmaW5lUGxheWVySGVscGVyKGVuZ2luZSlcbmNvbnN0IHsgZ2V0UGxheWVyLCBvbkVudGVyU2NlbmUsIG9uTGVhdmVTY2VuZSB9ID0gcGxheWVyc1xuXG5leHBvcnQgeyBnZXRQbGF5ZXIsIG9uRW50ZXJTY2VuZSwgb25MZWF2ZVNjZW5lIH1cbmV4cG9ydCBkZWZhdWx0IHBsYXllcnNcbiJdfQ==
@@ -0,0 +1,106 @@
1
+ import { Entity, IEngine, TransformType, engine } from '@dcl/ecs'
2
+ import {
3
+ PlayerIdentityData as definePlayerIdenityData,
4
+ AvatarBase as defineAvatarBase,
5
+ AvatarEquippedData as defineAvatarEquippedData,
6
+ PBAvatarBase,
7
+ PBAvatarEquippedData,
8
+ Transform as defineTransform
9
+ } from '@dcl/ecs/dist/components'
10
+
11
+ type GetPlayerDataReq = {
12
+ userId: string
13
+ }
14
+ type GetPlayerDataRes = {
15
+ entity: Entity
16
+ name: string
17
+ isGuest: boolean
18
+ userId: string
19
+ avatar?: PBAvatarBase
20
+ wearables: PBAvatarEquippedData['wearableUrns']
21
+ emotes: PBAvatarEquippedData['emoteUrns']
22
+ position: TransformType['position'] | undefined
23
+ }
24
+
25
+ function definePlayerHelper(engine: IEngine) {
26
+ const Transform = defineTransform(engine)
27
+ const PlayerIdentityData = definePlayerIdenityData(engine)
28
+ const AvatarEquippedData = defineAvatarEquippedData(engine)
29
+ const AvatarBase = defineAvatarBase(engine)
30
+ const playerEntities = new Map<Entity, string>()
31
+ let onEnterSceneCb: ((player: GetPlayerDataRes) => void) | undefined = undefined
32
+ let onLeaveSceneCb: ((userId: string) => void) | undefined = undefined
33
+
34
+ engine.addSystem(() => {
35
+ const players = Array.from(engine.getEntitiesWith(PlayerIdentityData, AvatarBase))
36
+ if (players.length === playerEntities.size) return
37
+
38
+ for (const [entity, identity] of players) {
39
+ if (!playerEntities.has(entity)) {
40
+ playerEntities.set(entity, identity.address)
41
+
42
+ // Call onEnter callback
43
+ if (onEnterSceneCb) {
44
+ onEnterSceneCb(getPlayer({ userId: identity.address })!)
45
+ }
46
+
47
+ // Check for changes/remove callbacks
48
+ AvatarBase.onChange(entity, (value) => {
49
+ if (!value && onLeaveSceneCb && playerEntities.get(entity)) {
50
+ onLeaveSceneCb(playerEntities.get(entity)!)
51
+ playerEntities.delete(entity)
52
+ }
53
+ })
54
+ }
55
+ }
56
+ })
57
+
58
+ return {
59
+ onEnterScene(cb: (player: GetPlayerDataRes) => void) {
60
+ onEnterSceneCb = cb
61
+ },
62
+ onLeaveScene(cb: (userId: string) => void) {
63
+ onLeaveSceneCb = cb
64
+ },
65
+ /**
66
+ * Returns the info of the player if it's in the scene.
67
+ */
68
+ getPlayer(user?: GetPlayerDataReq): GetPlayerDataRes | null {
69
+ function getEntity() {
70
+ if (!user?.userId) return engine.PlayerEntity
71
+ for (const [entity, data] of engine.getEntitiesWith(PlayerIdentityData)) {
72
+ if (data.address === user.userId) {
73
+ return entity
74
+ }
75
+ }
76
+ return undefined
77
+ }
78
+
79
+ const userEntity = getEntity()
80
+ if (!userEntity) return null
81
+
82
+ const playerData = PlayerIdentityData.getOrNull(userEntity)
83
+ const avatarData = AvatarBase.getOrNull(userEntity)
84
+ const wearablesData = AvatarEquippedData.getOrNull(userEntity)
85
+
86
+ if (!playerData && !avatarData && !wearablesData) return null
87
+
88
+ return {
89
+ entity: userEntity,
90
+ name: avatarData?.name ?? '',
91
+ isGuest: !!playerData?.isGuest ?? false,
92
+ userId: playerData?.address ?? '',
93
+ avatar: avatarData ?? undefined,
94
+ wearables: wearablesData?.wearableUrns ?? [],
95
+ emotes: wearablesData?.emoteUrns ?? [],
96
+ position: Transform.getOrNull(userEntity)?.position
97
+ }
98
+ }
99
+ }
100
+ }
101
+
102
+ const players = definePlayerHelper(engine)
103
+ const { getPlayer, onEnterScene, onLeaveScene } = players
104
+
105
+ export { getPlayer, onEnterScene, onLeaveScene }
106
+ export default players