227 lines
		
	
	
		
			No EOL
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			No EOL
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const locationWindow = document.getElementById("location");
 | 
						|
const statusWindow = document.getElementById("status");
 | 
						|
const speedometerWindow = document.getElementById("speedometer");
 | 
						|
 | 
						|
const arrow = document.getElementById("arrow");
 | 
						|
const direction = document.getElementById("direction");
 | 
						|
const zipcode = document.getElementById("zipcode");
 | 
						|
const distance = document.getElementById("distance");
 | 
						|
const streetname = document.getElementById("streetname");
 | 
						|
const zone = document.getElementById("zone");
 | 
						|
 | 
						|
const thirstcontainer = document.getElementById("thirstcontainer");
 | 
						|
const foodcontainer = document.getElementById("foodcontainer");
 | 
						|
const armorcontainer = document.getElementById("armorcontainer");
 | 
						|
const oxygencontainer = document.getElementById("oxygencontainer");
 | 
						|
 | 
						|
const healthtext = document.getElementById("healthtext")
 | 
						|
const armortext = document.getElementById("armortext")
 | 
						|
const thirsttext = document.getElementById("thirsttext")
 | 
						|
const foodtext = document.getElementById("foodtext")
 | 
						|
const oxygentext = document.getElementById("oxygentext")
 | 
						|
const healthbar = document.getElementById("health")
 | 
						|
const armorbar = document.getElementById("armor")
 | 
						|
const thirstbar = document.getElementById("thirst")
 | 
						|
const foodbar = document.getElementById("food")
 | 
						|
const oxygenbar = document.getElementById("oxygen")
 | 
						|
const voice = document.getElementById("voice")
 | 
						|
 | 
						|
const speed = document.getElementById("speed-svg");
 | 
						|
const speedtextkm = document.getElementById("speedtextkm")
 | 
						|
const speedtextmiles = document.getElementById("speedtextmiles")
 | 
						|
const fuel = document.getElementById("fuel-svg");
 | 
						|
const fuel_path = document.getElementById("fuel-path");
 | 
						|
const fuel_icon = document.getElementById("fuel-icon");
 | 
						|
 | 
						|
const seatbelt = document.getElementById("seatbelt");
 | 
						|
const engine = document.getElementById("engine");
 | 
						|
const highbeams = document.getElementById("beam");
 | 
						|
 | 
						|
let left = 0
 | 
						|
 | 
						|
