dcl-npc-toolkit 0.0.0 → 1.0.6-20230511223948.commit-74300a8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/npc.js ADDED
@@ -0,0 +1,365 @@
1
+ import { Animator, AvatarShape, Billboard, engine, GltfContainer, MeshCollider, MeshRenderer, pointerEventsSystem, Transform } from '@dcl/sdk/ecs';
2
+ import { Color3, Quaternion, Vector3 } from '@dcl/sdk/math';
3
+ import { NPCPathType, NPCState, NPCType } from './types';
4
+ import * as utils from '@dcl-sdk/utils';
5
+ import { IsFollowingPath } from './components';
6
+ import { handleDialogTyping, handlePathTimes } from './systems';
7
+ import { addDialog, closeDialog, npcDialogComponent } from './dialog';
8
+ export const walkingTimers = new Map();
9
+ export const npcDataComponent = new Map();
10
+ export let activeNPC = 0;
11
+ const walkingSystem = engine.addSystem(handlePathTimes);
12
+ const dialogSystem = engine.addSystem(handleDialogTyping);
13
+ const isCooldown = new Map();
14
+ const onActivateCbs = new Map();
15
+ const onWalkAwayCbs = new Map();
16
+ const animTimers = new Map();
17
+ const pointReachedCallbacks = new Map();
18
+ const onFinishCallbacks = new Map();
19
+ export function showDebug(debug) {
20
+ utils.triggers.enableDebugDraw(debug);
21
+ }
22
+ export function getData(npc) {
23
+ return npcDataComponent.get(npc);
24
+ }
25
+ export function create(transform, data) {
26
+ let npc = engine.addEntity();
27
+ let t = { position: transform.position ? transform.position : Vector3.create(0, 0, 0), rotation: transform.rotation ? transform.rotation : Quaternion.Zero(), scale: transform.scale ? transform.scale : Vector3.One() };
28
+ Transform.create(npc, t);
29
+ npcDataComponent.set(npc, {
30
+ introduced: false,
31
+ inCooldown: false,
32
+ coolDownDuration: data && data.coolDownDuration ? data.coolDownDuration : 5,
33
+ faceUser: data.faceUser,
34
+ walkingSpeed: 2,
35
+ walkingAnim: data && data.walkingAnim ? data.walkingAnim : undefined,
36
+ bubbleHeight: 2,
37
+ pathData: data.pathData ? data.pathData : undefined,
38
+ currentPathData: [],
39
+ manualStop: false,
40
+ pathIndex: 0,
41
+ state: NPCState.STANDING,
42
+ idleAnim: data && data.idleAnim ? data.idleAnim : "Idle"
43
+ });
44
+ if (data && data.noUI) { }
45
+ else if (data && data.portrait) { }
46
+ else {
47
+ addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined);
48
+ }
49
+ onActivateCbs.set(npc, () => {
50
+ data.onActivate();
51
+ });
52
+ if (data && data.hasOwnProperty("onWalkAway")) {
53
+ onWalkAwayCbs.set(npc, () => {
54
+ if (!data || !data.continueOnWalkAway) {
55
+ if (npcDialogComponent.has(npc)) {
56
+ npcDialogComponent.get(npc).visible = false;
57
+ }
58
+ }
59
+ else {
60
+ if (npcDialogComponent.has(npc)) {
61
+ npcDialogComponent.get(npc).visible = false;
62
+ }
63
+ }
64
+ data.onWalkAway();
65
+ });
66
+ }
67
+ addNPCBones(npc, data);
68
+ addClickReactions(npc, data);
69
+ addTriggerArea(npc, data);
70
+ if (data && data.pathData && data.pathData.speed) {
71
+ let npcData = npcDataComponent.get(npc);
72
+ npcData.walkingSpeed = data.pathData.speed;
73
+ }
74
+ if (data && data.coolDownDuration) {
75
+ let npcData = npcDataComponent.get(npc);
76
+ npcData.coolDownDuration = data.coolDownDuration;
77
+ }
78
+ if (data && data.pathData) {
79
+ let npcData = npcDataComponent.get(npc);
80
+ followPath(npc, npcData.pathData);
81
+ }
82
+ return npc;
83
+ }
84
+ function addNPCBones(npc, data) {
85
+ switch (data.type) {
86
+ case NPCType.AVATAR:
87
+ AvatarShape.create(npc, {
88
+ id: "npc",
89
+ name: "NPC",
90
+ bodyShape: "urn:decentraland:off-chain:base-avatars:BaseMale",
91
+ emotes: [],
92
+ wearables: [
93
+ "urn:decentraland:off-chain:base-avatars:f_eyes_00",
94
+ "urn:decentraland:off-chain:base-avatars:f_eyebrows_00",
95
+ "urn:decentraland:off-chain:base-avatars:f_mouth_00",
96
+ "urn:decentraland:off-chain:base-avatars:comfy_sport_sandals",
97
+ "urn:decentraland:off-chain:base-avatars:soccer_pants",
98
+ "urn:decentraland:off-chain:base-avatars:elegant_sweater",
99
+ ],
100
+ });
101
+ break;
102
+ case NPCType.CUSTOM:
103
+ GltfContainer.create(npc, {
104
+ src: data && data.model ? data.model : ""
105
+ });
106
+ Animator.create(npc, {
107
+ states: [{
108
+ name: data && data.idleAnim ? data.idleAnim : 'Idle',
109
+ clip: data && data.idleAnim ? data.idleAnim : 'Idle',
110
+ loop: true
111
+ }]
112
+ });
113
+ let npcData = npcDataComponent.get(npc);
114
+ npcData.idleAnim = data && data.idleAnim ? data.idleAnim : 'Idle';
115
+ npcData.lastPlayedAnim = npcDataComponent.get(npc).idleAnim;
116
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).idleAnim);
117
+ if (data && data.walkingAnim) {
118
+ npcDataComponent.get(npc).walkingAnim = data.walkingAnim;
119
+ let animations = Animator.getMutable(npc);
120
+ animations.states.push({ name: data.walkingAnim, clip: data.walkingAnim, loop: true });
121
+ }
122
+ break;
123
+ case NPCType.BLANK:
124
+ MeshRenderer.setBox(npc);
125
+ MeshCollider.setBox(npc);
126
+ break;
127
+ }
128
+ }
129
+ function addClickReactions(npc, data) {
130
+ let activateButton = data && data.onlyClickTrigger ? 0 : 1;
131
+ pointerEventsSystem.onPointerDown(npc, function () {
132
+ if (isCooldown.has(npc) || (npcDialogComponent.get(npc).visible))
133
+ return;
134
+ activate(npc);
135
+ }, {
136
+ button: activateButton,
137
+ hoverText: data && data.hoverText ? data.hoverText : 'Talk',
138
+ showFeedback: data && data.onlyExternalTrigger ? false : true,
139
+ });
140
+ if (data && data.onlyExternalTrigger) {
141
+ pointerEventsSystem.removeOnPointerDown(npc);
142
+ }
143
+ }
144
+ function addTriggerArea(npc, data) {
145
+ let triggerData = {};
146
+ if (!data || (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
147
+ onActivateCbs.set(npc, () => {
148
+ if (isCooldown.has(npc)) {
149
+ console.log(npc, ' in cooldown');
150
+ return;
151
+ }
152
+ else if ((npcDialogComponent.has(npc) && npcDialogComponent.get(npc).visible) ||
153
+ (data && data.onlyExternalTrigger) ||
154
+ (data && data.onlyClickTrigger)) {
155
+ return;
156
+ }
157
+ data.onActivate();
158
+ });
159
+ triggerData.onCameraEnter = onActivateCbs.get(npc);
160
+ }
161
+ if (!data || (data && !data.continueOnWalkAway)) {
162
+ triggerData.onCameraExit = () => {
163
+ handleWalkAway(npc);
164
+ };
165
+ }
166
+ if (!data ||
167
+ (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
168
+ triggerData.onCameraEnter = () => {
169
+ if (isCooldown.has(npc)) {
170
+ console.log(npc, ' in cooldown');
171
+ return;
172
+ }
173
+ activate(npc);
174
+ };
175
+ }
176
+ if (triggerData.onCameraEnter || triggerData.onCameraExit) {
177
+ utils.triggers.addTrigger(npc, 254, 1, [{ type: 'sphere', position: Vector3.Zero(), radius: data.reactDistance != undefined ? data.reactDistance : 6 }], triggerData.onCameraEnter ? triggerData.onCameraEnter : undefined, triggerData.onCameraExit ? triggerData.onCameraExit : undefined, Color3.Red());
178
+ }
179
+ }
180
+ export function followPath(npc, data) {
181
+ let npcData = npcDataComponent.get(npc);
182
+ let path = [];
183
+ if (data) {
184
+ npcData.pathData = data;
185
+ if (npcData.faceUser) {
186
+ Billboard.deleteFrom(npc);
187
+ }
188
+ if (data.startingPoint) {
189
+ data.path?.splice(0, data.startingPoint - 1);
190
+ }
191
+ let pos = Transform.get(npc).position;
192
+ path.push(Vector3.create(pos.x, pos.y, pos.z));
193
+ data.path?.forEach((p) => {
194
+ path.push(p);
195
+ });
196
+ onFinishCallbacks.set(npc, () => {
197
+ console.log('on finished callback');
198
+ if (data && data.onFinishCallback && !data.loop) {
199
+ data.onFinishCallback;
200
+ }
201
+ stopPath(npc);
202
+ });
203
+ pointReachedCallbacks.set(npc, () => {
204
+ console.log('on point reached callback');
205
+ let data = npcDataComponent.get(npc);
206
+ data.pathIndex += 1;
207
+ data.onReachedPointCallback ? data.onReachedPointCallback : undefined;
208
+ });
209
+ walkNPC(npc, npcData, data.pathType, data.totalDuration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
210
+ }
211
+ else {
212
+ if (npcData.manualStop) {
213
+ console.log('we have manual stop, need to pick back up where we left off');
214
+ }
215
+ else {
216
+ console.log('we are trying to follow a path witout starting one prior');
217
+ }
218
+ }
219
+ }
220
+ function walkNPC(npc, npcData, type, duration, path, pointReachedCallback, finishedCallback) {
221
+ if (IsFollowingPath.has(npc)) {
222
+ IsFollowingPath.deleteFrom(npc);
223
+ walkingTimers.delete(npc);
224
+ }
225
+ IsFollowingPath.create(npc);
226
+ if (type) {
227
+ if (type == NPCPathType.RIGID_PATH) {
228
+ utils.paths.startStraightPath(npc, path, duration, true, () => { finishedCallback(); }, () => { pointReachedCallback(); });
229
+ }
230
+ else {
231
+ utils.paths.startSmoothPath(npc, path, duration, 30, true, () => { finishedCallback(); }, () => { pointReachedCallback(); });
232
+ }
233
+ }
234
+ else {
235
+ utils.paths.startSmoothPath(npc, path, duration, 20, true, () => { finishedCallback(); }, () => { pointReachedCallback(); });
236
+ }
237
+ if (npcData.walkingAnim) {
238
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
239
+ npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
240
+ }
241
+ npcData.state = NPCState.FOLLOWPATH;
242
+ console.log('debug here');
243
+ }
244
+ export function stopWalking(npc, duration, finished) {
245
+ let npcData = npcDataComponent.get(npc);
246
+ npcData.state = NPCState.STANDING;
247
+ npcData.manualStop = true;
248
+ stopPath(npc);
249
+ if (duration) {
250
+ utils.timers.setTimeout(() => {
251
+ if (npcData.path) {
252
+ Animator.stopAllAnimations(npc, true);
253
+ if (npcDataComponent.get(npc).walkingAnim) {
254
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
255
+ npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
256
+ }
257
+ let duration = npcData.pathData.totalDuration;
258
+ let currentTimer = walkingTimers.get(npc);
259
+ console.log('current time is', currentTimer);
260
+ if (currentTimer) {
261
+ duration -= currentTimer;
262
+ }
263
+ let path = [];
264
+ npcData.pathData.path.forEach((p) => {
265
+ path.push(p);
266
+ });
267
+ path.splice(0, npcData.pathIndex);
268
+ let pos = Transform.get(npc).position;
269
+ path.unshift(Vector3.create(pos.x, pos.y, pos.z));
270
+ npcData.manualStop = false;
271
+ walkNPC(npc, npcData, npcData.pathData.pathType, duration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
272
+ }
273
+ }, duration * 1000);
274
+ }
275
+ }
276
+ function stopPath(npc) {
277
+ utils.paths.stopPath(npc);
278
+ IsFollowingPath.deleteFrom(npc);
279
+ let npcData = npcDataComponent.get(npc);
280
+ if (npcData.walkingAnim) {
281
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim);
282
+ npcData.lastPlayedAnim = npcData.idleAnim;
283
+ }
284
+ if (!npcData.manualStop) {
285
+ if (npcData.pathData.loop) {
286
+ npcData.pathIndex = 0;
287
+ walkingTimers.delete(npc);
288
+ console.log('we are looping path', npcData);
289
+ followPath(npc, npcData.pathData);
290
+ console.log(npcData);
291
+ }
292
+ }
293
+ }
294
+ export function activate(npc) {
295
+ activeNPC = npc;
296
+ onActivateCbs.get(npc)();
297
+ let npcData = npcDataComponent.get(npc);
298
+ if (npcData.faceUser) {
299
+ Billboard.create(npc, {
300
+ billboardMode: 2
301
+ });
302
+ }
303
+ isCooldown.set(npc, true);
304
+ npcData.inCooldown = true;
305
+ utils.timers.setTimeout(function () {
306
+ isCooldown.delete(npc);
307
+ npcDataComponent.get(npc).inCooldown = false;
308
+ if (Billboard.has(npc)) {
309
+ Billboard.deleteFrom(npc);
310
+ }
311
+ }, 1000 * npcData.coolDownDuration);
312
+ console.log('activated npc,', npcDataComponent.get(npc));
313
+ }
314
+ function endInteraction(npc) {
315
+ let npcData = npcDataComponent.get(npc);
316
+ npcData.state = NPCState.STANDING;
317
+ if (npcDialogComponent.has(npc) && npcDialogComponent.get(npc).visible) {
318
+ closeDialog(npc);
319
+ }
320
+ playAnimation(npc, npcDataComponent.get(npc).idleAnim);
321
+ if (npcData.faceUser) {
322
+ Billboard.deleteFrom(npc);
323
+ }
324
+ }
325
+ export function handleWalkAway(npc) {
326
+ let npcData = npcDataComponent.get(npc);
327
+ if (npcData.state == NPCState.FOLLOWPATH) {
328
+ return;
329
+ }
330
+ endInteraction(npc);
331
+ if (onWalkAwayCbs.get(npc)) {
332
+ onWalkAwayCbs.get(npc)();
333
+ }
334
+ }
335
+ export function playAnimation(npc, anim, noLoop, duration) {
336
+ let animations = Animator.getMutable(npc);
337
+ if (animations.states.filter((animation) => animation.name === anim).length == 0) {
338
+ animations.states.push({ name: anim, clip: anim, loop: noLoop ? false : true });
339
+ }
340
+ let npcData = npcDataComponent.get(npc);
341
+ if (npcData.state == NPCState.FOLLOWPATH) {
342
+ utils.paths.stopPath(npc);
343
+ }
344
+ if (animTimers.has(npc)) {
345
+ utils.timers.clearTimeout(animTimers.get(npc));
346
+ animTimers.delete(npc);
347
+ }
348
+ Animator.stopAllAnimations(npc);
349
+ Animator.playSingleAnimation(npc, anim, true);
350
+ if (duration) {
351
+ animTimers.set(npc, utils.timers.setTimeout(() => {
352
+ animTimers.delete(npc);
353
+ }, 1000 * duration));
354
+ }
355
+ npcData.lastPlayedAnim = anim;
356
+ }
357
+ export function changeIdleAnim(npc, animation, play) {
358
+ let npcData = npcDataComponent.get(npc);
359
+ npcData.idleAnim = animation;
360
+ if (play) {
361
+ playAnimation(npc, animation, true);
362
+ npcDataComponent.get(npc).lastPlayedAnim = animation;
363
+ }
364
+ }
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25wYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWlCLE1BQU0sRUFBVSxhQUFhLEVBQWMsWUFBWSxFQUFDLFlBQVksRUFBQyxtQkFBbUIsRUFBQyxTQUFTLEVBQWlCLE1BQU0sY0FBYyxDQUFBO0FBQ2pNLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMzRCxPQUFPLEVBQTJCLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFlLE1BQU0sU0FBUyxDQUFDO0FBQy9GLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUE7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUMxRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUMzRCxNQUFNLENBQUMsSUFBSSxTQUFTLEdBQVUsQ0FBQyxDQUFBO0FBRS9CLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7QUFDdkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBRXpELE1BQU0sVUFBVSxHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFBO0FBQzlDLE1BQU0sYUFBYSxHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFBO0FBQ2pELE1BQU0sYUFBYSxH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LFNBQVMsQ0FBQTtLQUN2RDtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbmltYXRvciwgQXZhdGFyU2hhcGUsIEJpbGxib2FyZCwgQmlsbGJvYXJkTW9kZSwgZW5naW5lLCBFbnRpdHksIEdsdGZDb250YWluZXIsIElucHV0QWN0aW9uLE1lc2hDb2xsaWRlcixNZXNoUmVuZGVyZXIscG9pbnRlckV2ZW50c1N5c3RlbSxUcmFuc2Zvcm0sIFRyYW5zZm9ybVR5cGUgfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBDb2xvcjMsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgRm9sbG93UGF0aERhdGEsIE5QQ0RhdGEsIE5QQ1BhdGhUeXBlLCBOUENTdGF0ZSwgTlBDVHlwZSwgVHJpZ2dlckRhdGEgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BkY2wtc2RrL3V0aWxzJ1xuaW1wb3J0IHsgSXNGb2xsb3dpbmdQYXRoIH0gZnJvbSAnLi9jb21wb25lbnRzJztcbmltcG9ydCB7IGhhbmRsZURpYWxvZ1R5cGluZywgaGFuZGxlUGF0aFRpbWVzIH0gZnJvbSAnLi9zeXN0ZW1zJztcbmltcG9ydCB7IGFkZERpYWxvZywgY2xvc2VEaWFsb2csIG5wY0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9nJztcblxuZXhwb3J0IGNvbnN0IHdhbGtpbmdUaW1lcnM6IE1hcDxFbnRpdHksbnVtYmVyPiA9IG5ldyBNYXAoKVxuZXhwb3J0IGNvbnN0IG5wY0RhdGFDb21wb25lbnQ6IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcbmV4cG9ydCBsZXQgYWN0aXZlTlBDOm51bWJlciA9IDBcblxuY29uc3Qgd2Fsa2luZ1N5c3RlbSA9IGVuZ2luZS5hZGRTeXN0ZW0oaGFuZGxlUGF0aFRpbWVzKVxuY29uc3QgZGlhbG9nU3lzdGVtID0gZW5naW5lLmFkZFN5c3RlbShoYW5kbGVEaWFsb2dUeXBpbmcpXG5cbmNvbnN0IGlzQ29vbGRvd246IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcbmNvbnN0IG9uQWN0aXZhdGVDYnM6IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcbmNvbnN0IG9uV2Fsa0F3YXlDYnM6IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcbmNvbnN0IGFuaW1UaW1lcnM6IE1hcDxFbnRpdHksYW55PiA9IG5ldyBNYXAoKVxuY29uc3QgcG9pbnRSZWFjaGVkQ2FsbGJhY2tzOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBvbkZpbmlzaENhbGxiYWNrczogTWFwPEVudGl0eSwgYW55PiA9IG5ldyBNYXAoKVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0RlYnVnKGRlYnVnOmJvb2xlYW4pe1xuICAgIHV0aWxzLnRyaWdnZXJzLmVuYWJsZURlYnVnRHJhdyhkZWJ1Zylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGEobnBjOkVudGl0eSl7XG4gICAgcmV0dXJuIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShcbiAgICB0cmFuc2Zvcm06IGFueSxcbiAgICBkYXRhOiBOUENEYXRhXG4pe1xuICAgIGxldCBucGMgPSBlbmdpbmUuYWRkRW50aXR5KClcblxuICAgIGxldCB0OlRyYW5zZm9ybVR5cGUgPSB7cG9zaXRpb246IHRyYW5zZm9ybS5wb3NpdGlvbiA/IHRyYW5zZm9ybS5wb3NpdGlvbiA6IFZlY3RvcjMuY3JlYXRlKDAsMCwwKSwgcm90YXRpb246IHRyYW5zZm9ybS5yb3RhdGlvbiA/IHRyYW5zZm9ybS5yb3RhdGlvbiA6IFF1YXRlcm5pb24uWmVybygpLCBzY2FsZTogdHJhbnNmb3JtLnNjYWxlID8gdHJhbnNmb3JtLnNjYWxlIDogVmVjdG9yMy5PbmUoKX1cbiAgICBUcmFuc2Zvcm0uY3JlYXRlKG5wYywgdClcblxuICAgIG5wY0RhdGFDb21wb25lbnQuc2V0KG5wYyx7XG4gICAgICAgIGludHJvZHVjZWQ6IGZhbHNlLFxuICAgICAgICBpbkNvb2xkb3duOiBmYWxzZSxcbiAgICAgICAgY29vbERvd25EdXJhdGlvbjogZGF0YSAmJiBkYXRhLmNvb2xEb3duRHVyYXRpb24gPyBkYXRhLmNvb2xEb3duRHVyYXRpb24gOiA1LFxuICAgICAgICBmYWNlVXNlcjpkYXRhLmZhY2VVc2VyLFxuICAgICAgICB3YWxraW5nU3BlZWQ6MixcbiAgICAgICAgd2Fsa2luZ0FuaW06IGRhdGEgJiYgZGF0YS53YWxraW5nQW5pbSA/IGRhdGEud2Fsa2luZ0FuaW0gOiB1bmRlZmluZWQsXG4gICAgICAgIGJ1YmJsZUhlaWdodDoyLFxuICAgICAgICBwYXRoRGF0YTogZGF0YS5wYXRoRGF0YSA/IGRhdGEucGF0aERhdGEgOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbnRQYXRoRGF0YTogW10sXG4gICAgICAgIG1hbnVhbFN0b3A6ZmFsc2UsXG4gICAgICAgIHBhdGhJbmRleDowLFxuICAgICAgICBzdGF0ZTpOUENTdGF0ZS5TVEFORElORyxcbiAgICAgICAgaWRsZUFuaW06IGRhdGEgJiYgZGF0YS5pZGxlQW5pbSA/IGRhdGEuaWRsZUFuaW0gOiBcIklkbGVcIlxuICAgIH0pXG5cbiAgICBpZihkYXRhICYmIGRhdGEubm9VSSl7fVxuICAgIGVsc2UgaWYoZGF0YSAmJiBkYXRhLnBvcnRyYWl0KXt9XG4gICAgZWxzZXtcbiAgICAgICAgYWRkRGlhbG9nKG5wYywgZGF0YSAmJiBkYXRhLmRpYWxvZ1NvdW5kID8gZGF0YS5kaWFsb2dTb3VuZCA6IHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICBvbkFjdGl2YXRlQ2JzLnNldChucGMsICgpPT57XG4gICAgICAgIGRhdGEub25BY3RpdmF0ZSgpXG4gICAgfSlcblxuICAgIGlmIChkYXRhICYmIGRhdGEuaGFzT3duUHJvcGVydHkoXCJvbldhbGtBd2F5XCIpKSB7XG4gICAgICAgIG9uV2Fsa0F3YXlDYnMuc2V0KG5wYywgKCk9PntcbiAgICAgICAgICAgIGlmKCFkYXRhIHx8ICFkYXRhLmNvbnRpbnVlT25XYWxrQXdheSl7XG4gICAgICAgICAgICAgICAgaWYobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKXtcbiAgICAgICAgICAgICAgICAgICAgbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKXtcbiAgICAgICAgICAgICAgICAgICAgbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEub25XYWxrQXdheSEoKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFkZE5QQ0JvbmVzKG5wYywgZGF0YSlcbiAgICBhZGRDbGlja1JlYWN0aW9ucyhucGMsIGRhdGEpXG4gICAgYWRkVHJpZ2dlckFyZWEobnBjLCBkYXRhKVxuICAgIFxuICAgIGlmIChkYXRhICYmIGRhdGEucGF0aERhdGEgJiYgZGF0YS5wYXRoRGF0YS5zcGVlZCkge1xuICAgICAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICAgICAgbnBjRGF0YS53YWxraW5nU3BlZWQgPSBkYXRhLnBhdGhEYXRhLnNwZWVkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jb29sRG93bkR1cmF0aW9uKSB7XG4gICAgICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgICAgICBucGNEYXRhLmNvb2xEb3duRHVyYXRpb24gPSBkYXRhLmNvb2xEb3duRHVyYXRpb25cbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLnBhdGhEYXRhKXtcbiAgICAgICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgICAgIC8vbnBjRGF0YS5jdXJyZW50UGF0aERhdGEgPSBucGNEYXRhLnBhdGhEYXRhXG4gICAgICAgIGZvbGxvd1BhdGgobnBjLCBucGNEYXRhLnBhdGhEYXRhKVxuICAgIH1cblxuICAgIHJldHVybiBucGNcbn1cblxuZnVuY3Rpb24gYWRkTlBDQm9uZXMobnBjOkVudGl0eSwgZGF0YTpOUENEYXRhKXtcbiAgICBzd2l0Y2goZGF0YS50eXBlKXtcbiAgICAgICAgY2FzZSBOUENUeXBlLkFWQVRBUjpcbiAgICAgICAgICAgIEF2YXRhclNoYXBlLmNyZWF0ZShucGMsIHtcbiAgICAgICAgICAgICAgICBpZDogXCJucGNcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIk5QQ1wiLFxuICAgICAgICAgICAgICAgIGJvZHlTaGFwZTpcInVybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpCYXNlTWFsZVwiLFxuICAgICAgICAgICAgICAgIGVtb3RlczogW10sXG4gICAgICAgICAgICAgICAgd2VhcmFibGVzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwidXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmZfZXllc18wMFwiLFxuICAgICAgICAgICAgICAgICAgICBcInVybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpmX2V5ZWJyb3dzXzAwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmZfbW91dGhfMDBcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6Y29tZnlfc3BvcnRfc2FuZGFsc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInVybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpzb2NjZXJfcGFudHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6ZWxlZ2FudF9zd2VhdGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBOUENUeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIEdsdGZDb250YWluZXIuY3JlYXRlKG5wYywgeyBcbiAgICAgICAgICAgICAgICBzcmM6IGRhdGEgJiYgZGF0YS5tb2RlbCA/IGRhdGEubW9kZWwgOiBcIlwiIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIEFuaW1hdG9yLmNyZWF0ZShucGMsIHtcbiAgICAgICAgICAgICAgICBzdGF0ZXM6W3tcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpkYXRhICYmIGRhdGEuaWRsZUFuaW0gPyBkYXRhLmlkbGVBbmltIDogJ0lkbGUnLFxuICAgICAgICAgICAgICAgICAgICBjbGlwOmRhdGEgJiYgZGF0YS5pZGxlQW5pbSA/IGRhdGEuaWRsZUFuaW0gOiAnSWRsZScsXG4gICAgICAgICAgICAgICAgICAgIGxvb3A6dHJ1ZVxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICAgICAgICAgIG5wY0RhdGEuaWRsZUFuaW0gPSBkYXRhICYmIGRhdGEuaWRsZUFuaW0gPyBkYXRhLmlkbGVBbmltIDogJ0lkbGUnXG4gICAgICAgICAgICBucGNEYXRhLmxhc3RQbGF5ZWRBbmltID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5pZGxlQW5pbVxuXG4gICAgICAgICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG5wYywgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5pZGxlQW5pbSlcblxuXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLndhbGtpbmdBbmltKSB7XG4gICAgICAgICAgICAgICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbSA9IGRhdGEud2Fsa2luZ0FuaW1cbiAgICAgICAgICAgICAgICBsZXQgYW5pbWF0aW9ucyA9IEFuaW1hdG9yLmdldE11dGFibGUobnBjKVxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMuc3RhdGVzLnB1c2goe25hbWU6ZGF0YS53YWxraW5nQW5pbSwgY2xpcDogZGF0YS53YWxraW5nQW5pbSwgbG9vcDp0cnVlfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBOUENUeXBlLkJMQU5LOlxuICAgICAgICAgICAgTWVzaFJlbmRlcmVyLnNldEJveChucGMpXG4gICAgICAgICAgICBNZXNoQ29sbGlkZXIuc2V0Qm94KG5wYylcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRDbGlja1JlYWN0aW9ucyhucGM6RW50aXR5LCBkYXRhOk5QQ0RhdGEpe1xuICAgIGxldCBhY3RpdmF0ZUJ1dHRvbiA9IGRhdGEgJiYgZGF0YS5vbmx5Q2xpY2tUcmlnZ2VyID8gSW5wdXRBY3Rpb24uSUFfUE9JTlRFUiA6IElucHV0QWN0aW9uLklBX1BSSU1BUllcblxuICAgIHBvaW50ZXJFdmVudHNTeXN0ZW0ub25Qb2ludGVyRG93bihcbiAgICAgICAgbnBjLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaXNDb29sZG93bi5oYXMobnBjKSB8fCAobnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpLnZpc2libGUpKSByZXR1cm5cbiAgICAgICAgICAgIGFjdGl2YXRlKG5wYylcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgYnV0dG9uOiBhY3RpdmF0ZUJ1dHRvbixcbiAgICAgICAgICAgIGhvdmVyVGV4dDogZGF0YSAmJiBkYXRhLmhvdmVyVGV4dCA/IGRhdGEuaG92ZXJUZXh0IDogJ1RhbGsnLFxuICAgICAgICAgICAgc2hvd0ZlZWRiYWNrOiBkYXRhICYmIGRhdGEub25seUV4dGVybmFsVHJpZ2dlciA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5vbmx5RXh0ZXJuYWxUcmlnZ2VyKSB7XG4gICAgICAgIHBvaW50ZXJFdmVudHNTeXN0ZW0ucmVtb3ZlT25Qb2ludGVyRG93bihucGMpXG4gICAgICAgIH0gXG59XG5cbmZ1bmN0aW9uIGFkZFRyaWdnZXJBcmVhKG5wYzpFbnRpdHksIGRhdGE6TlBDRGF0YSl7XG5cbiAgICAgICAgbGV0IHRyaWdnZXJEYXRhOiBUcmlnZ2VyRGF0YSA9IHt9XG5cbiAgICAgICAgaWYgKCFkYXRhIHx8IChkYXRhICYmICFkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIgJiYgIWRhdGEub25seUNsaWNrVHJpZ2dlciAmJiAhZGF0YS5vbmx5RVRyaWdnZXIpKXtcbiAgICAgICAgb25BY3RpdmF0ZUNicy5zZXQobnBjLCAoKT0+e1xuICAgICAgICAgICAgaWYgKGlzQ29vbGRvd24uaGFzKG5wYykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhucGMsICcgaW4gY29vbGRvd24nKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIChucGNEaWFsb2dDb21wb25lbnQuaGFzKG5wYykgJiYgbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpLnZpc2libGUpIHx8XG4gICAgICAgICAgICAgICAgKGRhdGEgJiYgZGF0YS5vbmx5RXh0ZXJuYWxUcmlnZ2VyKSB8fFxuICAgICAgICAgICAgICAgIChkYXRhICYmIGRhdGEub25seUNsaWNrVHJpZ2dlcilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YS5vbkFjdGl2YXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgdHJpZ2dlckRhdGEub25DYW1lcmFFbnRlciA9IG9uQWN0aXZhdGVDYnMuZ2V0KG5wYylcbiAgICAgICAgfVxuXG4gICAgLy8gd2hlbiBleGl0aW5nIHRyaWdnZXJcbiAgICBpZiAoIWRhdGEgfHwgKGRhdGEgJiYgIWRhdGEuY29udGludWVPbldhbGtBd2F5KSkge1xuICAgICAgICB0cmlnZ2VyRGF0YS5vbkNhbWVyYUV4aXQgPSAoKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVXYWxrQXdheShucGMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB3aGVuIGVudGVyaW5nIHRyaWdnZXJcbiAgICBpZiAoXG4gICAgICAgICFkYXRhIHx8XG4gICAgICAgIChkYXRhICYmICFkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIgJiYgIWRhdGEub25seUNsaWNrVHJpZ2dlciAmJiAhZGF0YS5vbmx5RVRyaWdnZXIpXG4gICAgKSB7XG4gICAgICAgIHRyaWdnZXJEYXRhLm9uQ2FtZXJhRW50ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNDb29sZG93bi5oYXMobnBjKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5wYywgJyBpbiBjb29sZG93bicpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgLy8gZWxzZSBpZiAoXG4gICAgICAgICAgICAvLyAgICAgKHRoaXMuZGlhbG9nICYmIHRoaXMuZGlhbG9nLmlzRGlhbG9nT3BlbikgfHxcbiAgICAgICAgICAgIC8vICAgICAoZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIpIHx8XG4gICAgICAgICAgICAvLyAgICAgKGRhdGEgJiYgZGF0YS5vbmx5Q2xpY2tUcmlnZ2VyKVxuICAgICAgICAgICAgLy8gKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBhY3RpdmF0ZShucGMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQgdHJpZ2dlclxuICAgIGlmICh0cmlnZ2VyRGF0YS5vbkNhbWVyYUVudGVyIHx8IHRyaWdnZXJEYXRhLm9uQ2FtZXJhRXhpdCkge1xuICAgICAgICB1dGlscy50cmlnZ2Vycy5hZGRUcmlnZ2VyKG5wYywyNTQsMSxbe3R5cGU6J3NwaGVyZScsIHBvc2l0aW9uOiBWZWN0b3IzLlplcm8oKSwgcmFkaXVzOiBkYXRhLnJlYWN0RGlzdGFuY2UgIT0gdW5kZWZpbmVkID8gZGF0YS5yZWFjdERpc3RhbmNlIDogNn1dLCB0cmlnZ2VyRGF0YS5vbkNhbWVyYUVudGVyID8gdHJpZ2dlckRhdGEub25DYW1lcmFFbnRlciA6IHVuZGVmaW5lZCwgdHJpZ2dlckRhdGEub25DYW1lcmFFeGl0ID8gdHJpZ2dlckRhdGEub25DYW1lcmFFeGl0IDogdW5kZWZpbmVkLCBDb2xvcjMuUmVkKCkpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9sbG93UGF0aChucGM6RW50aXR5LCBkYXRhPzpGb2xsb3dQYXRoRGF0YSl7XG4gICAgICAgIFxuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIGxldCBwYXRoOmFueVtdID1bXVxuXG4gICAgaWYoZGF0YSl7XG4gICAgICAgIG5wY0RhdGEucGF0aERhdGEgPSBkYXRhXG5cbiAgICAgICAgaWYobnBjRGF0YS5mYWNlVXNlcil7XG4gICAgICAgICAgICBCaWxsYm9hcmQuZGVsZXRlRnJvbShucGMpXG4gICAgICAgIH1cblxuICAgICAgICBpZihkYXRhLnN0YXJ0aW5nUG9pbnQpe1xuICAgICAgICAgICAgZGF0YS5wYXRoPy5zcGxpY2UoMCxkYXRhLnN0YXJ0aW5nUG9pbnQgLSAxKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvcyA9IFRyYW5zZm9ybS5nZXQobnBjKS5wb3NpdGlvblxuICAgICAgICBwYXRoLnB1c2goVmVjdG9yMy5jcmVhdGUocG9zLngsIHBvcy55LCBwb3MueikpXG4gICAgICAgIGRhdGEucGF0aD8uZm9yRWFjaCgocCk9PntcbiAgICAgICAgICAgIHBhdGgucHVzaChwKVxuICAgICAgICB9KVxuXG4gICAgICAgIG9uRmluaXNoQ2FsbGJhY2tzLnNldChucGMsKCk9PntcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbiBmaW5pc2hlZCBjYWxsYmFjaycpXG4gICAgICAgICAgICBpZihkYXRhICYmIGRhdGEub25GaW5pc2hDYWxsYmFjayAmJiAhZGF0YS5sb29wKXtcbiAgICAgICAgICAgICAgICBkYXRhLm9uRmluaXNoQ2FsbGJhY2tcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3BQYXRoKG5wYylcbiAgICAgICAgfSlcblxuICAgICAgICBwb2ludFJlYWNoZWRDYWxsYmFja3Muc2V0KG5wYywgKCk9PntcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbiBwb2ludCByZWFjaGVkIGNhbGxiYWNrJylcbiAgICAgICAgICAgIGxldCBkYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgICAgICAgICAgZGF0YS5wYXRoSW5kZXggKz0gMVxuICAgICAgICAgICAgZGF0YS5vblJlYWNoZWRQb2ludENhbGxiYWNrID8gZGF0YS5vblJlYWNoZWRQb2ludENhbGxiYWNrIDogdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgICAgIHdhbGtOUEMobnBjLCBucGNEYXRhLCBkYXRhLnBhdGhUeXBlISwgZGF0YS50b3RhbER1cmF0aW9uLCBwYXRoLCBwb2ludFJlYWNoZWRDYWxsYmFja3MuZ2V0KG5wYyksIG9uRmluaXNoQ2FsbGJhY2tzLmdldChucGMpKVxuICAgIH1lbHNle1xuICAgICAgICBpZihucGNEYXRhLm1hbnVhbFN0b3Ape1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3dlIGhhdmUgbWFudWFsIHN0b3AsIG5lZWQgdG8gcGljayBiYWNrIHVwIHdoZXJlIHdlIGxlZnQgb2ZmJylcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3dlIGFyZSB0cnlpbmcgdG8gZm9sbG93IGEgcGF0aCB3aXRvdXQgc3RhcnRpbmcgb25lIHByaW9yJylcbiAgICAgICAgfVxuICAgIH1cbiAgICB9XG4vL1xuZnVuY3Rpb24gd2Fsa05QQyhucGM6RW50aXR5LCBucGNEYXRhOmFueSwgdHlwZTpOUENQYXRoVHlwZSwgZHVyYXRpb246bnVtYmVyLCBwYXRoOlZlY3RvcjNbXSwgcG9pbnRSZWFjaGVkQ2FsbGJhY2s/OmFueSwgZmluaXNoZWRDYWxsYmFjaz86YW55KXtcbiAgICAvL1xuICAgIGlmKElzRm9sbG93aW5nUGF0aC5oYXMobnBjKSl7XG4gICAgICAgIElzRm9sbG93aW5nUGF0aC5kZWxldGVGcm9tKG5wYylcbiAgICAgICAgd2Fsa2luZ1RpbWVycy5kZWxldGUobnBjKVxuICAgIH1cbiAgICBJc0ZvbGxvd2luZ1BhdGguY3JlYXRlKG5wYylcblxuICAgIGlmKHR5cGUpe1xuICAgICAgICBpZih0eXBlPT0gTlBDUGF0aFR5cGUuUklHSURfUEFUSCl7XG4gICAgICAgICAgICB1dGlscy5wYXRocy5zdGFydFN0cmFpZ2h0UGF0aChucGMsIHBhdGgsIGR1cmF0aW9uLHRydWUsXG4gICAgICAgICAgICAgICAgKCk9PntmaW5pc2hlZENhbGxiYWNrKCl9LCAoKT0+e3BvaW50UmVhY2hlZENhbGxiYWNrKCl9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICB1dGlscy5wYXRocy5zdGFydFNtb290aFBhdGgobnBjLCBwYXRoLCBkdXJhdGlvbiwgMzAsIHRydWUsIFxuICAgICAgICAgICAgICAgICgpPT57ZmluaXNoZWRDYWxsYmFjaygpfSwgKCk9Pntwb2ludFJlYWNoZWRDYWxsYmFjaygpfSlcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZWxzZXtcbiAgICAgICAgdXRpbHMucGF0aHMuc3RhcnRTbW9vdGhQYXRoKG5wYywgcGF0aCwgZHVyYXRpb24sIDIwLCB0cnVlLCBcbiAgICAgICAgICAgICgpPT57ZmluaXNoZWRDYWxsYmFjaygpfSwgKCk9Pntwb2ludFJlYWNoZWRDYWxsYmFjaygpfSlcbiAgICB9ICAgXG5cbiAgICBpZiAobnBjRGF0YS53YWxraW5nQW5pbSkge1xuICAgICAgICAvLyBpZiAodGhpcy5lbmRBbmltVGltZXIuaGFzQ29tcG9uZW50KE5QQ0RlbGF5KSkge1xuICAgICAgICAvLyAgIHRoaXMuZW5kQW5pbVRpbWVyLnJlbW92ZUNvbXBvbmVudChOUENEZWxheSlcbiAgICAgICAgLy8gfVxuICAgICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG5wYywgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbSwgdHJ1ZSlcbiAgICAgICAgbnBjRGF0YS5sYXN0UGxheWVkQW5pbSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykud2Fsa2luZ0FuaW1cbiAgICAgIH1cbiAgICBucGNEYXRhLnN0YXRlID0gTlBDU3RhdGUuRk9MTE9XUEFUSFxuICAgIGNvbnNvbGUubG9nKCdkZWJ1ZyBoZXJlJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BXYWxraW5nKG5wYzpFbnRpdHksIGR1cmF0aW9uPzogbnVtYmVyLCBmaW5pc2hlZD86Ym9vbGVhbikge1xuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIG5wY0RhdGEuc3RhdGUgPSBOUENTdGF0ZS5TVEFORElOR1xuICAgIG5wY0RhdGEubWFudWFsU3RvcCA9IHRydWVcblxuICAgIHN0b3BQYXRoKG5wYylcblxuICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICB1dGlscy50aW1lcnMuc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgLy9pZiAodGhpcy5kaWFsb2cgJiYgdGhpcy5kaWFsb2cuaXNEaWFsb2dPcGVuKSByZXR1cm5cbiAgICAgICAgICAgIGlmKG5wY0RhdGEucGF0aCl7XG4gICAgICAgICAgICAgICAgQW5pbWF0b3Iuc3RvcEFsbEFuaW1hdGlvbnMobnBjLCB0cnVlKVxuICAgICAgICAgICAgICAgIGlmKG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykud2Fsa2luZ0FuaW0pe1xuICAgICAgICAgICAgICAgICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG5wYywgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbSx0cnVlKVxuICAgICAgICAgICAgICAgICAgICBucGNEYXRhLmxhc3RQbGF5ZWRBbmltID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBucGNEYXRhLnBhdGhEYXRhLnRvdGFsRHVyYXRpb25cbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFRpbWVyOm51bWJlciA9IHdhbGtpbmdUaW1lcnMuZ2V0KG5wYykhXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2N1cnJlbnQgdGltZSBpcycsIGN1cnJlbnRUaW1lcilcbiAgICAgICAgICAgICAgICBpZihjdXJyZW50VGltZXIpe1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAtPSBjdXJyZW50VGltZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgbGV0IHBhdGg6YW55W10gPSBbXVxuICAgICAgICAgICAgICAgIG5wY0RhdGEucGF0aERhdGEucGF0aC5mb3JFYWNoKChwOmFueSk9PntcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKHApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBwYXRoLnNwbGljZSgwLG5wY0RhdGEucGF0aEluZGV4KVxuICAgIFxuICAgICAgICAgICAgICAgIGxldCBwb3MgPSBUcmFuc2Zvcm0uZ2V0KG5wYykucG9zaXRpb25cbiAgICAgICAgICAgICAgICBwYXRoLnVuc2hpZnQoVmVjdG9yMy5jcmVhdGUocG9zLngsIHBvcy55LCBwb3MueikpXG4gICAgXG4gICAgICAgICAgICAgICAgbnBjRGF0YS5tYW51YWxTdG9wID0gZmFsc2VcbiAgICAgICAgICAgICAgICB3YWxrTlBDKG5wYyxucGNEYXRhLCBucGNEYXRhLnBhdGhEYXRhLnBhdGhUeXBlLCBkdXJhdGlvbiwgcGF0aCwgcG9pbnRSZWFjaGVkQ2FsbGJhY2tzLmdldChucGMpLCBvbkZpbmlzaENhbGxiYWNrcy5nZXQobnBjKSkgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxkdXJhdGlvbiAqIDEwMDApXG4gICAgfVxufS8vXG5cbmZ1bmN0aW9uIHN0b3BQYXRoKG5wYzpFbnRpdHkpe1xuICAgIHV0aWxzLnBhdGhzLnN0b3BQYXRoKG5wYylcbiAgICBJc0ZvbGxvd2luZ1BhdGguZGVsZXRlRnJvbShucGMpXG5cbiAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICBpZiAobnBjRGF0YS53YWxraW5nQW5pbSkge1xuICAgICAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG5wYywgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbSlcbiAgICAgICAgbnBjRGF0YS5sYXN0UGxheWVkQW5pbSA9IG5wY0RhdGEuaWRsZUFuaW1cbiAgICB9XG5cbiAgICBpZighbnBjRGF0YS5tYW51YWxTdG9wKXtcbiAgICAgICAgaWYobnBjRGF0YS5wYXRoRGF0YS5sb29wKXtcbiAgICAgICAgICAgIG5wY0RhdGEucGF0aEluZGV4ID0gMFxuICAgICAgICAgICAgd2Fsa2luZ1RpbWVycy5kZWxldGUobnBjKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3dlIGFyZSBsb29waW5nIHBhdGgnLCBucGNEYXRhKVxuICAgICAgICAgICAgZm9sbG93UGF0aChucGMsIG5wY0RhdGEucGF0aERhdGEpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhucGNEYXRhKVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGxzIHRoZSBOUEMncyBhY3RpdmF0aW9uIGZ1bmN0aW9uIChzZXQgb24gTlBDIGRlZmluaXRpb24pLiBJZiBOUEMgaGFzIGBmYWNlVXNlcmAgPSB0cnVlLCBpdCB3aWxsIHJvdGF0ZSB0byBmYWNlIHRoZSBwbGF5ZXIuIEl0IHN0YXJ0cyBhIGNvb2xkb3duIGNvdW50ZXIgdG8gYXZvaWQgcmVhY3RpdmF0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUobnBjOkVudGl0eSkge1xuICAgIGFjdGl2ZU5QQyA9IG5wY1xuICAgIG9uQWN0aXZhdGVDYnMuZ2V0KG5wYykoKVxuXG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgaWYgKG5wY0RhdGEuZmFjZVVzZXIpIHtcbiAgICAgICAgQmlsbGJvYXJkLmNyZWF0ZShucGMsIHtcbiAgICAgICAgICAgIGJpbGxib2FyZE1vZGU6QmlsbGJvYXJkTW9kZS5CTV9ZXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGlzQ29vbGRvd24uc2V0KG5wYywgdHJ1ZSlcbiAgICBucGNEYXRhLmluQ29vbGRvd24gPSB0cnVlXG5cbiAgICB1dGlscy50aW1lcnMuc2V0VGltZW91dChcbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc0Nvb2xkb3duLmRlbGV0ZShucGMpXG4gICAgICAgICAgICBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmluQ29vbGRvd24gPSBmYWxzZVxuICAgICAgICAgICAgaWYoQmlsbGJvYXJkLmhhcyhucGMpKXtcbiAgICAgICAgICAgICAgICBCaWxsYm9hcmQuZGVsZXRlRnJvbShucGMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIDEwMDAgKiBucGNEYXRhLmNvb2xEb3duRHVyYXRpb25cbiAgICApXG4gICAgY29uc29sZS5sb2coJ2FjdGl2YXRlZCBucGMsJywgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKSlcbn1cblxuZnVuY3Rpb24gZW5kSW50ZXJhY3Rpb24obnBjOkVudGl0eSkge1xuICAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICAgbnBjRGF0YS5zdGF0ZSA9IE5QQ1N0YXRlLlNUQU5ESU5HXG5cbiAgICAgICAgaWYgKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSAmJiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYykudmlzaWJsZSkge1xuICAgICAgICAgICAgY2xvc2VEaWFsb2cobnBjKVxuICAgICAgICB9XG5cbiAgICAgICAgcGxheUFuaW1hdGlvbihucGMsIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykuaWRsZUFuaW0pXG5cbiAgICAgICAgaWYobnBjRGF0YS5mYWNlVXNlcil7XG4gICAgICAgICAgICBCaWxsYm9hcmQuZGVsZXRlRnJvbShucGMpXG4gICAgICAgIH1cblxuICAgIC8vIGlmICh0aGlzLmJ1YmJsZSAmJiB0aGlzLmJ1YmJsZS5pc0J1YmxlT3Blbikge1xuICAgIC8vICAgdGhpcy5idWJibGUuY2xvc2VEaWFsb2dXaW5kb3coKVxuICAgIC8vIH1cbn1cblxuLyoqXG4gKiBFbmRzIGludGVyYWN0aW9uIGFuZCBjYWxscyB0aGUgb25XYWxrQXdheSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlV2Fsa0F3YXkobnBjOkVudGl0eSkge1xuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIGlmIChucGNEYXRhLnN0YXRlID09IE5QQ1N0YXRlLkZPTExPV1BBVEgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZW5kSW50ZXJhY3Rpb24obnBjKVxuXG4gICAgaWYgKG9uV2Fsa0F3YXlDYnMuZ2V0KG5wYykpIHtcbiAgICAgICAgb25XYWxrQXdheUNicy5nZXQobnBjKSgpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGxheUFuaW1hdGlvbihucGM6RW50aXR5LCBhbmltOnN0cmluZywgbm9Mb29wPzpib29sZWFuLCBkdXJhdGlvbj86bnVtYmVyKXtcbiAgICBsZXQgYW5pbWF0aW9ucyA9IEFuaW1hdG9yLmdldE11dGFibGUobnBjKVxuICAgIGlmKGFuaW1hdGlvbnMuc3RhdGVzLmZpbHRlcigoYW5pbWF0aW9uKT0+IGFuaW1hdGlvbi5uYW1lID09PSBhbmltKS5sZW5ndGggPT0gMCl7XG4gICAgICAgIGFuaW1hdGlvbnMuc3RhdGVzLnB1c2goe25hbWU6YW5pbSwgY2xpcDphbmltLCBsb29wOiBub0xvb3A/IGZhbHNlIDogdHJ1ZX0pXG4gICAgfVxuXG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgaWYobnBjRGF0YS5zdGF0ZSA9PSBOUENTdGF0ZS5GT0xMT1dQQVRIKXtcbiAgICAgICAgdXRpbHMucGF0aHMuc3RvcFBhdGgobnBjKVxuICAgIH1cblxuICAgIGlmKGFuaW1UaW1lcnMuaGFzKG5wYykpe1xuICAgICAgICB1dGlscy50aW1lcnMuY2xlYXJUaW1lb3V0KGFuaW1UaW1lcnMuZ2V0KG5wYykpXG4gICAgICAgIGFuaW1UaW1lcnMuZGVsZXRlKG5wYylcbiAgICB9XG5cbiAgICBBbmltYXRvci5zdG9wQWxsQW5pbWF0aW9ucyhucGMpXG4gICAgQW5pbWF0b3IucGxheVNpbmdsZUFuaW1hdGlvbihucGMsIGFuaW0sIHRydWUpXG4gICAgaWYoZHVyYXRpb24pe1xuICAgICAgICBhbmltVGltZXJzLnNldChucGMsIHV0aWxzLnRpbWVycy5zZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICBhbmltVGltZXJzLmRlbGV0ZShucGMpXG4gICAgICAgIH0sIDEwMDAgKiBkdXJhdGlvbikpXG4gICAgfSBcblxuICAgIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBhbmltXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VJZGxlQW5pbShucGM6RW50aXR5LCBhbmltYXRpb246c3RyaW5nLCBwbGF5Pzpib29sZWFuKXtcbiAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICBucGNEYXRhLmlkbGVBbmltID0gYW5pbWF0aW9uXG4gICAgaWYocGxheSl7XG4gICAgICAgIHBsYXlBbmltYXRpb24obnBjLCBhbmltYXRpb24sIHRydWUpXG4gICAgICAgIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykubGFzdFBsYXllZEFuaW0gPSBhbmltYXRpb25cbiAgICB9XG59Il19
@@ -0,0 +1,13 @@
1
+ export declare const NPCDataComponent: import("@dcl/sdk/ecs").MapComponentDefinition<import("@dcl/sdk/ecs").MapResult<{
2
+ introduced: import("@dcl/sdk/ecs").ISchema<boolean>;
3
+ inCooldown: import("@dcl/sdk/ecs").ISchema<boolean>;
4
+ coolDownDuration: import("@dcl/sdk/ecs").ISchema<number>;
5
+ faceUser: import("@dcl/sdk/ecs").ISchema<boolean>;
6
+ walkingSpeed: import("@dcl/sdk/ecs").ISchema<number>;
7
+ bubbleHeight: import("@dcl/sdk/ecs").ISchema<number>;
8
+ state: import("@dcl/sdk/ecs").ISchema<string>;
9
+ walkingAnim: import("@dcl/sdk/ecs").ISchema<string>;
10
+ idleAnim: import("@dcl/sdk/ecs").ISchema<string>;
11
+ lastPlayedAnim: import("@dcl/sdk/ecs").ISchema<string>;
12
+ path: import("@dcl/sdk/ecs").ISchema<import("@dcl/sdk/ecs").Vector3Type[]>;
13
+ }>>;
@@ -0,0 +1,15 @@
1
+ import { Schemas, engine } from "@dcl/sdk/ecs";
2
+ export const NPCDataComponent = engine.defineComponent("npcdatacomponent", {
3
+ introduced: Schemas.Boolean,
4
+ inCooldown: Schemas.Boolean,
5
+ coolDownDuration: Schemas.Number,
6
+ faceUser: Schemas.Boolean,
7
+ walkingSpeed: Schemas.Number,
8
+ bubbleHeight: Schemas.Number,
9
+ state: Schemas.String,
10
+ walkingAnim: Schemas.String,
11
+ idleAnim: Schemas.String,
12
+ lastPlayedAnim: Schemas.String,
13
+ path: Schemas.Array(Schemas.Vector3)
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBjRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ucGNEYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQ3JELGtCQUFrQixFQUNsQjtJQUNDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTztJQUMzQixVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU87SUFDckIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDaEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPO0lBQ3pCLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTTtJQUM1QixZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDNUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNO0lBQ3JCLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTTtJQUMzQixRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDeEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNO0lBQzlCLElBQUksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Q0FDekMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZW1hcywgZW5naW5lIH0gZnJvbSBcIkBkY2wvc2RrL2Vjc1wiO1xuZXhwb3J0IGNvbnN0IE5QQ0RhdGFDb21wb25lbnQgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KFxuXHRcIm5wY2RhdGFjb21wb25lbnRcIixcblx0e1xuXHRcdGludHJvZHVjZWQ6IFNjaGVtYXMuQm9vbGVhbixcblx0XHRpbkNvb2xkb3duOiBTY2hlbWFzLkJvb2xlYW4sXG4gICAgICAgIGNvb2xEb3duRHVyYXRpb246IFNjaGVtYXMuTnVtYmVyLFxuICAgICAgICBmYWNlVXNlcjogU2NoZW1hcy5Cb29sZWFuLFxuICAgICAgICB3YWxraW5nU3BlZWQ6IFNjaGVtYXMuTnVtYmVyLFxuICAgICAgICBidWJibGVIZWlnaHQ6IFNjaGVtYXMuTnVtYmVyLFxuICAgICAgICBzdGF0ZTogU2NoZW1hcy5TdHJpbmcsXG4gICAgICAgIHdhbGtpbmdBbmltOiBTY2hlbWFzLlN0cmluZyxcbiAgICAgICAgaWRsZUFuaW06IFNjaGVtYXMuU3RyaW5nLFxuICAgICAgICBsYXN0UGxheWVkQW5pbTogU2NoZW1hcy5TdHJpbmcsXG4gICAgICAgIHBhdGg6U2NoZW1hcy5BcnJheShTY2hlbWFzLlZlY3RvcjMpXG5cdH0pIl19
@@ -0,0 +1,2 @@
1
+ export declare function handlePathTimes(dt: number): void;
2
+ export declare function handleDialogTyping(dt: number): void;
@@ -0,0 +1,37 @@
1
+ import { engine } from "@dcl/sdk/ecs";
2
+ import { IsFollowingPath, IsTypingDialog } from "./components";
3
+ import { walkingTimers } from "./npc";
4
+ import { npcDialogComponent } from "./dialog";
5
+ export function handlePathTimes(dt) {
6
+ for (const [entity] of engine.getEntitiesWith(IsFollowingPath)) {
7
+ if (walkingTimers.has(entity)) {
8
+ let elapsed = walkingTimers.get(entity);
9
+ elapsed += dt;
10
+ walkingTimers.set(entity, walkingTimers.get(entity) + dt);
11
+ }
12
+ else {
13
+ walkingTimers.set(entity, dt);
14
+ }
15
+ }
16
+ }
17
+ export function handleDialogTyping(dt) {
18
+ for (const [entity] of engine.getEntitiesWith(IsTypingDialog)) {
19
+ let dialogData = npcDialogComponent.get(entity);
20
+ if (!dialogData.typing) {
21
+ return;
22
+ }
23
+ dialogData.timer += dt;
24
+ if (dialogData.timer >= 2 / dialogData.speed) {
25
+ let charsToAdd = Math.floor(dialogData.timer / (1 / dialogData.speed));
26
+ dialogData.timer = 0;
27
+ dialogData.visibleChars += charsToAdd;
28
+ if (dialogData.visibleChars >= dialogData.fullText.length) {
29
+ dialogData.typing = false;
30
+ dialogData.visibleChars = dialogData.fullText.length;
31
+ IsTypingDialog.deleteFrom(entity);
32
+ }
33
+ dialogData.visibleText = dialogData.fullText.substr(0, dialogData.visibleChars);
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQTBCLE1BQU0sVUFBVSxDQUFDO0FBRXRFLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBUztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQzVELElBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBQztZQUN6QixJQUFJLE9BQU8sR0FBVSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFBO1lBQy9DLE9BQU8sSUFBSSxFQUFFLENBQUE7WUFDYixhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1NBQzdEO2FBQ0c7WUFDQSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtTQUNoQztLQUNKO0FBQ0gsQ0FBQztBQUVILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxFQUFTO0lBQ3hDLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDM0QsSUFBSSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQy9DLElBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFDO1lBQ2xCLE9BQU07U0FDVDtRQUVELFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1FBQ3RCLElBQUksVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUMxQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDdEUsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDcEIsVUFBVSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUE7WUFFckMsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN2RCxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtnQkFDekIsVUFBVSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQTtnQkFDcEQsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUVwQztZQUVELFVBQVUsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtTQUNsRjtLQUNKO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuZ2luZSB9IGZyb20gXCJAZGNsL3Nkay9lY3NcIjtcbmltcG9ydCB7IElzRm9sbG93aW5nUGF0aCwgSXNUeXBpbmdEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyB3YWxraW5nVGltZXJzIH0gZnJvbSBcIi4vbnBjXCI7XG5pbXBvcnQgeyBucGNEaWFsb2dDb21wb25lbnQsIG5wY0RpYWxvZ1R5cGluZ1N5c3RlbXMgfSBmcm9tIFwiLi9kaWFsb2dcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhdGhUaW1lcyhkdDpudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoSXNGb2xsb3dpbmdQYXRoKSkge1xuICAgICAgICBpZih3YWxraW5nVGltZXJzLmhhcyhlbnRpdHkpKXtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkOm51bWJlciA9IHdhbGtpbmdUaW1lcnMuZ2V0KGVudGl0eSkhXG4gICAgICAgICAgICBlbGFwc2VkICs9IGR0XG4gICAgICAgICAgICB3YWxraW5nVGltZXJzLnNldChlbnRpdHksIHdhbGtpbmdUaW1lcnMuZ2V0KGVudGl0eSkhICsgZHQpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHdhbGtpbmdUaW1lcnMuc2V0KGVudGl0eSwgZHQpXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpYWxvZ1R5cGluZyhkdDpudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoSXNUeXBpbmdEaWFsb2cpKSB7XG4gICAgICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChlbnRpdHkpXG4gICAgICAgIGlmKCFkaWFsb2dEYXRhLnR5cGluZyl7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRpYWxvZ0RhdGEudGltZXIgKz0gZHRcbiAgICAgICAgaWYgKGRpYWxvZ0RhdGEudGltZXIgPj0gMiAvIGRpYWxvZ0RhdGEuc3BlZWQpIHtcbiAgICAgICAgICAgIGxldCBjaGFyc1RvQWRkID0gTWF0aC5mbG9vcihkaWFsb2dEYXRhLnRpbWVyIC8gKDEgLyBkaWFsb2dEYXRhLnNwZWVkKSlcbiAgICAgICAgICAgIGRpYWxvZ0RhdGEudGltZXIgPSAwXG4gICAgICAgICAgICBkaWFsb2dEYXRhLnZpc2libGVDaGFycyArPSBjaGFyc1RvQWRkXG4gICAgICAgIFxuICAgICAgICAgICAgaWYgKGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzID49IGRpYWxvZ0RhdGEuZnVsbFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlhbG9nRGF0YS50eXBpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzID0gZGlhbG9nRGF0YS5mdWxsVGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICBJc1R5cGluZ0RpYWxvZy5kZWxldGVGcm9tKGVudGl0eSlcbiAgICAgICAgICAgICAgICAvL2VuZ2luZS5yZW1vdmVTeXN0ZW0obnBjRGlhbG9nVHlwaW5nU3lzdGVtcy5nZXQoZW50aXR5KSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGlhbG9nRGF0YS52aXNpYmxlVGV4dCA9IGRpYWxvZ0RhdGEuZnVsbFRleHQuc3Vic3RyKDAsIGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzKVxuICAgICAgICB9XG4gICAgfVxuICB9Il19
@@ -0,0 +1,119 @@
1
+ import { Vector3 } from "@dcl/sdk/math";
2
+ export type Dialog = {
3
+ text: string;
4
+ name?: string;
5
+ fontSize?: number;
6
+ offsetX?: number;
7
+ offsetY?: number;
8
+ typeSpeed?: number;
9
+ isEndOfDialog?: boolean;
10
+ triggeredByNext?: () => void;
11
+ portrait?: ImageData;
12
+ image?: ImageData;
13
+ isQuestion?: boolean;
14
+ isFixedScreen?: boolean;
15
+ buttons?: ButtonData[];
16
+ audio?: string;
17
+ skipable?: boolean;
18
+ timeOn?: number;
19
+ };
20
+ export type TriggerData = {
21
+ layer?: number;
22
+ triggeredByLayer?: number;
23
+ onTriggerEnter?: () => void;
24
+ onTriggerExit?: () => void;
25
+ onCameraEnter?: () => void;
26
+ onCameraExit?: () => void;
27
+ enableDebug?: boolean;
28
+ };
29
+ export type ButtonData = {
30
+ goToDialog: number | string;
31
+ label: string;
32
+ triggeredActions?: () => void;
33
+ fontSize?: number;
34
+ offsetX?: number;
35
+ offsetY?: number;
36
+ };
37
+ export declare enum ButtonStyles {
38
+ E = "e",
39
+ F = "f",
40
+ DARK = "dark",
41
+ RED = "red",
42
+ ROUNDBLACK = "roundblack",
43
+ ROUNDWHITE = "roundwhite",
44
+ ROUNDSILVER = "roundsilver",
45
+ ROUNDGOLD = "roundgold",
46
+ SQUAREBLACK = "squareblack",
47
+ SQUAREWHITE = "squarewhite",
48
+ SQUARESILVER = "squaresilver",
49
+ SQUAREGOLD = "squaregold",
50
+ WHITE = "white"
51
+ }
52
+ export type NPCData = {
53
+ type: NPCType;
54
+ body?: NPCBodyType;
55
+ model?: string;
56
+ walkingAnim?: string;
57
+ portrait?: string | ImageData;
58
+ reactDistance?: number;
59
+ idleAnim?: string;
60
+ faceUser?: boolean;
61
+ turningSpeed?: number;
62
+ onlyExternalTrigger?: boolean;
63
+ onlyClickTrigger?: boolean;
64
+ onlyETrigger?: boolean;
65
+ onActivate: () => void;
66
+ onWalkAway?: () => void;
67
+ continueOnWalkAway?: boolean;
68
+ darkUI?: boolean;
69
+ coolDownDuration?: number;
70
+ hoverText?: string;
71
+ dialogSound?: string;
72
+ textBubble?: boolean;
73
+ bubbleHeight?: number;
74
+ noUI?: boolean;
75
+ pathData?: FollowPathData;
76
+ };
77
+ export type FollowPathData = {
78
+ startingPoint?: number;
79
+ loop?: boolean;
80
+ curve?: boolean;
81
+ totalDuration: number;
82
+ speed?: number;
83
+ path?: Vector3[];
84
+ pathType?: NPCPathType;
85
+ onFinishCallback?: () => void;
86
+ onReachedPointCallback?: () => void;
87
+ };
88
+ export type ImageSection = {
89
+ sourceWidth: number;
90
+ sourceHeight: number;
91
+ sourceLeft?: number;
92
+ sourceTop?: number;
93
+ };
94
+ export type ImageData = {
95
+ path: string;
96
+ offsetX?: number;
97
+ offsetY?: number;
98
+ height?: number;
99
+ width?: number;
100
+ section?: ImageSection;
101
+ };
102
+ export declare enum NPCState {
103
+ STANDING = "standing",
104
+ TALKING = "talking",
105
+ FOLLOWPATH = "followPath"
106
+ }
107
+ export declare enum NPCBodyType {
108
+ MALE = "BaseMale",
109
+ FEMALE = "BaseFemale"
110
+ }
111
+ export declare enum NPCType {
112
+ BLANK = "blank",
113
+ CUSTOM = "custom",
114
+ AVATAR = "avatar"
115
+ }
116
+ export declare enum NPCPathType {
117
+ SMOOTH_PATH = "smooth",
118
+ RIGID_PATH = "rigid"
119
+ }