mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 07:47:30 +02:00
allow crowd-agent STOP command to take a delay time before it acts
This commit is contained in:
parent
03946748bc
commit
d69ea6b252
1 changed files with 45 additions and 11 deletions
|
@ -16,7 +16,7 @@
|
|||
|
||||
var MESSAGE_CHANNEL = "io.highfidelity.summon-crowd";
|
||||
|
||||
print('crowd-agent version 3');
|
||||
print('crowd-agent version 4');
|
||||
|
||||
/* Observations:
|
||||
- File urls for AC scripts silently fail. Use a local server (e.g., python SimpleHTTPServer) for development.
|
||||
|
@ -34,19 +34,56 @@ function getSound(data, callback) { // callback(sound) when downloaded (which ma
|
|||
if (sound.downloaded) {
|
||||
return callback(sound);
|
||||
}
|
||||
sound.ready.connect(function () { callback(sound); });
|
||||
function onDownloaded() {
|
||||
sound.ready.disconnect(onDownloaded);
|
||||
callback(sound);
|
||||
}
|
||||
sound.ready.connect(onDownloaded);
|
||||
}
|
||||
function onFinishedPlaying() {
|
||||
messageSend({key: 'finishedSound'});
|
||||
}
|
||||
|
||||
var attachment;
|
||||
var stopper;
|
||||
function clearStopper() {
|
||||
if (!stopper) {
|
||||
return;
|
||||
}
|
||||
Script.clearTimeout(stopper);
|
||||
stopper = null;
|
||||
}
|
||||
function stopAgent(parameters) {
|
||||
function stop() {
|
||||
clearStopper();
|
||||
if (attachment) {
|
||||
Avatar.detachOne(attachment.modelURL, attachment.jointName);
|
||||
attachment = undefined;
|
||||
}
|
||||
Agent.isListeningToAudioStream = false;
|
||||
Agent.isAvatar = false;
|
||||
print('crowd-agent stopped', JSON.stringify(parameters), JSON.stringify(Agent));
|
||||
}
|
||||
// Shutting down lots of agents at once can be hard on other parts of the system. (See fogbugz 2095.)
|
||||
// For now, accept a parameter to delay for the given number of milliseconds before stopping.
|
||||
// (We cannot count on summoning scripts to spread out the STOP messages, because they might be doing so
|
||||
// on scriptEnding, in which case they are not allowed to create new delays.)
|
||||
if (parameters.delay) {
|
||||
if (!stopper) { // Let the first stopper do the deed.
|
||||
stopper = Script.setTimeout(stop, parameters.delay);
|
||||
}
|
||||
} else {
|
||||
stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var MILLISECONDS_IN_SECOND = 1000;
|
||||
function startAgent(parameters) { // Can also be used to update.
|
||||
print('crowd-agent starting params', JSON.stringify(parameters), JSON.stringify(Agent));
|
||||
clearStopper();
|
||||
var wasOff = !Agent.isAvatar;
|
||||
Agent.isAvatar = true;
|
||||
Agent.isListeningToAudioStream = true; // Send silence when not chattering.
|
||||
if (parameters.position) {
|
||||
Avatar.position = parameters.position;
|
||||
}
|
||||
|
@ -56,6 +93,11 @@ function startAgent(parameters) { // Can also be used to update.
|
|||
if (parameters.skeletonModelURL) {
|
||||
Avatar.skeletonModelURL = parameters.skeletonModelURL;
|
||||
}
|
||||
if (parameters.listen != undefined) {
|
||||
Agent.isListeningToAudioStream = parameters.listen; // Send silence when not chattering.
|
||||
} else if (wasOff) {
|
||||
Agent.isListeningToAudioStream = true;
|
||||
}
|
||||
if (parameters.soundData) {
|
||||
getSound(parameters.soundData, function (sound) {
|
||||
Script.setTimeout(onFinishedPlaying, sound.duration * MILLISECONDS_IN_SECOND);
|
||||
|
@ -74,14 +116,6 @@ function startAgent(parameters) { // Can also be used to update.
|
|||
}
|
||||
print('crowd-agent avatars started');
|
||||
}
|
||||
function stopAgent(parameters) {
|
||||
if (attachment) {
|
||||
Avatar.detachOne(attachment.modelURL, attachment.jointName);
|
||||
attachment = undefined;
|
||||
}
|
||||
Agent.isAvatar = false;
|
||||
print('crowd-agent stopped', JSON.stringify(parameters), JSON.stringify(Agent));
|
||||
}
|
||||
|
||||
function messageHandler(channel, messageString, senderID) {
|
||||
if (channel !== MESSAGE_CHANNEL) {
|
||||
|
|
Loading…
Reference in a new issue