238 lines
7.5 KiB
JavaScript
238 lines
7.5 KiB
JavaScript
(function() {
|
|
//Script.include("../../../developer/libraries/utils.js");
|
|
var _this;
|
|
var TRIGGER_CONTROLS = [
|
|
Controller.Standard.LT,
|
|
Controller.Standard.RT,
|
|
];
|
|
var triggerState = false;
|
|
var TIMESCALE = 0.03;
|
|
var ACTION_TTL = 10;
|
|
|
|
MagicWand = function() {
|
|
_this = this;
|
|
_this.launchSound = SoundCache.getSound("https://s3-us-west-1.amazonaws.com/hifi-content/eric/Sounds/missle+launch.wav");
|
|
_this.explosionSound = SoundCache.getSound("https://s3-us-west-1.amazonaws.com/hifi-content/eric/Sounds/fireworksExplosion.wav");
|
|
_this.TIME_TO_EXPLODE = 3000;
|
|
};
|
|
|
|
function triggerPulled(hand) {
|
|
var triggerValue = Controller.getValue(TRIGGER_CONTROLS[hand]);
|
|
var oldTriggerState = triggerState;
|
|
var TRIGGER_PULL_THRESHOLD = 0.5;
|
|
var TRIGGER_RELEASE_THRESHOLD = 0.4;
|
|
if (triggerValue > TRIGGER_PULL_THRESHOLD) {
|
|
triggerState = true;
|
|
} else if (triggerValue < TRIGGER_RELEASE_THRESHOLD) {
|
|
triggerState = false;
|
|
}
|
|
return (triggerState && (oldTriggerState != triggerState));
|
|
};
|
|
|
|
function updateSpringAction(timescale) {
|
|
var targetProps = SVGElementInstanceList.getEntityProperties(_this.entityID);
|
|
var props = {
|
|
targetPosition: targetProps.position,
|
|
targetRotation: targetProps.rotation,
|
|
linearTimeScale: timescale,
|
|
angularTimeScale: timescale,
|
|
ttl: ACTION_TTL
|
|
};
|
|
Entities.updateAction(_this.copy, _this.actionID, props);
|
|
};
|
|
|
|
function createSpringAction(timescale) {
|
|
var targetProps = SVGElementInstanceList.getEntityProperties(_this.entityID);
|
|
var props = {
|
|
targetPosition: targetProps.position,
|
|
targetRotation: targetProps.rotation,
|
|
linearTimeScale: timescale,
|
|
angularTimeScale: timescale,
|
|
ttl: ACTION_TTL
|
|
};
|
|
_this.actionID = Entities.addAction("spring", _this.copy, props);
|
|
};
|
|
|
|
function createCopy() {
|
|
var origionalProps = Entities.getEntityProperties(_this.entityID);
|
|
var props = {
|
|
type: origionalProps.type,
|
|
color: origionalProps.color,
|
|
dimentions: origionalProps.dimentions,
|
|
dynamic: true,
|
|
damping: 0.0,
|
|
angularDamping: 0.0,
|
|
collidesWith: 'dynamic,static,kinematic',
|
|
rotation: origionalProps.rotation,
|
|
position: origionalProps.position,
|
|
shapeType: origionalProps.shapeType,
|
|
visible: true,
|
|
userdata: JSON.stringify({
|
|
grabbableKey: {
|
|
grabable: true
|
|
}
|
|
})
|
|
};
|
|
_this.copy = Entities.addEntity(props);
|
|
};
|
|
|
|
function deleteCopy() {
|
|
Entities.deleteEntity(_this.copy);
|
|
};
|
|
|
|
function makeOrigionalInvisible() {
|
|
Entities.editEntity(_this.entityID, {
|
|
visible: false,
|
|
collisionless: true
|
|
})
|
|
};
|
|
|
|
function makeOrigionalVisible() {
|
|
Entities.editEntity(_this.entityID, {
|
|
visible: true,
|
|
collisionless: false
|
|
})
|
|
};
|
|
|
|
function deleteSpringAction() {
|
|
Entities.deleteAction(this.copy, this.actionID);
|
|
};
|
|
|
|
function shootFire(launchPosition) {
|
|
Audio.playSound(_this.launchSound, {
|
|
position: launchPosition,
|
|
volume: 0.5
|
|
});
|
|
var smoke = Entities.addEntity({
|
|
type: "ParticleEffect",
|
|
position: _this.position,
|
|
velocity: vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getForward(Camera.getOrientation()))),
|
|
lifespan: 5,
|
|
lifetime: 10,
|
|
isEmmiting: true,
|
|
name: "Smoke Trail",
|
|
maxParticles: 2000,
|
|
emitRate: 80,
|
|
emitSpeed: 0,
|
|
speedSpread: 0,
|
|
polarStart: 0,
|
|
polarFinish: 0,
|
|
azimuthStart: -Math.PI,
|
|
azimuthFinish: Math.PI,
|
|
emitAcceleration: {
|
|
x: 0,
|
|
y: 0.01,
|
|
z: 0
|
|
},
|
|
accelerationSpread: {
|
|
x: 0.01,
|
|
y: 0,
|
|
z: 0.01
|
|
},
|
|
radiusSpread: 0.03,
|
|
particleRadius: 0.1,
|
|
radiusStart: 0.02,
|
|
radiusFinish: 0.1,
|
|
alpha: 0.1,
|
|
alphaSpread: 0,
|
|
alphaStart: 0.7,
|
|
alphaFinish: 0,
|
|
textures: "https://hifi-public.s3.amazonaws.com/alan/Particles/Particle-Sprite-Smoke-1.png",
|
|
emitterShouldTrail: true,
|
|
});
|
|
Script.setTimeout(function() {
|
|
var explodePosition = Entities.getEntityProperties(smoke, "position").position;
|
|
explodeFire(explodePosition);
|
|
}, _this.TIME_TO_EXPLODE);
|
|
};
|
|
|
|
function explodeFire(explodePosition) {
|
|
Audio.playSound(_this.explosionSound, {
|
|
position: explodePosition
|
|
});
|
|
var firework = Entities.addEntity({
|
|
name: "fireworks emitter",
|
|
position: explodePosition,
|
|
type: "ParticleEffect",
|
|
colorStart: hslToRgb({
|
|
h: Math.random(),
|
|
s: 0.5,
|
|
l: 0.7
|
|
}),
|
|
color: hslToRgb({
|
|
h: Math.random(),
|
|
s: 0.5,
|
|
l: 0.5
|
|
}),
|
|
colorFinish: hslToRgb({
|
|
h: Math.random(),
|
|
s: 0.5,
|
|
l: 0.7
|
|
}),
|
|
maxParticles: 10000,
|
|
lifetime: 20,
|
|
lifespan: randFloat(1.5, 3),
|
|
emitRate: randInt(500, 5000),
|
|
emitSpeed: randFloat(0.5, 2),
|
|
speedSpread: 0.2,
|
|
emitOrientation: Quat.fromPitchYawRollDegrees(randInt(0, 360), randInt(0, 360), randInt(0, 360)),
|
|
polarStart: 1,
|
|
polarFinish: randFloat(1.2, 3),
|
|
azimuthStart: -Math.PI,
|
|
azimuthFinish: Math.PI,
|
|
emitAcceleration: {
|
|
x: 0,
|
|
y: randFloat(-1, -0.2),
|
|
z: 0
|
|
},
|
|
accelerationSpread: {
|
|
x: Math.random(),
|
|
y: 0,
|
|
z: Math.random()
|
|
},
|
|
particleRadius: randFloat(0.001, 0.1),
|
|
radiusSpread: Math.random() * 0.1,
|
|
radiusStart: randFloat(0.001, 0.1),
|
|
radiusFinish: randFloat(0.001, 0.1),
|
|
alpha: randFloat(0.8, 1.0),
|
|
alphaSpread: randFloat(0.1, 0.2),
|
|
alphaStart: randFloat(0.7, 1.0),
|
|
alphaFinish: randFloat(0.7, 1.0),
|
|
textures: "http://ericrius1.github.io/PlatosCave/assets/star.png",
|
|
});
|
|
|
|
Script.setTimeout(function() {
|
|
Entities.editEntity(firework, {
|
|
isEmitting: false
|
|
});
|
|
}, 1000);
|
|
};
|
|
|
|
this.continueEquip = function(id, params) {
|
|
var hand = params[0] == "left" ? 0 : 1;
|
|
if(triggerPulled(hand)) {
|
|
shootFire(_this.position)
|
|
}
|
|
};
|
|
|
|
MagicWand.prototype = {
|
|
preload: function(entityID) {
|
|
_this.entityID = entityID;
|
|
},
|
|
startNearGrab: function(entityID, data) {
|
|
createCopy();
|
|
createSpringAction(TIMESCALE);
|
|
makeOrigionalInvisible();
|
|
},
|
|
continueNearGrab: function() {
|
|
updateSpringAction();
|
|
},
|
|
releaseGrab: function() {
|
|
deleteSpringAction();
|
|
deleteCopy();
|
|
makeOrigionalVisible();
|
|
},
|
|
};
|
|
|
|
return new MagicWand;
|
|
})
|