content/hifi-content/brosche/Wearables/GravityGun/flamethrowerServer.js
2022-02-13 21:50:01 +01:00

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;
});