// // 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(); });