content/hifi-content/james/turntable/turntable.js
2022-02-13 23:57:50 +01:00

189 lines
No EOL
5.9 KiB
JavaScript

(function() {
var _this;
function Turntable() {
_this = this;
}
Turntable.prototype = {
musicInjector: null,
current:{
track:null
},
preload: function(entityID) {
_this.entityID = entityID;
Messages.messageReceived.connect(handleMessages);
Messages.subscribe('hifi-record-player')
},
collisionWithEntity: function(me, other, collision) {
print('jbp collision with turntable!!')
if (collision.type !== 0) {
return;
}
var myProps = Entities.getEntityProperties(me);
var otherProps = Entities.getEntityProperties(other);
if (otherProps.description.indexOf('hifi-record-disc') > -1) {
print('jbp its a disc')
_this.stopMusic();
Messages.sendMessage('hifi-record-player', 'stop')
_this.startRecord(otherProps)
}
},
findNeedleAndTurntable: function() {
print('jbp find needle and disc 1')
var needle = null;
var disc = null;
var children = Entities.getChildrenIDs(_this.entityID);
print('jbp children length: ' + children.length)
children.forEach(function(child) {
print('jbp looking for a child: ' + child)
var props = Entities.getEntityProperties(child);
print('has props? ' + props)
if (props.description.indexOf('hifi-record-needle') > -1) {
needle = child;
}
if (props.description.indexOf('hifi-record-turntable') > -1) {
turntable = child;
}
});
print('jbp find needle and disc 3')
return {
needle: needle,
turntable: turntable,
}
},
startRecord: function(recordProps) {
if (_this.current.track !== null) {
if (_this.current.track.downloaded !== true) {
return
}
}
print('jbp start record 1')
var myProps = Entities.getEntityProperties(_this.entityID);
var current = _this.findNeedleAndTurntable();
print('jbp current: ' + JSON.stringify(current))
//move needle over
//start rotation
Entities.editEntity(current.turntable, {
angularVelocity: {
x: 0,
y: 0.785398,
z: 0,
},
angularDamping: 0,
})
print('jbp after start record edit')
//play music
var url = recordProps.description.split("hifi-record-disc:")[1];
current.url = url;
current.track = SoundCache.getSound(url);
_this.current = current;
startCheckDownloadedTimers();
},
stopRecord: function() {
print('jbp should stop record')
var current = _this.findNeedleAndTurntable();
//add angular damping
Entities.editEntity(current.turntable, {
angularDamping: 0.3
})
//move needle over
},
updateRecordRotation: function(record) {
var baseProps = Entities.getEntityProperties(_this.entityID);
var localAngularVelocity = {
x: 0,
y: 0.785398,
z: 0,
};
var worldAngularVelocity = Vec3.multiplyQbyV(baseProps.rotation, localAngularVelocity);
Entities.editEntity(record, {
angularVelocity: worldAngularVelocity
})
},
playMusic: function() {
print('jbp should play music:' + _this.current.url)
var properties = Entities.getEntityProperties(_this.entityID);
var audioOptions = {
position: properties.position,
volume: 0.75,
loop: true
};
_this.musicInjector = Audio.playSound(_this.current.track, audioOptions);
print('jbp music should be playing now')
},
stopMusic: function() {
print('should stop music')
if (_this.musicInjector !== null) {
_this.musicInjector.stop();
}
print('jbp after should stop music')
},
unload: function() {
_this.stopRecord();
_this.stopMusic();
if (checkDownloadTimer !== null) {
Script.clearInterval(checkDownloadTimer)
}
}
}
var checkDownloadTimer = null;
function checkDownloaded(sound) {
var sound = _this.current.track;
if (sound.downloaded) {
print('sound is downloaded!')
Script.clearInterval(checkDownloadTimer);
_this.playMusic();
} else {
print('song hasnt finished downloading yet')
}
}
function startCheckDownloadedTimers() {
print('should start check download timer')
if (checkDownloadTimer !== null) {
Script.clearInterval(checkDownloadTimer);
}
checkDownloadTimer = Script.setInterval(function() {
checkDownloaded();
}, 100);
}
function handleMessages(channel, message, sender) {
if (sender === MyAvatar.sessionUUID) {
return
}
if (channel === 'hifi-record-player') {
print('jbp got record message')
_this.stopMusic();
_this.stopRecord();
}
}
return new Turntable();
})