190 lines · 6.8 KB · JavaScript
RawDownload
////  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); 

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t