129 lines
No EOL
3.4 KiB
JavaScript
129 lines
No EOL
3.4 KiB
JavaScript
// copyright 2018
|
|
// Fluffy Jenkins
|
|
//GeorgeDeac
|
|
|
|
|
|
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
|
var isActive = false;
|
|
|
|
var bikeWearPosition = {x: 0, y: -0.35, z: 0.4};
|
|
var bikeWearRotation = {x: 0, y: 1, z: 0, w: -4.371138828673793e-8};
|
|
|
|
var jointIndex = -1;
|
|
|
|
var bikeSize = {
|
|
z: 3,
|
|
y: 1,
|
|
x: 1
|
|
};
|
|
|
|
var bikeColours = ["hoverKart.fbx"];//bikered.fbx","bikegreen.fbx","bikeblue.fbx","bikeorange.fbx","bikepurple.fbx"];
|
|
|
|
|
|
var bikeIconActive = Script.resolvePath("bikeb.png");
|
|
var bikeIconInactive = Script.resolvePath("bike.png");
|
|
|
|
var SCALE = 1;
|
|
var TIMEOUT = 500;
|
|
|
|
var bikeEntity;
|
|
|
|
var bikeName = "HoverBike";
|
|
|
|
var ANIMATION_URL = Script.resolvePath("sitting.fbx");
|
|
var ANIMATION_FPS = 30, ANIMATION_FIRST_FRAME = 1, ANIMATION_LAST_FRAME = 200;
|
|
|
|
var animationPrefetch = AnimationCache.prefetch(ANIMATION_URL);
|
|
|
|
function sitMe() {
|
|
MyAvatar.restoreAnimation();
|
|
|
|
MyAvatar.getAnimationRoles().filter(function (role) {
|
|
return !/^(right|left)/.test(role);
|
|
}).forEach(function (role) {
|
|
MyAvatar.overrideRoleAnimation(role, ANIMATION_URL, ANIMATION_FPS, true, ANIMATION_FIRST_FRAME, ANIMATION_LAST_FRAME);
|
|
});
|
|
|
|
Script.setTimeout(function () {
|
|
MyAvatar.setJointRotation(jointIndex, Quat.IDENTITY);
|
|
}, TIMEOUT);
|
|
}
|
|
|
|
function unSitMe() {
|
|
MyAvatar.getAnimationRoles().filter(function (role) {
|
|
return !/^(right|left)/.test(role);
|
|
}).forEach(function (role) {
|
|
MyAvatar.restoreRoleAnimation(role);
|
|
});
|
|
MyAvatar.clearJointData(jointIndex);
|
|
}
|
|
|
|
// humbletim's barnacle locator
|
|
function findBarnacles(name) {
|
|
return Object.keys(MyAvatar.getAvatarEntityData())
|
|
.filter(function (id) {
|
|
return Entities.getNestableType(id) === 'entity';
|
|
})
|
|
.map(function (entityID) {
|
|
return Entities.getEntityProperties(entityID);
|
|
})
|
|
.filter(function (props) {
|
|
return props.name === name;
|
|
});
|
|
}
|
|
|
|
var toggle = function () {
|
|
isActive = !isActive;
|
|
activeButton.editProperties({isActive: isActive});
|
|
if (isActive) {
|
|
activateFunction();
|
|
} else {
|
|
deactivateFunction();
|
|
}
|
|
};
|
|
|
|
function activateFunction() {
|
|
jointIndex = MyAvatar.getJointIndex("Hips");
|
|
sitMe();
|
|
|
|
var currentbikeColour = bikeColours[Math.floor(Math.random()*bikeColours.length)];
|
|
var bikeURL = Script.resolvePath(currentbikeColour);
|
|
bikeEntity = Entities.addEntity({
|
|
visible: true,
|
|
name: "HoveBike",
|
|
type: "Model",
|
|
modelURL: bikeURL,
|
|
parentID: MyAvatar.sessionUUID,
|
|
parentJointIndex: jointIndex,
|
|
localPosition: bikeWearPosition,
|
|
localRotation: bikeWearRotation,
|
|
dimensions: Vec3.multiply((SCALE * MyAvatar.scale), bikeSize),
|
|
collisionless: true
|
|
}, true);
|
|
}
|
|
|
|
function deactivateFunction() {
|
|
unSitMe();
|
|
Entities.deleteEntity(bikeEntity);
|
|
}
|
|
|
|
var activeButton = tablet.addButton({
|
|
icon: bikeIconInactive,
|
|
activeIcon: bikeIconActive,
|
|
text: "HoverBike",
|
|
isActive: false,
|
|
sortOrder: 10
|
|
});
|
|
|
|
Script.scriptEnding.connect(function () {
|
|
activeButton.clicked.disconnect(toggle);
|
|
tablet.removeButton(activeButton);
|
|
deactivateFunction();
|
|
});
|
|
|
|
activeButton.clicked.connect(toggle);
|
|
|
|
var oldbikes = findBarnacles(bikeName);
|
|
oldbikes.forEach(function (ent) {
|
|
Entities.deleteEntity(ent.id);
|
|
}); |