dcl-npc-toolkit 1.5.2-20250415203310.commit-be60b9e → 1.5.2-20251229114702.commit-02ef366
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/bubble.js +1 -1
- package/dist/dialog.d.ts +2 -2
- package/dist/dialog.js +13 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -3
- package/dist/npc.d.ts +6 -1
- package/dist/npc.js +159 -23
- package/dist/utils/math.d.ts +28 -0
- package/dist/utils/math.js +239 -0
- package/dist/utils/path.d.ts +18 -0
- package/dist/utils/path.js +125 -0
- package/dist/utils/utils.d.ts +7 -0
- package/dist/utils/utils.js +46 -0
- package/package.json +4 -4
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Entity } from '@dcl/sdk/ecs';
|
|
2
|
+
import { Vector3, Quaternion } from '@dcl/sdk/math';
|
|
3
|
+
export declare function remap(value: number, min1: number, max1: number, min2: number, max2: number): number;
|
|
4
|
+
export declare function getWorldPosition(entity: Entity): Vector3;
|
|
5
|
+
export declare function getWorldRotation(entity: Entity): Quaternion;
|
|
6
|
+
export declare enum InterpolationType {
|
|
7
|
+
LINEAR = "linear",
|
|
8
|
+
EASEINQUAD = "easeinquad",
|
|
9
|
+
EASEOUTQUAD = "easeoutquad",
|
|
10
|
+
EASEQUAD = "easequad",
|
|
11
|
+
EASEINSINE = "easeinsine",
|
|
12
|
+
EASEOUTSINE = "easeoutsine",
|
|
13
|
+
EASESINE = "easeinoutsine",
|
|
14
|
+
EASEINEXPO = "easeinexpo",
|
|
15
|
+
EASEOUTEXPO = "easeoutexpo",
|
|
16
|
+
EASEEXPO = "easeinoutexpo",
|
|
17
|
+
EASEINELASTIC = "easeinelastic",
|
|
18
|
+
EASEOUTELASTIC = "easeoutelastic",
|
|
19
|
+
EASEELASTIC = "easeinoutelastic",
|
|
20
|
+
EASEINBOUNCE = "easeinbounce",
|
|
21
|
+
EASEOUTEBOUNCE = "easeoutbounce",
|
|
22
|
+
EASEBOUNCE = "easeinoutbounce"
|
|
23
|
+
}
|
|
24
|
+
export declare function interpolate(type: InterpolationType, t: number): number;
|
|
25
|
+
export declare function createCatmullRomSpline(points: Vector3[], nbPoints: number, closed?: boolean): Vector3[];
|
|
26
|
+
export declare function areAABBIntersecting(aMin: Vector3, aMax: Vector3, bMin: Vector3, bMax: Vector3): boolean;
|
|
27
|
+
export declare function areSpheresIntersecting(aPos: Vector3, aRadius: number, bPos: Vector3, bRadius: number): boolean;
|
|
28
|
+
export declare function areAABBSphereIntersecting(boxMin: Vector3, boxMax: Vector3, spherePos: Vector3, sphereRadius: number): boolean;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { Transform } from '@dcl/sdk/ecs';
|
|
2
|
+
import { Vector3, Quaternion } from '@dcl/sdk/math';
|
|
3
|
+
export function remap(value, min1, max1, min2, max2) {
|
|
4
|
+
let range1 = max1 - min1;
|
|
5
|
+
let range2 = max2 - min2;
|
|
6
|
+
return ((value - min1) / range1) * range2 + min2;
|
|
7
|
+
}
|
|
8
|
+
export function getWorldPosition(entity) {
|
|
9
|
+
let transform = Transform.getOrNull(entity);
|
|
10
|
+
if (!transform)
|
|
11
|
+
return Vector3.Zero();
|
|
12
|
+
let parent = transform.parent;
|
|
13
|
+
if (!parent) {
|
|
14
|
+
return transform.position;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
let parentRotation = Transform.get(parent).rotation;
|
|
18
|
+
return Vector3.add(getWorldPosition(parent), Vector3.rotate(transform.position, getWorldRotation(parent)));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function getWorldRotation(entity) {
|
|
22
|
+
let transform = Transform.getOrNull(entity);
|
|
23
|
+
if (!transform)
|
|
24
|
+
return Quaternion.Identity();
|
|
25
|
+
let parent = transform.parent;
|
|
26
|
+
if (!parent) {
|
|
27
|
+
return transform.rotation;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
return Quaternion.multiply(transform.rotation, getWorldRotation(parent));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export var InterpolationType;
|
|
34
|
+
(function (InterpolationType) {
|
|
35
|
+
InterpolationType["LINEAR"] = "linear";
|
|
36
|
+
InterpolationType["EASEINQUAD"] = "easeinquad";
|
|
37
|
+
InterpolationType["EASEOUTQUAD"] = "easeoutquad";
|
|
38
|
+
InterpolationType["EASEQUAD"] = "easequad";
|
|
39
|
+
InterpolationType["EASEINSINE"] = "easeinsine";
|
|
40
|
+
InterpolationType["EASEOUTSINE"] = "easeoutsine";
|
|
41
|
+
InterpolationType["EASESINE"] = "easeinoutsine";
|
|
42
|
+
InterpolationType["EASEINEXPO"] = "easeinexpo";
|
|
43
|
+
InterpolationType["EASEOUTEXPO"] = "easeoutexpo";
|
|
44
|
+
InterpolationType["EASEEXPO"] = "easeinoutexpo";
|
|
45
|
+
InterpolationType["EASEINELASTIC"] = "easeinelastic";
|
|
46
|
+
InterpolationType["EASEOUTELASTIC"] = "easeoutelastic";
|
|
47
|
+
InterpolationType["EASEELASTIC"] = "easeinoutelastic";
|
|
48
|
+
InterpolationType["EASEINBOUNCE"] = "easeinbounce";
|
|
49
|
+
InterpolationType["EASEOUTEBOUNCE"] = "easeoutbounce";
|
|
50
|
+
InterpolationType["EASEBOUNCE"] = "easeinoutbounce";
|
|
51
|
+
})(InterpolationType || (InterpolationType = {}));
|
|
52
|
+
export function interpolate(type, t) {
|
|
53
|
+
switch (type) {
|
|
54
|
+
case InterpolationType.LINEAR:
|
|
55
|
+
return InterpolateLinear(t);
|
|
56
|
+
case InterpolationType.EASEINQUAD:
|
|
57
|
+
return InterpolateEaseInQuad(t);
|
|
58
|
+
case InterpolationType.EASEOUTQUAD:
|
|
59
|
+
return InterpolateEaseOutQuad(t);
|
|
60
|
+
case InterpolationType.EASEQUAD:
|
|
61
|
+
return InterpolateEaseQuad(t);
|
|
62
|
+
case InterpolationType.EASEINSINE:
|
|
63
|
+
return InterpolateEaseInSine(t);
|
|
64
|
+
case InterpolationType.EASEOUTSINE:
|
|
65
|
+
return InterpolateEaseOutSine(t);
|
|
66
|
+
case InterpolationType.EASESINE:
|
|
67
|
+
return InterpolateEaseInOutSine(t);
|
|
68
|
+
case InterpolationType.EASEINEXPO:
|
|
69
|
+
return InterpolateEaseInExpo(t);
|
|
70
|
+
case InterpolationType.EASEOUTEXPO:
|
|
71
|
+
return InterpolateEaseOutExpo(t);
|
|
72
|
+
case InterpolationType.EASEEXPO:
|
|
73
|
+
return InterpolateEaseInOutExpo(t);
|
|
74
|
+
case InterpolationType.EASEINELASTIC:
|
|
75
|
+
return InterpolateEaseInElastic(t);
|
|
76
|
+
case InterpolationType.EASEOUTELASTIC:
|
|
77
|
+
return InterpolateEaseOutElastic(t);
|
|
78
|
+
case InterpolationType.EASEELASTIC:
|
|
79
|
+
return InterpolateEaseInOutElastic(t);
|
|
80
|
+
case InterpolationType.EASEINBOUNCE:
|
|
81
|
+
return InterpolateEaseInBounce(t);
|
|
82
|
+
case InterpolationType.EASEOUTEBOUNCE:
|
|
83
|
+
return InterpolateEaseOutBounce(t);
|
|
84
|
+
case InterpolationType.EASEBOUNCE:
|
|
85
|
+
return InterpolateEaseInOutBounce(t);
|
|
86
|
+
default:
|
|
87
|
+
return InterpolateLinear(t);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function InterpolateLinear(t) {
|
|
91
|
+
return t;
|
|
92
|
+
}
|
|
93
|
+
function InterpolateEaseInQuad(t) {
|
|
94
|
+
return t * t;
|
|
95
|
+
}
|
|
96
|
+
function InterpolateEaseOutQuad(t) {
|
|
97
|
+
return t * (2 - t);
|
|
98
|
+
}
|
|
99
|
+
function InterpolateEaseQuad(t) {
|
|
100
|
+
return (t * t) / (2.0 * (t * t - t) + 1.0);
|
|
101
|
+
}
|
|
102
|
+
function InterpolateEaseInSine(t) {
|
|
103
|
+
return 1 - Math.cos((t * Math.PI) / 2);
|
|
104
|
+
}
|
|
105
|
+
function InterpolateEaseOutSine(t) {
|
|
106
|
+
return Math.sin((t * Math.PI) / 2);
|
|
107
|
+
}
|
|
108
|
+
function InterpolateEaseInOutSine(t) {
|
|
109
|
+
return -(Math.cos(Math.PI * t) - 1) / 2;
|
|
110
|
+
}
|
|
111
|
+
function InterpolateEaseInExpo(t) {
|
|
112
|
+
return t === 0 ? 0 : Math.pow(2, 10 * t - 10);
|
|
113
|
+
}
|
|
114
|
+
function InterpolateEaseOutExpo(t) {
|
|
115
|
+
return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);
|
|
116
|
+
}
|
|
117
|
+
function InterpolateEaseInOutExpo(t) {
|
|
118
|
+
return t === 0
|
|
119
|
+
? 0
|
|
120
|
+
: t === 1
|
|
121
|
+
? 1
|
|
122
|
+
: t < 0.5
|
|
123
|
+
? Math.pow(2, 20 * t - 10) / 2
|
|
124
|
+
: (2 - Math.pow(2, -20 * t + 10)) / 2;
|
|
125
|
+
}
|
|
126
|
+
function InterpolateEaseInElastic(t) {
|
|
127
|
+
const c4 = (2 * Math.PI) / 3;
|
|
128
|
+
return t === 0
|
|
129
|
+
? 0
|
|
130
|
+
: t === 1
|
|
131
|
+
? 1
|
|
132
|
+
: -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4);
|
|
133
|
+
}
|
|
134
|
+
function InterpolateEaseOutElastic(t) {
|
|
135
|
+
const c5 = (2 * Math.PI) / 3;
|
|
136
|
+
return t === 0
|
|
137
|
+
? 0
|
|
138
|
+
: t === 1
|
|
139
|
+
? 1
|
|
140
|
+
: Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c5) + 1;
|
|
141
|
+
}
|
|
142
|
+
function InterpolateEaseInOutElastic(t) {
|
|
143
|
+
const c6 = (2 * Math.PI) / 4.5;
|
|
144
|
+
return t === 0
|
|
145
|
+
? 0
|
|
146
|
+
: t === 1
|
|
147
|
+
? 1
|
|
148
|
+
: t < 0.5
|
|
149
|
+
? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c6)) / 2
|
|
150
|
+
: (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c6)) / 2 + 1;
|
|
151
|
+
}
|
|
152
|
+
function InterpolateEaseInBounce(t) {
|
|
153
|
+
return 1 - bounce(1 - t);
|
|
154
|
+
}
|
|
155
|
+
function InterpolateEaseOutBounce(t) {
|
|
156
|
+
return bounce(t);
|
|
157
|
+
}
|
|
158
|
+
function InterpolateEaseInOutBounce(t) {
|
|
159
|
+
return t < 0.5 ? (1 - bounce(1 - 2 * t)) / 2 : (1 + bounce(2 * t - 1)) / 2;
|
|
160
|
+
}
|
|
161
|
+
function bounce(x) {
|
|
162
|
+
const n1 = 7.5625;
|
|
163
|
+
const d1 = 2.75;
|
|
164
|
+
if (x < 1 / d1) {
|
|
165
|
+
return n1 * x * x;
|
|
166
|
+
}
|
|
167
|
+
else if (x < 2 / d1) {
|
|
168
|
+
return n1 * (x -= 1.5 / d1) * x + 0.75;
|
|
169
|
+
}
|
|
170
|
+
else if (x < 2.5 / d1) {
|
|
171
|
+
return n1 * (x -= 2.25 / d1) * x + 0.9375;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
return n1 * (x -= 2.625 / d1) * x + 0.984375;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export function createCatmullRomSpline(points, nbPoints, closed) {
|
|
178
|
+
const catmullRom = new Array();
|
|
179
|
+
const step = 1.0 / nbPoints;
|
|
180
|
+
let amount = 0.0;
|
|
181
|
+
if (closed) {
|
|
182
|
+
const pointsCount = points.length;
|
|
183
|
+
for (let i = 0; i < pointsCount; i++) {
|
|
184
|
+
amount = 0;
|
|
185
|
+
for (let c = 0; c < nbPoints; c++) {
|
|
186
|
+
catmullRom.push(Vector3.catmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount));
|
|
187
|
+
amount += step;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catmullRom.push(catmullRom[0]);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const totalPoints = new Array();
|
|
194
|
+
totalPoints.push(Vector3.clone(points[0]));
|
|
195
|
+
Array.prototype.push.apply(totalPoints, points);
|
|
196
|
+
totalPoints.push(Vector3.clone(points[points.length - 1]));
|
|
197
|
+
let i = 0;
|
|
198
|
+
for (; i < totalPoints.length - 3; i++) {
|
|
199
|
+
amount = 0;
|
|
200
|
+
for (let c = 0; c < nbPoints; c++) {
|
|
201
|
+
catmullRom.push(Vector3.catmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount));
|
|
202
|
+
amount += step;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
i--;
|
|
206
|
+
catmullRom.push(Vector3.catmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount));
|
|
207
|
+
}
|
|
208
|
+
return catmullRom;
|
|
209
|
+
}
|
|
210
|
+
export function areAABBIntersecting(aMin, aMax, bMin, bMax) {
|
|
211
|
+
return (aMin.x <= bMax.x &&
|
|
212
|
+
aMax.x >= bMin.x &&
|
|
213
|
+
aMin.y <= bMax.y &&
|
|
214
|
+
aMax.y >= bMin.y &&
|
|
215
|
+
aMin.z <= bMax.z &&
|
|
216
|
+
aMax.z >= bMin.z);
|
|
217
|
+
}
|
|
218
|
+
export function areSpheresIntersecting(aPos, aRadius, bPos, bRadius) {
|
|
219
|
+
const sqDist = Vector3.distanceSquared(aPos, bPos);
|
|
220
|
+
const radiusSum = aRadius + bRadius;
|
|
221
|
+
return sqDist < radiusSum * radiusSum;
|
|
222
|
+
}
|
|
223
|
+
export function areAABBSphereIntersecting(boxMin, boxMax, spherePos, sphereRadius) {
|
|
224
|
+
let dmin = 0;
|
|
225
|
+
if (spherePos.x < boxMin.x)
|
|
226
|
+
dmin += (boxMin.x - spherePos.x) * (boxMin.x - spherePos.x);
|
|
227
|
+
if (spherePos.x > boxMax.x)
|
|
228
|
+
dmin += (spherePos.x - boxMax.x) * (spherePos.x - boxMax.x);
|
|
229
|
+
if (spherePos.y < boxMin.y)
|
|
230
|
+
dmin += (boxMin.y - spherePos.y) * (boxMin.y - spherePos.y);
|
|
231
|
+
if (spherePos.y > boxMax.y)
|
|
232
|
+
dmin += (spherePos.y - boxMax.y) * (spherePos.y - boxMax.y);
|
|
233
|
+
if (spherePos.z < boxMin.z)
|
|
234
|
+
dmin += (boxMin.z - spherePos.z) * (boxMin.z - spherePos.z);
|
|
235
|
+
if (spherePos.z > boxMax.z)
|
|
236
|
+
dmin += (spherePos.z - boxMax.z) * (spherePos.z - boxMax.z);
|
|
237
|
+
return dmin < sphereRadius * sphereRadius;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9tYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFhbkQsTUFBTSxVQUFVLEtBQUssQ0FDbkIsS0FBYSxFQUNiLElBQVksRUFDWixJQUFZLEVBQ1osSUFBWSxFQUNaLElBQVk7SUFFWixJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ3hCLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7SUFDeEIsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUE7QUFDbEQsQ0FBQztBQVNELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFjO0lBQzdDLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFHM0MsSUFBSSxDQUFDLFNBQVM7UUFBRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUVyQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFBO0lBRTdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQTtJQUMzQixDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksY0FBYyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFBO1FBQ25ELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMs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QU0sVUFBVSx5QkFBeUIsQ0FBQyxNQUFlLEVBQUUsTUFBZSxFQUFFLFNBQWtCLEVBQUUsWUFBb0I7SUFDbEgsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0lBRVosSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFN0QsT0FBTyxJQUFJLEdBQUcsWUFBWSxHQUFHLFlBQVksQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBUcmFuc2Zvcm0gfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBWZWN0b3IzLCBRdWF0ZXJuaW9uIH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcblxuLyoqXG4gKiBSZW1hcHMgYSB2YWx1ZSBmcm9tIG9uZSByYW5nZSBvZiB2YWx1ZXMgdG8gaXRzIGVxdWl2YWxlbnQsIHNjYWxlZCBpbiBwcm9wb3J0aW9uIHRvIGFub3RoZXIgcmFuZ2Ugb2YgdmFsdWVzLCB1c2luZyBtYXhpbXVtIGFuZCBtaW5pbXVtLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIHZhbHVlIGlucHV0IG51bWJlclxuICogQHBhcmFtIG1pbjEgLSBtaW4xIE1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlIG9mIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBtYXgxIC0gbWF4MSBNYXhpbXVtIHZhbHVlIGluIHRoZSByYW5nZSBvZiB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gbWluMiAtIG1pbjIgTWluaW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBtYXgyIC0gbWF4MiBNYXhpbXVtIHZhbHVlIGluIHRoZSByYW5nZSBvZiB0aGUgb3V0cHV0LlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyByZW1hcHBlZCB2YWx1ZSBiZXR3ZWVuIHRoZSBuZXcgbWluIGFuZCBtYXhcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtaW4xOiBudW1iZXIsXG4gIG1heDE6IG51bWJlcixcbiAgbWluMjogbnVtYmVyLFxuICBtYXgyOiBudW1iZXJcbikge1xuICBsZXQgcmFuZ2UxID0gbWF4MSAtIG1pbjFcbiAgbGV0IHJhbmdlMiA9IG1heDIgLSBtaW4yXG4gIHJldHVybiAoKHZhbHVlIC0gbWluMSkgLyByYW5nZTEpICogcmFuZ2UyICsgbWluMlxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIGFuIGVudGl0eSB0aGF0IGlzIGEgY2hpbGQgb2Ygb3RoZXIgZW50aXRpZXMsIHJlbGF0aXZlIHRvIHRoZSBzY2VuZSBpbnN0ZWFkIG9mIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQuIFJldHVybnMgYSBWZWN0b3IzLlxuICpcbiAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgdG8gY2FsY3VsYXRlIHBvc2l0aW9uXG4gKiBAcmV0dXJucyBUaGUgRW50aXR5J3MgZ2xvYmFsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzY2VuZSdzIG9yaWdpblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ybGRQb3NpdGlvbihlbnRpdHk6IEVudGl0eSk6IFZlY3RvcjMge1xuICBsZXQgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmdldE9yTnVsbChlbnRpdHkpXG5cblxuICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIFZlY3RvcjMuWmVybygpXG5cbiAgbGV0IHBhcmVudCA9IHRyYW5zZm9ybS5wYXJlbnRcblxuICBpZiAoIXBhcmVudCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ucG9zaXRpb25cbiAgfSBlbHNlIHtcbiAgICBsZXQgcGFyZW50Um90YXRpb24gPSBUcmFuc2Zvcm0uZ2V0KHBhcmVudCkucm90YXRpb25cbiAgICByZXR1cm4gVmVjdG9yMy5hZGQoZ2V0V29ybGRQb3NpdGlvbihwYXJlbnQpLCBWZWN0b3IzLnJvdGF0ZSh0cmFuc2Zvcm0ucG9zaXRpb24sIGdldFdvcmxkUm90YXRpb24ocGFyZW50KSkpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBhbiBlbnRpdHkgdGhhdCBpcyBhIGNoaWxkIG9mIG90aGVyIGVudGl0aWVzLCByZWxhdGl2ZSB0byB0aGUgc2NlbmUgaW5zdGVhZCBvZiByZWxhdGl2ZSB0byB0aGUgcGFyZW50LiBSZXR1cm5zIGEgVmVjdG9yMy5cbiAqXG4gKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IHRvIGNhbGN1bGF0ZSBwb3NpdGlvblxuICogQHJldHVybnMgVGhlIEVudGl0eSdzIGdsb2JhbCByb3RhdGlvbiBpbiByZWZlcmVuY2UgdG8gdGhlIHNjZW5lJ3Mgb3JpZ2luXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JsZFJvdGF0aW9uKGVudGl0eTogRW50aXR5KTogUXVhdGVybmlvbiB7XG4gIGxldCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0T3JOdWxsKGVudGl0eSlcblxuICBpZiAoIXRyYW5zZm9ybSlcbiAgICByZXR1cm4gUXVhdGVybmlvbi5JZGVudGl0eSgpXG5cbiAgbGV0IHBhcmVudCA9IHRyYW5zZm9ybS5wYXJlbnRcblxuICBpZiAoIXBhcmVudCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ucm90YXRpb25cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseSh0cmFuc2Zvcm0ucm90YXRpb24sIGdldFdvcmxkUm90YXRpb24ocGFyZW50KSlcbiAgfVxufVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGVudW0gSW50ZXJwb2xhdGlvblR5cGUge1xuICBMSU5FQVIgPSAnbGluZWFyJyxcblxuICBFQVNFSU5RVUFEID0gJ2Vhc2VpbnF1YWQnLFxuICBFQVNFT1VUUVVBRCA9ICdlYXNlb3V0cXVhZCcsXG4gIEVBU0VRVUFEID0gJ2Vhc2VxdWFkJyxcblxuICBFQVNFSU5TSU5FID0gJ2Vhc2VpbnNpbmUnLFxuICBFQVNFT1VUU0lORSA9ICdlYXNlb3V0c2luZScsXG4gIEVBU0VTSU5FID0gJ2Vhc2Vpbm91dHNpbmUnLFxuXG4gIEVBU0VJTkVYUE8gPSAnZWFzZWluZXhwbycsXG4gIEVBU0VPVVRFWFBPID0gJ2Vhc2VvdXRleHBvJyxcbiAgRUFTRUVYUE8gPSAnZWFzZWlub3V0ZXhwbycsXG5cbiAgRUFTRUlORUxBU1RJQyA9ICdlYXNlaW5lbGFzdGljJyxcbiAgRUFTRU9VVEVMQVNUSUMgPSAnZWFzZW91dGVsYXN0aWMnLFxuICBFQVNFRUxBU1RJQyA9ICdlYXNlaW5vdXRlbGFzdGljJyxcblxuICBFQVNFSU5CT1VOQ0UgPSAnZWFzZWluYm91bmNlJyxcbiAgRUFTRU9VVEVCT1VOQ0UgPSAnZWFzZW91dGJvdW5jZScsXG4gIEVBU0VCT1VOQ0UgPSAnZWFzZWlub3V0Ym91bmNlJyxcbn1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh0eXBlOiBJbnRlcnBvbGF0aW9uVHlwZSwgdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5MSU5FQVI6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXIodClcbiAgICBjYXNlIEludGVycG9sYXRpb25UeXBlLkVBU0VJTlFVQUQ6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5RdWFkKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFT1VUUVVBRDpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VPdXRRdWFkKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFUVVBRDpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VRdWFkKHQpXG5cdCAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5TSU5FOlxuXHRcdCAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluU2luZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVFNJTkU6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0U2luZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRVNJTkU6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRTaW5lKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5FWFBPOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluRXhwbyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVEVYUE86XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0RXhwbyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUVYUE86XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRFeHBvKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5FTEFTVElDOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluRWxhc3RpYyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVEVMQVNUSUM6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0RWxhc3RpYyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUVMQVNUSUM6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRFbGFzdGljKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5CT1VOQ0U6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5Cb3VuY2UodClcbiAgICBjYXNlIEludGVycG9sYXRpb25UeXBlLkVBU0VPVVRFQk9VTkNFOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZU91dEJvdW5jZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUJPVU5DRTpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VJbk91dEJvdW5jZSh0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXIodClcbiAgfVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUxpbmVhcih0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdFxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJblF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHQgKiB0XG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dFF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHQgKiAoMiAtIHQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZVF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuICh0ICogdCkgLyAoMi4wICogKHQgKiB0IC0gdCkgKyAxLjApXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZUluU2luZSh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VPdXRTaW5lKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMilcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRTaW5lKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiAtKE1hdGguY29zKE1hdGguUEkgKiB0KSAtIDEpIC8gMlxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkV4cG8odDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPT09IDAgPyAwIDogTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dEV4cG8odDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPT09IDEgPyAxIDogMSAtIE1hdGgucG93KDIsIC0xMCAqIHQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZUluT3V0RXhwbyh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gdCA9PT0gMFxuXHRcdFx0PyAwXG5cdFx0XHQ6IHQgPT09IDFcblx0XHRcdD8gMVxuXHRcdFx0OiB0IDwgMC41XG5cdFx0XHQ/IE1hdGgucG93KDIsIDIwICogdCAtIDEwKSAvIDJcblx0XHRcdDogKDIgLSBNYXRoLnBvdygyLCAtMjAgKiB0ICsgMTApKSAvIDJcbn1cblxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzQgPSAoMiAqIE1hdGguUEkpIC8gM1xuXG5cdHJldHVybiB0ID09PSAwXG5cdFx0XHQ/IDBcblx0XHRcdDogdCA9PT0gMVxuXHRcdFx0PyAxXG5cdFx0XHQ6IC1NYXRoLnBvdygyLCAxMCAqIHQgLSAxMCkgKiBNYXRoLnNpbigodCAqIDEwIC0gMTAuNzUpICogYzQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dEVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzUgPSAoMiAqIE1hdGguUEkpIC8gM1xuXG5cdHJldHVybiB0ID09PSAwXG5cdFx0XHQ/IDBcblx0XHRcdDogdCA9PT0gMVxuXHRcdFx0PyAxXG5cdFx0XHQ6IE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHQgKiAxMCAtIDAuNzUpICogYzUpICsgMVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbk91dEVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzYgPSAoMiAqIE1hdGguUEkpIC8gNC41XG5cblx0cmV0dXJuIHQgPT09IDBcblx0XHRcdD8gMFxuXHRcdFx0OiB0ID09PSAxXG5cdFx0XHQ/IDFcblx0XHRcdDogdCA8IDAuNVxuXHRcdFx0PyAtKE1hdGgucG93KDIsIDIwICogdCAtIDEwKSAqIE1hdGguc2luKCgyMCAqIHQgLSAxMS4xMjUpICogYzYpKSAvIDJcblx0XHRcdDogKE1hdGgucG93KDIsIC0yMCAqIHQgKyAxMCkgKiBNYXRoLnNpbigoMjAgKiB0IC0gMTEuMTI1KSAqIGM2KSkgLyAyICsgMVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkJvdW5jZSh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMSAtIGJvdW5jZSgxIC0gdClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlT3V0Qm91bmNlKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBib3VuY2UodClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRCb3VuY2UodDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPCAwLjUgPyAoMSAtIGJvdW5jZSgxIC0gMiAqIHQpKSAvIDIgOiAoMSArIGJvdW5jZSgyICogdCAtIDEpKSAvIDJcbn1cblxuZnVuY3Rpb24gYm91bmNlKHg6IG51bWJlcikge1xuXHRjb25zdCBuMSA9IDcuNTYyNVxuXHRjb25zdCBkMSA9IDIuNzVcblxuXHRpZiAoeCA8IDEgLyBkMSkge1xuXHRcdHJldHVybiBuMSAqIHggKiB4XG5cdH0gZWxzZSBpZiAoeCA8IDIgLyBkMSkge1xuXHRcdHJldHVybiBuMSAqICh4IC09IDEuNSAvIGQxKSAqIHggKyAwLjc1XG5cdH0gZWxzZSBpZiAoeCA8IDIuNSAvIGQxKSB7XG5cdFx0cmV0dXJuIG4xICogKHggLT0gMi4yNSAvIGQxKSAqIHggKyAwLjkzNzVcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbjEgKiAoeCAtPSAyLjYyNSAvIGQxKSAqIHggKyAwLjk4NDM3NVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXRtdWxsUm9tU3BsaW5lKHBvaW50czogVmVjdG9yM1tdLCBuYlBvaW50czogbnVtYmVyLCBjbG9zZWQ/OiBib29sZWFuKTogVmVjdG9yM1tdIHtcblx0Y29uc3QgY2F0bXVsbFJvbSA9IG5ldyBBcnJheTxWZWN0b3IzPigpO1xuXHRjb25zdCBzdGVwID0gMS4wIC8gbmJQb2ludHM7XG5cdGxldCBhbW91bnQgPSAwLjA7XG5cdGlmIChjbG9zZWQpIHtcblx0XHRjb25zdCBwb2ludHNDb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgaSsrKSB7XG5cdFx0XHRhbW91bnQgPSAwO1xuXHRcdFx0Zm9yIChsZXQgYyA9IDA7IGMgPCBuYlBvaW50czsgYysrKSB7XG5cdFx0XHRcdGNhdG11bGxSb20ucHVzaChcblx0XHRcdFx0XHRWZWN0b3IzLmNhdG11bGxSb20ocG9pbnRzW2kgJSBwb2ludHNDb3VudF0sIHBvaW50c1soaSArIDEpICUgcG9pbnRzQ291bnRdLCBwb2ludHNbKGkgKyAyKSAlIHBvaW50c0NvdW50XSwgcG9pbnRzWyhpICsgMykgJSBwb2ludHNDb3VudF0sIGFtb3VudClcblx0XHRcdFx0KTtcblx0XHRcdFx0YW1vdW50ICs9IHN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNhdG11bGxSb20ucHVzaChjYXRtdWxsUm9tWzBdKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCB0b3RhbFBvaW50cyA9IG5ldyBBcnJheTxWZWN0b3IzPigpO1xuXHRcdHRvdGFsUG9pbnRzLnB1c2goVmVjdG9yMy5jbG9uZShwb2ludHNbMF0pKTtcblx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0b3RhbFBvaW50cywgcG9pbnRzKTtcblx0XHR0b3RhbFBvaW50cy5wdXNoKFZlY3RvcjMuY2xvbmUocG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSkpO1xuXHRcdGxldCBpID0gMDtcblx0XHRmb3IgKDsgaSA8IHRvdGFsUG9pbnRzLmxlbmd0aCAtIDM7IGkrKykge1xuXHRcdFx0YW1vdW50ID0gMDtcblx0XHRcdGZvciAobGV0IGMgPSAwOyBjIDwgbmJQb2ludHM7IGMrKykge1xuXHRcdFx0XHRjYXRtdWxsUm9tLnB1c2goVmVjdG9yMy5jYXRtdWxsUm9tKHRvdGFsUG9pbnRzW2ldLCB0b3RhbFBvaW50c1tpICsgMV0sIHRvdGFsUG9pbnRzW2kgKyAyXSwgdG90YWxQb2ludHNbaSArIDNdLCBhbW91bnQpKTtcblx0XHRcdFx0YW1vdW50ICs9IHN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGktLTtcblx0XHRjYXRtdWxsUm9tLnB1c2goVmVjdG9yMy5jYXRtdWxsUm9tKHRvdGFsUG9pbnRzW2ldLCB0b3RhbFBvaW50c1tpICsgMV0sIHRvdGFsUG9pbnRzW2kgKyAyXSwgdG90YWxQb2ludHNbaSArIDNdLCBhbW91bnQpKTtcblx0fVxuXHRyZXR1cm4gY2F0bXVsbFJvbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUFBQkJJbnRlcnNlY3RpbmcoYU1pbjogVmVjdG9yMywgYU1heDogVmVjdG9yMywgYk1pbjogVmVjdG9yMywgYk1heDogVmVjdG9yMyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGFNaW4ueCA8PSBiTWF4LnggJiZcblx0XHRhTWF4LnggPj0gYk1pbi54ICYmXG5cdFx0YU1pbi55IDw9IGJNYXgueSAmJlxuXHRcdGFNYXgueSA+PSBiTWluLnkgJiZcblx0XHRhTWluLnogPD0gYk1heC56ICYmXG5cdFx0YU1heC56ID49IGJNaW4uelxuXHQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVTcGhlcmVzSW50ZXJzZWN0aW5nKGFQb3M6IFZlY3RvcjMsIGFSYWRpdXM6IG51bWJlciwgYlBvczogVmVjdG9yMywgYlJhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNxRGlzdCA9IFZlY3RvcjMuZGlzdGFuY2VTcXVhcmVkKGFQb3MsIGJQb3MpXG4gIGNvbnN0IHJhZGl1c1N1bSA9IGFSYWRpdXMgKyBiUmFkaXVzXG4gIHJldHVybiBzcURpc3QgPCByYWRpdXNTdW0gKiByYWRpdXNTdW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUFBQkJTcGhlcmVJbnRlcnNlY3RpbmcoYm94TWluOiBWZWN0b3IzLCBib3hNYXg6IFZlY3RvcjMsIHNwaGVyZVBvczogVmVjdG9yMywgc3BoZXJlUmFkaXVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgbGV0IGRtaW4gPSAwXG5cbiAgaWYgKHNwaGVyZVBvcy54IDwgYm94TWluLngpXG4gICAgZG1pbiArPSAoYm94TWluLnggLSBzcGhlcmVQb3MueCkgKiAoYm94TWluLnggLSBzcGhlcmVQb3MueClcbiAgaWYgKHNwaGVyZVBvcy54ID4gYm94TWF4LngpXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnggLSBib3hNYXgueCkgKiAoc3BoZXJlUG9zLnggLSBib3hNYXgueClcbiAgaWYgKHNwaGVyZVBvcy55IDwgYm94TWluLnkpXG4gICAgZG1pbiArPSAoYm94TWluLnkgLSBzcGhlcmVQb3MueSkgKiAoYm94TWluLnkgLSBzcGhlcmVQb3MueSlcbiAgaWYgKHNwaGVyZVBvcy55ID4gYm94TWF4LnkpXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnkgLSBib3hNYXgueSkgKiAoc3BoZXJlUG9zLnkgLSBib3hNYXgueSlcbiAgaWYgKHNwaGVyZVBvcy56IDwgYm94TWluLnopXG4gICAgZG1pbiArPSAoYm94TWluLnogLSBzcGhlcmVQb3MueikgKiAoYm94TWluLnogLSBzcGhlcmVQb3MueilcbiAgaWYgKHNwaGVyZVBvcy56ID4gYm94TWF4LnopXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnogLSBib3hNYXgueikgKiAoc3BoZXJlUG9zLnogLSBib3hNYXgueilcblxuICByZXR1cm4gZG1pbiA8IHNwaGVyZVJhZGl1cyAqIHNwaGVyZVJhZGl1c1xufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Entity, IEngine } from '@dcl/sdk/ecs';
|
|
2
|
+
import { Vector3 } from '@dcl/sdk/math';
|
|
3
|
+
export type Paths = ReturnType<typeof createPaths>;
|
|
4
|
+
export type OnFinishCallback = () => void;
|
|
5
|
+
export type OnPointReachedCallback = (pointIndex: number, point: Vector3, nextPoint: Vector3) => void;
|
|
6
|
+
declare function createPaths(targetEngine: IEngine): {
|
|
7
|
+
startStraightPath(entity: Entity, points: Vector3[], duration: number, faceDirection?: boolean, onFinishCallback?: OnFinishCallback, onPointReachedCallback?: OnPointReachedCallback): void;
|
|
8
|
+
startSmoothPath(entity: Entity, points: Vector3[], duration: number, segmentCount: number, faceDirection?: boolean, onFinishCallback?: OnFinishCallback, onPointReachedCallback?: OnPointReachedCallback): void;
|
|
9
|
+
stopPath(entity: Entity): void;
|
|
10
|
+
getOnFinishCallback(entity: Entity): OnFinishCallback | undefined;
|
|
11
|
+
};
|
|
12
|
+
export declare const paths: {
|
|
13
|
+
startStraightPath(entity: Entity, points: Vector3[], duration: number, faceDirection?: boolean, onFinishCallback?: OnFinishCallback, onPointReachedCallback?: OnPointReachedCallback): void;
|
|
14
|
+
startSmoothPath(entity: Entity, points: Vector3[], duration: number, segmentCount: number, faceDirection?: boolean, onFinishCallback?: OnFinishCallback, onPointReachedCallback?: OnPointReachedCallback): void;
|
|
15
|
+
stopPath(entity: Entity): void;
|
|
16
|
+
getOnFinishCallback(entity: Entity): OnFinishCallback | undefined;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { engine, EntityState, Schemas, Transform } from '@dcl/sdk/ecs';
|
|
2
|
+
import { Scalar, Vector3, Quaternion } from '@dcl/sdk/math';
|
|
3
|
+
import { createCatmullRomSpline } from './math';
|
|
4
|
+
function createPaths(targetEngine) {
|
|
5
|
+
const FollowPath = targetEngine.defineComponent('dcl.utils.FollowPath', {
|
|
6
|
+
points: Schemas.Array(Schemas.Vector3),
|
|
7
|
+
faceDirection: Schemas.Boolean,
|
|
8
|
+
speed: Schemas.Number,
|
|
9
|
+
normalizedTime: Schemas.Number,
|
|
10
|
+
currentIndex: Schemas.Number,
|
|
11
|
+
segmentTimes: Schemas.Array(Schemas.Number),
|
|
12
|
+
curveSegmentCount: Schemas.Number
|
|
13
|
+
});
|
|
14
|
+
const finishCbs = new Map();
|
|
15
|
+
const pointReachedCbs = new Map();
|
|
16
|
+
function unregisterEntity(entity) {
|
|
17
|
+
finishCbs.delete(entity);
|
|
18
|
+
pointReachedCbs.delete(entity);
|
|
19
|
+
FollowPath.deleteFrom(entity);
|
|
20
|
+
}
|
|
21
|
+
function system(dt) {
|
|
22
|
+
const deadPaths = [];
|
|
23
|
+
const pointReachedPaths = [];
|
|
24
|
+
for (const entity of finishCbs.keys()) {
|
|
25
|
+
if (targetEngine.getEntityState(entity) == EntityState.Removed || !FollowPath.has(entity)) {
|
|
26
|
+
unregisterEntity(entity);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const transform = Transform.getMutable(entity);
|
|
30
|
+
const path = FollowPath.getMutable(entity);
|
|
31
|
+
path.normalizedTime = Scalar.clamp(path.normalizedTime + dt * path.speed, 0, 1);
|
|
32
|
+
if (path.normalizedTime >= 1)
|
|
33
|
+
deadPaths.push(entity);
|
|
34
|
+
while (path.normalizedTime >= path.segmentTimes[path.currentIndex] &&
|
|
35
|
+
path.currentIndex < path.points.length - 1) {
|
|
36
|
+
if (path.faceDirection) {
|
|
37
|
+
const direction = Vector3.subtract(path.points[path.currentIndex + 1], path.points[path.currentIndex]);
|
|
38
|
+
transform.rotation = Quaternion.lookRotation(direction);
|
|
39
|
+
}
|
|
40
|
+
if (path.currentIndex > 0 && path.currentIndex % path.curveSegmentCount == 0) {
|
|
41
|
+
const pointIndex = path.currentIndex / path.curveSegmentCount;
|
|
42
|
+
const pointCoords = path.points[path.currentIndex];
|
|
43
|
+
const nextPointCoords = path.points[path.currentIndex + path.curveSegmentCount];
|
|
44
|
+
pointReachedPaths.push({ entity: entity, index: pointIndex, coords: pointCoords, nextCoords: nextPointCoords });
|
|
45
|
+
}
|
|
46
|
+
path.currentIndex += 1;
|
|
47
|
+
}
|
|
48
|
+
const timeDiff = path.segmentTimes[path.currentIndex] - path.segmentTimes[path.currentIndex - 1];
|
|
49
|
+
const coef = (path.segmentTimes[path.currentIndex] - path.normalizedTime) / timeDiff;
|
|
50
|
+
transform.position = Vector3.lerp(path.points[path.currentIndex], path.points[path.currentIndex - 1], coef);
|
|
51
|
+
}
|
|
52
|
+
for (const pointReached of pointReachedPaths) {
|
|
53
|
+
const callback = pointReachedCbs.get(pointReached.entity);
|
|
54
|
+
if (callback) {
|
|
55
|
+
callback(pointReached.index, pointReached.coords, pointReached.nextCoords);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const entity of deadPaths) {
|
|
59
|
+
const callback = finishCbs.get(entity);
|
|
60
|
+
unregisterEntity(entity);
|
|
61
|
+
if (callback)
|
|
62
|
+
callback();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
targetEngine.addSystem(system);
|
|
66
|
+
function startPath(entity, points, duration, faceDirection, curveSegmentCount, onFinishCallback, onPointReachedCallback) {
|
|
67
|
+
if (points.length < 2)
|
|
68
|
+
throw new Error('At least 2 points are required to form a path.');
|
|
69
|
+
if (duration == 0)
|
|
70
|
+
throw new Error('Path duration must not be zero');
|
|
71
|
+
if (curveSegmentCount) {
|
|
72
|
+
const loop = Vector3.equals(points[0], points[points.length - 1]);
|
|
73
|
+
if (loop) {
|
|
74
|
+
points.pop();
|
|
75
|
+
points.unshift(points.pop());
|
|
76
|
+
}
|
|
77
|
+
points = createCatmullRomSpline(points, curveSegmentCount, loop);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
curveSegmentCount = 1;
|
|
81
|
+
}
|
|
82
|
+
finishCbs.set(entity, onFinishCallback);
|
|
83
|
+
pointReachedCbs.set(entity, onPointReachedCallback);
|
|
84
|
+
let totalLength = 0;
|
|
85
|
+
const segmentLengths = [];
|
|
86
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
87
|
+
let sqDist = Vector3.distance(points[i], points[i + 1]);
|
|
88
|
+
totalLength += sqDist;
|
|
89
|
+
segmentLengths.push(sqDist);
|
|
90
|
+
}
|
|
91
|
+
const segmentTimes = [0];
|
|
92
|
+
for (let i = 0; i < segmentLengths.length; i++) {
|
|
93
|
+
segmentTimes.push(segmentLengths[i] / totalLength + segmentTimes[i]);
|
|
94
|
+
}
|
|
95
|
+
FollowPath.createOrReplace(entity, {
|
|
96
|
+
points: points,
|
|
97
|
+
segmentTimes: segmentTimes,
|
|
98
|
+
curveSegmentCount: curveSegmentCount,
|
|
99
|
+
speed: 1 / duration,
|
|
100
|
+
normalizedTime: 0,
|
|
101
|
+
currentIndex: 0,
|
|
102
|
+
faceDirection: faceDirection
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
startStraightPath(entity, points, duration, faceDirection, onFinishCallback, onPointReachedCallback) {
|
|
107
|
+
return startPath(entity, points, duration, faceDirection, 0, onFinishCallback, onPointReachedCallback);
|
|
108
|
+
},
|
|
109
|
+
startSmoothPath(entity, points, duration, segmentCount, faceDirection, onFinishCallback, onPointReachedCallback) {
|
|
110
|
+
if (segmentCount < 2 || !Number.isInteger(segmentCount))
|
|
111
|
+
throw new Error(`segmentCount must be an integer that is greater than 2, got: ${segmentCount}`);
|
|
112
|
+
return startPath(entity, points, duration, faceDirection, segmentCount, onFinishCallback, onPointReachedCallback);
|
|
113
|
+
},
|
|
114
|
+
stopPath(entity) {
|
|
115
|
+
unregisterEntity(entity);
|
|
116
|
+
},
|
|
117
|
+
getOnFinishCallback(entity) {
|
|
118
|
+
if (!finishCbs.has(entity))
|
|
119
|
+
throw new Error(`Entity ${entity} is not registered in triggers system`);
|
|
120
|
+
return finishCbs.get(entity);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export const paths = createPaths(engine);
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQVUsV0FBVyxFQUFXLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQVEvQyxTQUFTLFdBQVcsQ0FBQyxZQUFxQjtJQUN4QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLHNCQUFzQixFQUFFO1FBQ3RFLE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDdEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQzlCLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTTtRQUNyQixjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDOUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQzVCLFlBQVksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDM0MsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDbEMsQ0FBQyxDQUFBO0lBS0YsTUFBTSxTQUFTLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUE7SUFDOUMsTUFBTSxlQUFlLEdBQThCLElBQUksR0FBRyxFQUFFLENBQUE7SUFFNUQsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjO1FBQ3RDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QixVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFRCxTQUFT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O1FBQ0QsbUJBQW1CLENBQUMsTUFBYztZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxNQUFNLHVDQUF1QyxDQUFDLENBQUE7WUFDMUUsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlCLENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbmdpbmUsIEVudGl0eSwgRW50aXR5U3RhdGUsIElFbmdpbmUsIFNjaGVtYXMsIFRyYW5zZm9ybSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IFNjYWxhciwgVmVjdG9yMywgUXVhdGVybmlvbiB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBjcmVhdGVDYXRtdWxsUm9tU3BsaW5lIH0gZnJvbSAnLi9tYXRoJ1xuXG5cbmV4cG9ydCB0eXBlIFBhdGhzID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUGF0aHM+XG5cbmV4cG9ydCB0eXBlIE9uRmluaXNoQ2FsbGJhY2sgPSAoKSA9PiB2b2lkXG5leHBvcnQgdHlwZSBPblBvaW50UmVhY2hlZENhbGxiYWNrID0gKHBvaW50SW5kZXg6IG51bWJlciwgcG9pbnQ6IFZlY3RvcjMsIG5leHRQb2ludDogVmVjdG9yMykgPT4gdm9pZFxuXG5mdW5jdGlvbiBjcmVhdGVQYXRocyh0YXJnZXRFbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgRm9sbG93UGF0aCA9IHRhcmdldEVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2RjbC51dGlscy5Gb2xsb3dQYXRoJywge1xuICAgIHBvaW50czogU2NoZW1hcy5BcnJheShTY2hlbWFzLlZlY3RvcjMpLFxuICAgIGZhY2VEaXJlY3Rpb246IFNjaGVtYXMuQm9vbGVhbixcbiAgICBzcGVlZDogU2NoZW1hcy5OdW1iZXIsXG4gICAgbm9ybWFsaXplZFRpbWU6IFNjaGVtYXMuTnVtYmVyLFxuICAgIGN1cnJlbnRJbmRleDogU2NoZW1hcy5OdW1iZXIsXG4gICAgc2VnbWVudFRpbWVzOiBTY2hlbWFzLkFycmF5KFNjaGVtYXMuTnVtYmVyKSxcbiAgICBjdXJ2ZVNlZ21lbnRDb3VudDogU2NoZW1hcy5OdW1iZXJcbiAgfSlcblxuICB0eXBlIEZpbmlzaENhbGxiYWNrTWFwID0gTWFwPEVudGl0eSwgT25GaW5pc2hDYWxsYmFjayB8IHVuZGVmaW5lZD5cbiAgdHlwZSBPblBvaW50UmVhY2hlZENhbGxiYWNrTWFwID0gTWFwPEVudGl0eSwgT25Qb2ludFJlYWNoZWRDYWxsYmFjayB8IHVuZGVmaW5lZD5cblxuICBjb25zdCBmaW5pc2hDYnM6IEZpbmlzaENhbGxiYWNrTWFwID0gbmV3IE1hcCgpXG4gIGNvbnN0IHBvaW50UmVhY2hlZENiczogT25Qb2ludFJlYWNoZWRDYWxsYmFja01hcCA9IG5ldyBNYXAoKVxuXG4gIGZ1bmN0aW9uIHVucmVnaXN0ZXJFbnRpdHkoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBmaW5pc2hDYnMuZGVsZXRlKGVudGl0eSlcbiAgICBwb2ludFJlYWNoZWRDYnMuZGVsZXRlKGVudGl0eSlcbiAgICBGb2xsb3dQYXRoLmRlbGV0ZUZyb20oZW50aXR5KVxuICB9XG5cbiAgZnVuY3Rpb24gc3lzdGVtKGR0OiBudW1iZXIpIHtcbiAgICBjb25zdCBkZWFkUGF0aHMgPSBbXVxuICAgIGNvbnN0IHBvaW50UmVhY2hlZFBhdGhzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGZpbmlzaENicy5rZXlzKCkpIHtcbiAgICAgIGlmICh0YXJnZXRFbmdpbmUuZ2V0RW50aXR5U3RhdGUoZW50aXR5KSA9PSBFbnRpdHlTdGF0ZS5SZW1vdmVkIHx8ICFGb2xsb3dQYXRoLmhhcyhlbnRpdHkpKSB7XG4gICAgICAgIHVucmVnaXN0ZXJFbnRpdHkoZW50aXR5KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0TXV0YWJsZShlbnRpdHkpXG4gICAgICBjb25zdCBwYXRoID0gRm9sbG93UGF0aC5nZXRNdXRhYmxlKGVudGl0eSlcbiAgICAgIHBhdGgubm9ybWFsaXplZFRpbWUgPSBTY2FsYXIuY2xhbXAocGF0aC5ub3JtYWxpemVkVGltZSArIGR0ICogcGF0aC5zcGVlZCwgMCwgMSlcbiAgICAgIGlmIChwYXRoLm5vcm1hbGl6ZWRUaW1lID49IDEpXG4gICAgICAgIGRlYWRQYXRocy5wdXNoKGVudGl0eSlcblxuICAgICAgd2hpbGUgKFxuICAgICAgICBwYXRoLm5vcm1hbGl6ZWRUaW1lID49IHBhdGguc2VnbWVudFRpbWVzW3BhdGguY3VycmVudEluZGV4XSAmJlxuICAgICAgICBwYXRoLmN1cnJlbnRJbmRleCA8IHBhdGgucG9pbnRzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICBpZiAocGF0aC5mYWNlRGlyZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gVmVjdG9yMy5zdWJ0cmFjdChwYXRoLnBvaW50c1twYXRoLmN1cnJlbnRJbmRleCArIDFdLCBwYXRoLnBvaW50c1twYXRoLmN1cnJlbnRJbmRleF0pXG4gICAgICAgICAgdHJhbnNmb3JtLnJvdGF0aW9uID0gUXVhdGVybmlvbi5sb29rUm90YXRpb24oZGlyZWN0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmN1cnJlbnRJbmRleCA+IDAgJiYgcGF0aC5jdXJyZW50SW5kZXggJSBwYXRoLmN1cnZlU2VnbWVudENvdW50ID09IDApIHtcbiAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcGF0aC5jdXJyZW50SW5kZXggLyBwYXRoLmN1cnZlU2VnbWVudENvdW50XG4gICAgICAgICAgY29uc3QgcG9pbnRDb29yZHMgPSBwYXRoLnBvaW50c1twYXRoLmN1cnJlbnRJbmRleF1cbiAgICAgICAgICBjb25zdCBuZXh0UG9pbnRDb29yZHMgPSBwYXRoLnBvaW50c1twYXRoLmN1cnJlbnRJbmRleCArIHBhdGguY3VydmVTZWdtZW50Q291bnRdXG4gICAgICAgICAgcG9pbnRSZWFjaGVkUGF0aHMucHVzaCh7ZW50aXR5OiBlbnRpdHksIGluZGV4OiBwb2ludEluZGV4LCBjb29yZHM6IHBvaW50Q29vcmRzLCBuZXh0Q29vcmRzOiBuZXh0UG9pbnRDb29yZHN9KVxuICAgICAgICB9XG4gICAgICAgIHBhdGguY3VycmVudEluZGV4ICs9IDFcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZURpZmYgPSBwYXRoLnNlZ21lbnRUaW1lc1twYXRoLmN1cnJlbnRJbmRleF0gLSBwYXRoLnNlZ21lbnRUaW1lc1twYXRoLmN1cnJlbnRJbmRleCAtIDFdXG4gICAgICBjb25zdCBjb2VmID0gKHBhdGguc2VnbWVudFRpbWVzW3BhdGguY3VycmVudEluZGV4XSAtIHBhdGgubm9ybWFsaXplZFRpbWUpIC8gdGltZURpZmZcbiAgICAgIHRyYW5zZm9ybS5wb3NpdGlvbiA9IFZlY3RvcjMubGVycChwYXRoLnBvaW50c1twYXRoLmN1cnJlbnRJbmRleF0sIHBhdGgucG9pbnRzW3BhdGguY3VycmVudEluZGV4IC0gMV0sIGNvZWYpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwb2ludFJlYWNoZWQgb2YgcG9pbnRSZWFjaGVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gcG9pbnRSZWFjaGVkQ2JzLmdldChwb2ludFJlYWNoZWQuZW50aXR5KVxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKHBvaW50UmVhY2hlZC5pbmRleCwgcG9pbnRSZWFjaGVkLmNvb3JkcywgcG9pbnRSZWFjaGVkLm5leHRDb29yZHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZGVhZFBhdGhzKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGZpbmlzaENicy5nZXQoZW50aXR5KVxuICAgICAgdW5yZWdpc3RlckVudGl0eShlbnRpdHkpXG4gICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICB0YXJnZXRFbmdpbmUuYWRkU3lzdGVtKHN5c3RlbSlcblxuICBmdW5jdGlvbiBzdGFydFBhdGgoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcG9pbnRzOiBWZWN0b3IzW10sXG4gICAgZHVyYXRpb246IG51bWJlcixcbiAgICBmYWNlRGlyZWN0aW9uPzogYm9vbGVhbixcbiAgICBjdXJ2ZVNlZ21lbnRDb3VudD86IG51bWJlcixcbiAgICBvbkZpbmlzaENhbGxiYWNrPzogT25GaW5pc2hDYWxsYmFjayxcbiAgICBvblBvaW50UmVhY2hlZENhbGxiYWNrPzogT25Qb2ludFJlYWNoZWRDYWxsYmFja1xuICApIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IDIgcG9pbnRzIGFyZSByZXF1aXJlZCB0byBmb3JtIGEgcGF0aC4nKVxuXG4gICAgaWYgKGR1cmF0aW9uID09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggZHVyYXRpb24gbXVzdCBub3QgYmUgemVybycpXG5cbiAgICBpZiAoY3VydmVTZWdtZW50Q291bnQpIHtcbiAgICAgIGNvbnN0IGxvb3AgPSBWZWN0b3IzLmVxdWFscyhwb2ludHNbMF0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0pXG4gICAgICBpZiAobG9vcCkge1xuICAgICAgICBwb2ludHMucG9wKClcbiAgICAgICAgcG9pbnRzLnVuc2hpZnQocG9pbnRzLnBvcCgpISlcbiAgICAgIH1cbiAgICAgIHBvaW50cyA9IGNyZWF0ZUNhdG11bGxSb21TcGxpbmUocG9pbnRzLCBjdXJ2ZVNlZ21lbnRDb3VudCwgbG9vcClcbiAgICB9IGVsc2Uge1xuICAgICAgY3VydmVTZWdtZW50Q291bnQgPSAxXG4gICAgfVxuXG4gICAgZmluaXNoQ2JzLnNldChlbnRpdHksIG9uRmluaXNoQ2FsbGJhY2spXG4gICAgcG9pbnRSZWFjaGVkQ2JzLnNldChlbnRpdHksIG9uUG9pbnRSZWFjaGVkQ2FsbGJhY2spXG5cbiAgICBsZXQgdG90YWxMZW5ndGggPSAwXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgbGV0IHNxRGlzdCA9IFZlY3RvcjMuZGlzdGFuY2UocG9pbnRzW2ldLCBwb2ludHNbaSArIDFdKVxuICAgICAgdG90YWxMZW5ndGggKz0gc3FEaXN0XG4gICAgICBzZWdtZW50TGVuZ3Rocy5wdXNoKHNxRGlzdClcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50VGltZXMgPSBbMF1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRMZW5ndGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzZWdtZW50VGltZXMucHVzaChzZWdtZW50TGVuZ3Roc1tpXSAvIHRvdGFsTGVuZ3RoICsgc2VnbWVudFRpbWVzW2ldKVxuICAgIH1cblxuICAgIEZvbGxvd1BhdGguY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgcG9pbnRzOiBwb2ludHMsXG4gICAgICBzZWdtZW50VGltZXM6IHNlZ21lbnRUaW1lcyxcbiAgICAgIGN1cnZlU2VnbWVudENvdW50OiBjdXJ2ZVNlZ21lbnRDb3VudCxcbiAgICAgIHNwZWVkOiAxIC8gZHVyYXRpb24sXG4gICAgICBub3JtYWxpemVkVGltZTogMCxcbiAgICAgIGN1cnJlbnRJbmRleDogMCxcbiAgICAgIGZhY2VEaXJlY3Rpb246IGZhY2VEaXJlY3Rpb25cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0cmFpZ2h0UGF0aChcbiAgICAgIGVudGl0eTogRW50aXR5LFxuICAgICAgcG9pbnRzOiBWZWN0b3IzW10sXG4gICAgICBkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgZmFjZURpcmVjdGlvbj86IGJvb2xlYW4sXG4gICAgICBvbkZpbmlzaENhbGxiYWNrPzogT25GaW5pc2hDYWxsYmFjayxcbiAgICAgIG9uUG9pbnRSZWFjaGVkQ2FsbGJhY2s/OiBPblBvaW50UmVhY2hlZENhbGxiYWNrXG4gICAgKSB7XG4gICAgICByZXR1cm4gc3RhcnRQYXRoKGVudGl0eSwgcG9pbnRzLCBkdXJhdGlvbiwgZmFjZURpcmVjdGlvbiwgMCwgb25GaW5pc2hDYWxsYmFjaywgb25Qb2ludFJlYWNoZWRDYWxsYmFjaylcbiAgICB9LFxuICAgIHN0YXJ0U21vb3RoUGF0aChcbiAgICAgIGVudGl0eTogRW50aXR5LFxuICAgICAgcG9pbnRzOiBWZWN0b3IzW10sXG4gICAgICBkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgc2VnbWVudENvdW50OiBudW1iZXIsXG4gICAgICBmYWNlRGlyZWN0aW9uPzogYm9vbGVhbixcbiAgICAgIG9uRmluaXNoQ2FsbGJhY2s/OiBPbkZpbmlzaENhbGxiYWNrLFxuICAgICAgb25Qb2ludFJlYWNoZWRDYWxsYmFjaz86IE9uUG9pbnRSZWFjaGVkQ2FsbGJhY2tcbiAgICApIHtcbiAgICAgIGlmIChzZWdtZW50Q291bnQgPCAyIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHNlZ21lbnRDb3VudCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudENvdW50IG11c3QgYmUgYW4gaW50ZWdlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiAyLCBnb3Q6ICR7c2VnbWVudENvdW50fWApXG4gICAgICByZXR1cm4gc3RhcnRQYXRoKGVudGl0eSwgcG9pbnRzLCBkdXJhdGlvbiwgZmFjZURpcmVjdGlvbiwgc2VnbWVudENvdW50LCBvbkZpbmlzaENhbGxiYWNrLCBvblBvaW50UmVhY2hlZENhbGxiYWNrKVxuICAgIH0sXG4gICAgc3RvcFBhdGgoZW50aXR5OiBFbnRpdHkpIHtcbiAgICAgIHVucmVnaXN0ZXJFbnRpdHkoZW50aXR5KVxuICAgIH0sXG4gICAgZ2V0T25GaW5pc2hDYWxsYmFjayhlbnRpdHk6IEVudGl0eSkge1xuICAgICAgaWYgKCFmaW5pc2hDYnMuaGFzKGVudGl0eSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7ZW50aXR5fSBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0cmlnZ2VycyBzeXN0ZW1gKVxuICAgICAgcmV0dXJuIGZpbmlzaENicy5nZXQoZW50aXR5KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGF0aHMgPSBjcmVhdGVQYXRocyhlbmdpbmUpXG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type DelayedHandle = {
|
|
2
|
+
id: string;
|
|
3
|
+
cancel: () => void;
|
|
4
|
+
};
|
|
5
|
+
export declare const delayedFunction: (cb: () => void, delayMs: number) => DelayedHandle;
|
|
6
|
+
export declare function clearDelayedFunction(handleOrId: DelayedHandle | string | undefined | null): void;
|
|
7
|
+
export declare function debugTriggers(): void;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { engine, MeshRenderer, TriggerArea, Material } from "@dcl/sdk/ecs";
|
|
2
|
+
import { Color4 } from "@dcl/sdk/math";
|
|
3
|
+
let __delayedId = 0;
|
|
4
|
+
export const delayedFunction = (cb, delayMs) => {
|
|
5
|
+
const id = `delayedFunction_${++__delayedId}`;
|
|
6
|
+
let timeMs = 0;
|
|
7
|
+
let cancelled = false;
|
|
8
|
+
const system = (dt) => {
|
|
9
|
+
if (cancelled) {
|
|
10
|
+
engine.removeSystem(id);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
timeMs += dt * 1000;
|
|
14
|
+
if (timeMs < delayMs)
|
|
15
|
+
return;
|
|
16
|
+
timeMs = 0;
|
|
17
|
+
engine.removeSystem(id);
|
|
18
|
+
if (!cancelled) {
|
|
19
|
+
cb && cb();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
engine.addSystem(system, undefined, id);
|
|
23
|
+
const cancel = () => {
|
|
24
|
+
cancelled = true;
|
|
25
|
+
engine.removeSystem(id);
|
|
26
|
+
};
|
|
27
|
+
return { id, cancel };
|
|
28
|
+
};
|
|
29
|
+
export function clearDelayedFunction(handleOrId) {
|
|
30
|
+
if (!handleOrId)
|
|
31
|
+
return;
|
|
32
|
+
if (typeof handleOrId === 'string') {
|
|
33
|
+
engine.removeSystem(handleOrId);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
handleOrId.cancel();
|
|
37
|
+
}
|
|
38
|
+
export function debugTriggers() {
|
|
39
|
+
for (const [entity] of engine.getEntitiesWith(TriggerArea)) {
|
|
40
|
+
MeshRenderer.setSphere(entity);
|
|
41
|
+
Material.setPbrMaterial(entity, {
|
|
42
|
+
albedoColor: Color4.create(1, 0, 0, 0.3)
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMxRSxPQUFPLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztBQU9wQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxFQUFjLEVBQUUsT0FBZSxFQUFpQixFQUFFO0lBQzlFLE1BQU0sRUFBRSxHQUFHLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQzdDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQzVCLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3ZCLE9BQU07UUFDUixDQUFDO1FBQ0QsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxNQUFNLEdBQUcsT0FBTztZQUFFLE9BQU87UUFDN0IsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNYLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUNoQixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQTtJQUVELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDekIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFVBQXFEO0lBQ3hGLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTTtJQUN2QixJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBRW5DLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDL0IsT0FBTTtJQUNSLENBQUM7SUFDRCxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUE7QUFDckIsQ0FBQztBQUlDLE1BQU0sVUFBVSxhQUFhO0lBRTNCLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlCLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQztTQUN6QyxDQUFDLENBQUE7SUFDSixDQUFDO0FBSUgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuZ2luZSwgTWVzaFJlbmRlcmVyLCBUcmlnZ2VyQXJlYSwgTWF0ZXJpYWwgfSBmcm9tIFwiQGRjbC9zZGsvZWNzXCJcbmltcG9ydCB7IENvbG9yMywgQ29sb3I0IH0gZnJvbSBcIkBkY2wvc2RrL21hdGhcIjtcblxubGV0IF9fZGVsYXllZElkID0gMDtcblxuZXhwb3J0IHR5cGUgRGVsYXllZEhhbmRsZSA9IHtcbiAgaWQ6IHN0cmluZ1xuICBjYW5jZWw6ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IGRlbGF5ZWRGdW5jdGlvbiA9IChjYjogKCkgPT4gdm9pZCwgZGVsYXlNczogbnVtYmVyKTogRGVsYXllZEhhbmRsZSA9PiB7XG4gICAgY29uc3QgaWQgPSBgZGVsYXllZEZ1bmN0aW9uXyR7KytfX2RlbGF5ZWRJZH1gXG4gICAgbGV0IHRpbWVNcyA9IDA7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3lzdGVtID0gKGR0OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgZW5naW5lLnJlbW92ZVN5c3RlbShpZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aW1lTXMgKz0gZHQgKiAxMDAwO1xuICAgICAgaWYgKHRpbWVNcyA8IGRlbGF5TXMpIHJldHVybjtcbiAgICAgIHRpbWVNcyA9IDA7XG4gICAgICBlbmdpbmUucmVtb3ZlU3lzdGVtKGlkKTtcbiAgICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAgIGNiICYmIGNiKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5naW5lLmFkZFN5c3RlbShzeXN0ZW0sIHVuZGVmaW5lZCwgaWQpO1xuXG4gICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgZW5naW5lLnJlbW92ZVN5c3RlbShpZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBpZCwgY2FuY2VsIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRGVsYXllZEZ1bmN0aW9uKGhhbmRsZU9ySWQ6IERlbGF5ZWRIYW5kbGUgfCBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gIGlmICghaGFuZGxlT3JJZCkgcmV0dXJuXG4gIGlmICh0eXBlb2YgaGFuZGxlT3JJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBjYW5jZWwgYnkgaWQvbmFtZVxuICAgIGVuZ2luZS5yZW1vdmVTeXN0ZW0oaGFuZGxlT3JJZClcbiAgICByZXR1cm5cbiAgfVxuICBoYW5kbGVPcklkLmNhbmNlbCgpXG59XG5cblxuXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWJ1Z1RyaWdnZXJzKCl7XG5cbiAgICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoVHJpZ2dlckFyZWEpKSB7XG4gICAgICBNZXNoUmVuZGVyZXIuc2V0U3BoZXJlKGVudGl0eSlcbiAgICAgIE1hdGVyaWFsLnNldFBick1hdGVyaWFsKGVudGl0eSwge1xuICAgICAgICBhbGJlZG9Db2xvcjogQ29sb3I0LmNyZWF0ZSgxLCAwLCAwLCAwLjMpXG4gICAgICB9KVxuICAgIH1cblxuXG5cbiAgfSJdfQ==
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dcl-npc-toolkit",
|
|
3
|
-
"version": "1.5.2-
|
|
3
|
+
"version": "1.5.2-20251229114702.commit-02ef366",
|
|
4
4
|
"description": "A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"typings": "./dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"build": "tsc -p tsconfig.json"
|
|
8
|
+
"build": "tsc -p tsconfig.json",
|
|
9
|
+
"link-sdk": "cd node_modules/@dcl/sdk && npm link && cd ../js-runtime && npm link"
|
|
9
10
|
},
|
|
10
11
|
"repository": {
|
|
11
12
|
"type": "git",
|
|
@@ -26,7 +27,6 @@
|
|
|
26
27
|
},
|
|
27
28
|
"homepage": "https://github.com/decentraland-scenes/dcl-npc-toolkit#readme",
|
|
28
29
|
"devDependencies": {
|
|
29
|
-
"@dcl-sdk/utils": "latest",
|
|
30
30
|
"@dcl/sdk": "latest",
|
|
31
31
|
"typescript": "^5.0.2"
|
|
32
32
|
},
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@dcl/js-runtime": "latest"
|
|
38
38
|
},
|
|
39
|
-
"commit": "
|
|
39
|
+
"commit": "02ef3662ba4c2304268c2a93c3d758dff97c0197"
|
|
40
40
|
}
|