166 lines
6.2 KiB
JavaScript
166 lines
6.2 KiB
JavaScript
//
|
|
// flamethrowerServer.js
|
|
//
|
|
// Created by David Back on 3/28/18.
|
|
// 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 FIREBALL_IMAGE = Script.resolvePath("../textures/sparkles.png");
|
|
var END_FIRE_SOUND_1 = SoundCache.getSound(Script.resolvePath("../sounds/flamethrowerEndFire.wav"));
|
|
var END_FIRE_SOUND_2 = SoundCache.getSound(Script.resolvePath("../sounds/flamethrowerEndFire2.wav"));
|
|
var END_FIRE_SOUND_3 = SoundCache.getSound(Script.resolvePath("../sounds/flamethrowerEndFire3.wav"));
|
|
var END_FIRE_VOLUME = 0.6;
|
|
|
|
var INTERSECT_TYPE = {
|
|
ENTITY : 0,
|
|
AVATAR : 1,
|
|
NONE : 2 // now only used for debugging purposes to verify end of flame ray cast with DEBUG_FIRING in client script
|
|
};
|
|
var LIFETIMES = [3.0, 1.5, 1.0];
|
|
|
|
var _this;
|
|
var endFireSound = null;
|
|
var endFireSoundPosition = undefined;
|
|
var remainingSoundReplays = 0;
|
|
|
|
Flamethrower = function() {
|
|
_this = this;
|
|
};
|
|
|
|
Flamethrower.prototype = {
|
|
remotelyCallable: ['createEndFireHitEntity', 'createEndFireHitAvatar', 'createEndFireNoHit'],
|
|
createEndFireHitEntity: function(entityID, params) {
|
|
this.createEndFire(INTERSECT_TYPE.ENTITY, params);
|
|
},
|
|
|
|
createEndFireHitAvatar: function(entityID, params) {
|
|
this.createEndFire(INTERSECT_TYPE.AVATAR, params);
|
|
},
|
|
|
|
createEndFireNoHit: function(entityID, params) {
|
|
this.createEndFire(INTERSECT_TYPE.NONE, params);
|
|
},
|
|
|
|
createEndFire: function(intersectType, params) {
|
|
var intersectEntityID = params[0];
|
|
var fireEnd = { x:params[1], y:params[2], z:params[3] };
|
|
var intersectLocalPosition = { x:params[4], y:params[5], z:params[6] };
|
|
var lifetime = LIFETIMES[intersectType];
|
|
Entities.addEntity({
|
|
accelerationSpread: {
|
|
x: 0.18,
|
|
y: 0.39,
|
|
z: 0.19
|
|
},
|
|
alpha: 0.8399999737739563,
|
|
alphaSpread: 1,
|
|
alphaStart: 0,
|
|
alphaFinish: 0,
|
|
azimuthStart: -115.99999867453464,
|
|
azimuthFinish: 77.00000100435534,
|
|
color: {
|
|
red: 255,
|
|
green: 255,
|
|
blue: 255
|
|
},
|
|
colorSpread: {
|
|
red: 115,
|
|
green: 115,
|
|
blue: 115
|
|
},
|
|
colorStart: {
|
|
red: 255,
|
|
green: 107,
|
|
blue: 15
|
|
},
|
|
colorFinish: {
|
|
red: 255,
|
|
green: 33,
|
|
blue: 26
|
|
},
|
|
emitAcceleration: {
|
|
x: 0,
|
|
y: 0.5,
|
|
z: 0
|
|
},
|
|
emitDimensions: {
|
|
x: 1,
|
|
y: 1,
|
|
z: 1
|
|
},
|
|
emitOrientation: {
|
|
x: -90,
|
|
y: 0,
|
|
z: 0
|
|
},
|
|
emitRate: 6,
|
|
emitterShouldTrail: true,
|
|
emitSpeed: 0.05000000074505806,
|
|
lifespan: 1.0099999904632568,
|
|
lifetime: lifetime,
|
|
//localPosition: intersectType === INTERSECT_TYPE.ENTITY ? intersectLocalPosition : undefined,
|
|
maxParticles: 100,
|
|
name: "Flamethrower End Flame",
|
|
//parentID: intersectType === INTERSECT_TYPE.ENTITY ? intersectEntityID : undefined,
|
|
//position: intersectType === INTERSECT_TYPE.ENTITY ? undefined : fireEnd,
|
|
position: fireEnd,
|
|
particleRadius: 0.4099999964237213,
|
|
polarStart: 0,
|
|
polarFinish: 1.9999999845072665,
|
|
radiusSpread: 3.259999990463257,
|
|
radiusStart: 0.3100000023841858,
|
|
radiusFinish: 0.5099999904632568,
|
|
speedSpread: 0,
|
|
textures: FIREBALL_IMAGE,
|
|
type: "ParticleEffect"
|
|
});
|
|
|
|
var newSound = endFireSoundPosition === undefined || Vec3.distance(fireEnd, endFireSoundPosition) > 0.5;
|
|
if (endFireSound === null || !endFireSound.isPlaying() || newSound) {
|
|
this.playEndFireSound(fireEnd);
|
|
}
|
|
|
|
remainingSoundReplays = intersectType === INTERSECT_TYPE.ENTITY ? 2 : 0;
|
|
},
|
|
|
|
playEndFireSound: function(fireEndPosition) {
|
|
if (endFireSound !== null) {
|
|
endFireSound.finished.disconnect(flamethrowerServer.onEndFireSoundFinished);
|
|
}
|
|
var random = Math.random();
|
|
var sound = END_FIRE_SOUND_1;
|
|
if (random > 0.33 & random <= 0.67) {
|
|
sound = END_FIRE_SOUND_2;
|
|
} if (random > 0.67) {
|
|
sound = END_FIRE_SOUND_3;
|
|
}
|
|
endFireSound = Audio.playSound(sound, {
|
|
volume: 0.0, //END_FIRE_VOLUME, // put sound volume to 0 for now until they are working properly
|
|
position: fireEndPosition
|
|
});
|
|
endFireSound.finished.connect(flamethrowerServer.onEndFireSoundFinished);
|
|
endFireSoundPosition = fireEndPosition;
|
|
},
|
|
|
|
onEndFireSoundFinished: function() {
|
|
if (remainingSoundReplays > 0) {
|
|
remainingSoundReplays--;
|
|
this.playEndFireSound(endFireSoundPosition);
|
|
}
|
|
},
|
|
|
|
unload: function() {
|
|
endFireSound.finished.disconnect(flamethrowerServer.onEndFireSoundFinished);
|
|
},
|
|
|
|
preload: function(entityID) {
|
|
_this.entityID = entityID;
|
|
}
|
|
};
|
|
|
|
var flamethrowerServer = new Flamethrower();
|
|
return flamethrowerServer;
|
|
});
|