content/hifi-content/davidback/development/zombies/zombieAttackerScript_debugOn.js
2022-02-13 22:49:05 +01:00

107 lines
3.9 KiB
JavaScript

//
// zombieAttackerScript.js
//
// Created by David Back on 2/8/18.
// Copyright 2018 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 CHANNEL_NAME = "ZOMBIE_BITE";
var SEARCH_RANGE = 2;
var BITE_RANGE = 0.3;
var BITE_SOUND = SoundCache.getSound("atp:/zombieBite.wav");
var BITE_SOUND_VOLUME = 0.5;
var TRIGGER_CONTROLS = [Controller.Standard.LT, Controller.Standard.RT];
var TRIGGER_THRESHOLD = 0.9;
var BITE_ANIMATION = "atp:/zombieBite.fbx";
var BITE_ANIMATION_START_FRAME = 0;
var BITE_ANIMATION_BLOOD_KEYFRAME = 0;
var BITE_ANIMATION_END_FRAME = 160;
var BITE_ANIMATION_FPS = 60;
var MSEC_PER_SEC = 1000;
var DEBUG_BITE_KEY = "b";
var DEBUG_ENABLED = true;
var bloodTargetAvatar;
var biteAnimationPlaying = false;
function triggerBite() {
if (biteAnimationPlaying) {
if (DEBUG_ENABLED) {
print("triggerBite blocked due to bite animation playing");
}
return;
}
var myHeadPosition = MyAvatar.getJointPosition("Head");
var avatarList = AvatarList.getAvatarsInRange(myHeadPosition, SEARCH_RANGE);
avatarList.forEach(function(targetAvatarSessionUUID) {
if (targetAvatarSessionUUID !== null && targetAvatarSessionUUID !== MyAvatar.sessionUUID) {
var targetAvatar = AvatarList.getAvatar(targetAvatarSessionUUID);
var targetHeadPosition = targetAvatar.getJointPosition("Head");
if (Vec3.distance(myHeadPosition, targetHeadPosition) < BITE_RANGE) {
bloodTargetAvatar = targetAvatarSessionUUID;
if (DEBUG_ENABLED) {
print("Biting avatar " + targetAvatarSessionUUID + " from " + MyAvatar.sessionUUID);
}
Messages.sendMessage(CHANNEL_NAME, JSON.stringify({type: 'receiveBite', biterID: MyAvatar.sessionUUID,
victimID: targetAvatarSessionUUID}));
MyAvatar.overrideAnimation(BITE_ANIMATION, BITE_ANIMATION_FPS, false,
BITE_ANIMATION_START_FRAME, BITE_ANIMATION_END_FRAME);
biteAnimationPlaying = true;
var timeOut = MSEC_PER_SEC * BITE_ANIMATION_END_FRAME / BITE_ANIMATION_FPS;
Script.setTimeout(function () {
biteAnimationPlaying = false;
MyAvatar.restoreAnimation();
}, timeOut);
var bloodTimeOut = MSEC_PER_SEC * BITE_ANIMATION_BLOOD_KEYFRAME / BITE_ANIMATION_FPS;
Script.setTimeout(function () {
var targetAvatar = AvatarList.getAvatar(bloodTargetAvatar);
var targetHeadPosition = targetAvatar.getJointPosition("Head");
Audio.playSound(BITE_SOUND, {
volume: BITE_SOUND_VOLUME,
position: targetHeadPosition
});
}, bloodTimeOut);
return;
}
}
});
}
function keyPressEvent(event) {
if (!DEBUG_ENABLED) {
return;
}
if (DEBUG_BITE_KEY === event.text) {
print("triggerBite called from debug key press");
triggerBite();
}
}
function update() {
for (var i = 0; i < TRIGGER_CONTROLS.length; i++) {
var triggerValue = Controller.getValue(TRIGGER_CONTROLS[i]);
if (triggerValue >= TRIGGER_THRESHOLD) {
if (DEBUG_ENABLED) {
print("triggerBite called from controller trigger");
}
triggerBite();
}
}
}
function shutdown() {
Controller.keyPressEvent.disconnect(keyPressEvent);
}
function init() {
Script.scriptEnding.connect(shutdown);
Script.update.connect(update);
Controller.keyPressEvent.connect(keyPressEvent);
}
init();