// // Grenade.js // examples // // Created by Philip Rosedale on August 20, 2015 // 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 // var grenadeURL = Script.getExternalPath(Script.ExternalPaths.Assets, "models/props/grenade/grenade.fbx"); var fuseSoundURL = Script.getExternalPath(Script.ExternalPaths.Assets, "sounds/burningFuse.wav"); var boomSoundURL = Script.getExternalPath(Script.ExternalPaths.Assets, "sounds/explosion.wav"); var AudioRotationOffset = Quat.fromPitchYawRollDegrees(0, -90, 0); var audioOptions = { volume: 0.5, loop: true } var injector = null; var fuseSound = SoundCache.getSound(fuseSoundURL, audioOptions.isStereo); var boomSound = SoundCache.getSound(boomSoundURL, audioOptions.isStereo); var grenade = null; var particles = null; var properties = null; var originalPosition = null; var isGrenade = false; var isBurning = false; var GRAVITY = -9.8; var TIME_TO_EXPLODE = 2500; var DISTANCE_IN_FRONT_OF_ME = 1.0; var PI = 3.141593; var DEG_TO_RAD = PI / 180.0; function makeGrenade() { var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.0, z: -DISTANCE_IN_FRONT_OF_ME })); var rotation = Quat.multiply(MyAvatar.orientation, Quat.fromPitchYawRollDegrees(0, -90, 0)); grenade = Entities.addEntity({ type: "Model", position: position, rotation: rotation, dimensions: { x: 0.09, y: 0.20, z: 0.09 }, dynamic: true, modelURL: grenadeURL, shapeType: "box" }); properties = Entities.getEntityProperties(grenade); audioOptions.position = position; audioOptions.orientation = rotation; originalPosition = position; } function update() { if (!grenade) { makeGrenade(); } else { var newProperties = Entities.getEntityProperties(grenade); if (!isBurning) { // If moved, start fuse var FUSE_START_MOVE = 0.01; if (Vec3.length(Vec3.subtract(newProperties.position, originalPosition)) > FUSE_START_MOVE) { isBurning = true; // Create fuse particles particles = Entities.addEntity({ type: "ParticleEffect", isEmitting: true, position: newProperties.position, textures: 'https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png', emitRate: 100, polarFinish: 25 * DEG_TO_RAD, color: { red: 200, green: 0, blue: 0 }, lifespan: 10.0, visible: true, locked: false }); // Start fuse sound injector = Audio.playSound(fuseSound, audioOptions); // Start explosion timer Script.setTimeout(boom, TIME_TO_EXPLODE); originalPosition = newProperties.position; // Add gravity Entities.editEntity(grenade, { gravity: {x: 0, y: GRAVITY, z: 0 }}); } } if (newProperties.type === "Model") { if (newProperties.position != properties.position) { audioOptions.position = newProperties.position; } if (newProperties.orientation != properties.orientation) { audioOptions.orientation = newProperties.orientation; } properties = newProperties; // Update sound location if playing if (injector) { injector.options = audioOptions; } if (particles) { Entities.editEntity(particles, { position: newProperties.position }); } } else { grenade = null; Script.update.disconnect(update); Script.scriptEnding.connect(scriptEnding); scriptEnding(); Script.stop(); } } } function boom() { injector.stop(); isBurning = false; var audioOptions = { position: properties.position, volume: 0.75, loop: false } Audio.playSound(boomSound, audioOptions); Entities.addEntity({ type: "ParticleEffect", isEmitting: true, position: properties.position, textures: 'https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png', emitRate: 200, polarFinish: 25 * DEG_TO_RAD, color: { red: 255, green: 255, blue: 0 }, lifespan: 2.0, visible: true, lifetime: 2, locked: false }); var BLAST_RADIUS = 20.0; var LIFT_DEPTH = 2.0; var epicenter = properties.position; epicenter.y -= LIFT_DEPTH; blowShitUp(epicenter, BLAST_RADIUS); deleteStuff(); } function blowShitUp(position, radius) { var stuff = Entities.findEntities(position, radius); var numMoveable = 0; var STRENGTH = 3.5; var SPIN_RATE = 20.0; for (var i = 0; i < stuff.length; i++) { var properties = Entities.getEntityProperties(stuff[i]); if (properties.dynamic) { var diff = Vec3.subtract(properties.position, position); var distance = Vec3.length(diff); var velocity = Vec3.sum(properties.velocity, Vec3.multiply(STRENGTH * 1.0 / distance, Vec3.normalize(diff))); var angularVelocity = { x: Math.random() * SPIN_RATE, y: Math.random() * SPIN_RATE, z: Math.random() * SPIN_RATE }; angularVelocity = Vec3.multiply( 1.0 / distance, angularVelocity); Entities.editEntity(stuff[i], { velocity: velocity, angularVelocity: angularVelocity }); } } } function scriptEnding() { deleteStuff(); } function deleteStuff() { if (grenade != null) { Entities.deleteEntity(grenade); grenade = null; } if (particles != null) { Entities.deleteEntity(particles); particles = null; } } Script.update.connect(update); Script.scriptEnding.connect(scriptEnding);