From c1466c2dec03e6e07d1ff341908f5eeae2536dfb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Mar 2017 10:45:13 -0700 Subject: [PATCH 1/6] Fix a couple sitting bugs --- scripts/tutorials/entity_scripts/sit.js | 33 +++++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/scripts/tutorials/entity_scripts/sit.js b/scripts/tutorials/entity_scripts/sit.js index 82afdc8974..82a6ab06a4 100644 --- a/scripts/tutorials/entity_scripts/sit.js +++ b/scripts/tutorials/entity_scripts/sit.js @@ -1,6 +1,16 @@ +// +// sit.js +// +// Created by Clement Brisset on 3/3/17 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + (function() { Script.include("/~/system/libraries/utils.js"); - + var SETTING_KEY = "com.highfidelity.avatar.isSitting"; var ANIMATION_URL = "https://s3-us-west-1.amazonaws.com/hifi-content/clement/production/animations/sitting_idle.fbx"; var ANIMATION_FPS = 30; @@ -28,6 +38,7 @@ this.interval = null; this.sitDownSettlePeriod = null; this.lastTimeNoDriveKeys = null; + this.sittingDown = false; this.preload = function(entityID) { this.entityID = entityID; @@ -106,6 +117,7 @@ return; } print("Sitting down (" + this.entityID + ")"); + this.sittingDown = true; var now = Date.now(); this.sitDownSettlePeriod = now + IK_SETTLE_TIME; @@ -121,6 +133,11 @@ for (i in ROLES) { MyAvatar.overrideRoleAnimation(ROLES[i], ANIMATION_URL, ANIMATION_FPS, true, ANIMATION_FIRST_FRAME, ANIMATION_LAST_FRAME); } + + for (var i in OVERRIDEN_DRIVE_KEYS) { + MyAvatar.disableDriveKey(OVERRIDEN_DRIVE_KEYS[i]); + } + MyAvatar.resetSensorsAndBody(); } @@ -132,22 +149,21 @@ return { headType: 0 }; }, ["headType"]); Script.update.connect(this, this.update); - for (var i in OVERRIDEN_DRIVE_KEYS) { - MyAvatar.disableDriveKey(OVERRIDEN_DRIVE_KEYS[i]); - } } this.standUp = function() { print("Standing up (" + this.entityID + ")"); MyAvatar.removeAnimationStateHandler(this.animStateHandlerID); Script.update.disconnect(this, this.update); - for (var i in OVERRIDEN_DRIVE_KEYS) { - MyAvatar.enableDriveKey(OVERRIDEN_DRIVE_KEYS[i]); - } this.setSeatUser(null); if (Settings.getValue(SETTING_KEY) === this.entityID) { Settings.setValue(SETTING_KEY, ""); + + for (var i in OVERRIDEN_DRIVE_KEYS) { + MyAvatar.enableDriveKey(OVERRIDEN_DRIVE_KEYS[i]); + } + var ROLES = MyAvatar.getAnimationRoles(); for (i in ROLES) { MyAvatar.restoreRoleAnimation(ROLES[i]); @@ -165,6 +181,7 @@ MyAvatar.bodyRoll = 0.0; }, SIT_DELAY); } + this.sittingDown = false; } // function called by teleport.js if it detects the appropriate userData @@ -215,7 +232,7 @@ } this.update = function(dt) { - if (MyAvatar.sessionUUID === this.getSeatUser()) { + if (this.sittingDown === true) { var properties = Entities.getEntityProperties(this.entityID); var avatarDistance = Vec3.distance(MyAvatar.position, properties.position); var ikError = MyAvatar.getIKErrorOnLastSolve(); From 4c756808777210af7080c5d2db5d05b19335982b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Mar 2017 16:10:15 -0700 Subject: [PATCH 2/6] Set teleport target to Cancel if seat in use --- scripts/system/controllers/teleport.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index c058f046db..49bbdb7682 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -440,7 +440,12 @@ function getTeleportTargetType(intersection) { var props = Entities.getEntityProperties(intersection.entityID, ['userData', 'visible']); var data = parseJSON(props.userData); if (data !== undefined && data.seat !== undefined) { - return TARGET.SEAT; + var avatarUuid = Uuid.fromString(data.seat.user); + if (Uuid.isNull(avatarUuid) || !AvatarList.getAvatar(avatarUuid)) { + return TARGET.SEAT; + } else { + return TARGET.INVALID; + } } if (!props.visible) { From eccc9ff47c30c7782d51a9ae14a8dbbac0479083 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Mar 2017 16:11:17 -0700 Subject: [PATCH 3/6] Prevent 2 avatars from staying seated in the same chair --- scripts/tutorials/entity_scripts/sit.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/tutorials/entity_scripts/sit.js b/scripts/tutorials/entity_scripts/sit.js index 82a6ab06a4..f03bc4fa50 100644 --- a/scripts/tutorials/entity_scripts/sit.js +++ b/scripts/tutorials/entity_scripts/sit.js @@ -156,7 +156,10 @@ MyAvatar.removeAnimationStateHandler(this.animStateHandlerID); Script.update.disconnect(this, this.update); - this.setSeatUser(null); + if (MyAvatar.sessionUUID === this.getSeatUser()) { + this.setSeatUser(null); + } + if (Settings.getValue(SETTING_KEY) === this.entityID) { Settings.setValue(SETTING_KEY, ""); @@ -261,6 +264,9 @@ shouldStandUp = true; } + if (MyAvatar.sessionUUID !== this.getSeatUser()) { + shouldStandUp = true; + } if (shouldStandUp || avatarDistance > RELEASE_DISTANCE) { print("IK error: " + ikError + ", distance from chair: " + avatarDistance); From 1ce4dcc6e5a732dbd1a27a07f59a76fd26f47544 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Mar 2017 16:11:47 -0700 Subject: [PATCH 4/6] Fix attempt for avatar stuck in geometry. --- scripts/tutorials/entity_scripts/sit.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/tutorials/entity_scripts/sit.js b/scripts/tutorials/entity_scripts/sit.js index f03bc4fa50..01c7030a44 100644 --- a/scripts/tutorials/entity_scripts/sit.js +++ b/scripts/tutorials/entity_scripts/sit.js @@ -276,7 +276,11 @@ var offset = { x: 0, y: 1.0, z: -0.5 - properties.dimensions.z * properties.registrationPoint.z }; var position = Vec3.sum(properties.position, Vec3.multiplyQbyV(properties.rotation, offset)); MyAvatar.position = position; - print("Moving Avatar in front of the chair.") + print("Moving Avatar in front of the chair."); + // Delay standing up by 1 cycle. + // This leaves times for the avatar to actually move since a lot + // of the stand up operations are threaded + return; } this.standUp(); From 893a5b1b18fcf32877bf135df0eec1854271816d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Mar 2017 17:16:08 -0700 Subject: [PATCH 5/6] Only override inAir and flying animation roles --- scripts/tutorials/entity_scripts/sit.js | 26 ++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/scripts/tutorials/entity_scripts/sit.js b/scripts/tutorials/entity_scripts/sit.js index 01c7030a44..ae16828c01 100644 --- a/scripts/tutorials/entity_scripts/sit.js +++ b/scripts/tutorials/entity_scripts/sit.js @@ -10,7 +10,13 @@ (function() { Script.include("/~/system/libraries/utils.js"); - + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(searchString, position){ + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; + } + var SETTING_KEY = "com.highfidelity.avatar.isSitting"; var ANIMATION_URL = "https://s3-us-west-1.amazonaws.com/hifi-content/clement/production/animations/sitting_idle.fbx"; var ANIMATION_FPS = 30; @@ -111,6 +117,12 @@ return seatUser !== null; } + this.rolesToOverride = function() { + return MyAvatar.getAnimationRoles().filter(function(role) { + return role === "fly" || role.startsWith("inAir"); + }); + } + this.sitDown = function() { if (this.checkSeatForAvatar()) { print("Someone is already sitting in that chair."); @@ -129,9 +141,9 @@ if (previousValue === "") { MyAvatar.characterControllerEnabled = false; MyAvatar.hmdLeanRecenterEnabled = false; - var ROLES = MyAvatar.getAnimationRoles(); - for (i in ROLES) { - MyAvatar.overrideRoleAnimation(ROLES[i], ANIMATION_URL, ANIMATION_FPS, true, ANIMATION_FIRST_FRAME, ANIMATION_LAST_FRAME); + var roles = this.rolesToOverride(); + for (i in roles) { + MyAvatar.overrideRoleAnimation(roles[i], ANIMATION_URL, ANIMATION_FPS, true, ANIMATION_FIRST_FRAME, ANIMATION_LAST_FRAME); } for (var i in OVERRIDEN_DRIVE_KEYS) { @@ -167,9 +179,9 @@ MyAvatar.enableDriveKey(OVERRIDEN_DRIVE_KEYS[i]); } - var ROLES = MyAvatar.getAnimationRoles(); - for (i in ROLES) { - MyAvatar.restoreRoleAnimation(ROLES[i]); + var roles = this.rolesToOverride(); + for (i in roles) { + MyAvatar.restoreRoleAnimation(roles[i]); } MyAvatar.characterControllerEnabled = true; MyAvatar.hmdLeanRecenterEnabled = true; From eab2c314d8cd6cb925f1fb8179a7bccda3b4fcb0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Mar 2017 17:17:05 -0700 Subject: [PATCH 6/6] Preload sitting animation --- scripts/tutorials/entity_scripts/sit.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/tutorials/entity_scripts/sit.js b/scripts/tutorials/entity_scripts/sit.js index ae16828c01..3d3bc10fb1 100644 --- a/scripts/tutorials/entity_scripts/sit.js +++ b/scripts/tutorials/entity_scripts/sit.js @@ -46,6 +46,9 @@ this.lastTimeNoDriveKeys = null; this.sittingDown = false; + // Preload the animation file + this.animation = AnimationCache.prefetch(ANIMATION_URL); + this.preload = function(entityID) { this.entityID = entityID; }