ESX = nil local Status, isPaused = {}, false Citizen.CreateThread(function() while ESX == nil do TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) Citizen.Wait(0) end end) function GetStatusData(minimal) local status = {} for i=1, #Status, 1 do if minimal then table.insert(status, { name = Status[i].name, val = Status[i].val, percent = (Status[i].val / Config.StatusMax) * 100 }) else table.insert(status, { name = Status[i].name, val = Status[i].val, color = Status[i].color, visible = Status[i].visible(Status[i]), percent = (Status[i].val / Config.StatusMax) * 100 }) end end return status end AddEventHandler('esx_status:registerStatus', function(name, default, color, visible, tickCallback) local status = CreateStatus(name, default, color, visible, tickCallback) table.insert(Status, status) end) AddEventHandler('esx_status:unregisterStatus', function(name) for k,v in ipairs(Status) do if v.name == name then table.remove(Status, k) break end end end) RegisterNetEvent('esx:onPlayerLogout') AddEventHandler('esx:onPlayerLogout', function() Status = {} if Config.Display then SendNUIMessage({ update = true, status = Status }) end end) RegisterNetEvent('esx_status:load') AddEventHandler('esx_status:load', function(status) TriggerEvent('esx_status:loaded') for i=1, #Status, 1 do for j=1, #status, 1 do if Status[i].name == status[j].name then Status[i].set(status[j].val) end end end if Config.Display then TriggerEvent('esx_status:setDisplay', 0.5) end Citizen.CreateThread(function() while #Status > 0 do for i=1, #Status, 1 do Status[i].onTick() end local data = GetStatusData(true) if Config.Display then local fullData = data for i=1, #data, 1 do fullData[i].color = Status[i].color fullData[i].visible = Status[i].visible(Status[i]) end SendNUIMessage({ update = true, status = fullData }) end TriggerEvent('esx_status:onTick', data) Citizen.Wait(Config.TickTime) end end) end) RegisterNetEvent('esx_status:set') AddEventHandler('esx_status:set', function(name, val) for i=1, #Status, 1 do if Status[i].name == name then Status[i].set(val) break end end if Config.Display then SendNUIMessage({ update = true, status = GetStatusData() }) end end) RegisterNetEvent('esx_status:add') AddEventHandler('esx_status:add', function(name, val) for i=1, #Status, 1 do if Status[i].name == name then Status[i].add(val) break end end if Config.Display then SendNUIMessage({ update = true, status = GetStatusData() }) end end) RegisterNetEvent('esx_status:remove') AddEventHandler('esx_status:remove', function(name, val) for i=1, #Status, 1 do if Status[i].name == name then Status[i].remove(val) break end end if Config.Display then SendNUIMessage({ update = true, status = GetStatusData() }) end end) AddEventHandler('esx_status:getStatus', function(name, cb) for i=1, #Status, 1 do if Status[i].name == name then cb(Status[i]) return end end end) AddEventHandler('esx_status:setDisplay', function(val) SendNUIMessage({ setDisplay = true, display = val }) end) -- Pause menu disable hud display Citizen.CreateThread(function() while true do if Config.Display then Citizen.Wait(300) if IsPauseMenuActive() and not isPaused then isPaused = true TriggerEvent('esx_status:setDisplay', 0.0) elseif not IsPauseMenuActive() and isPaused then isPaused = false TriggerEvent('esx_status:setDisplay', 0.5) end else Citizen.Wait(1000) end end end) -- Loading screen off event AddEventHandler('esx:loadingScreenOff', function() if not isPaused then TriggerEvent('esx_status:setDisplay', 0.3) end end) -- Update server Citizen.CreateThread(function() while true do Citizen.Wait(Config.UpdateInterval) TriggerServerEvent('esx_status:update', GetStatusData(true)) end end)