433 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			433 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local playerId = PlayerId()
 | |
| local playerPed = PlayerPedId()
 | |
| local playerCoords = GetEntityCoords(playerPed)
 | |
| local inVehicle = IsPedInAnyVehicle(playerPed)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     while true do
 | |
|         playerPed = PlayerPedId()
 | |
|         playerCoords = GetEntityCoords(playerPed)
 | |
|         inVehicle = IsPedInAnyVehicle(playerPed)
 | |
| 
 | |
|         Citizen.Wait(100)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| local hudVisible = true
 | |
| local QBCore = nil
 | |
| 
 | |
| exports('hudVisibility', function(toggle)
 | |
|     hudVisible = toggle
 | |
| end)
 | |
| 
 | |
| --
 | |
| -- HIDE HEALTH
 | |
| --
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     local scaleform = RequestScaleformMovie('minimap')
 | |
| 
 | |
|     SetRadarBigmapEnabled(true, false)
 | |
| 
 | |
|     Citizen.Wait(0)
 | |
| 
 | |
|     SetRadarBigmapEnabled(false, false)
 | |
| 
 | |
|     while true do
 | |
|         BeginScaleformMovieMethod(scaleform, 'SETUP_HEALTH_ARMOUR')
 | |
| 
 | |
|         if Config.vanilla then
 | |
|             ScaleformMovieMethodAddParamInt(1)
 | |
|             EndScaleformMovieMethod()
 | |
|             return
 | |
|         end
 | |
| 
 | |
|         ScaleformMovieMethodAddParamInt(3)
 | |
|         EndScaleformMovieMethod()
 | |
|         SetRadarBigmapEnabled(false, false)
 | |
| 
 | |
|         Citizen.Wait(0)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| --
 | |
| -- HUD COMPONENTS
 | |
| --
 | |
| 
 | |
| if Config.componentsDisabler then
 | |
|     Citizen.CreateThread(function()
 | |
|         while true do
 | |
|             HideHudComponentThisFrame(1)
 | |
|             HideHudComponentThisFrame(3)
 | |
|             HideHudComponentThisFrame(4)
 | |
|             HideHudComponentThisFrame(6)
 | |
|             HideHudComponentThisFrame(8)
 | |
|             HideHudComponentThisFrame(7)
 | |
|             HideHudComponentThisFrame(9)
 | |
| 
 | |
|             Citizen.Wait(0)
 | |
|         end
 | |
|     end)
 | |
| end
 | |
| 
 | |
| --
 | |
| -- RADAR IN VEHICLE
 | |
| --
 | |
| 
 | |
| local bypass = false
 | |
| 
 | |
| exports('bypassRadar', function(toggle)
 | |
|     bypass = toggle
 | |
| end)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     DisplayRadar(true)
 | |
| 
 | |
|     if not Config.radarOnlyInCar then
 | |
|         return
 | |
|     end
 | |
| 
 | |
|     while true do
 | |
|         if bypass then
 | |
|             DisplayRadar(true)
 | |
|         else
 | |
|             if not inVehicle then
 | |
|                 DisplayRadar(false)
 | |
|             else
 | |
|                 DisplayRadar(true)
 | |
|             end
 | |
|         end
 | |
| 
 | |
|         Citizen.Wait(1000)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| --
 | |
| -- HUD LOCATION
 | |
| --
 | |
| 
 | |
| local activeCoords = vec2(0.0, 0.0)
 | |
| local postalText = 'CP 0000'
 | |
| local directionText = 'N'
 | |
| local postals = {}
 | |
| local zones = {}
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     local postalsJson = LoadResourceFile(GetCurrentResourceName(), 'zips.json')
 | |
|     postalsJson = json.decode(postalsJson)
 | |
| 
 | |
|     for i, postal in ipairs(postalsJson) do
 | |
|         postals[i] = { vec2(postal.x, postal.y), code = postal.code }
 | |
|     end
 | |
| 
 | |
|     local zonesJson = LoadResourceFile(GetCurrentResourceName(), 'zones.json')
 | |
|     zonesJson = json.decode(zonesJson)
 | |
| 
 | |
|     for _, zone in pairs(zonesJson) do
 | |
|         zones[zone.zone] = zone.name
 | |
|     end
 | |
| end)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     while not postals do
 | |
|         Citizen.Wait(0)
 | |
|     end
 | |
| 
 | |
|     while true do
 | |
|         local nearestIndex, nearestDist
 | |
| 
 | |
|         for i = 1, #postals do
 | |
|             local dist = #(playerCoords.xy - postals[i][1])
 | |
| 
 | |
|             if not nearestDist or dist < nearestDist then
 | |
|                 nearestIndex = i
 | |
|                 nearestDist = dist
 | |
|                 activeCoords = postals[i][1]
 | |
|             end
 | |
|         end
 | |
| 
 | |
|         local code = postals[nearestIndex].code
 | |
| 
 | |
|         postalText = string.format('CP %s', code)
 | |
| 
 | |
|         Citizen.Wait(1000)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     local directions = { [0] = 'N', [45] = 'NW', [90] = 'W', [135] = 'SW', [180] = 'S', [225] = 'SE', [270] = 'E', [315] = 'NE', [360] = 'N', }
 | |
