dcl-npc-toolkit-ai-version
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations. AI usage is added atop of it
514 lines • 77.7 kB
JavaScript
import * as utils from '@dcl-sdk/utils';
import { Animator, AvatarShape, engine, GltfContainer, MeshCollider, MeshRenderer, pointerEventsSystem, Transform } from '@dcl/sdk/ecs';
import { Color3, Quaternion, Vector3 } from '@dcl/sdk/math';
import { bubbles, closeBubble, createDialogBubble, openBubble } from './bubble';
import { IsFollowingPath, TrackUserFlag } from './components';
import { addDialog, closeDialog, findDialogByName, npcDialogComponent, openDialog } from './dialog';
import { faceUserSystem, handleBubbletyping, handleDialogTyping, handlePathTimes, inputListenerSystem } from './systems';
import { NPCPathType, NPCState, NPCType } from './types';
import { darkTheme, lightTheme } from './ui';
import { initServerModel, setCustomServerRoomName, setCustomServerUrl } from './ai';
export const walkingTimers = new Map();
export const npcDataComponent = new Map();
export let NULL_NPC = 0;
export let activeNPC = NULL_NPC;
export let blankDialog = 0;
engine.addSystem(handlePathTimes);
engine.addSystem(handleDialogTyping);
engine.addSystem(handleBubbletyping);
engine.addSystem(faceUserSystem);
engine.addSystem(inputListenerSystem);
const isCooldown = new Map();
const onActivateCbs = new Map();
const onWalkAwayCbs = new Map();
const animTimers = new Map();
const pointReachedCallbacks = new Map();
const onFinishCallbacks = new Map();
export function showDebug(debug) {
utils.triggers.enableDebugDraw(debug);
}
export function getData(npc) {
return npcDataComponent.get(npc);
}
export function create(transform, data, ragMode = false, configuredMode = false, serverUrl = "", roomName = "", serverFileUrl = "") {
if (serverUrl != "")
setCustomServerUrl(serverUrl, serverFileUrl);
if (roomName != "")
setCustomServerRoomName(roomName);
let npc = engine.addEntity();
initServerModel(npc, ragMode, configuredMode);
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()
};
Transform.create(npc, t);
npcDataComponent.set(npc, {
introduced: false,
inCooldown: false,
coolDownDuration: data && data.coolDownDuration ? data.coolDownDuration : 5,
faceUser: data && data.faceUser ? data.faceUser : undefined,
walkingSpeed: 2,
walkingAnim: data && data.walkingAnim ? data.walkingAnim : undefined,
pathData: data.pathData ? data.pathData : undefined,
currentPathData: [],
manualStop: false,
pathIndex: 0,
state: NPCState.STANDING,
idleAnim: data && data.idleAnim ? data.idleAnim : 'Idle',
bubbleHeight: data && data.textBubble && data.bubbleHeight ? data.bubbleHeight : undefined,
bubbleSound: data.dialogSound ? data.dialogSound : undefined,
hasBubble: data && data.textBubble ? true : false,
turnSpeed: data && data.turningSpeed ? data.turningSpeed : 2,
theme: data.darkUI ? darkTheme : lightTheme,
bubbleXOffset: data.bubbleXOffset ? data.bubbleXOffset : 0,
bubbleYOffset: data.bubbleYOffset ? data.bubbleYOffset : 0
});
if (data && data.noUI) {
}
else if (data && data.portrait) {
addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined, typeof data.portrait === `string` ? { path: data.portrait } : data.portrait);
}
else {
addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined);
}
if (data && data.textBubble) {
createDialogBubble(npc, npcDataComponent.get(npc).bubbleHeight);
}
onActivateCbs.set(npc, (other) => {
data.onActivate(other);
});
if (data && data.hasOwnProperty('onWalkAway')) {
onWalkAwayCbs.set(npc, (other) => {
if (!data || !data.continueOnWalkAway) {
if (npcDialogComponent.has(npc)) {
npcDialogComponent.get(npc).visible = false;
}
}
else {
if (npcDialogComponent.has(npc)) {
npcDialogComponent.get(npc).visible = false;
}
}
data.onWalkAway(other);
});
}
addNPCBones(npc, data);
addClickReactions(npc, data);
addTriggerArea(npc, data);
if (data && data.pathData && data.pathData.speed) {
let npcData = npcDataComponent.get(npc);
npcData.walkingSpeed = data.pathData.speed;
}
if (data && data.coolDownDuration) {
let npcData = npcDataComponent.get(npc);
npcData.coolDownDuration = data.coolDownDuration;
}
if (data && data.pathData) {
let npcData = npcDataComponent.get(npc);
npcData.pathData.loop = true;
followPath(npc, npcData.pathData);
}
return npc;
}
function addNPCBones(npc, data) {
const modelIsString = data && data.model && typeof data.model === `string`;
const modelAvatarData = modelIsString
? undefined
: data.model && data.model.bodyShape
? data.model
: undefined;
const modelGLTFData = modelIsString
? undefined
: data.model && data.model.src
? data.model
: undefined;
switch (data.type) {
case NPCType.AVATAR:
AvatarShape.create(npc, !data || !data.model || !modelAvatarData
? {
id: 'npc',
name: 'NPC',
bodyShape: 'urn:decentraland:off-chain:base-avatars:BaseMale',
emotes: [],
wearables: [
'urn:decentraland:off-chain:base-avatars:f_eyes_00',
'urn:decentraland:off-chain:base-avatars:f_eyebrows_00',
'urn:decentraland:off-chain:base-avatars:f_mouth_00',
'urn:decentraland:off-chain:base-avatars:comfy_sport_sandals',
'urn:decentraland:off-chain:base-avatars:soccer_pants',
'urn:decentraland:off-chain:base-avatars:elegant_sweater'
]
}
: modelAvatarData);
break;
case NPCType.CUSTOM:
GltfContainer.create(npc, modelIsString && typeof data.model === `string` ? { src: data && data.model ? data.model : '' } : modelGLTFData);
Animator.create(npc, {
states: [
{
clip: data && data.idleAnim ? data.idleAnim : 'Idle',
loop: true
}
]
});
let npcData = npcDataComponent.get(npc);
npcData.idleAnim = data && data.idleAnim ? data.idleAnim : 'Idle';
npcData.lastPlayedAnim = npcDataComponent.get(npc).idleAnim;
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).idleAnim);
if (data && data.walkingAnim) {
npcDataComponent.get(npc).walkingAnim = data.walkingAnim;
let animations = Animator.getMutable(npc);
animations.states.push({ clip: data.walkingAnim, loop: true });
}
break;
case NPCType.BLANK:
MeshRenderer.setBox(npc);
MeshCollider.setBox(npc);
break;
}
}
function addClickReactions(npc, data) {
let activateButton = data && data.onlyClickTrigger ? 0 : 1;
pointerEventsSystem.onPointerDown(npc, function () {
if (isCooldown.has(npc) || npcDialogComponent.get(npc).visible)
return;
activate(npc, engine.PlayerEntity);
}, {
button: activateButton,
hoverText: data && data.hoverText ? data.hoverText : 'Talk',
showFeedback: data && data.onlyExternalTrigger ? false : true
});
if (data && data.onlyExternalTrigger) {
pointerEventsSystem.removeOnPointerDown(npc);
}
}
function addTriggerArea(npc, data) {
let triggerData = {};
if (!data || (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
onActivateCbs.set(npc, (other) => {
if (isCooldown.has(npc)) {
console.log(npc, ' in cooldown');
return;
}
else if ((npcDialogComponent.has(npc) && npcDialogComponent.get(npc).visible) ||
(data && data.onlyExternalTrigger) ||
(data && data.onlyClickTrigger)) {
return;
}
data.onActivate(other);
});
triggerData.onCameraEnter = onActivateCbs.get(npc);
}
if (!data || (data && !data.continueOnWalkAway)) {
triggerData.onCameraExit = (other) => {
handleWalkAway(npc, other);
};
}
if (!data || (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
triggerData.onCameraEnter = (other) => {
if (isCooldown.has(npc)) {
console.log(npc, ' in cooldown');
return;
}
activate(npc, other);
};
}
if (triggerData.onCameraEnter || triggerData.onCameraExit) {
utils.triggers.addTrigger(npc, triggerData.layer != undefined ? triggerData.layer : utils.NO_LAYERS, triggerData.triggeredByLayer != undefined ? triggerData.triggeredByLayer : utils.LAYER_1, [{ type: 'sphere', position: Vector3.Zero(), radius: data.reactDistance != undefined ? data.reactDistance : 6 }], (other) => {
if (triggerData.onCameraEnter)
triggerData.onCameraEnter(other);
}, (other) => {
if (triggerData.onCameraExit)
triggerData.onCameraExit(other);
}, Color3.Red());
}
}
export function followPath(npc, data) {
let npcData = npcDataComponent.get(npc);
let path = [];
if (npcData.faceUser) {
if (TrackUserFlag.has(npc)) {
TrackUserFlag.deleteFrom(npc);
}
}
if (npcData.manualStop) {
let duration = npcData.pathData.totalDuration;
let currentTimer = walkingTimers.get(npc);
console.log('current time is', currentTimer);
if (currentTimer) {
duration -= currentTimer;
}
let path = [];
npcData.pathData.path.forEach((p) => {
path.push(p);
});
path.splice(0, npcData.pathIndex);
let pos = Transform.get(npc).position;
path.unshift(Vector3.create(pos.x, pos.y, pos.z));
walkNPC(npc, npcData, npcData.pathData.pathType, duration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
}
else {
if (data) {
npcData.pathData = data;
if (data.startingPoint) {
data.path?.splice(0, data.startingPoint - 1);
}
let pos = Transform.get(npc).position;
path.push(Vector3.create(pos.x, pos.y, pos.z));
data.path?.forEach((p) => {
path.push(p);
});
onFinishCallbacks.set(npc, () => {
console.log('on finished callback');
if (data && data.onFinishCallback && !data.loop) {
data.onFinishCallback();
}
stopPath(npc);
});
pointReachedCallbacks.set(npc, () => {
console.log('on point reached callback');
let data = npcDataComponent.get(npc);
data.pathIndex += 1;
data.onReachedPointCallback ? data.onReachedPointCallback : undefined;
});
walkNPC(npc, npcData, data.pathType, data.totalDuration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
}
else {
if (npcData.manualStop) {
console.log('we have manual stop, need to pick back up where we left off');
}
else {
console.log('we are trying to follow a path witout starting one prior');
}
}
}
}
function walkNPC(npc, npcData, type, duration, path, pointReachedCallback, finishedCallback) {
if (IsFollowingPath.has(npc)) {
IsFollowingPath.deleteFrom(npc);
walkingTimers.delete(npc);
}
IsFollowingPath.create(npc);
if (type) {
if (type == NPCPathType.RIGID_PATH) {
utils.paths.startStraightPath(npc, path, duration, true, () => {
finishedCallback();
}, () => {
pointReachedCallback();
});
}
else {
utils.paths.startSmoothPath(npc, path, duration, 30, true, () => {
finishedCallback();
}, () => {
pointReachedCallback();
});
}
}
else {
utils.paths.startSmoothPath(npc, path, duration, 20, true, () => {
finishedCallback();
}, () => {
pointReachedCallback();
});
}
if (npcData.walkingAnim) {
clearAnimationTimer(npc);
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
}
npcData.state = NPCState.FOLLOWPATH;
npcData.manualStop = false;
}
export function stopWalking(npc, duration, finished) {
let npcData = npcDataComponent.get(npc);
npcData.state = NPCState.STANDING;
npcData.manualStop = true;
stopPath(npc);
if (duration) {
utils.timers.setTimeout(() => {
if (npcData.path) {
Animator.stopAllAnimations(npc, true);
if (npcDataComponent.get(npc).walkingAnim) {
clearAnimationTimer(npc);
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
}
let duration = npcData.pathData.totalDuration;
let currentTimer = walkingTimers.get(npc);
console.log('current time is', currentTimer);
if (currentTimer) {
duration -= currentTimer;
}
let path = [];
npcData.pathData.path.forEach((p) => {
path.push(p);
});
path.splice(0, npcData.pathIndex);
let pos = Transform.get(npc).position;
path.unshift(Vector3.create(pos.x, pos.y, pos.z));
walkNPC(npc, npcData, npcData.pathData.pathType, duration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
}
}, duration * 1000);
}
}
export function stopPath(npc) {
utils.paths.stopPath(npc);
IsFollowingPath.deleteFrom(npc);
let npcData = npcDataComponent.get(npc);
if (npcData.walkingAnim) {
clearAnimationTimer(npc);
Animator.playSingleAnimation(npc, npcDataComponent.get(npc).idleAnim);
npcData.lastPlayedAnim = npcData.idleAnim;
}
if (!npcData.manualStop) {
if (npcData.pathData.loop) {
npcData.pathIndex = 0;
walkingTimers.delete(npc);
console.log('we are looping path', npcData);
followPath(npc, npcData.pathData);
console.log(npcData);
}
}
}
export function clearNPC() {
activeNPC = NULL_NPC;
}
export function setActiveNPC(npc) {
activeNPC = npc;
}
export function isActiveNpcSet() {
return activeNPC && npcDialogComponent.has(activeNPC);
}
export function activate(npc, other) {
if (activeNPC != 0) {
console.log('we have a current npc, needto remove');
endInteraction(activeNPC);
}
activeNPC = npc;
onActivateCbs.get(npc)(other);
let npcData = npcDataComponent.get(npc);
if (npcData.faceUser) {
if (TrackUserFlag.has(npc)) {
TrackUserFlag.deleteFrom(npc);
}
TrackUserFlag.create(npc, {
lockXZRotation: true,
active: true,
rotSpeed: npcData.turnSpeed
});
}
isCooldown.set(npc, true);
npcData.inCooldown = true;
utils.timers.setTimeout(function () {
isCooldown.delete(npc);
npcDataComponent.get(npc).inCooldown = false;
}, 1000 * npcData.coolDownDuration);
console.log('activated npc,', npcDataComponent.get(npc));
}
function endInteraction(npc) {
let npcData = npcDataComponent.get(npc);
npcData.state = NPCState.STANDING;
if (npcDialogComponent.has(npc)) {
closeDialog(npc);
}
if (npcData.faceUser) {
if (TrackUserFlag.has(npc)) {
TrackUserFlag.deleteFrom(npc);
}
}
console.log('ending interaction', npcData, bubbles.get(npc));
if (npcData.hasBubble && bubbles.get(npc).isBubbleOpen) {
closeBubble(npc);
}
}
export function handleWalkAway(npc, other) {
let npcData = npcDataComponent.get(npc);
if (npcData.state == NPCState.FOLLOWPATH) {
return;
}
endInteraction(npc);
if (onWalkAwayCbs.get(npc)) {
onWalkAwayCbs.get(npc)(other);
}
}
export function playAnimation(npc, anim, noLoop, duration) {
let animations = Animator.getMutable(npc);
let npcData = npcDataComponent.get(npc);
if (!animations || !npcData)
return;
if (animations.states && animations.states.filter((animation) => animation.clip === anim).length == 0) {
animations.states.push({ clip: anim, loop: noLoop ? false : true });
}
if (npcData.state == NPCState.FOLLOWPATH) {
utils.paths.stopPath(npc);
}
clearAnimationTimer(npc);
Animator.stopAllAnimations(npc, true);
Animator.playSingleAnimation(npc, anim, true);
if (duration) {
console.log('have a duration to play animation');
clearAnimationTimer(npc);
animTimers.set(npc, utils.timers.setTimeout(() => {
clearAnimationTimer(npc);
Animator.stopAllAnimations(npc, true);
if (npcData.idleAnim) {
Animator.playSingleAnimation(npc, npcData.idleAnim);
npcData.lastPlayedAnim = npcData.idleAnim;
}
}, 1000 * duration));
}
npcData.lastPlayedAnim = anim;
}
export function changeIdleAnim(npc, animation, play) {
let npcData = npcDataComponent.get(npc);
npcData.idleAnim = animation;
let animations = Animator.getMutable(npc);
if (animations.states.filter((anim) => anim.clip === animation).length == 0) {
animations.states.push({ clip: animation, loop: true });
}
if (play) {
playAnimation(npc, animation, true);
npcDataComponent.get(npc).lastPlayedAnim = animation;
}
}
export function talkBubble(npc, script, startIndex) {
openBubble(npc, script, startIndex);
}
export function createDialogWindow(defaultPortrait, sound) {
let dialog = engine.addEntity();
addDialog(dialog, sound, defaultPortrait);
return dialog;
}
export function openDialogWindow(npc, dialog, startIndex) {
activeNPC = npc;
if (npcDialogComponent.has(npc)) {
let index;
if (!startIndex) {
index = 0;
}
else if (typeof startIndex === 'number') {
index = startIndex;
}
else {
index = findDialogByName(dialog, startIndex);
}
openDialog(npc, dialog, index);
}
}
export function closeDialogWindow(window) {
let dialog = npcDialogComponent.get(window);
if (window) {
closeDialog(dialog);
}
}
function clearAnimationTimer(npc) {
if (animTimers.has(npc)) {
utils.timers.clearTimeout(animTimers.get(npc));
animTimers.delete(npc);
return true;
}
return false;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25wYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFBO0FBQ3ZDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLE1BQU0sRUFFTixhQUFhLEVBRWIsWUFBWSxFQUNaLFlBQVksRUFHWixtQkFBbUIsRUFDbkIsU0FBUyxFQUdWLE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ25HLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hILE9BQU8sRUFBOEMsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQWUsTUFBTSxTQUFTLENBQUE7QUFDakgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVuRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDM0QsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDM0QsTUFBTSxD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ZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BkY2wtc2RrL3V0aWxzJ1xuaW1wb3J0IHtcbiAgQW5pbWF0b3IsXG4gIEF2YXRhclNoYXBlLFxuICBlbmdpbmUsXG4gIEVudGl0eSxcbiAgR2x0ZkNvbnRhaW5lcixcbiAgSW5wdXRBY3Rpb24sXG4gIE1lc2hDb2xsaWRlcixcbiAgTWVzaFJlbmRlcmVyLFxuICBQQkF2YXRhclNoYXBlLFxuICBQQkdsdGZDb250YWluZXIsXG4gIHBvaW50ZXJFdmVudHNTeXN0ZW0sXG4gIFRyYW5zZm9ybSxcbiAgVHJhbnNmb3JtVHlwZSxcbiAgUEJBbmltYXRpb25TdGF0ZVxufSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBDb2xvcjMsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgYnViYmxlcywgY2xvc2VCdWJibGUsIGNyZWF0ZURpYWxvZ0J1YmJsZSwgb3BlbkJ1YmJsZSB9IGZyb20gJy4vYnViYmxlJ1xuaW1wb3J0IHsgSXNGb2xsb3dpbmdQYXRoLCBUcmFja1VzZXJGbGFnIH0gZnJvbSAnLi9jb21wb25lbnRzJ1xuaW1wb3J0IHsgYWRkRGlhbG9nLCBjbG9zZURpYWxvZywgZmluZERpYWxvZ0J5TmFtZSwgbnBjRGlhbG9nQ29tcG9uZW50LCBvcGVuRGlhbG9nIH0gZnJvbSAnLi9kaWFsb2cnXG5pbXBvcnQgeyBmYWNlVXNlclN5c3RlbSwgaGFuZGxlQnViYmxldHlwaW5nLCBoYW5kbGVEaWFsb2dUeXBpbmcsIGhhbmRsZVBhdGhUaW1lcywgaW5wdXRMaXN0ZW5lclN5c3RlbSB9IGZyb20gJy4vc3lzdGVtcydcbmltcG9ydCB7IERpYWxvZywgRm9sbG93UGF0aERhdGEsIEltYWdlRGF0YSwgTlBDRGF0YSwgTlBDUGF0aFR5cGUsIE5QQ1N0YXRlLCBOUENUeXBlLCBUcmlnZ2VyRGF0YSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBkYXJrVGhlbWUsIGxpZ2h0VGhlbWUgfSBmcm9tICcuL3VpJ1xuaW1wb3J0IHsgaW5pdFNlcnZlck1vZGVsLCBzZXRDdXN0b21TZXJ2ZXJSb29tTmFtZSwgc2V0Q3VzdG9tU2VydmVyVXJsIH0gZnJvbSAnLi9haSdcblxuZXhwb3J0IGNvbnN0IHdhbGtpbmdUa