(function () { // System variables var SPAWNERMODEL = "https://hifi-content.s3.amazonaws.com/liv/3DModels/Spawner.fbx"; var _spawnerObject = -1; // We set this when we have an object var _username = GlobalServices.username; // Used to subscribe to Pub/Sub messages var _interval; // User specified variables var _emojisToSpawn = []; var _lifetime = 60; var _frequency = 30; var _showUserNames = true; // Set up the app if (Settings.getValue("ACTIVE_BROADCAST_QUERY") === "") { Settings.setValue("ACTIVE_BROADCAST_QUERY", false); } var APP_NAME = "CONFIG"; var APP_URL = Script.resolvePath("app.html?") + _username + "&" + Settings.getValue("ACTIVE_BROADCAST_QUERY"); var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); var button = tablet.addButton({ text: APP_NAME }); function onClicked() { tablet.gotoWebScreen(APP_URL); } button.clicked.connect(onClicked); // Handle web events function onWebEventReceived(event) { if (typeof event === "string") { print("Received event: " + event); event = JSON.parse(event); } // Handle the submit / start button event if (event.type === "submit") { var data = event.data; // Get the user settings _emojisToSpawn = data.emojis; _lifetime = data.lifetime; _frequency = data.frequency; _showUserNames = data.useNames; if (_spawnerObject === -1) { // The user has not set up an object, so make one _spawnerObject = createObjectForEmojiLocation(); } Settings.setValue("ACTIVE_BROADCAST_QUERY", true); // We are now listening for emojis } // Handle the creation of a location entity if (event.type === "setLoc") { // We do not already have an object spawning if (_spawnerObject === -1) { _spawnerObject = createObjectForEmojiLocation(); } else { Entities.editEntity(_spawnerObject, { position: Vec3.sum(MyAvatar.position, Quat.getFront(MyAvatar.orientation)) }); } } // Handle stopping listening for emojis if (event.type === "stop") { Entities.deleteEntity(_spawnerObject); _spawnerObject = -1; Settings.setValue("ACTIVE_BROADCAST_QUERY", false); // We are no longer querying for emojis Script.clearInterval(_interval) } if (event.type === "receivedMsg") { print(JSON.stringify(event.data.message.text)); } } function createObjectForEmojiLocation() { var properties = { position: Vec3.sum(MyAvatar.position, Quat.getFront(MyAvatar.orientation)), grabbable: true, type: "Model", modelURL: SPAWNERMODEL } return Entities.addEntity(properties); } tablet.webEventReceived.connect(onWebEventReceived); // Clean up when done function cleanup() { if (_spawnerObject != -1) { // We have an emoji spawner to clean up _activelyListening = false; Entities.deleteEntity(_spawnerObject); // Disconnect any scripts that are setting up Settings.setValue("ACTIVE_BROADCAST_QUERY", false); // We are no longer querying for emojis } tablet.removeButton(button); } Script.scriptEnding.connect(cleanup); /** * BEGIN TEMPORARY EMOJI SOLUTION * TODO: REPLACE WITH LIBRARY PENDING FINAL EMOJI APP */ // Set up our emojis var _emojis = []; var _overlays = []; var EMOJI_MODEL_URLS = ["https://hifi-content.s3.amazonaws.com/liv/3DModels/heart.fbx", "https://hifi-content.s3.amazonaws.com/liv/3DModels/Flower.fbx", "https://hifi-content.s3.amazonaws.com/liv/3DModels/poo.fbx", "https://hifi-content.s3.amazonaws.com/liv/3DModels/pizza.fbx", "https://hifi-content.s3.amazonaws.com/liv/3DModels/Pickle_Mat.fbx"]; var EMOJI_SCRIPT_URLS = ["https://hifi-content.s3.amazonaws.com/liv/dev/emojis/HeartEmoji.js", "https://hifi-content.s3.amazonaws.com/liv/dev/emojis/Flowers.js", "https://hifi-content.s3.amazonaws.com/liv/dev/emojis/Fart.js", "https://hifi-content.s3.amazonaws.com/liv/dev/emojis/Edible.js", "https://hifi-content.s3.amazonaws.com/liv/dev/emojis/Crunch.js"]; var EMOJI_DIMENSIONS = [{ x: 0.1768, y: .1529, z: .0817 }, { x: .3272, y: 0.0172, z: 0.3343 }, { x: .1563, y: 0.1122, z: 0.1563 }, { x: .4397, y: 0.0148, z: 0.3080 }, { x: .1134, y: 0.0452, z: 0.0725 }]; var FUNCTION_URL = "https://sendanentity.azurewebsites.net/api/HttpTriggerJS/"; var Create3DEmoji = function (emojiType, userName) { print("Creating " + emojiType + " emoji"); var index = 0; switch (emojiType) { case "Heart": index = 0; break; case "Flowers": index = 1; break; case "Poo": index = 2; break; case "Pizza": index = 3; break; case "Pickle": index = 4; break; default: print("Unsupported emoji type"); break; }; var emojiProperties = { type: "Model", name: userName, modelURL: EMOJI_MODEL_URLS[index], position: Entities.getEntityProperties(_spawnerObject).position, dimensions: EMOJI_DIMENSIONS[index], dynamic: true, angularVelocity: { x: 0, y: 5, z: 0 }, angularDamping: .1, velocity: { x: 0, y: -.2, z: 0 }, gravity: { x: 0, y: -.1, z: 0 }, linearDamping: 0, lifetime: _lifetime, grabbable: true, collisionless: false, script: EMOJI_SCRIPT_URLS[index], shapeType: 'Box' } var newEmoji = Entities.addEntity(emojiProperties); print(JSON.stringify(Entities.getEntityProperties(newEmoji).position)) _emojis.push(newEmoji); var nameOverlayProperties = { type: "Text", parentID: newEmoji, position: Entities.getEntityProperties(_spawnerObject, 'position'), localPosition: { x: 0.0, y: 0.2, z: 0.0 }, dimensions: { x: .5, y: .1, z: 0.01 }, lineHeight: 0.065, text: userName } if (_showUserNames) { var textEntity = Entities.addEntity(nameOverlayProperties); _overlays.push(textEntity); } }; function parseResponse(response) { var _hearts = response.Heart._; var _sentHeart = formatUsernameList(response.SentHeart._); for (var i = 0; i < _hearts; ++i) { Create3DEmoji("Heart", _sentHeart[i]); } var _flowers = response.Flowers._; var _sentFlowers = formatUsernameList(response.SentFlowers._); for (var i = 0; i < _flowers; ++i) { Create3DEmoji("Flowers", _sentFlowers[i]); } var _pizza = response.Pizza._; var _sentPizza = formatUsernameList(response.SentPizza._); for (var i = 0; i < _pizza; ++i) { Create3DEmoji("Pizza", _sentPizza[i]); } var _poo = response.Poo._; var _sentPoo = formatUsernameList(response.SentPoo._); for (var i = 0; i < _poo; ++i) { Create3DEmoji("Poo", _sentPoo[i]); } var _pickle = response.Pickle._; var _sentPickle = formatUsernameList(response.SentPickle._); for (var i = 0; i < _pickle; ++i) { Create3DEmoji("Pickle", _sentPickle[i]); } }; // Helper function to format user names function formatUsernameList(unformattedList) { var trimmed = unformattedList.substring(2); // Remove prefixed comma return trimmed.split(','); }; /** * END TEMPORARY EMOJI SOLUTION */ })();