content/hifi-content/brosche/DomainContent/ZombieIsland/EntityScripts/batController.js
2022-02-13 21:50:01 +01:00

184 lines
No EOL
8.1 KiB
JavaScript

//batAttackTrigger.js
(function(){
var BAT_ORBIT_RADIUS = 50;
var batData;
var zoneProperties;
var HALF_MULTIPLIER = 0.5;
this.preload = function(entityID) {
// Get the Bat_tornado_position entity userData fields, and note the position of the entity.
//debugPrint("Bat Zone preload " + entityID);
entity = entityID;
_this = this;
zoneProperties = Entities.getEntityProperties(entityID, ["position", "dimensions", "rotation", "userData"]);
var position = Entities.getEntityProperties(entityID, "position").position;
batData = getPropertiesFromNamedObjects("bat", position, BAT_ORBIT_RADIUS*2, ["position"]);
};
function isPositionInsideBox(position, boxProperties) {
var localPosition = Vec3.multiplyQbyV(Quat.inverse(boxProperties.rotation),
Vec3.subtract(position, boxProperties.position));
var halfDimensions = Vec3.multiply(boxProperties.dimensions, HALF_MULTIPLIER);
return -halfDimensions.x <= localPosition.x &&
halfDimensions.x >= localPosition.x &&
-halfDimensions.y <= localPosition.y &&
halfDimensions.y >= localPosition.y &&
-halfDimensions.z <= localPosition.z &&
halfDimensions.z >= localPosition.z;
}
function isSomeAvatarOtherThanMeStillInsideTheObject(objectProperties) {
var result = false;
AvatarList.getAvatarIdentifiers().forEach(function(avatarID) {
var avatar = AvatarList.getAvatar(avatarID);
if (avatar.sessionUUID !== MyAvatar.sessionUUID) {
if (isPositionInsideBox(avatar.position, objectProperties)) {
result = true;
}
}
});
return result;
}
function getPropertiesFromNamedObjects(entityName, searchOriginPosition, searchRadius, arrayOfProperties) {
var entityList = Entities.findEntitiesByName(
entityName,
searchOriginPosition,
searchRadius
);
var returnedObjects = [];
if (entityList.length > 0) {
//return Entities.getEntityProperties(entityList.forEach, arrayOfProperties);
entityList.forEach(function(entity){
var properties = Entities.getEntityProperties(entity, arrayOfProperties);
returnedObjects.push(properties);
});
return returnedObjects;
} else {
console.log("GOT NOTHING");
return null;
}
}
this.enterEntity = function(entityID) {
print("bat zone entered");
if (!isSomeAvatarOtherThanMeStillInsideTheObject(zoneProperties) && batData.length > 0) {
batData.forEach(function(element){
var delay = 1;
Script.setTimeout(function(){
console.log("showing bats");
Entities.callEntityServerMethod(element.id, "apparateBats", [true]);
}, delay*100);
delay += 1;
});
}
};
this.leaveEntity = function(entityID) {
if (!isSomeAvatarOtherThanMeStillInsideTheObject(zoneProperties) && batData.length > 0) {
Script.setTimeout(function(){
batData.forEach(function(element){
console.log("hiding bats");
Entities.callEntityServerMethod(element.id, "apparateBats", [false]);
});
}, 6000);
}
}
this.unload = function(entityID) {
this.cleanup();
};
this.cleanup = function() {
Script.stop();
};
})
// this.enterEntity = function(entityID) {
// print("bat zone entered");
// if (!isSomeAvatarOtherThanMeStillInsideTheObject(zoneProperties)) {
// // Collect data on the original parents of the bats for resetting them after the event has completed
// var runOnce = false;
// var checkDistOnce = false;
// var endSwarmCheck = [];
// var oldParents = [];
// if(runOnce === false){
// batData.forEach(function(element){
// oldParents.push(element.parentID);
// endSwarmCheck.push(false);
// console.log("ORIGINAL BAT PARENT: ", JSON.stringify(element.parentID), " and OLD PARENT: ", oldParents[oldParents.length - 1]);
// });
// console.log("oldParents got data", oldParents.length);
// var angularVelocityToPass = {
// x: Math.PI,
// y: 0,
// z: 0
// };
// // Initiate the swoop
// swooperData.forEach(function(element){
// // console.log("Swooper Element ID ", JSON.stringify(element.id));
// Entities.callEntityServerMethod(element.id, "swoopTheBats", [JSON.stringify(angularVelocityToPass)]);
// });
// runOnce = true;
// }
// // Start an interval to distance check bats from the tornado center.
// batIntervalCheck = Script.setInterval(function(){
// batData = null;
// batData = getPropertiesFromNamedObjects("bat", tornadoData.position, BAT_ORBIT_RADIUS*2, ["position"]);
// var distance = [];
// batData.forEach(function(element){
// // console.log("bat data is: ", JSON.stringify(element));
// distance.push(Vec3.distance(element.position, tornadoData.position));
// });
// for(var i=0; i<distance.length; i++){
// if (distance[i] <= 10.0 && batData[i].parentID != tornadoData.id && checkDistOnce === false){
// console.log("distance less than 10!!!!!! ", distance[i]);
// console.log("PRECHANGE: batData parent: ", batData[i].parentID, "tornado ID: ", tornadoData.id)
// // Join the tornado!
// Entities.callEntityServerMethod(batData[i].id, "changeParent", [tornadoData.id]);
// //Entities.callEntityServerMethod(batData[i].id, "changeParent", tornadoData.id);
// console.log("POSTCHANGE: batData parent: ", batData[i].parentID, "tornado ID: ", tornadoData.id)
// checkDistOnce = true;
// }
// }
// for (var i = 0; i < batData.length; i++){
// if (batData[i].parentID == tornadoData.id && endSwarmCheck[i] === false){
// // After tornado-ing for a bit, swoop back out.
// endSwarmCheck[i] = true;
// var index = i;
// Script.setTimeout(function(){
// console.log("tornado id ", tornadoData.id);
// console.log("bat parent before ", batData[index].parentID);
// //Entities.callEntityServerMethod(batData[index].id, "changeParent", [oldParents[index]])
// Entities.callEntityServerMethod(batData[index].id, "changeParent", oldParents[index])
// console.log("bat parent after ", batData[index].parentID);
// var angularVelocityToEnd = {
// x: 0,
// y: 0,
// z: 0
// };
// Script.setTimeout(function(){
// Entities.callEntityServerMethod(swooperData[index].id, "swoopTheBats", [JSON.stringify(angularVelocityToEnd)]);
// runOnce = false;
// checkDistOnce = false;
// console.log("finished swarming, checkdist reset", checkDistOnce);
// }, 1000);
// }, 4000);
// }
// }
// },CHECK_INTERVAL);
// }
// };