Two files wire the HUD into the rest of your server:
config.lua → Config.Framework picks a status adapter from adapters/ (hunger, thirst, stress, and the load/logout HUD toggle).
integration.lua → the Bridge functions feed everything else: seatbelt state, fuel, NOS, the job / money pills, and the postal code.
Both are plain Lua you’re meant to edit.
Framework adapters
Set Config.Framework to pick where hunger / thirst / stress come from:
| Value | Source |
|---|
"qb" | Listens to the hud:client:UpdateNeeds and hud:client:UpdateStress events. Shows and hides the HUD on QBCore:Client:OnPlayerLoaded / OnPlayerUnload. |
"esx" | Listens to esx_status:onTick. Shows and hides the HUD on esx:playerLoaded / esx:onPlayerLogout. |
"ox" | Listens to ox:statusTick. Shows and hides the HUD on ox:playerLoaded / ox:playerLogout. |
"custom" | A stub in adapters/custom.lua — replace getPlayerHunger, getPlayerThirst, getPlayerStress, and the connect / disconnect event handlers with your own. |
"none" | No adapter. Hunger, thirst, and stress are not shown; health, armor, oxygen, and stamina still work. |
Bridge functions
integration.lua defines the Bridge functions below. Anything auto-detected checks GetResourceState(...), so no config flag is needed — just start the resource.
Bridge.getInfo — job, cash, bank, dirty money
Feeds the top-right info column. QBCore and ESX are auto-detected, independent of Config.Framework:
- QBCore: job label with grade name,
money.cash, money.bank.
- ESX: job label with
grade_label, plus the money, bank, and black_money accounts. Dirty money is only shown while it’s above 0.
For any other framework, return your own snapshot:
function Bridge.getInfo()
return {
job = 'Mechanic (Manager)', -- label shown in the job pill
cash = 250, -- number
bank = 12000, -- number
dirtyMoney = nil, -- number, or nil to hide the pill
}
end
Bridge.getInfo runs on every player tick (client-side, every 300 ms) — keep it cheap. Framework detection is cached, and errors in your code won’t crash the HUD; it falls back to Civilian with zeroed money.
Bridge.getVehicleFuel — fuel level
Auto-detects, in order: ps-fuel, cdn-fuel, LegacyFuel, then ox_fuel (statebag). With none of those running it falls back to the native GetVehicleFuelLevel. Return a 0–100 number for anything else:
function Bridge.getVehicleFuel(currentVehicle)
return exports.my_fuel:GetFuel(currentVehicle)
end
Bridge.getNosLevel — NOS
Returns 0 by default, which keeps the NOS bar empty. Wire your nitrous script here:
function Bridge.getNosLevel(currentVehicle)
return Entity(currentVehicle).state.nitro or 0 -- 0-100
end
Bridge.isSeatbeltOn — external seatbelt
Only used when Config.UseSeatbeltLogic = false. Auto-detects jim-mechanic; otherwise it reads LocalPlayer.state.isSeatbeltOn. Adjust to match wherever your seatbelt script stores its state.
Bridge.getPostal — postal code
Auto-detects nearest-postal. Return a string to show it in the street card’s area line, or nil to hide it:
function Bridge.getPostal()
return exports.my_postal:getCurrent()
end
Voice level
The voice pill reads the standard LocalPlayer.state.proximity statebag (modes Whisper, Normal, Shouting) as set by pma-voice-style resources. No wiring needed.