206 lines
No EOL
5.7 KiB
JavaScript
206 lines
No EOL
5.7 KiB
JavaScript
//
|
|
// VerifyVisitedZone.js
|
|
//
|
|
// Created by Robin Wilson 12/17/2018
|
|
// Adapted from BouncerZone.js
|
|
//
|
|
// Script uses values set in userData to set values in a user's Settings.setValue;
|
|
//
|
|
// Copyright 2018 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
|
|
|
|
/* globals Entities */
|
|
|
|
(function () {
|
|
|
|
var _entityID;
|
|
var LOAD_TIME = 50;
|
|
var HALF = 0.5;
|
|
|
|
// var EVENT_DATE = "12_19_2019";
|
|
// var EVENT_TITLE = "HolidayDecorating";
|
|
// var EVENT_NAME = EVENT_TITLE + "_" + EVENT_DATE;
|
|
// var VOTE_APP_SETTINGS_NAME = EVENT_NAME + "_voteApp"; // "HolidayDecorating_12_19_2019_voteApp"
|
|
|
|
var DEBUG = false;
|
|
|
|
var SETTINGS = "settings";
|
|
var NAME = "name";
|
|
var SET_IF_PRESENT = "setIfPresent";
|
|
var SET_IF_NOT_PRESENT = "setIfNotPresent";
|
|
|
|
// App settings
|
|
// Set from userData on zone
|
|
var settingName;
|
|
var setIfPresent;
|
|
var setIfNotPresent;
|
|
|
|
/*
|
|
|
|
USERDATA EXAMPLE
|
|
|
|
{
|
|
"settings": {
|
|
"name": "test",
|
|
"setIfPresent": { "visited": true },
|
|
"setIfNotPresent": { "visited": true }
|
|
}
|
|
}
|
|
|
|
*/
|
|
|
|
var utils = {
|
|
|
|
getUserData: function () {
|
|
|
|
var properties = Entities.getEntityProperties(_entityID, ["userData"]);
|
|
|
|
try {
|
|
var userData = JSON.parse(properties.userData);
|
|
} catch (err) {
|
|
console.error("Error parsing userData: ", err);
|
|
}
|
|
|
|
return userData;
|
|
},
|
|
|
|
setup: function () {
|
|
var userData = this.getUserData();
|
|
|
|
if (userData[SETTINGS]) {
|
|
var settings = userData[SETTINGS];
|
|
|
|
settingName = settings[NAME];
|
|
setIfNotPresent = settings[SET_IF_NOT_PRESENT];
|
|
setIfPresent = settings[SET_IF_PRESENT];
|
|
}
|
|
},
|
|
|
|
onEnter: function () {
|
|
var currentSettings = Settings.getValue(settingName);
|
|
|
|
var isPresent = currentSettings && true;
|
|
|
|
var toSet;
|
|
|
|
if (isPresent) {
|
|
|
|
// got through each key inside setIfPresent and set to currentSettings
|
|
var keys = Object.keys(setIfPresent);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var currentKey = keys[i];
|
|
var currentValue = setIfPresent[currentKey];
|
|
|
|
currentSettings[currentKey] = currentValue;
|
|
}
|
|
|
|
toSet = currentSettings;
|
|
|
|
} else {
|
|
|
|
toSet = setIfNotPresent;
|
|
|
|
}
|
|
|
|
Settings.setValue(settingName, toSet);
|
|
|
|
},
|
|
|
|
largestAxisVec: function (dimensions) {
|
|
var max = Math.max(dimensions.x, dimensions.y, dimensions.z);
|
|
return max;
|
|
},
|
|
|
|
isInEntity: function () {
|
|
var properties = Entities.getEntityProperties(_entityID, ["position", "dimensions", "rotation"]);
|
|
var position = properties.position;
|
|
var dimensions = properties.dimensions;
|
|
|
|
var avatarPosition = MyAvatar.position;
|
|
var worldOffset = Vec3.subtract(avatarPosition, position);
|
|
|
|
avatarPosition = Vec3.multiplyQbyV(Quat.inverse(properties.rotation), worldOffset);
|
|
|
|
var minX = 0 - dimensions.x * HALF;
|
|
var maxX = 0 + dimensions.x * HALF;
|
|
var minY = 0 - dimensions.y * HALF;
|
|
var maxY = 0 + dimensions.y * HALF;
|
|
var minZ = 0 - dimensions.z * HALF;
|
|
var maxZ = 0 + dimensions.z * HALF;
|
|
|
|
if (avatarPosition.x >= minX && avatarPosition.x <= maxX
|
|
&& avatarPosition.y >= minY && avatarPosition.y <= maxY
|
|
&& avatarPosition.z >= minZ && avatarPosition.z <= maxZ) {
|
|
|
|
if (DEBUG) {
|
|
print("Avatar is inside zone");
|
|
}
|
|
return true;
|
|
|
|
} else {
|
|
|
|
if (DEBUG) {
|
|
print("Avatar is NOT in zone");
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
var VerifyVisitedZone = function () {
|
|
|
|
};
|
|
|
|
VerifyVisitedZone.prototype = {
|
|
|
|
preload: function (entityID) {
|
|
_entityID = entityID;
|
|
var _this = this;
|
|
|
|
utils.setup();
|
|
|
|
Script.setTimeout(function () {
|
|
|
|
_this.insideEntityCheck();
|
|
|
|
}, LOAD_TIME);
|
|
|
|
},
|
|
insideEntityCheck: function () {
|
|
// ensures every avatar experiences the enterEntity method
|
|
var properties = Entities.getEntityProperties(_entityID, ["position", "dimensions"]);
|
|
var largestDimension = utils.largestAxisVec(properties.dimensions);
|
|
var avatarsInRange = AvatarList.getAvatarsInRange(properties.position, largestDimension).filter(function(id) {
|
|
return id === MyAvatar.sessionUUID;
|
|
});
|
|
|
|
if (avatarsInRange.length > 0) {
|
|
if (DEBUG) {
|
|
print("Found avatar near zone");
|
|
}
|
|
// do isInZone check
|
|
if (utils.isInEntity()) {
|
|
this.enterEntity();
|
|
}
|
|
}
|
|
},
|
|
enterEntity: function () {
|
|
|
|
utils.setup();
|
|
|
|
Script.setTimeout(function () {
|
|
|
|
utils.onEnter();
|
|
|
|
}, LOAD_TIME);
|
|
|
|
}
|
|
};
|
|
|
|
return new VerifyVisitedZone();
|
|
|
|
}); |