@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 +6 -6
- package/players/index.d.ts +23 -0
- package/players/index.js +73 -0
- package/src/players/index.ts +106 -0
package/package.json
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
{
|
2
2
|
"name": "@dcl/sdk",
|
3
3
|
"description": "",
|
4
|
-
"version": "7.3.40-
|
4
|
+
"version": "7.3.40-7717066166.commit-ece036d",
|
5
5
|
"author": "Decentraland",
|
6
6
|
"dependencies": {
|
7
|
-
"@dcl/ecs": "7.3.40-
|
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-
|
11
|
-
"@dcl/react-ecs": "7.3.40-
|
12
|
-
"@dcl/sdk-commands": "7.3.40-
|
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": "
|
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;
|
package/players/index.js
ADDED
@@ -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
|