Scripts/resources/[hp]/hp_hud/main/client.lua
2024-12-29 20:48:41 +01:00

1047 lines
39 KiB
Lua

local speedBuffer, velBuffer, pauseActive, isCarHud, stress, speedMultiplier = { 0.0, 0.0 }, {}, false, false, 0, 3.6
Framework = nil
Framework = exports["qb-core"]:GetCoreObject()
Citizen.Await(Framework)
local showRadar = true
Callback = Framework.Functions.TriggerCallback
function getPlayerData()
return Framework.Functions.GetPlayerData()
end
RegisterNetEvent('hp_hud:client:UpdateSettings')
AddEventHandler('hp_hud:client:UpdateSettings', function(data)
showRadar = not showRadar
SendNUIMessage({ action = "HIDEHUD", hudStatus = data })
end)
Citizen.CreateThread(function()
if Config.RemoveStress["on_swimming"].enable then
while true do
Citizen.Wait(10000)
if IsPedSwimming(playerPed) then
local val = math.random(Config.RemoveStress["on_swimming"].min, Config.RemoveStress["on_swimming"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end
end
end)
Citizen.CreateThread(function()
if Config.RemoveStress["on_running"].enable then
while true do
Citizen.Wait(10000)
if IsPedRunning(playerPed) then
local val = math.random(Config.RemoveStress["on_running"].min, Config.RemoveStress["on_running"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end
end
end)
Citizen.CreateThread(function() -- Speeding
if Config.AddStress["on_fastdrive"].enable then
while true do
local ped = PlayerPedId() -- corrected line
if IsPedInAnyVehicle(ped, false) then
local speed = GetEntitySpeed(GetVehiclePedIsIn(ped, false)) * 15
local stressSpeed = 110
if speed >= stressSpeed then
TriggerServerEvent('hud:server:GainStress',
math.random(Config.AddStress["on_fastdrive"].min, Config.AddStress["on_fastdrive"].max))
end
end
Wait(10000)
end
end
end)
CreateThread(function() -- Shooting
if Config.AddStress["on_shoot"].enable then
while true do
local ped = playerPed
local weapon = GetSelectedPedWeapon(ped)
if weapon ~= `WEAPON_UNARMED` then
if IsPedShooting(ped) then
if math.random() < 0.15 and not IsWhitelistedWeaponStress(weapon) then
TriggerServerEvent('hud:server:GainStress',
math.random(Config.AddStress["on_shoot"].min, Config.AddStress["on_shoot"].max))
end
end
else
Wait(900)
end
Wait(8)
end
end
end)
function IsWhitelistedWeaponStress(weapon)
if weapon then
for _, v in pairs(Config.WhitelistedWeaponStress) do
if weapon == v then
return true
end
end
end
return false
end
Citizen.CreateThread(function() -- Shooting
if Config.AddStress["on_shoot"].enable then
while true do
local ped = PlayerPedId()
local weapon = GetSelectedPedWeapon(ped)
if weapon ~= GetHashKey('WEAPON_UNARMED') then
if IsPedShooting(ped) then
if math.random() < 0.15 and not IsWhitelistedWeaponStress(weapon) then
TriggerServerEvent('hud:server:GainStress',
math.random(Config.AddStress["on_shoot"].min, Config.AddStress["on_shoot"].max))
end
end
else
Wait(900)
end
Wait(8)
end
end
end)
Citizen.CreateThread(function()
while true do
local ped = PlayerPedId()
if tonumber(stress) >= 100 then
local ShakeIntensity = GetShakeIntensity(stress)
local FallRepeat = math.random(2, 4)
local RagdollTimeout = (FallRepeat * 1750)
ShakeGameplayCam('SMALL_EXPLOSION_SHAKE', ShakeIntensity)
SetFlash(0, 0, 500, 3000, 500)
if not IsPedRagdoll(ped) and IsPedOnFoot(ped) and not IsPedSwimming(ped) then
SetPedToRagdollWithFall(ped, RagdollTimeout, RagdollTimeout, 1, GetEntityForwardVector(ped), 1.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0)
end
Wait(500)
for i = 1, FallRepeat, 1 do
Wait(750)
DoScreenFadeOut(200)
Wait(1000)
DoScreenFadeIn(200)
ShakeGameplayCam('SMALL_EXPLOSION_SHAKE', ShakeIntensity)
SetFlash(0, 0, 200, 750, 200)
end
end
if stress >= 50 then
local ShakeIntensity = GetShakeIntensity(stress)
ShakeGameplayCam('SMALL_EXPLOSION_SHAKE', ShakeIntensity)
SetFlash(0, 0, 500, 2500, 500)
end
Wait(GetEffectInterval(stress))
end
end)
function GetShakeIntensity(stresslevel)
local retval = 0.05
local Intensity = {
["shake"] = {
[1] = {
min = 50,
max = 60,
intensity = 0.12,
},
[2] = {
min = 60,
max = 70,
intensity = 0.17,
},
[3] = {
min = 70,
max = 80,
intensity = 0.22,
},
[4] = {
min = 80,
max = 90,
intensity = 0.28,
},
[5] = {
min = 90,
max = 100,
intensity = 0.32,
},
}
}
for k, v in pairs(Intensity['shake']) do
if stresslevel >= v.min and stresslevel <= v.max then
retval = v.intensity
break
end
end
return retval
end
function GetEffectInterval(stresslevel)
local EffectInterval = {
[1] = {
min = 50,
max = 60,
timeout = math.random(14000, 15000)
},
[2] = {
min = 60,
max = 70,
timeout = math.random(12000, 13000)
},
[3] = {
min = 70,
max = 80,
timeout = math.random(10000, 11000)
},
[4] = {
min = 80,
max = 90,
timeout = math.random(8000, 9000)
},
[5] = {
min = 90,
max = 100,
timeout = math.random(6000, 7000)
}
}
local retval = 10000
for k, v in pairs(EffectInterval) do
if stresslevel >= v.min and stresslevel <= v.max then
retval = v.timeout
break
end
end
return retval
end
RegisterNetEvent('hud:client:UpdateStress', function(newStress) -- Add this event with adding stress elsewhere
stress = newStress
SendNUIMessage({
action = 'STRESS',
stress = math.ceil(newStress),
})
end)
RegisterNetEvent('consumables:client:Eat')
AddEventHandler('consumables:client:Eat', function()
if Config.RemoveStress["on_eat"].enable then
local val = math.random(Config.RemoveStress["on_eat"].min, Config.RemoveStress["on_eat"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end)
RegisterNetEvent('consumables:client:Drink')
AddEventHandler('consumables:client:Drink', function()
if Config.RemoveStress["on_drink"].enable then
local val = math.random(Config.RemoveStress["on_drink"].min, Config.RemoveStress["on_drink"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end)
RegisterNetEvent('consumables:client:DrinkAlcohol')
AddEventHandler('consumables:client:DrinkAlcohol', function()
if Config.RemoveStress["on_drink"].enable then
local val = math.random(Config.RemoveStress["on_drink"].min, Config.RemoveStress["on_drink"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end)
AddEventHandler('baseevents:onPlayerDied', function()
TriggerServerEvent('hud:server:RelieveStress', 10000)
end)
AddEventHandler('baseevents:onPlayerKilled', function()
TriggerServerEvent('hud:server:RelieveStress', 10000)
end)
RegisterNetEvent('hospital:client:RespawnAtHospital')
AddEventHandler('hospital:client:RespawnAtHospital', function()
TriggerServerEvent('hud:server:RelieveStress', 10000)
end)
Citizen.CreateThread(function()
if Config.RemoveStress["on_swimming"].enable then
while true do
Citizen.Wait(10000)
if IsPedSwimming(playerPed) then
local val = math.random(Config.RemoveStress["on_swimming"].min, Config.RemoveStress["on_swimming"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end
end
end)
Citizen.CreateThread(function()
if Config.RemoveStress["on_running"].enable then
while true do
Citizen.Wait(10000)
if IsPedRunning(playerPed) then
local val = math.random(Config.RemoveStress["on_running"].min, Config.RemoveStress["on_running"].max)
TriggerServerEvent('hud:server:RelieveStress', val)
end
end
end
end)
RegisterCommand("Notification", function() -- Test Command
exports['hp_hud']:Notification('success', 'Succes', 'Success description are there in few cute words for our dear players, enjoy')
Citizen.Wait(1000)
exports['hp_hud']:Notification('error', 'Error', 'Success description are there in few cute words for our dear players, enjoy')
Citizen.Wait(2000)
exports['hp_hud']:Notification('warning', 'Warning', 'Success description are there in few cute words for our dear players, enjoy')
end, true)
RegisterCommand("Question", function()
exports['hp_hud']:Question('Are you sure?', 'Success description are there in few cute words for our dear players, enjoy')
end, true)
RegisterNetEvent('HudNotification') -- Trigger ==> Export
AddEventHandler('HudNotification', function(Type, Header, Message)
exports['hp_hud']:Notification(Type, Header, Message)
end)
exports('Notification', function(Type, Header, Message)
SendNUIMessage({
action = "GET_NOTIFICATION",
ntype = Type,
nheader = Header,
nmsg = Message
})
end)
exports('Question', function(Header, Message)
if not isQuestion then
isQuestion = true
SendNUIMessage({ action = 'GET_QUESTION', qheader = Header, qmsg = Message, qstats = true })
while isQuestion do
if IsControlJustPressed(0, 246) then
SendNUIMessage({ action = 'GET_QUESTION', qstats = false })
isQuestion = false
return 'Y'
end
--For some reason, they 249 is tied to voicechat, and if voicechat is disabled, it will not work. So, I added 306 as well.
if IsControlJustPressed(0, 249) or IsControlJustPressed(0, 306) then
SendNUIMessage({ action = 'GET_QUESTION', qstats = false })
isQuestion = false
return 'N'
end
Citizen.Wait(4)
end
else
return
end
end)
local lastAmmo = nil
local lastMaxAmmo = nil
local displayAmmo = false
local currentWeaponName = ""
local weapons = {
--Melee
{ label = "Dagger", name = "dagger", hash = "0x92A27487" },
{ label = "Bat", name = "bat", hash = "0x958A4A8F" },
{ label = "Bottle", name = "bottle", hash = "0xF9E6AA4B" },
{ label = "Crowbar", name = "crowbar", hash = "0x84BD7BFD" },
{ label = "Unarmed", name = "unarmed", hash = "0xA2719263" },
{ label = "Flashlight", name = "flashlight", hash = "0x8BB05FD7" },
{ label = "Golfclub", name = "golfclub", hash = "0x440E4788" },
{ label = "Hammer", name = "hammer", hash = "0x4E875F73" },
{ label = "Hatchet", name = "hatchet", hash = "0xF9DCBF2D" },
{ label = "Knuckle", name = "knuckle", hash = "0xD8DF3C3C" },
{ label = "Knife", name = "knife", hash = "0x99B507EA" },
{ label = "Machete", name = "machete", hash = "0xDD5DF8D9" },
{ label = "Switchblade", name = "switchblade", hash = "0xDFE37640" },
{ label = "Nightstick", name = "nightstick", hash = "0x678B81B1" },
{ label = "Wrench", name = "wrench", hash = "0x19044EE0" },
{ label = "Battleaxe", name = "battleaxe", hash = "0xCD274149" },
{ label = "Poolcue", name = "poolcue", hash = "0x94117305" },
{ label = "Stone Hatchet", name = "stone_hatchet", hash = "0x3813FC08" },
-- Pistols
{ label = "Pistol", name = "pistol", hash = "0x1B06D571" },
{ label = "Pistol MK2", name = "pistol_mk2", hash = "0xBFE256D4" },
{ label = "Combat Pistol", name = "combatpistol", hash = "0x5EF9FEC4" },
{ label = "AP Pistol", name = "appistol", hash = "0x22D8FE39" },
{ label = "Stun Gun", name = "stungun", hash = "0x3656C8C1" },
{ label = "Pistol .50", name = "pistol50", hash = "0x99AEEB3B" },
{ label = "SNS Pistol", name = "snspistol", hash = "0xBFD21232" },
{ label = "SNS Pistol MK2", name = "snspistol_mk2", hash = "0x88374054" },
{ label = "Heavy Pistol", name = "heavypistol", hash = "0xD205520E" },
{ label = "Vintage Pistol", name = "vintagepistol", hash = "0x83839C4" },
{ label = "Flare Gun", name = "flaregun", hash = "0x47757124" },
{ label = "Marksman Pistol", name = "marksmanpistol", hash = "0xDC4DB296" },
{ label = "Revolver", name = "revolver", hash = "0xC1B3C3D1" },
{ label = "Revolver MK2", name = "revolver_mk2", hash = "0xCB96392F" },
{ label = "Double Action", name = "doubleaction", hash = "0x97EA20B8" },
{ label = "Ray Pistol", name = "raypistol", hash = "0xAF3696A1" },
{ label = "Ceramic Pistol", name = "ceramicpistol", hash = "0x2B5EF5EC" },
{ label = "Navy Revolver", name = "navyrevolver", hash = "0x917F6C8C" },
{ label = "Perico Pistol", name = "gadgetpistol", hash = "0x57A4368C" },
--SMGs
{ label = "Micro SMG", name = "microsmg", hash = "0x13532244" },
{ label = "SMG", name = "smg", hash = "0x2BE6766B" },
{ label = "SMG Mk II", name = "smg_mk2", hash = "0x78A97CD0" },
{ label = "Assault SMG", name = "assaultsmg", hash = "0xEFE7E2DF" },
{ label = "Combat PDW", name = "combatpdw", hash = "0x0A3D4D34" },
{ label = "Machine Pistol", name = "machinepistol", hash = "0xDB1AA450" },
{ label = "Mini SMG", name = "minismg", hash = "0xBD248B55" },
{ label = "Unholy Hellbringer", name = "raycarbine", hash = "0x476BF155" },
--Shotguns
{ label = "Pump Shotgun", name = "pumpshotgun", hash = "0x1D073A89" },
{ label = "Pump Shotgun Mk II", name = "pumpshotgun_mk2", hash = "0x555AF99A" },
{ label = "Sawed-Off Shotgun", name = "sawnoffshotgun", hash = "0x7846A318" },
{ label = "Assault Shotgun", name = "assaultshotgun", hash = "0xE284C527" },
{ label = "Bullpup Shotgun", name = "bullpupshotgun", hash = "0x9D61E50F" },
{ label = "Musket", name = "musket", hash = "0xA89CB99E" },
{ label = "Heavy Shotgun", name = "heavyshotgun", hash = "0x3AABBBAA" },
{ label = "Double Barrel Shotgun", name = "dbshotgun", hash = "0xEF951FBB" },
{ label = "Sweeper Shotgun", name = "autoshotgun", hash = "0x12E82D3D" },
{ label = "Combat Shotgun", name = "combatshotgun", hash = "0x5A96BA4" },
--Rifles
{ label = "Assault Rifle", name = "assaultrifle", hash = "0xBFEFFF6D" },
{ label = "Assault RiflE", name = "assaultrifle_mk2", hash = "0x394F415C" },
{ label = "Carbine Rifle", name = "carbinerifle", hash = "0x83BF0278" },
{ label = "Carbine Rifle", name = "carbinerifle_mk2", hash = "0xFAD1F1C9" },
{ label = "Advanced Rifle", name = "advancedrifle", hash = "0xAF113F99" },
{ label = "Special Carbine", name = "specialcarbine", hash = "0xC0A3098D" },
{ label = "Special Carbine Mk II", name = "specialcarbine_mk2", hash = "0x969C3D67" },
{ label = "Bullpup Rifle", name = "bullpuprifle", hash = "0x7F229F94" },
{ label = "Bullpup Rifle Mk II", name = "bullpuprifle_mk2", hash = "0x84D6FAFD" },
{ label = "Compact Rifle", name = "compactrifle", hash = "0x624FE830" },
{ label = "Military Rifle", name = "militaryrifle", hash = "0x9D1F17E6" },
{ label = "Heavy Rifle", name = "heavyrifle", hash = "0xC78D71B4" },
{ label = "Tactical Rifle", name = "tacticalrifle", hash = "0xD1D5F52B" },
--LMGs
{ label = "MG", name = "mg", hash = "0x9D07F764" },
{ label = "Combat MG", name = "combatmg", hash = "0x7FD62962" },
{ label = "Combat MG Mk II", name = "combatmg_mk2", hash = "0xDBBD7280" },
{ label = "Gusenberg Sweeper", name = "gusenberg", hash = "0x61012683" },
--Snipers
{ label = "Sniper Rifle", name = "sniperrifle", hash = "0x05FC3C11" },
{ label = "Heavy Sniper", name = "heavysniper", hash = "0x0C472FE2" },
{ label = "Heavy Sniper Mk II", name = "heavysniper_mk2", hash = "0xA914799" },
{ label = "Marksman Rifle", name = "marksmanrifle", hash = "0xC734385A" },
{ label = "Marksman Rifle Mk II", name = "marksmanrifle_mk2", hash = "0x6A6C02E0" },
{ label = "Precision Rifle", name = "precisionrifle", hash = "0x6E7DDDEC" },
--Heavy Weapons
{ label = "RPG", name = "rpg", hash = "0xB1CA77B1" },
{ label = "Grenade Launcher", name = "grenadelauncher", hash = "0xA284510B" },
{ label = "Grenade Launcher Smoke", name = "grenadelauncher_smoke", hash = "0x4DD2DC56" },
{ label = "Minigun", name = "minigun", hash = "0x42BF8A85" },
{ label = "Firework Launcher", name = "firework", hash = "0x7F7497E5" },
{ label = "Railgun", name = "railgun", hash = "0x6D544C99" },
{ label = "Homing Launcher", name = "hominglauncher", hash = "0x63AB0442" },
{ label = "Compact Grenade Launcher", name = "compactlauncher", hash = "0x0781FE4A" },
{ label = "Widowmaker", name = "rayminigun", hash = "0xB62D1F67" },
{ label = "Compact EMP Launcher", name = "emplauncher", hash = "0xDB26713A" },
--Throwables
{ label = "Grenade", name = "grenade", hash = "0x93E220BD" },
{ label = "BZ Gas", name = "bzgas", hash = "0xA0973D5E" },
{ label = "Molotov Cocktail", name = "molotov", hash = "0x24B17070" },
{ label = "Sticky Bomb", name = "stickybomb", hash = "0x2C3731D9" },
{ label = "Proximity Mines", name = "proxmine", hash = "0xAB564B93" },
{ label = "Snowballs", name = "snowball", hash = "0x787F0BB" },
{ label = "Pipe Bombs", name = "pipebomb", hash = "0xBA45E8B8" },
{ label = "Baseball", name = "ball", hash = "0x23C9F95C" },
{ label = "Tear Gas", name = "smokegrenade", hash = "0xFDBC8A50" },
{ label = "Flare", name = "flare", hash = "0x497FACC3" },
--Miscellaneous
{ label = "Jerry Can", name = "petrolcan", hash = "0x34A67B97" },
{ label = "Parachute", name = "parachute", hash = "0xFBAB5776" },
{ label = "Fire Extinguisher", name = "fireextinguisher", hash = "0x060EC506" },
{ label = "Hazardous Jerry Can", name = "hazardcan", hash = "0xBA536372" },
{ label = "Fertilizer Can", name = "fertilizercan", hash = "0x184140A1" },
}
local function getWeaponNameFromHash(hash)
for _, weapon in ipairs(weapons) do
if hash == GetHashKey('weapon_' .. weapon.name) then
return weapon.name
end
end
return ""
end
local function getWeaponNameFromLabel(hash)
for _, weapon in ipairs(weapons) do
if hash == GetHashKey('weapon_' .. weapon.name) then
return weapon.label
end
end
return ""
end
Citizen.CreateThread(function()
local lastAmmo = nil
local lastMaxAmmo = nil
local displayAmmo = false
while true do
Citizen.Wait(200)
local playerPed = PlayerPedId()
local _, weaponHash = GetCurrentPedWeapon(playerPed)
local currentWeaponName = getWeaponNameFromHash(weaponHash) -- Update this to your function for getting weapon name from hash
local currentWeaponLabel = getWeaponNameFromLabel(weaponHash) -- Update this to your function for getting weapon label from hash
if IsPedArmed(playerPed, 7) then
SendNUIMessage({
action = 'GET_WEAPON',
name = currentWeaponLabel,
img = currentWeaponName,
stats = true
})
local _, ammoClip = GetAmmoInClip(playerPed, weaponHash)
local ammoTotal = GetAmmoInPedWeapon(playerPed, weaponHash)
local ammoRemaining = ammoTotal - ammoClip
if not displayAmmo then
displayAmmo = true
end
if IsControlPressed(0, 24) or lastAmmo ~= ammoClip or lastMaxAmmo ~= ammoTotal then
SendNUIMessage({
action = 'GET_AMMO',
ammo = ammoClip .. '/' .. ammoRemaining,
})
lastAmmo = ammoClip
lastMaxAmmo = ammoTotal
Citizen.Wait(100)
end
else
SendNUIMessage({
action = 'GET_WEAPON',
name = currentWeaponName,
img = currentWeaponName,
stats = false
})
displayAmmo = false
end
end
end)
RegisterCommand(Config.Hud, function()
SendNUIMessage({ action = 'MENU' })
SetDisplay(true, true)
end, false)
local display = false
function SetDisplay(bool)
display = bool
SetNuiFocus(bool, bool)
end
RegisterNUICallback("exit", function(data)
SetDisplay(false)
end)
local LastSpeed, LastRpm, LastEngine, LastSignal, LastLight
local LastFuel = 0
local doorsOpen = false
local indicatorlights = false
local speedLimiterEnabled = false
RegisterKeyMapping('blinkers', 'Nødblink', 'keyboard', 'DOWN')
RegisterCommand('blinkers', function()
local playerPed = GetPlayerPed(-1)
local vehicle = GetVehiclePedIsIn(playerPed, false)
if GetPedInVehicleSeat(vehicle, -1) == playerPed and IsPedInAnyVehicle(playerPed, false) then
if indicatorlights then
SetVehicleIndicatorLights(vehicle, 0, false)
SetVehicleIndicatorLights(vehicle, 1, false)
indicatorlights = false
else
SetVehicleIndicatorLights(vehicle, 0, true)
SetVehicleIndicatorLights(vehicle, 1, true)
indicatorlights = true
end
end
end, false)
local function handleSpeedLimiter(vehicle, maxSpeed)
if not speedLimiterEnabled then
local cruise = GetEntitySpeed(vehicle)
SetEntityMaxSpeed(vehicle, cruise)
speedLimiterEnabled = not speedLimiterEnabled
cruise = math.floor(cruise * 3.6 + 0.5)
exports['hp_hud']:Notification('success', 'Fartbegrænser', "Fartbegrænser sat til " .. cruise .. " km/h.")
else
SetEntityMaxSpeed(vehicle, maxSpeed)
speedLimiterEnabled = not speedLimiterEnabled
exports['hp_hud']:Notification('success', 'Fartbegrænser', "Fartbegrænser slået fra")
end
end
RegisterKeyMapping('speedlimiter', 'Fartbegrænser', 'keyboard', 'F2')
RegisterCommand('speedlimiter', function()
local playerPed = GetPlayerPed(-1)
local vehicle = GetVehiclePedIsIn(playerPed, false)
if GetPedInVehicleSeat(vehicle, -1) == playerPed and IsPedInAnyVehicle(playerPed, false) then
local maxSpeed = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fInitialDriveMaxFlatVel")
handleSpeedLimiter(vehicle, maxSpeed)
end
end, false)
Citizen.CreateThread(function()
while true do
Citizen.Wait(50)
local ped = PlayerPedId()
local vehicle = GetVehiclePedIsIn(ped, false)
if IsPedInVehicle(ped, vehicle, true) and not pauseActive then
local engineHealth = GetVehicleEngineHealth(vehicle)
local LightVal, LightLights, LightHighlights = GetVehicleLightsState(vehicle)
local checkEngine = false
local indicator = GetVehicleIndicatorLights(vehicle)
local blinkers = false
if indicator <= 3 and indicator >= 1 then
blinkers = true
else
blinkers = false
end
local Light = (LightLights == 1 or LightHighlights == 1)
local Speed, Rpm, Fuel, Engine, Signal = GetEntitySpeed(vehicle), GetVehicleCurrentRpm(vehicle),
getFuelLevel(vehicle), GetIsVehicleEngineRunning(vehicle), GetVehicleIndicatorLights(vehicle)
if engineHealth <= 549 then
SetVehicleEngineTorqueMultiplier(vehicle, engineHealth <= 300 and 0.09 or 0.4)
SetVehicleIndicatorLights(vehicle, 0, true)
SetVehicleIndicatorLights(vehicle, 1, true)
checkEngine = true
if engineHealth <= 300 then
SetVehicleEngineHealth(vehicle, 150.0)
SetVehicleBodyHealth(vehicle, 0.0)
SetVehicleUndriveable(vehicle, true)
SetVehicleDoorOpen(vehicle, 4, 0, 0)
end
elseif engineHealth >= 550 then
SetVehicleEngineTorqueMultiplier(vehicle, 1.0)
checkEngine = false
end
for i = 0, 7 do
if GetVehicleDoorAngleRatio(vehicle, i) > 0.0 then
doorsOpen = true
break
else
doorsOpen = false
end
end
SendNUIMessage({
action = 'SETCARHUD',
variable = true
})
local Speed = GetEntitySpeed(vehicle)
if LastSpeed ~= Speed or LastRpm ~= Rpm or LastFuel ~= Fuel or LastEngine ~= Engine or LastSignal ~= Signal or LastLight ~= Light then
SendNUIMessage({
action = 'CARHUD',
speed = math.floor(Speed * speedMultiplier),
rpm = math.ceil(GetVehicleCurrentRpm(vehicle) * 78),
fuel = math.floor(Config.GetVehFuel(vehicle)),
cruise = speedLimiterEnabled,
engine = checkEngine,
state = Light,
seatbelt = getSeatbeltStatus(),
door = doorsOpen,
gear = GetVehicleCurrentGear(vehicle),
blinkers = blinkers,
type = Config.DefaultSpeedUnit
})
LastSpeed, LastRpm, LastFuel, LastEngine, LastSignal, LastLight = Speed, Rpm, Fuel, Engine, Signal, Light
end
else
SendNUIMessage({ action = 'SETCARHUD', variable = false })
Citizen.Wait(500)
end
end
end)
local lastFuelUpdate = 0
function getFuelLevel(vehicle)
local updateTick = GetGameTimer()
if (updateTick - lastFuelUpdate) > 2000 then
lastFuelUpdate = updateTick
LastFuel = math.floor(Config.GetVehFuel(vehicle))
end
return LastFuel
end
Citizen.CreateThread(function()
while true do
Citizen.Wait(1)
HideHudComponentThisFrame(6) -- VEHICLE_NAME
HideHudComponentThisFrame(7) -- AREA_NAME
HideHudComponentThisFrame(8) -- VEHICLE_CLASS
HideHudComponentThisFrame(9) -- STREET_NAME
HideHudComponentThisFrame(3) -- CASH
HideHudComponentThisFrame(4) -- MP_CASH
DisplayAmmoThisFrame(false)
end
end)
RegisterNetEvent("QBCore:Player:SetPlayerData")
AddEventHandler("QBCore:Player:SetPlayerData", function(data)
SendNUIMessage({ action = 'ECONOMY', cash = data.money.cash, bank = data.money.bank, black = data.money.crypto })
end)
RegisterNetEvent("QBCore:Client:OnJobUpdate")
AddEventHandler("QBCore:Client:OnJobUpdate", function(data)
SendNUIMessage({ action = 'GET_JOB', job = data.grade.name, grade = data.label })
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(1000)
local playerData = getPlayerData()
if playerData and playerData.metadata then
local armorStats = playerData.metadata["armor"]
if armorStats == nil then
armorStats = 0
else
armorStats = math.ceil(armorStats)
end
SendNUIMessage({ action = 'ARMOR', armor = armorStats })
else
SendNUIMessage({ action = 'ARMOR', armor = 0 })
end
Citizen.Wait(2500)
end
end)
local seatbeltOn = false
local speedBuffer = { nil, nil }
local velBuffer = { nil, nil }
function Fwv(entity)
local hr = GetEntityHeading(entity) + 90.0
if hr < 0.0 then hr = 360.0 + hr end
hr = hr * 0.0174533
return { x = math.cos(hr) * 2.0, y = math.sin(hr) * 2.0 }
end
local function hasHarness()
return seatbeltOn
end
exports("HasHarness", hasHarness)
-- RegisterKeyMapping('seatbelt', 'Toggle Seatbelt', 'keyboard', Config.SeatbeltControl)
-- RegisterCommand('seatbelt', function()
-- local playerPed = PlayerPedId()
-- if IsPedInAnyVehicle(playerPed, false) then
-- local class = GetVehicleClass(GetVehiclePedIsUsing(playerPed))
-- if class ~= 8 and class ~= 13 and class ~= 14 then
-- if seatbeltOn then
-- exports['hp_hud']:Notification('info', 'Sikkerhedssele', 'Du tog selen af!')
-- TriggerServerEvent("InteractSound_SV:PlayOnSource", "carbuckle", 0.25)
-- else
-- exports['hp_hud']:Notification('info', 'Sikkerhedssele', 'Du tog selen på!')
-- TriggerServerEvent("InteractSound_SV:PlayOnSource", "carunbuckle", 0.25)
-- end
-- seatbeltOn = not seatbeltOn
-- end
-- end
-- end, false)
Citizen.CreateThread(function()
while true do
local playerPed = PlayerPedId()
local Veh = GetVehiclePedIsIn(playerPed, false)
local isCarHud = true -- Replace as per your context.
if isCarHud then
if seatbeltOn then DisableControlAction(0, 75) end
speedBuffer[2] = speedBuffer[1]
speedBuffer[1] = GetEntitySpeed(Veh)
velBuffer[2] = velBuffer[1]
velBuffer[1] = GetEntityVelocity(Veh)
if speedBuffer[2] and GetEntitySpeedVector(Veh, true).y > 1.0 and speedBuffer[1] > 15 and (speedBuffer[2] - speedBuffer[1]) > (speedBuffer[1] * 0.255) then
if not seatbeltOn then
local co = GetEntityCoords(playerPed)
local fw = Fwv(playerPed)
SetEntityCoords(playerPed, co.x + fw.x, co.y + fw.y, co.z - 0.47, true, true, true)
SetEntityVelocity(playerPed, velBuffer[2].x, velBuffer[2].y, velBuffer[2].z)
Wait(500)
SetPedToRagdoll(playerPed, 1000, 1000, 0, 0, 0, 0)
seatbeltOn = false
end
end
else
Wait(3000)
end
Wait(0)
end
end)
function getSeatbeltStatus()
return seatbeltOn
end
Citizen.CreateThread(function()
while true do
Citizen.Wait(650)
if IsPauseMenuActive() and not pauseActive then
pauseActive = true
SendNUIMessage({
action = 'EXIT',
args = false
})
end
if not IsPauseMenuActive() and pauseActive then
pauseActive = false
SendNUIMessage({
action = 'EXIT',
args = true
})
end
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(150)
local microphoneColor = NetworkIsPlayerTalking(PlayerId()) and "green" or "#FFFFFF"
SendNUIMessage({
action = "MICROPHONE",
variable = microphoneColor
})
SendNUIMessage({
action = 'PLAYERS',
players = "ID: " .. GetPlayerServerId(PlayerId())
})
end
end)
RegisterNetEvent('HudPlayerLoad')
AddEventHandler('HudPlayerLoad', function(source)
Citizen.Wait(2000)
local Player = getPlayerData()
Citizen.CreateThread(function()
local hunger = math.ceil(Player.metadata["hunger"])
local thirst = math.ceil(Player.metadata["thirst"])
SendNUIMessage({
action = "STATUS",
hunger = hunger,
thirst = thirst
})
end)
SendNUIMessage({
action = "GET_JOB",
job = Player.job.grade.name,
grade = Player.job.label
})
end)
RegisterNetEvent('hud:client:UpdateNeeds', function(newHunger, newThirst)
local hunger = math.ceil(newHunger)
local thirst = math.ceil(newThirst)
if hunger > 100 then
hunger = 100
end
if thirst > 100 then
thirst = 100
end
SendNUIMessage({
action = "STATUS",
hunger = hunger,
thirst = thirst
})
end)
Callback('Player', function(cash, bank, black)
Citizen.Wait(2000)
SendNUIMessage({ action = 'ECONOMY', cash = cash, bank = bank, black = black })
end)
RegisterNUICallback("UpStats", function(data, cb)
cb({ hunger = math.ceil(Framework.Functions.GetPlayerData().metadata["hunger"]), thirst = math.ceil(Framework.Functions.GetPlayerData().metadata["thirst"]) })
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(1000)
local playerPed = PlayerPedId()
local health = GetEntityHealth(playerPed)
if lastHealth ~= health then
local val = health - 100
if GetEntityModel(playerPed) == `mp_f_freemode_01` then val = (health + 25) - 100 end
SendNUIMessage({
action = 'HEALTH',
health = GetEntityHealth(playerPed) - 100
})
lastHealth = health
end
end
end)
Citizen.CreateThread(function()
local wait, LastOxygen
while true do
local Player = PlayerId()
local newoxygen = GetPlayerSprintStaminaRemaining(Player)
if IsPedInAnyVehicle(PlayerPed) then wait = 2100 end
if LastOxygen ~= newoxygen then
wait = 125
if IsEntityInWater(PlayerPed) then
oxygen = GetPlayerUnderwaterTimeRemaining(Player) * 10
else
oxygen = 100 - GetPlayerSprintStaminaRemaining(Player)
end
LastOxygen = newoxygen
SendNUIMessage({
action = 'GET_STAMINA',
stamina = math.ceil(oxygen),
})
else
wait = 1850
end
Citizen.Wait(wait)
end
end)
local NitroVeh = {}
RegisterNetEvent('hud:client:UpdateNitrous', function(Plate, level)
NitroVeh[Plate] = level
SendNUIMessage({
action = 'UPDATE_NOSS',
noss = NitroVeh[Plate]
})
end)
function GetVehicleInDirection()
PlayerPed = PlayerPedId()
local playerCoords = GetEntityCoords(PlayerPed)
local inDirection = GetOffsetFromEntityInWorldCoords(PlayerPed, 0.0, 5.0,
0.0)
local rayHandle = StartShapeTestRay(playerCoords, inDirection, 10,
PlayerPed, 0)
local numRayHandle, hit, endCoords, surfaceNormal, entityHit = GetShapeTestResult(rayHandle)
if hit == 1 and GetEntityType(entityHit) == 2 then
return entityHit
end
return nil
end
RegisterNUICallback("GetMap",function(type)
if type.map == 'squared' then
local defaultAspectRatio = 1920/1080 -- Don't change this.
local resolutionX, resolutionY = GetActiveScreenResolution()
local aspectRatio = resolutionX/resolutionY
local minimapOffset = 0
if aspectRatio ~= defaultAspectRatio then
minimapOffset = ((defaultAspectRatio-aspectRatio)/3.6)-0.008
end
RequestStreamedTextureDict("squaremap", false)
while not HasStreamedTextureDictLoaded("squaremap") do
Wait(150)
end
SetMinimapClipType(0)
AddReplaceTexture("platform:/textures/graphics", "radarmasksm", "squaremap", "radarmasksm")
AddReplaceTexture("platform:/textures/graphics", "radarmask1g", "squaremap", "radarmasksm")
SetMinimapComponentPosition("minimap", "L", "B", 0.0 + minimapOffset, -0.047, 0.1638, 0.183)
SetMinimapComponentPosition("minimap_mask", "L", "B", 0.0 + minimapOffset, 0.0, 0.128, 0.20)
SetMinimapComponentPosition('minimap_blur', 'L', 'B', 0.012 + minimapOffset, 0.064, 0.257, 0.325)
SetBlipAlpha(GetNorthRadarBlip(), 0)
SetRadarBigmapEnabled(true, false)
SetMinimapClipType(0)
Wait(0)
SetRadarBigmapEnabled(false, false)
else
local defaultAspectRatio = 1920 / 1080 -- Don't change this.
local resolutionX, resolutionY = GetActiveScreenResolution()
local aspectRatio = resolutionX / resolutionY
local minimapOffset = 0
if aspectRatio > defaultAspectRatio then
minimapOffset = ((defaultAspectRatio - aspectRatio) / 3.6) - 0.008
end
RequestStreamedTextureDict("circlemap", false)
while not HasStreamedTextureDictLoaded("circlemap") do
Wait(150)
end
SetMinimapClipType(1)
AddReplaceTexture("platform:/textures/graphics", "radarmasksm", "circlemap", "radarmasksm")
AddReplaceTexture("platform:/textures/graphics", "radarmask1g", "circlemap", "radarmasksm")
-- -0.0100 = nav symbol and icons left
-- 0.180 = nav symbol and icons stretched
-- 0.258 = nav symbol and icons raised up
SetMinimapComponentPosition("minimap", "L", "B", 0.00999 + minimapOffset, -0.090 - minimapOffset, 0.15, 0.170);
SetMinimapComponentPosition("minimap_mask", "L", "B", 0.2125 + minimapOffset, -0.050 - minimapOffset, 0.065, 0.20);
SetMinimapComponentPosition('minimap_blur', 'L', 'B', 0.027 + minimapOffset, -0.025 - minimapOffset, 0.190, 0.290);
SetBlipAlpha(GetNorthRadarBlip(), 0)
SetMinimapClipType(1)
SetRadarBigmapEnabled(true, false)
Wait(0)
SetRadarBigmapEnabled(false, false)
end
end)
Citizen.CreateThread(function()
local minimap = RequestScaleformMovie("minimap")
SetRadarBigmapEnabled(true, false)
Wait(0)
SetRadarBigmapEnabled(false, false)
end)
Citizen.CreateThread(function()
Citizen.Wait(100)
while true do
local sleepThread = 500
local radarEnabled = IsRadarEnabled()
local inVehicle = IsPedInAnyVehicle(PlayerPedId(), false)
if not inVehicle and radarEnabled then
DisplayRadar(false)
elseif inVehicle and not radarEnabled then
DisplayRadar(true)
end
Citizen.Wait(sleepThread)
end
end)
-- Minimap update
CreateThread(function()
while true do
SetRadarBigmapEnabled(false, false)
SetRadarZoom(1000)
SetBigmapActive(false, false)
Wait(4)
end
end)