A lightweight, framework-agnostic bridge library for FiveM. Write your resource once — it works on ESX, QBCore, QBox, or standalone, with zero extra code from you.
Bridge auto-detects what's running on the server (framework + inventory system) and exposes one unified API. No more if Config.Framework == 'esx' then ... else ... end copy-pasted across every resource you write.
- Auto-detects ESX, QBCore, QBox, or standalone
- Auto-detects ox_inventory, qb-inventory, or ESX's built-in inventory
- Unified notifications (uses
ox_libif present, falls back to framework-native, falls back to GTA native) - Single, consistent API — no framework-specific branching in your resource
- Can be force-configured (skip auto-detection) via
shared/config.lua
- Download / clone into your resources folder as
d-bridge - Add
ensure d-bridgeto yourserver.cfg— above any resource that depends on it - Add
d-bridgeas adependencyin thefxmanifest.luaof resources that use it
dependency 'd-bridge'local playerData = exports['d-bridge']:GetPlayerData(source)
-- { source, identifier, name, job = { name, label, grade, onduty }, money = { cash, bank } }
exports['d-bridge']:AddMoney(source, 'bank', 500)
exports['d-bridge']:RemoveMoney(source, 'cash', 100)
local job = exports['d-bridge']:GetJob(source)
exports['d-bridge']:SetJob(source, 'police', 2)
if exports['d-bridge']:HasItem(source, 'water', 1) then
exports['d-bridge']:RemoveItem(source, 'water', 1)
end
exports['d-bridge']:AddItem(source, 'bread', 1)
exports['d-bridge']:Notify(source, 'Task complete!', 'success')local playerData = exports['d-bridge']:GetPlayerData()
exports['d-bridge']:Notify('Hello there', 'info')| Function | Side | Description |
|---|---|---|
GetPlayerData(src) |
server/client | Normalized player table (works standalone too — session-only) |
GetIdentifier(src) |
server | Player's unique identifier |
GetMoney(src, account) |
server | Get cash/bank balance |
AddMoney(src, account, amount) |
server | Add money |
RemoveMoney(src, account, amount) |
server | Remove money |
GetJob(src) |
server | Get normalized job table |
SetJob(src, job, grade) |
server | Set player job |
IsOnDuty(src) |
server | Duty status (tracked in-memory for ESX) |
SetDuty(src, bool) |
server | Toggle duty |
IsDead(src) |
server | Death status (QBCore only — see caveat below) |
Revive(src) |
server | Fires the EMS resource's revive event |
HasItem(src, item, count) |
server | Check inventory |
AddItem(src, item, count, metadata) |
server | Give item |
RemoveItem(src, item, count) |
server | Remove item |
GetOwnedVehicles(src, cb) |
server | Async, requires oxmysql |
IsVehicleOwned(plate, cb) |
server | Async, requires oxmysql |
AddSocietyMoney(society, amount) |
server | Best-effort across society/management resources |
CreateCallback(name, cb) |
server | Register a callback handler |
TriggerCallback(name, cb, ...) |
client | Call a server callback |
Notify(src/message, message, type) |
server/client | Unified notification |
GetFramework() |
server/client | Returns detected framework string |
GetInventory() |
server | Returns detected inventory string |
-- server
exports['d-bridge']:CreateCallback('myresource:getBalance', function(src, cb, account)
cb(exports['d-bridge']:GetMoney(src, account))
end)
-- client
exports['d-bridge']:TriggerCallback('myresource:getBalance', function(balance)
print('Bank balance:', balance)
end, 'bank')AddSocietyMoneyandReviverely on common default resource/event names (esx_addonaccount,qb-management,esx_ambulancejob,hospital:client:Revive). If your server uses different EMS/management resources, overrideConfig.SocietySystem/Config.ReviveEventinshared/config.lua.GetOwnedVehicles/IsVehicleOwnedrequireoxmysqland assume defaultowned_vehicles/player_vehiclestable schemas. AdjustConfig.VehicleTableif yours differ.IsDeadcurrently only reads QBCore's metadata flag — ESX has no native death state, so track it in your own ambulance-job resource and extend this function if you need it there.