| 
 | |
|     while true do
 | |
|         for k, v in pairs(directions) do
 | |
|             direction = GetEntityHeading(playerPed)
 | |
| 
 | |
|             if math.abs(direction - k) < 22.5 then
 | |
|                 directionText = v
 | |
|                 break
 | |
|             end
 | |
|         end
 | |
| 
 | |
|         Citizen.Wait(500)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     while true do
 | |
|         if not IsRadarHidden() and Config.location.enabled and hudVisible then
 | |
|             local zone = GetNameOfZone(playerCoords.x, playerCoords.y, playerCoords.z)
 | |
|             local streetname, _ = GetStreetNameAtCoord(playerCoords.x, playerCoords.y, playerCoords.z)
 | |
|             local streetnameText = GetStreetNameFromHashKey(streetname)
 | |
|             local dist = #(playerCoords.xy - activeCoords)
 | |
|             local distanceText = string.format('%sm', math.floor(dist))
 | |
|             local zoneText = streetnameText
 | |
| 
 | |
|             if zones[string.upper(zone)] then
 | |
|                 zoneText = zones[string.upper(zone)]
 | |
|             end
 | |
| 
 | |
|             SendNUIMessage({
 | |
|                 component = 'position',
 | |
|                 heading = GetEntityHeading(playerPed),
 | |
|                 postal = postalText,
 | |
|                 direction = directionText,
 | |
|                 distance = distanceText,
 | |
|                 street = streetnameText,
 | |
|                 zone = zoneText
 | |
|             })
 | |
|         else
 | |
|             SendNUIMessage({
 | |
|                 component = 'position',
 | |
|                 visible = false
 | |
|             })
 | |
|         end
 | |
| 
 | |
|         Citizen.Wait(Config.globalUpdateTime)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| --
 | |
| -- HUD STATUS
 | |
| --
 | |
| 
 | |
| local hunger = 100
 | |
| local thirst = 100
 | |
| local voice_type = 'mic_mute.png'
 | |
| local voice_talking = false
 | |
| local voice_radio = false
 | |
| 
 | |
| exports('setThirst', function(val)
 | |
|     thirst = val
 | |
| end)
 | |
| 
 | |
| exports('setHunger', function(val)
 | |
|     hunger = val
 | |
| end)
 | |
| 
 | |
| exports('setVoiceDistance', function(val)
 | |
|     if val == 0 then
 | |
|         voice_type = 'mic_mute.png'
 | |
|     elseif val == 1 then
 | |
|         voice_type = 'mic_one.png'
 | |
|     elseif val == 2 then
 | |
|         voice_type = 'mic_two.png'
 | |
|     elseif val == 3 then
 | |
|         voice_type = 'mic_three.png'
 | |
|     end
 | |
| end)
 | |
| 
 | |
| exports('setVoiceRadio', function(toggle)
 | |
|     voice_radio = toggle
 | |
| end)
 | |
| 
 | |
| exports('setVoiceTalking', function(toggle)
 | |
|     voice_talking = toggle
 | |
| end)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     if Config.framework == 'esx' then
 | |
|         AddEventHandler('esx_status:onTick', function(data)
 | |
|             for i = 1, #data do
 | |
|                 if data[i].name == 'thirst' then
 | |
|                     thirst = math.floor(data[i].percent)
 | |
|                 end
 | |
| 
 | |
|                 if data[i].name == 'hunger' then
 | |
|                     hunger = math.floor(data[i].percent)
 | |
|                 end
 | |
|             end
 | |
|         end)
 | |
|     end
 | |
| 
 | |
|     if Config.framework == 'qbcore' then
 | |
|         QBCore = exports['qb-core']:GetCoreObject()
 | |
|     end
 | |
| 
 | |
|     while true do
 | |
|         ::redo::
 | |
| 
 | |
|         Citizen.Wait(Config.globalUpdateTime)
 | |
| 
 | |
|         local voice = voice_type
 | |
| 
 | |
|         if voice_radio then
 | |
|             voice = 'mic_radio.png'
 | |
|         end
 | |
| 
 | |
|         if Config.status.enabled and hudVisible then
 | |
|             if Config.framework == 'qbcore' then
 | |
|                 local PlayerData = QBCore.Functions.GetPlayerData()
 | |
| 
 | |
|                 if (PlayerData.metadata ~= nil) then
 | |
|                     hunger = PlayerData.metadata['hunger']
 | |
|                     thirst = PlayerData.metadata['thirst']
 | |
|                 else
 | |
|                     SendNUIMessage({
 | |
|                         component = 'status',
 | |
|                         visible = false
 | |
|                     })
 | |
| 
 | |
|                     goto redo
 | |
|                 end
 | |
|             end
 | |
| 
 | |
|             if Config.pmaVoice then
 | |
|                 exports['jordqn_hud']:setVoiceDistance(LocalPlayer.state.proximity.index)
 | |
| 
 | |
|                 if not MumbleIsPlayerTalking(playerId) then
 | |
|                     voice_talking = false
 | |
|                 else
 | |