window.addEventListener('message', (event) => {
 | 
						|
    if (event.data.component == "position") {
 | 
						|
        if (event.data.visible == null) {
 | 
						|
            left = 1
 | 
						|
            locationWindow.style.opacity = 1
 | 
						|
            arrow.style.rotate = -event.data.heading + "deg"
 | 
						|
 | 
						|
            direction.innerText = event.data.direction
 | 
						|
            zipcode.innerText = event.data.postal
 | 
						|
            distance.innerText = event.data.distance
 | 
						|
            streetname.innerText = event.data.street
 | 
						|
            zone.innerText = event.data.zone
 | 
						|
        } else {
 | 
						|
            left = 0
 | 
						|
            locationWindow.style.opacity = 0
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (event.data.component == "status") {
 | 
						|
        if (event.data.visible == null) {
 | 
						|
            statusWindow.style.opacity = 1
 | 
						|
            if (event.data.hungerVisible) { foodcontainer.style.display = "block" } else { foodcontainer.style.display = "none" }
 | 
						|
            if (event.data.thirstVisible) { thirstcontainer.style.display = "block" } else { thirstcontainer.style.display = "none" }
 | 
						|
            if (event.data.voiceVisible) { voice.style.display = "block" } else { voice.style.display = "none" }
 | 
						|
 | 
						|
            if (event.data.voiceTalking == true) {
 | 
						|
                if (voice.classList.contains("disabled")) {
 | 
						|
                    voice.classList.remove("disabled")
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                if (!voice.classList.contains("disabled")) {
 | 
						|
                    voice.classList.add("disabled")
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            voice.src = event.data.voiceType
 | 
						|
 | 
						|
            let health = Math.round((event.data.health * 100) / event.data.maxhealth)
 | 
						|
            if (health > 100) { health = 100 }
 | 
						|
            let armor = Math.round((event.data.armor * 100) / 100)
 | 
						|
            if (armor > 0) {
 | 
						|
                armorcontainer.style.display = "block"
 | 
						|
            } else {
 | 
						|
                armorcontainer.style.display = "none"
 | 
						|
            }
 | 
						|
            let thirst = Math.round((event.data.thirst * 100) / 100)
 | 
						|
            let food = Math.round((event.data.hunger * 100) / 100)
 | 
						|
 | 
						|
            let oxygen = Math.round((event.data.oxygen * 100) / 40)
 | 
						|
 | 
						|
            if (event.data.framework == "qbcore" || event.data.framework == "esx") {
 | 
						|
                oxygen = Math.round((event.data.oxygen * 100) / 10)
 | 
						|
            }
 | 
						|
 | 
						|
            if (oxygen < 0) { oxygen = 0 }
 | 
						|
 | 
						|
            if (oxygen != 100) {
 | 
						|
                oxygencontainer.style.display = "block"
 | 
						|
            } else {
 | 
						|
                oxygencontainer.style.display = "none"
 | 
						|
            }
 | 
						|
 | 
						|
            healthtext.innerText = health + "%"
 | 
						|
            healthbar.style.width = (health * 150) / 100 + "px"
 | 
						|
            healthbar.style.setProperty('--size', 150 - ((health * 150) / 100) + "px");
 | 
						|
            armortext.innerText = armor + "%"
 | 
						|
            armorbar.style.width = (armor * 150) / 100 + "px"
 | 
						|
            armorbar.style.setProperty('--size', 150 - ((armor * 150) / 100) + "px");
 | 
						|
 | 
						|
            thirsttext.innerText = thirst + "%"
 | 
						|
            thirstbar.style.width = (thirst * 150) / 100 + "px"
 | 
						|
            thirstbar.style.setProperty('--size', 150 - ((thirst * 150) / 100) + "px");
 | 
						|
 | 
						|
            foodtext.innerText = food + "%"
 | 
						|
            foodbar.style.width = (food * 150) / 100 + "px"
 | 
						|
            foodbar.style.setProperty('--size', 150 - ((food * 150) / 100) + "px");
 | 
						|
 | 
						|
            oxygentext.innerText = oxygen + "%"
 | 
						|
            oxygenbar.style.width = (oxygen * 150) / 100 + "px"
 | 
						|
            oxygenbar.style.setProperty('--size', 150 - ((oxygen * 150) / 100) + "px");
 | 
						|
        } else {
 | 
						|
            if (event.data.visible == true) {
 | 
						|
                statusWindow.style.opacity = 1
 | 
						|
            } else {
 | 
						|
                statusWindow.style.opacity = 0
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (event.data.component == "speedometer") {
 | 
						|
        if (event.data.visible == null) {
 | 
						|
            if (event.data.seatbeltVisible) { seatbelt.style.display = "block" } else { seatbelt.style.display = "none" }
 | 
						|
            if (event.data.fuelVisible) { speedometerWindow.style.marginLeft = '0px'; fuel.style.display = "block"; fuel_path.style.display = "block"; fuel_icon.style.display = "block"; } else { speedometerWindow.style.marginLeft = '10px'; fuel.style.display = "none"; fuel_path.style.display = "none"; fuel_icon.style.display = "none"; }
 | 
						|
            speedometerWindow.style.opacity = 1
 | 
						|
            let percent_speed = (event.data.speed * 100) / (event.data.maxspeed + 50)
 | 
						|
            let percent_fuel = (event.data.fuel * 100) / (event.data.maxfuel)
 | 
						|
            if (event.data.framework == "qbcore") {
 | 
						|
                percent_fuel = event.data.fuel
 | 
						|
            }
 | 
						|
            setDashedGaugeValue(speed, percent_speed, 219.911485751);
 | 
						|
            setDashedGaugeValue(fuel, percent_fuel, 87.9645943005);
 | 
						|
            speedtextkm.innerText = Math.round(event.data.speed)
 | 
						|
            speedtextmiles.innerText = Math.round(event.data.speed)
 | 
						|
 | 
						|
            if (event.data.iselectric == true) {
 | 
						|
                fuel_icon.src = "battery.png"
 | 
						|
            } else {
 | 
						|
                fuel_icon.src = "gas.png"
 | 
						|
            }
 | 
						|
 | 
						|
            if (event.data.useMiles == true) {
 | 
						|
                speedtextkm.style.display = "none"
 | 
						|
                speedtextmiles.style.display = "block"
 | 
						|
            } else {
 | 
						|
                speedtextkm.style.display = "block"
 | 
						|
                speedtextmiles.style.display = "none"
 | 
						|
            }
 | 
						|
 | 
						|
            if (event.data.hasmotor == true) {
 | 
						|
                highbeams.style.display = "block"
 | 
						|
                engine.style.display = "block"
 | 
						|
                speedometerWindow.style.marginLeft = '0px'
 | 
						|
                speedometerWindow.style.marginBottom = '0px'
 | 
						|
            } else {
 | 
						|
                highbeams.style.display = "none"
 | 
						|
                engine.style.display = "none"
 | 
						|
                seatbelt.style.display = "none"
 | 
						|
                fuel.style.display = "none"
 | 
						|
                fuel_path.style.display = "none"
 | 
						|
                fuel_icon.style.display = "none"
 | 
						|
                speedometerWindow.style.marginLeft = '10px'
 | 
						|
                speedometerWindow.style.marginBottom = '-10px'
 | 
						|
            }
 | 
						|
 | 
						|
            if (event.data.highbeams == 1) {
 | 
						|
                if (highbeams.classList.contains("disabled")) {
 | 
						|
                    highbeams.classList.remove("disabled")
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                if (!highbeams.classList.contains("disabled")) {
 | 
						|
                    highbeams.classList.add("disabled")
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (event.data.engine == 1) {
 | 
						|
                if (engine.classList.contains("disabled")) {
 | 
						|
                    engine.classList.remove("disabled")
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                if (!engine.classList.contains("disabled")) {
 | 
						|
                    engine.classList.add("disabled")
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (event.data.seatbelt == true) {
 | 
						|
                if (seatbelt.classList.contains("disabled")) {
 | 
						|
                    seatbelt.classList.remove("disabled")
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                if (!seatbelt.classList.contains("disabled")) {
 | 
						|
                    seatbelt.classList.add("disabled")
 | 
						|
                }
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            speedometerWindow.style.opacity = 0
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (event.data.component == "configuration") {
 | 
						|
        locationWindow.style.left = event.data.locationleft + "px"
 | 
						|
        locationWindow.style.bottom = event.data.locationbottom + "px"
 | 
						|
        statusWindow.style.right = event.data.statusright + "px"
 | 
						|
        statusWindow.style.bottom = event.data.statusbottom + "px"
 | 
						|
        speedometerWindow.style.bottom = event.data.speedometerbottom + "px"
 | 
						|
    }
 | 
						|
})
 | 
						|
 | 
						|
function setDashedGaugeValue(gaugeDOMElement, percentage, arcLength) {
 | 
						|
    const emptyDashLength = 500;
 | 
						|
    const filledArcLength = arcLength * (percentage / 100);
 | 
						|
    gaugeDOMElement.style.strokeDasharray = `${filledArcLength} ${emptyDashLength}`;
 | 
						|
    gaugeDOMElement.style.strokeDashoffset = filledArcLength;
 | 
						|
}
 | 
						|
 | 
						|
setDashedGaugeValue(speed, 0, 219.911485751);
 | 
						|
setDashedGaugeValue(fuel, 0, 87.9645943005); |