mirror of
https://github.com/overte-org/overte.git
synced 2025-06-18 21:41:20 +02:00
Added enity script for balloon spawner and sample json entity with userData to attach script to
This commit is contained in:
parent
8507fffcc2
commit
bc7ea11297
2 changed files with 201 additions and 0 deletions
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"Entities": [
|
||||||
|
{
|
||||||
|
"description": "Spawns balloons",
|
||||||
|
"dimensions": {
|
||||||
|
"x": 2,
|
||||||
|
"y": 0.1,
|
||||||
|
"z": 2
|
||||||
|
},
|
||||||
|
"name": "Balloon Spawner",
|
||||||
|
"serverScripts": "https://s3.amazonaws.com/hifi-rabelaiis/spawnBalloons.js",
|
||||||
|
"type": "Shape",
|
||||||
|
"shape": "Cube",
|
||||||
|
"visible": "false",
|
||||||
|
"collisionless": "true",
|
||||||
|
"userData": "{\"spawnRate\":1000,\"xRangeMax\":1,\"zRangeMax\":1,\"gravityCoefficient\":0.25,\"balloonLifetime\":10,\"spawnTime\":300}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Version": 63
|
||||||
|
}
|
181
scripts/tutorials/entity_scripts/balloonSpawner/spawnBalloons.js
Normal file
181
scripts/tutorials/entity_scripts/balloonSpawner/spawnBalloons.js
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//
|
||||||
|
// spawnBalloons.js
|
||||||
|
//
|
||||||
|
// Created by Johnathan Franck on 3 May 2017.
|
||||||
|
// 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() {
|
||||||
|
var RED_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/redBalloon.fbx";
|
||||||
|
var BLUE_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/blueBalloon.fbx";
|
||||||
|
var GREEN_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/greenBalloon.fbx";
|
||||||
|
var YELLOW_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/yellowBalloon.fbx";
|
||||||
|
var ORANGE_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/orangeBalloon.fbx";
|
||||||
|
var CYAN_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/cyanBalloon.fbx";
|
||||||
|
var PURPLE_BALLOON_URL = "https://s3.amazonaws.com/hifi-rabelaiis/purpleBalloon.fbx";
|
||||||
|
|
||||||
|
var BALLOON_COLORS = ["red", "blue", "green", "yellow", "orange", "cyan", "purple"];
|
||||||
|
var BALLOON_URLS = [RED_BALLOON_URL, BLUE_BALLOON_URL, GREEN_BALLOON_URL,
|
||||||
|
YELLOW_BALLOON_URL, ORANGE_BALLOON_URL, CYAN_BALLOON_URL, PURPLE_BALLOON_URL];
|
||||||
|
|
||||||
|
var NUM_COLORS = 7;
|
||||||
|
var COUNTDOWN_SECONDS = 9;
|
||||||
|
|
||||||
|
var spawnRate = 2000;
|
||||||
|
var xRangeMax = 1;
|
||||||
|
var zRangeMax = 1;
|
||||||
|
var gravityCoefficient = 0.25;
|
||||||
|
var balloonLifetime = 10;
|
||||||
|
var spawnTime = 300;
|
||||||
|
var spawnIntervalID;
|
||||||
|
var countdownIntervalID;
|
||||||
|
var countdownEntityID;
|
||||||
|
|
||||||
|
this.preload = function(pEntityID) {
|
||||||
|
startCountdown(pEntityID);
|
||||||
|
};
|
||||||
|
|
||||||
|
function startCountdown(pEntityID) {
|
||||||
|
var countdownSeconds = COUNTDOWN_SECONDS,
|
||||||
|
parentProperties = Entities.getEntityProperties(pEntityID, ["position"]),
|
||||||
|
countdownEntityProperties;
|
||||||
|
|
||||||
|
countdownEntityProperties = {
|
||||||
|
type: "Text",
|
||||||
|
text: countdownSeconds,
|
||||||
|
lineHeight: 0.71,
|
||||||
|
dimensions: {
|
||||||
|
x: 0.5,
|
||||||
|
y: 1,
|
||||||
|
z: 0.01
|
||||||
|
},
|
||||||
|
textColor: {
|
||||||
|
red: 0,
|
||||||
|
blue: 255,
|
||||||
|
green: 0
|
||||||
|
},
|
||||||
|
backgroundColor: {
|
||||||
|
red: 255,
|
||||||
|
blue: 255,
|
||||||
|
green: 255
|
||||||
|
},
|
||||||
|
parentID: pEntityID,
|
||||||
|
position: parentProperties.position
|
||||||
|
};
|
||||||
|
|
||||||
|
countdownEntityID = Entities.addEntity(countdownEntityProperties);
|
||||||
|
countdownIntervalID = Script.setInterval(function () {
|
||||||
|
countdownSeconds -= 1;
|
||||||
|
if (countdownSeconds < 0) {
|
||||||
|
Script.clearInterval(countdownIntervalID);
|
||||||
|
Entities.deleteEntity(countdownEntityID);
|
||||||
|
} else {
|
||||||
|
Entities.editEntity(countdownEntityID, {"text": countdownSeconds});
|
||||||
|
if (countdownSeconds === 0) {
|
||||||
|
spawnBalloons(pEntityID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function spawnBalloons(pEntityID) {
|
||||||
|
var parentProperties = Entities.getEntityProperties(pEntityID, ["position", "userData"]),
|
||||||
|
spawnerSettings,
|
||||||
|
spawnCount = 0;
|
||||||
|
|
||||||
|
if (parentProperties.userData){
|
||||||
|
spawnerSettings = JSON.parse(parentProperties.userData);
|
||||||
|
}
|
||||||
|
|
||||||
|
xRangeMax = !isNaN(spawnerSettings.xRangeMax) ? spawnerSettings.xRangeMax : xRangeMax;
|
||||||
|
zRangeMax = !isNaN(spawnerSettings.zRangeMax) ? spawnerSettings.zRangeMax : zRangeMax;
|
||||||
|
gravityCoefficient = !isNaN(spawnerSettings.gravityCoefficient) ? spawnerSettings.gravityCoefficient : gravityCoefficient;
|
||||||
|
spawnTime = !isNaN(spawnerSettings.spawnTime) ? spawnerSettings.spawnTime : spawnTime;
|
||||||
|
balloonLifetime = !isNaN(spawnerSettings.balloonLifetime) ? spawnerSettings.balloonLifetime : balloonLifetime;
|
||||||
|
spawnRate = !isNaN(spawnerSettings.spawnRate) ? spawnerSettings.spawnRate : spawnRate;
|
||||||
|
|
||||||
|
spawnIntervalID = Script.setInterval(function() {
|
||||||
|
var colorID = Math.floor(Math.random() * NUM_COLORS),
|
||||||
|
color = BALLOON_COLORS[colorID],
|
||||||
|
balloonURL = BALLOON_URLS[colorID],
|
||||||
|
balloonPosition = {},
|
||||||
|
balloonProperties;
|
||||||
|
|
||||||
|
spawnCount ++;
|
||||||
|
//Randomize balloon spawn position
|
||||||
|
balloonPosition.y = parentProperties.position.y + 0.5;
|
||||||
|
balloonPosition.x = parentProperties.position.x + (Math.random() - 0.5) * 2 * xRangeMax;
|
||||||
|
balloonPosition.z = parentProperties.position.z + (Math.random() - 0.5) * 2 * zRangeMax;
|
||||||
|
|
||||||
|
balloonProperties = {
|
||||||
|
position: balloonPosition,
|
||||||
|
lifetime: balloonLifetime,
|
||||||
|
angularVelocity: {
|
||||||
|
x: -0.03654664754867554,
|
||||||
|
y: -0.4030083637684583664 + Math.random(),
|
||||||
|
z: 0.02576472796499729
|
||||||
|
},
|
||||||
|
collisionsWillMove: 1,
|
||||||
|
density: 100,
|
||||||
|
description: "A happy " + color + " balloon",
|
||||||
|
dimensions: {
|
||||||
|
x: 0.3074322044849396,
|
||||||
|
y: 0.40930506587028503,
|
||||||
|
z: 0.30704551935195923
|
||||||
|
},
|
||||||
|
dynamic: 1,
|
||||||
|
gravity: {
|
||||||
|
x: 0,
|
||||||
|
y: gravityCoefficient,
|
||||||
|
z: 0
|
||||||
|
},
|
||||||
|
modelURL: balloonURL,
|
||||||
|
name: color + " balloon",
|
||||||
|
queryAACube: {
|
||||||
|
scale: 0.596927285194397,
|
||||||
|
x: -0.2984636425971985,
|
||||||
|
y: -0.2984636425971985,
|
||||||
|
z: -0.2984636425971985
|
||||||
|
},
|
||||||
|
restitution: 0.9900000095367432,
|
||||||
|
rotation: {
|
||||||
|
w: -0.10368101298809052,
|
||||||
|
x: 0.5171623826026917,
|
||||||
|
y: 0.1211432576179504,
|
||||||
|
z: -0.670971691608429 + Math.random()
|
||||||
|
},
|
||||||
|
shapeType: "sphere",
|
||||||
|
type : "Model",
|
||||||
|
velocity: {
|
||||||
|
x: 0.003623033408075571,
|
||||||
|
y: 0.0005839366931468248,
|
||||||
|
z: -0.01512028019875288
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Entities.addEntity(balloonProperties);
|
||||||
|
|
||||||
|
//Stop spawning after spawnTime
|
||||||
|
if (spawnCount * spawnRate / 1000 > spawnTime){
|
||||||
|
Script.clearInterval(spawnIntervalID);
|
||||||
|
}
|
||||||
|
}, spawnRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.unload = function(){
|
||||||
|
if (spawnIntervalID){
|
||||||
|
Script.clearInterval(spawnIntervalID);
|
||||||
|
}
|
||||||
|
if (countdownIntervalID){
|
||||||
|
Script.clearInterval(countdownIntervalID);
|
||||||
|
}
|
||||||
|
if (countdownEntityID){
|
||||||
|
Entities.deleteEntity(countdownEntityID);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in a new issue