|                     voice_talking = true
 | |
|                 end
 | |
|             end
 | |
| 
 | |
|             SendNUIMessage({
 | |
|                 component = 'status',
 | |
|                 framework = Config.framework,
 | |
|                 hungerVisible = Config.enableHunger,
 | |
|                 thirstVisible = Config.enableThirst,
 | |
|                 voiceVisible = Config.enableVoice,
 | |
|                 voiceType = voice,
 | |
|                 voiceTalking = voice_talking,
 | |
|                 health = GetEntityHealth(playerPed),
 | |
|                 maxhealth = GetEntityMaxHealth(playerPed),
 | |
|                 armor = GetPedArmour(playerPed),
 | |
|                 hunger = hunger,
 | |
|                 thirst = thirst,
 | |
|                 oxygen = GetPlayerUnderwaterTimeRemaining(playerId)
 | |
|             })
 | |
|         else
 | |
|             SendNUIMessage({
 | |
|                 component = 'status',
 | |
|                 visible = false
 | |
|             })
 | |
|         end
 | |
|     end
 | |
| end)
 | |
| 
 | |
| --
 | |
| -- PMA VOICE
 | |
| --
 | |
| 
 | |
| if Config.pmaVoice then
 | |
|     AddEventHandler('pma-voice:radioActive', function(toggle)
 | |
|         voice_radio = toggle
 | |
|     end)
 | |
| end
 | |
| 
 | |
| --
 | |
| -- HUD SPEEDOMETER
 | |
| --
 | |
| 
 | |
| local seatbelt = false
 | |
| 
 | |
| exports('setSeatBelt', function(toggle)
 | |
|     seatbelt = toggle
 | |
| end)
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     while true do
 | |
|         if Config.speedometer.enabled and hudVisible then
 | |
|             if inVehicle then
 | |
|                 local vehicle = GetVehiclePedIsIn(playerPed, false)
 | |
| 
 | |
|                 if DoesEntityExist(vehicle) then
 | |
|                     local multipler = Config.useMiles and 2.236936 or 3.6
 | |
|                     local maxSpeed = GetVehicleEstimatedMaxSpeed(vehicle) * multipler
 | |
|                     local speed = GetEntitySpeed(vehicle) * multipler
 | |
|                     local maxFuel = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fPetrolTankVolume')
 | |
|                     local fuel = GetVehicleFuelLevel(vehicle)
 | |
|                     local hasMotor = true
 | |
|                     local isElectric = false
 | |
| 
 | |
|                     if maxFuel < 5.0 then
 | |
|                         hasMotor = false
 | |
|                     end
 | |
| 
 | |
|                     if Config.LegacyFuel then
 | |
|                         fuel = math.floor(exports['LegacyFuel']:GetFuel(vehicle))
 | |
|                     end
 | |
| 
 | |
|                     local model = GetEntityModel(vehicle)
 | |
| 
 | |
|                     for _, v in pairs(Config.electricVehicles) do
 | |
|                         if v == model then
 | |
|                             isElectric = true
 | |
|                             break
 | |
|                         end
 | |
|                     end
 | |
| 
 | |
|                     local _, _, highbeams = GetVehicleLightsState(vehicle)
 | |
| 
 | |
|                     SendNUIMessage({
 | |
|                         component = 'speedometer',
 | |
|                         framework = Config.framework,
 | |
|                         seatbeltVisible = Config.enableSeatBelt,
 | |
|                         fuelVisible = Config.enableFuel,
 | |
|                         useMiles = Config.useMiles,
 | |
|                         speed = speed,
 | |
|                         maxspeed = maxSpeed,
 | |
|                         fuel = fuel,
 | |
|                         hasmotor = hasMotor,
 | |
|                         iselectric = isElectric,
 | |
|                         maxfuel = maxFuel,
 | |
|                         highbeams = highbeams,
 | |
|                         engine = GetIsVehicleEngineRunning(vehicle),
 | |
|                         seatbelt = seatbelt
 | |
|                     })
 | |
|                 else
 | |
|                     SendNUIMessage({
 | |
|                         component = 'speedometer',
 | |
|                         visible = false
 | |
|                     })
 | |
|                 end
 | |
|             else
 | |
|                 SendNUIMessage({
 | |
|                     component = 'speedometer',
 | |
|                     visible = false
 | |
|                 })
 | |
|             end
 | |
|         else
 | |
|             SendNUIMessage({
 | |
|                 component = 'speedometer',
 | |
|                 visible = false
 | |
|             })
 | |
|         end
 | |
| 
 | |
|         Citizen.Wait(Config.globalUpdateTime)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| --
 | |
| -- CONFIGURATION
 | |
| --
 | |
| 
 | |
| Citizen.CreateThread(function()
 | |
|     SendNUIMessage({
 | |
|         component = 'configuration',
 | |
|         locationleft = Config.location.left,
 | |
|         locationbottom = Config.location.bottom,
 | |
|         statusright = Config.status.right,
 | |
|         statusbottom = Config.status.bottom,
 | |
|         speedometerbottom = Config.speedometer.bottom
 | |
|     })
 | |
| end)
 | 
