159 lines
4.5 KiB
JavaScript
159 lines
4.5 KiB
JavaScript
let nuiHandlers = {};
|
|
let isHudHidden = false;
|
|
|
|
const batteryElement = document.querySelector('.battery-high');
|
|
const signalElement = document.querySelector('.signal-high');
|
|
const instructionsBtn = document.getElementById('instructions-btn');
|
|
const instructionsOverlay = document.getElementById('instructions-overlay');
|
|
const closeInstructions = document.getElementById('close-instructions');
|
|
|
|
$(() => {
|
|
window.addEventListener('message', (event) => {
|
|
const { name, data } = event.data;
|
|
if (nuiHandlers[name]) {
|
|
nuiHandlers[name](data);
|
|
}
|
|
});
|
|
|
|
// Toggle hud
|
|
$(document).keyup((e) => {
|
|
if (e.key !== 'h') return;
|
|
|
|
const isVisible = $('body').is(':visible');
|
|
if (isVisible) {
|
|
$('body').hide();
|
|
isHudHidden = true;
|
|
} else if (isHudHidden) {
|
|
$('body').show();
|
|
}
|
|
});
|
|
|
|
onNui('showHud', (data) => showHud(data));
|
|
onNui('hideHud', () => hideHud());
|
|
onNui('updateHud', (data) => updateHud(data));
|
|
|
|
onNui('copyToClipboard', copyToClipboard);
|
|
onNui('updateBattery', updateBattery);
|
|
onNui('updateRange', updateRange);
|
|
|
|
onNui('initialize', (data) => {
|
|
const config = data.config;
|
|
$('.speed-unit').text(config.useMetric ? 'km/h' : 'mph');
|
|
|
|
const droneConfig = data.droneConfig;
|
|
const components = droneConfig.components;
|
|
|
|
for (const name in components) {
|
|
const value = components[name];
|
|
const element = document.querySelector(`[component-${name}]`);
|
|
if (!element) continue;
|
|
element.style.display = value ? 'block' : 'none';
|
|
}
|
|
});
|
|
|
|
$('#button-effect').click(() => {
|
|
emitNui('toggleExtraEffect');
|
|
});
|
|
|
|
$('#button-power').click(() => {
|
|
emitNui('exitDrone');
|
|
});
|
|
|
|
$('#button-screenshot').click(() => {
|
|
emitNui('captureScreenshot');
|
|
const element = $('#button-screenshot');
|
|
element.prop('disabled', true);
|
|
setTimeout(() => {
|
|
element.prop('disabled', false);
|
|
}, 15000);
|
|
});
|
|
|
|
$('#button-togglehud').click(() => {
|
|
isHudHidden = true;
|
|
$('body').hide();
|
|
});
|
|
|
|
instructionsBtn.addEventListener('click', () => {
|
|
instructionsOverlay.style.display = 'flex';
|
|
});
|
|
|
|
closeInstructions.addEventListener('click', () => {
|
|
instructionsOverlay.style.display = 'none';
|
|
});
|
|
});
|
|
|
|
const emitNui = (action, data = {}, cb) => {
|
|
$.post(`https://${GetParentResourceName()}/${action}`, JSON.stringify(data), cb);
|
|
};
|
|
|
|
const onNui = (name, handler) => {
|
|
nuiHandlers[name] = handler;
|
|
};
|
|
|
|
const showHud = () => {
|
|
$('body').show();
|
|
updateBattery();
|
|
updateRange();
|
|
};
|
|
|
|
const hideHud = () => {
|
|
isHudHidden = false;
|
|
$('body').hide();
|
|
};
|
|
|
|
const updateHud = (data) => {
|
|
for (const name in data) {
|
|
const value = data[name];
|
|
const element = document.querySelector(`[value-${name}]`);
|
|
|
|
if (name === 'yaw') {
|
|
const degrees = value * -1;
|
|
const compassArrow = document.querySelector('.compass-arrow');
|
|
compassArrow.style.transform = `translate(calc(-50% + 15px), -50%) rotate(${degrees + 270}deg)`;
|
|
continue;
|
|
}
|
|
|
|
if (element) {
|
|
element.textContent = value;
|
|
}
|
|
}
|
|
};
|
|
|
|
const updateBattery = (percentage = 100) => {
|
|
element = document.querySelector('[value-battery]');
|
|
if (!element) return;
|
|
element.textContent = percentage;
|
|
|
|
batteryElement.classList.remove('battery-high', 'battery-medium', 'battery-low');
|
|
if (percentage > 60) {
|
|
batteryElement.classList.add('battery-high');
|
|
} else if (percentage > 30) {
|
|
batteryElement.classList.add('battery-medium');
|
|
} else {
|
|
batteryElement.classList.add('battery-low');
|
|
}
|
|
};
|
|
|
|
const updateRange = (percentage = 100) => {
|
|
element = document.querySelector('[value-range]');
|
|
if (!element) return;
|
|
element.textContent = percentage;
|
|
|
|
signalElement.classList.remove('signal-high', 'signal-medium', 'signal-low');
|
|
if (percentage > 70) {
|
|
signalElement.classList.add('signal-high');
|
|
} else if (percentage > 40) {
|
|
signalElement.classList.add('signal-medium');
|
|
} else {
|
|
signalElement.classList.add('signal-low');
|
|
}
|
|
};
|
|
|
|
const copyToClipboard = (value) => {
|
|
const clipboardElement = document.createElement('input');
|
|
clipboardElement.value = value;
|
|
document.body.appendChild(clipboardElement);
|
|
clipboardElement.select();
|
|
document.execCommand('copy');
|
|
document.body.removeChild(clipboardElement);
|
|
};
|