// // hiddenEntityReset.js // // Created by Eric Levin on 10/2/15. // Copyright 2015 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 _this; var sprayPaintScriptURL = Script.resolvePath("../examples/toybox/spray_paint/sprayPaintCan.js"); var catScriptURL = Script.resolvePath("../examples/toybox/cat/cat.js"); var flashlightScriptURL = Script.resolvePath('../examples/toybox/flashlight/flashlight.js'); var pingPongScriptURL = Script.resolvePath('../examples/toybox/ping_pong_gun/pingPongGun.js'); var wandScriptURL = Script.resolvePath("../examples/toybox/bubblewand/wand.js"); var dollScriptURL = Script.resolvePath("../examples/toybox/doll/doll.js"); var lightsScriptURL = Script.resolvePath("../examples/toybox/lights/lightSwitch.js"); var targetsScriptURL = Script.resolvePath('../examples/toybox/ping_pong_gun/wallTarget.js'); ResetSwitch = function() { _this = this; }; ResetSwitch.prototype = { clickReleaseOnEntity: function(entityId, mouseEvent) { if (!mouseEvent.isLeftButton) { return; } this.triggerReset(); }, startNearGrabNonColliding: function() { this.triggerReset(); }, triggerReset: function() { MasterReset(); }, preload: function(entityID) { this.entityID = entityID; } }; MasterReset = function() { var resetKey = "resetMe"; var HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; var shouldDeleteOnEndScript = false; //Before creating anything, first search a radius and delete all the things that should be deleted deleteAllToys(); createAllToys(); function createAllToys() { createBlocks({ x: 548.3, y: 495.55, z: 504.4 }); createBasketBall({ x: 547.73, y: 495.5, z: 505.47 }); createDoll({ x: 546.67, y: 495.41, z: 505.09 }); createWand({ x: 546.71, y: 495.55, z: 506.15 }); createDice(); createFlashlight({ x: 545.72, y: 495.41, z: 505.78 }); createCombinedArmChair({ x: 549.29, y: 494.9, z: 508.22 }); createPottedPlant({ x: 554.26, y: 495.2, z: 504.53 }); createPingPongBallGun(); createBasketballHoop(); createBasketballRack(); createGates(); createFire(); // Handles toggling of all sconce lights createLights(); createCat({ x: 551.09, y: 494.98, z: 503.49 }); createSprayCan({ x: 549.7, y: 495.6, z: 503.91 }); createTargets(); } function deleteAllToys() { var entities = Entities.findEntities(MyAvatar.position, 100); entities.forEach(function(entity) { //params: customKey, id, defaultValue var shouldReset = getEntityCustomData(resetKey, entity, {}).resetMe; if (shouldReset === true) { Entities.deleteEntity(entity); } }); } function createFire() { var myOrientation = Quat.fromPitchYawRollDegrees(-90, 0, 0.0); var animationSettings = JSON.stringify({ fps: 30, running: true, loop: true, firstFrame: 1, lastFrame: 10000 }); var fire = Entities.addEntity({ type: "ParticleEffect", name: "fire", animationSettings: animationSettings, textures: "https://hifi-public.s3.amazonaws.com/alan/Particles/Particle-Sprite-Smoke-1.png", position: { x: 551.45, y: 494.82, z: 502.05 }, emitRate: 100, colorStart: { red: 70, green: 70, blue: 137 }, color: { red: 200, green: 99, blue: 42 }, colorFinish: { red: 255, green: 99, blue: 32 }, radiusSpread: 0.01, radiusStart: 0.02, radiusEnd: 0.001, particleRadius: 0.05, radiusFinish: 0.0, emitOrientation: myOrientation, emitSpeed: 0.3, speedSpread: 0.1, alphaStart: 0.05, alpha: 0.1, alphaFinish: 0.05, emitDimensions: { x: 1, y: 1, z: 0.1 }, polarFinish: 0.1, emitAcceleration: { x: 0.0, y: 0.0, z: 0.0 }, accelerationSpread: { x: 0.1, y: 0.01, z: 0.1 }, lifespan: 1, userData: JSON.stringify({ resetMe: { resetMe: true } }) }); } function createBasketballRack() { var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; var RESET_DISTANCE = 1; var MINIMUM_MOVE_LENGTH = 0.05; var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var basketballCollisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/rack_collision_hull.obj"; var rackRotation = Quat.fromPitchYawRollDegrees(0, -90, 0); var rackStartPosition = { x: 542.86, y: 494.84, z: 475.06 }; var rack = Entities.addEntity({ name: 'Basketball Rack', type: "Model", modelURL: rackURL, position: rackStartPosition, rotation: rackRotation, shapeType: 'compound', gravity: { x: 0, y: -9.8, z: 0 }, linearDamping: 1, dimensions: { x: 0.4, y: 1.37, z: 1.73 }, collisionsWillMove: true, ignoreForCollisions: false, compoundShapeURL: rackCollisionHullURL, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }); var collidingBalls = []; function createCollidingBalls() { var position = rackStartPosition; var i; for (i = 0; i < NUMBER_OF_BALLS; i++) { var ballPosition = { x: position.x, y: position.y + DIAMETER * 2, z: position.z + (DIAMETER) - (DIAMETER * i) }; var newPosition = { x: position.x + (DIAMETER * 2) - (DIAMETER * i), y: position.y + DIAMETER * 2, z: position.z }; var collidingBall = Entities.addEntity({ type: "Model", name: 'Hifi-Basketball', shapeType: 'Sphere', position: newPosition, dimensions: { x: DIAMETER, y: DIAMETER, z: DIAMETER }, restitution: 1.0, linearDamping: 0.00001, gravity: { x: 0, y: -9.8, z: 0 }, collisionsWillMove: true, ignoreForCollisions: false, modelURL: basketballURL, userData: JSON.stringify({ originalPositionKey: { originalPosition: newPosition }, resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); collidingBalls.push(collidingBall); } } createCollidingBalls(); } function createTargets() { var MODEL_URL = 'http://hifi-public.s3.amazonaws.com/models/ping_pong_gun/target.fbx'; var COLLISION_HULL_URL = 'http://hifi-public.s3.amazonaws.com/models/ping_pong_gun/target_collision_hull.obj'; var MINIMUM_MOVE_LENGTH = 0.05; var RESET_DISTANCE = 0.5; var TARGET_USER_DATA_KEY = 'hifi-ping_pong_target'; var NUMBER_OF_TARGETS = 6; var TARGETS_PER_ROW = 3; var TARGET_DIMENSIONS = { x: 0.06, y: 0.42, z: 0.42 }; var VERTICAL_SPACING = TARGET_DIMENSIONS.y + 0.5; var HORIZONTAL_SPACING = TARGET_DIMENSIONS.z + 0.5; var startPosition = { x: 548.68, y: 497.30, z: 509.74 }; var rotation = Quat.fromPitchYawRollDegrees(0, -55.25, 0); var targets = []; function addTargets() { var i; var row = -1; for (i = 0; i < NUMBER_OF_TARGETS; i++) { if (i % TARGETS_PER_ROW === 0) { row++; } var vHat = Quat.getFront(rotation); var spacer = HORIZONTAL_SPACING * (i % TARGETS_PER_ROW) + (row * HORIZONTAL_SPACING / 2); var multiplier = Vec3.multiply(spacer, vHat); var position = Vec3.sum(startPosition, multiplier); position.y = startPosition.y - (row * VERTICAL_SPACING); var targetProperties = { name: 'Hifi-Target', type: 'Model', modelURL: MODEL_URL, shapeType: 'compound', collisionsWillMove: true, dimensions: TARGET_DIMENSIONS, compoundShapeURL: COLLISION_HULL_URL, position: position, rotation: rotation, script: targetsScriptURL, userData: JSON.stringify({ originalPositionKey: { originalPosition: position }, resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }; var target = Entities.addEntity(targetProperties); targets.push(target); } } addTargets(); } function createCat(position) { var modelURL = "http://hifi-public.s3.amazonaws.com/ryan/Dark_Cat.fbx"; var animationURL = "http://hifi-public.s3.amazonaws.com/ryan/sleeping.fbx"; var animationSettings = JSON.stringify({ running: true }); var cat = Entities.addEntity({ type: "Model", modelURL: modelURL, name: "cat", script: catScriptURL, animationURL: animationURL, animationSettings: animationSettings, position: position, rotation: { w: 0.35020983219146729, x: -4.57763671875e-05, y: 0.93664455413818359, z: -1.52587890625e-05 }, dimensions: { x: 0.15723302960395813, y: 0.50762706995010376, z: 0.90716040134429932 }, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }); } function createFlashlight(position) { var modelURL = "https://hifi-public.s3.amazonaws.com/models/props/flashlight.fbx"; var flashlight = Entities.addEntity({ type: "Model", modelURL: modelURL, name: "flashlight", script: flashlightScriptURL, position: position, dimensions: { x: 0.08, y: 0.30, z: 0.08 }, collisionsWillMove: true, gravity: { x: 0, y: -3.5, z: 0 }, velocity: { x: 0, y: -0.01, z: 0 }, shapeType: 'box', userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); } function createLights() { var modelURL = "http://hifi-public.s3.amazonaws.com/ryan/lightswitch.fbx"; var rotation = { w: 0.63280689716339111, x: 0.63280689716339111, y: -0.31551080942153931, z: 0.31548023223876953 }; var axis = { x: 0, y: 1, z: 0 }; var dQ = Quat.angleAxis(180, axis); rotation = Quat.multiply(rotation, dQ); var lightSwitchHall = Entities.addEntity({ type: "Model", modelURL: modelURL, name: "Light Switch Hall", script: lightsScriptURL, position: { x: 543.27764892578125, y: 495.67999267578125, z: 511.00564575195312 }, rotation: rotation, dimensions: { x: 0.10546875, y: 0.032372996211051941, z: 0.16242524981498718 }, userData: JSON.stringify({ resetMe: { resetMe: true, on: true, type: "Hall Light" }, grabbableKey: { wantsTrigger: true } }) }); var sconceLight1 = Entities.addEntity({ type: "Light", position: { x: 543.75, y: 496.24, z: 511.13 }, name: "Sconce 1 Light", dimensions: { x: 2.545, y: 2.545, z: 2.545 }, cutoff: 90, color: { red: 217, green: 146, blue: 24 }, isSpotlight: false, userData: JSON.stringify({ resetMe: { resetMe: true, type: "Hall Light" } }) }); var sconceLight2 = Entities.addEntity({ type: "Light", position: { x: 540.1, y: 496.24, z: 505.57 }, name: "Sconce 2 Light", dimensions: { x: 2.545, y: 2.545, z: 2.545 }, cutoff: 90, color: { red: 217, green: 146, blue: 24 }, isSpotlight: false, userData: JSON.stringify({ resetMe: { resetMe: true, type: "Hall Light" } }) }); rotation = { w: 0.20082402229309082, x: 0.20082402229309082, y: -0.67800414562225342, z: 0.67797362804412842 }; axis = { x: 0, y: 1, z: 0 }; dQ = Quat.angleAxis(180, axis); rotation = Quat.multiply(rotation, dQ); var lightSwitchGarage = Entities.addEntity({ type: "Model", modelURL: modelURL, name: "Light Switch Garage", script: lightsScriptURL, position: { x: 545.62, y: 495.68, z: 500.21 }, rotation: rotation, dimensions: { x: 0.10546875, y: 0.032372996211051941, z: 0.16242524981498718 }, userData: JSON.stringify({ resetMe: { resetMe: true, on: true, type: "Garage Light" }, grabbableKey: { wantsTrigger: true } }) }); var sconceLight3 = Entities.addEntity({ type: "Light", position: { x: 545.49468994140625, y: 496.24026489257812, z: 500.63516235351562 }, name: "Sconce 3 Light", dimensions: { x: 2.545, y: 2.545, z: 2.545 }, cutoff: 90, color: { red: 217, green: 146, blue: 24 }, isSpotlight: false, userData: JSON.stringify({ resetMe: { resetMe: true, type: "Garage Light" } }) }); var sconceLight4 = Entities.addEntity({ type: "Light", position: { x: 550.90399169921875, y: 496.24026489257812, z: 507.90237426757812 }, name: "Sconce 4 Light", dimensions: { x: 2.545, y: 2.545, z: 2.545 }, cutoff: 90, color: { red: 217, green: 146, blue: 24 }, isSpotlight: false, userData: JSON.stringify({ resetMe: { resetMe: true, type: "Garage Light" } }) }); var sconceLight5 = Entities.addEntity({ type: "Light", position: { x: 548.407958984375, y: 496.24026489257812, z: 509.5504150390625 }, name: "Sconce 5 Light", dimensions: { x: 2.545, y: 2.545, z: 2.545 }, cutoff: 90, color: { red: 217, green: 146, blue: 24 }, isSpotlight: false, userData: JSON.stringify({ resetMe: { resetMe: true, type: "Garage Light" } }) }); } function createDice() { var diceProps = { type: "Model", modelURL: "http://s3.amazonaws.com/hifi-public/models/props/Dice/goldDie.fbx", collisionSoundURL: "http://s3.amazonaws.com/hifi-public/sounds/dice/diceCollide.wav", name: "dice", position: { x: 541, y: 494.96, z: 509.1 }, dimensions: { x: 0.09, y: 0.09, z: 0.09 }, gravity: { x: 0, y: -3.5, z: 0 }, velocity: { x: 0, y: -0.01, z: 0 }, shapeType: "box", collisionsWillMove: true, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }; var dice1 = Entities.addEntity(diceProps); diceProps.position = { x: 541.05, y: 494.96, z: 509.0 }; var dice2 = Entities.addEntity(diceProps); } function createGates() { var MODEL_URL = 'http://hifi-public.s3.amazonaws.com/ryan/fence.fbx'; var rotation = Quat.fromPitchYawRollDegrees(0, -16, 0); var gate = Entities.addEntity({ name: 'Front Door Fence', type: 'Model', modelURL: MODEL_URL, shapeType: 'box', position: { x: 531.15, y: 495.11, z: 520.20 }, dimensions: { x: 1.42, y: 1.13, z: 0.2 }, rotation: rotation, collisionsWillMove: true, gravity: { x: 0, y: -100, z: 0 }, linearDamping: 1, angularDamping: 10, mass: 10, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }); } function createPingPongBallGun() { var MODEL_URL = 'http://hifi-public.s3.amazonaws.com/models/ping_pong_gun/ping_pong_gun.fbx'; var COLLISION_HULL_URL = 'http://hifi-public.s3.amazonaws.com/models/ping_pong_gun/ping_pong_gun_collision_hull.obj'; var position = { x: 548.6, y: 495.4, z: 503.39 }; var rotation = Quat.fromPitchYawRollDegrees(0, 36, 0); var pingPongGun = Entities.addEntity({ type: "Model", modelURL: MODEL_URL, shapeType: 'box', script: pingPongScriptURL, position: position, rotation: rotation, gravity: { x: 0, y: -9.8, z: 0 }, dimensions: { x: 0.08, y: 0.21, z: 0.47 }, collisionsWillMove: true, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); } function createBasketballHoop() { var position = { x: 539.23, y: 496.13, z: 475.89 }; var rotation = Quat.fromPitchYawRollDegrees(0, 58.49, 0); var hoopURL = "http://hifi-public.s3.amazonaws.com/models/basketball_hoop/basketball_hoop.fbx"; var hoopCollisionHullURL = "http://hifi-public.s3.amazonaws.com/models/basketball_hoop/basketball_hoop_collision_hull.obj"; var hoop = Entities.addEntity({ type: "Model", modelURL: hoopURL, position: position, rotation: rotation, shapeType: 'compound', gravity: { x: 0, y: -9.8, z: 0 }, dimensions: { x: 1.89, y: 3.99, z: 3.79 }, compoundShapeURL: hoopCollisionHullURL, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }); } function createWand(position) { var WAND_MODEL = 'http://hifi-public.s3.amazonaws.com/james/bubblewand/models/wand/wand.fbx'; var WAND_COLLISION_SHAPE = 'http://hifi-public.s3.amazonaws.com/james/bubblewand/models/wand/actual_no_top_collision_hull.obj'; var entity = Entities.addEntity({ name: 'Bubble Wand', type: "Model", modelURL: WAND_MODEL, position: position, gravity: { x: 0, y: -9.8, z: 0 }, dimensions: { x: 0.05, y: 0.25, z: 0.05 }, //must be enabled to be grabbable in the physics engine shapeType: 'compound', collisionsWillMove: true, compoundShapeURL: WAND_COLLISION_SHAPE, //Look into why bubble wand is going through table when gravity is enabled // gravity: {x: 0, y: -3.5, z: 0}, // velocity: {x: 0, y: -0.01, z:0}, script: wandScriptURL, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); } function createBasketBall(position) { var modelURL = "http://s3.amazonaws.com/hifi-public/models/content/basketball2.fbx"; var entity = Entities.addEntity({ type: "Model", modelURL: modelURL, position: position, collisionsWillMove: true, shapeType: "sphere", name: "basketball", dimensions: { x: 0.25, y: 0.26, z: 0.25 }, gravity: { x: 0, y: -7, z: 0 }, restitution: 10, linearDamping: 0.0, velocity: { x: 0, y: -0.01, z: 0 }, collisionSoundURL: "http://s3.amazonaws.com/hifi-public/sounds/basketball/basketball.wav", userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); } function createDoll(position) { var modelURL = "http://hifi-public.s3.amazonaws.com/models/Bboys/bboy2/bboy2.fbx"; var naturalDimensions = { x: 1.63, y: 1.67, z: 0.26 }; var desiredDimensions = Vec3.multiply(naturalDimensions, 0.15); var entity = Entities.addEntity({ type: "Model", name: "doll", modelURL: modelURL, script: dollScriptURL, position: position, shapeType: 'box', dimensions: desiredDimensions, gravity: { x: 0, y: -5, z: 0 }, velocity: { x: 0, y: -0.1, z: 0 }, collisionsWillMove: true, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); } function createSprayCan(position) { var modelURL = "https://hifi-public.s3.amazonaws.com/eric/models/paintcan.fbx"; var entity = Entities.addEntity({ type: "Model", name: "spraycan", script: sprayPaintScriptURL, modelURL: modelURL, position: position, dimensions: { x: 0.07, y: 0.17, z: 0.07 }, collisionsWillMove: true, shapeType: 'box', gravity: { x: 0, y: -0.5, z: 0 }, velocity: { x: 0, y: -1, z: 0 }, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { invertSolidWhileHeld: true } }) }); } function createPottedPlant(position) { var modelURL = "http://hifi-public.s3.amazonaws.com/models/potted_plant/potted_plant.fbx"; var entity = Entities.addEntity({ type: "Model", name: "Potted Plant", modelURL: modelURL, position: position, dimensions: { x: 1.10, y: 2.18, z: 1.07 }, collisionsWillMove: true, shapeType: 'box', gravity: { x: 0, y: -9.8, z: 0 }, velocity: { x: 0, y: 0, z: 0 }, linearDamping: 0.4, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }); } function createCombinedArmChair(position) { var modelURL = "http://hifi-public.s3.amazonaws.com/models/red_arm_chair/combined_chair.fbx"; var RED_ARM_CHAIR_COLLISION_HULL = "http://hifi-public.s3.amazonaws.com/models/red_arm_chair/red_arm_chair_collision_hull.obj"; var rotation = Quat.fromPitchYawRollDegrees(0, -143, 0); var entity = Entities.addEntity({ type: "Model", name: "Red Arm Chair", modelURL: modelURL, shapeType: 'compound', compoundShapeURL: RED_ARM_CHAIR_COLLISION_HULL, position: position, rotation: rotation, dimensions: { x: 1.26, y: 1.56, z: 1.35 }, collisionsWillMove: true, gravity: { x: 0, y: -0.8, z: 0 }, velocity: { x: 0, y: 0, z: 0 }, linearDamping: 0.2, userData: JSON.stringify({ resetMe: { resetMe: true }, grabbableKey: { grabbable: false } }) }); } function createBlocks(position) { var baseURL = HIFI_PUBLIC_BUCKET + "models/content/planky/"; var collisionSoundURL = "https://hifi-public.s3.amazonaws.com/sounds/Collisions-otherorganic/ToyWoodBlock.L.wav"; var NUM_BLOCKS_PER_COLOR = 4; var i, j; var blockTypes = [{ url: "planky_blue.fbx", dimensions: { x: 0.05, y: 0.05, z: 0.25 } }, { url: "planky_green.fbx", dimensions: { x: 0.1, y: 0.1, z: 0.25 } }, { url: "planky_natural.fbx", dimensions: { x: 0.05, y: 0.05, z: 0.05 } }, { url: "planky_yellow.fbx", dimensions: { x: 0.03, y: 0.05, z: 0.25 } }, { url: "planky_red.fbx", dimensions: { x: 0.1, y: 0.05, z: 0.25 } }]; var modelURL, entity; for (i = 0; i < blockTypes.length; i++) { for (j = 0; j < NUM_BLOCKS_PER_COLOR; j++) { modelURL = baseURL + blockTypes[i].url; entity = Entities.addEntity({ type: "Model", modelURL: modelURL, position: Vec3.sum(position, { x: j / 10, y: i / 10, z: 0 }), shapeType: 'box', name: "block", dimensions: blockTypes[i].dimensions, collisionsWillMove: true, collisionSoundURL: collisionSoundURL, gravity: { x: 0, y: -2.5, z: 0 }, velocity: { x: 0, y: -0.01, z: 0 }, userData: JSON.stringify({ resetMe: { resetMe: true } }) }); } } } function cleanup() { deleteAllToys(); } if (shouldDeleteOnEndScript) { Script.scriptEnding.connect(cleanup); } }; // entity scripts always need to return a newly constructed object of our type return new ResetSwitch(); });