overte-lubosz/scripts/tutorials/entity_scripts/floatingLanternBox.js

103 lines
3.3 KiB
JavaScript

"use strict";
/* jslint vars: true, plusplus: true, forin: true*/
/* globals Tablet, Script, AvatarList, Users, Entities, MyAvatar, Camera, Overlays, Vec3, Quat, Controller, print, getControllerWorldLocation */
/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
//
// floatingLanternBox.js
//
// Created by MrRoboman on 17/05/04
// Copyright 2017 High Fidelity, Inc.
//
// Spawns new floating lanterns every couple seconds if the old ones have been removed.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
(function() {
var _this;
var LANTERN_MODEL_URL = Script.getExternalPath(Script.ExternalPaths.HF_Content, "/DomainContent/Welcome%20Area/Models/chinaLantern_capsule.fbx");
var LANTERN_SCRIPT_URL = Script.resolvePath("floatingLantern.js?v=" + Date.now());
var LIFETIME = 120;
var RESPAWN_INTERVAL = 1000;
var MAX_LANTERNS = 4;
var SCALE_FACTOR = 1;
var LANTERN = {
type: "Model",
name: "Floating Lantern",
description: "Spawns Lanterns that float away when grabbed and released!",
modelURL: LANTERN_MODEL_URL,
script: LANTERN_SCRIPT_URL,
dimensions: {
x: 0.2049 * SCALE_FACTOR,
y: 0.4 * SCALE_FACTOR,
z: 0.2049 * SCALE_FACTOR
},
gravity: {
x: 0,
y: -1,
z: 0
},
velocity: {
x: 0, y: .01, z: 0
},
linearDampening: 0,
shapeType: 'Box',
lifetime: LIFETIME,
dynamic: true
};
lanternBox = function() {
_this = this;
};
lanternBox.prototype = {
preload: function(entityID) {
this.entityID = entityID;
var props = Entities.getEntityProperties(this.entityID);
if (props.owningAvatarID === MyAvatar.sessionUUID) {
this.respawnTimer = Script.setInterval(this.spawnAllLanterns.bind(this), RESPAWN_INTERVAL);
}
},
unload: function(entityID) {
if (this.respawnTimer) {
Script.clearInterval(this.respawnTimer);
}
},
spawnAllLanterns: function() {
var props = Entities.getEntityProperties(this.entityID);
var lanternCount = 0;
var nearbyEntities = Entities.findEntities(props.position, props.dimensions.x * 0.75);
for (var i = 0; i < nearbyEntities.length; i++) {
var name = Entities.getEntityProperties(nearbyEntities[i], ["name"]).name;
if (name === "Floating Lantern") {
lanternCount++;
}
}
while (lanternCount++ < MAX_LANTERNS) {
this.spawnLantern();
}
},
spawnLantern: function() {
var boxProps = Entities.getEntityProperties(this.entityID);
LANTERN.position = boxProps.position;
LANTERN.position.x += Math.random() * .2 - .1;
LANTERN.position.y += Math.random() * .2 + .1;
LANTERN.position.z += Math.random() * .2 - .1;
LANTERN.owningAvatarID = boxProps.owningAvatarID;
return Entities.addEntity(LANTERN);
}
};
return new lanternBox();
});