6 · Bridges & Compatibility
Keep custom integrations isolated from the core by using the bridge layer.
- Bridge Architecture
- Framework Bridge
- Inventory Bridge
- Notifications & Text UI
- Custom Ownership Bridge
Bridge Architecture
Bridge selection lives in:
config/bridges.lua
Config.Bridges = {
Framework = 'auto', -- auto | qb | qbx | esx | standalone | custom
Inventory = 'auto', -- auto | nord | ox | qb | esx | custom
Notify = 'auto', -- auto | ox | qb | esx | gta | custom
TextUI = 'auto', -- auto | ox | gta | custom
}
For a custom resource:
- Set the relevant bridge to
custom. - Edit only the matching bridge file.
- Return the values expected by the bridge contract.
- Leave the core resource logic unchanged.
This keeps updates easier because custom integrations stay isolated.
Framework Bridge
Framework bridge files:
client/bridge/framework.lua
server/bridge/framework.lua
Auto-detection order:
qbx_coreqb-corees_extended- standalone fallback
The server bridge provides:
- Framework detection.
- Player lookup.
- Stable identifier lookup.
- Job lookup.
- Grade normalization.
- Duty state handling.
Custom integration hooks:
NVKServerBridge.CustomGetPlayer(source)
NVKServerBridge.CustomGetIdentifier(source)
NVKServerBridge.CustomGetJob(source)
NVKClientBridge.CustomGetJob()
Return your framework's normal player/job objects in those hooks.
Inventory Bridge
Inventory bridge files:
client/bridge/inventory.lua
server/bridge/inventory.lua
Generic item checks support:
- Nord Inventory
- ox_inventory
- QB/QBX inventory through the framework player object
- ESX inventory
- Custom implementation
Native physical vehicle keys
The full physical vehicle_key metadata flow is native to nord_inventory.
Custom inventory hooks are provided for complete physical-key support:
NVKInventory.CustomHasItem(source, item, count)
NVKInventory.CustomRemoveItem(source, item, count)
NVKInventory.CustomHasVehicleKeyItem(source, plate)
NVKInventory.CustomResolveVehicleKeyMetadata(source, slot)
NVKInventory.CustomGiveVehicleKeyItem(source, plate, keyType, expiresAt, sessionBound)
NVKInventory.CustomRemoveVehicleKeyItem(source, plate)
NVKInventory.CustomCleanupInvalidVehicleKeyItems(source)
Client custom count hook:
NVKClientInventory.CustomGetItemCount(item, metadata)
If you use a custom inventory with strict physical keys, implement the physical-key hooks rather than modifying the core.
Notifications & Text UI
Notification and Text UI are independent bridges.
Files:
client/bridge/notify.lua
server/bridge/notify.lua
client/bridge/textui.lua
server/bridge/textui.lua
Supported notification modes:
auto | ox | qb | esx | gta | custom
Supported Text UI modes:
auto | ox | gta | custom
Custom notification hook:
function NVKNotify.Custom(message, kind, duration, title)
-- show your notification
return true
end
Custom Text UI hooks:
function NVKTextUI.CustomShow(id, text, options)
-- show your UI
return true
end
function NVKTextUI.CustomHide(id)
-- hide your UI
return true
end
The recovery interaction uses this bridge instead of hardcoded GTA help text.
Custom Ownership Bridge
Ownership is isolated in:
server/bridge/ownership.lua
For custom ownership logic:
Config.Ownership.Custom = true
Implement:
function NVKOwnership.CustomGetOwnerIdentifier(plate)
-- Return the framework identifier that owns this plate.
end
For the recovery UI, you can also implement:
function NVKOwnership.CustomGetOwnedVehicles(source, identifier)
return {
{ plate = 'ABC123', model = 'sultan' },
{ plate = 'XYZ987', model = 'adder' },
}
end
Trusted standalone/garage resources can set a runtime owner through the SetVehicleOwner server export.