QBX Installation
Install oxide-police on QBX (Qbox) — jobs, ox_inventory, radar weapon, radial menu cleanup, and evidence compatibility.
This guide covers the QBX-specific setup required to install Oxide Police on a QBX server.
Requirements
qbx_coreox_liboxmysqlox_inventoryox_targeto-linkscreenshot-basicoxide-dispatch(required for the MDT Dispatch tab; setConfig.MDT.dispatchEnabled = falseif running ps-dispatch / cd_dispatch / qs-dispatch / wasabi_mdt / etc.)
Optional but recommended:
oxide-bankingpma-voice
Run the Oxide Police SQL from oxide-police/sql before starting the resource.
Resource conflicts
Disable the legacy police/prison resources so they do not register duplicate events, radial options, jails, duty state, or evidence handlers.
Move these resources out of auto-started folders:
resources/[qbx]/qbx_policeresources/[standalone]/xt-prison
A common pattern is to move them to a disabled folder:
resources/[disabled]/qbx_policeresources/[disabled]/xt-prison
Oxide Police provides qb-policejob in fxmanifest.lua, so resources that check for the legacy police resource name can still resolve the dependency.
Startup order
Start dependencies before Oxide Police:
ensure ox_lib
ensure oxmysql
ensure ox_inventory
ensure screenshot-basic
ensure o-link
ensure oxide-dispatch # optional — powers the MDT Dispatch tab
ensure oxide-policeThe oxide-dispatch line is optional — leave it out if you do not run dispatch. If you use folder ensures, make sure o-link starts before oxide-police.
QBX jobs
QBX still needs LEO job definitions in qbx_core/shared/jobs.lua.
Oxide Police owns the police-facing duty, department, roster, MDT, and management workflows. The QBX job entries are still required because qbx_core, o-link, ox_inventory, society account integrations, banking integrations, and other third-party resources still use framework job names to identify player employment and permissions.
Do not rely on QBX police duty or QBX police boss-management behavior when Oxide Police is installed. Register the jobs for framework identity, compatibility, inventory access, and account lookup.
QBX requires all top-level keys in qbx_core/shared/jobs.lua to be lowercase. qbx_core/server/groups.lua prints jobs.lua contains a job name with capital letters: <name> at boot for any capitalized key and still loads the job, but AddPlayerToJob lowercases the name before writing to player_groups. The result is a stored record that never matches a capitalized entry in any Config.PoliceDepartments array. Use ['police'], ['lspd'], ['bcso'] — never ['Police'] or ['LSPD'].
Recommended LEO jobs:
policelspdbcsosaspsheriffstatetrooper
Set LEO defaultDuty = false. Oxide Police should own police duty state.
Example job entry:
['police'] = {
label = 'LSPD',
type = 'leo',
defaultDuty = false,
offDutyPay = false,
grades = {
[0] = { name = 'Recruit', payment = 50 },
[1] = { name = 'Officer', payment = 75 },
[2] = { name = 'Sergeant', payment = 100 },
[3] = { name = 'Lieutenant', payment = 125 },
[4] = {
name = 'Chief',
isboss = true,
bankAuth = true,
payment = 150,
},
},
},Repeat the same structure for each department job name used by the server. Keep type = 'leo' so QBX police counts and LEO checks continue to work.
ox_inventory police access
Update ox.cfg:
setr inventory:police ["police", "lspd", "bcso", "sasp", "sheriff", "statetrooper"]Register Oxide Police items in resources/[ox]/ox_inventory/data/items.lua, then copy item images from:
resources/[oxide]/oxide-police/itemsto:
resources/[ox]/ox_inventory/web/imagesRequired items:
body_campolice_radiomegaphoneevidence_camerabreathalyzercctv_cameraprison_food_trayziptiescissorswheel_clampmouthtapetracking_bandheadbaglockpickevidence_bloodevidence_bulletevidence_fingerprint
Example item definitions:
['body_cam'] = { label = 'Body Camera', weight = 250, stack = false, close = true },
['police_radio'] = { label = 'Police Radio', weight = 500, stack = false, close = true },
['megaphone'] = { label = 'Megaphone', weight = 1000, stack = false, close = true },
['evidence_camera'] = { label = 'Evidence Camera', weight = 750, stack = false, close = true },
['breathalyzer'] = { label = 'Breathalyzer', weight = 350, stack = false, close = true },
['cctv_camera'] = { label = 'CCTV Camera', weight = 1500, stack = false, close = true },
['prison_food_tray'] = { label = 'Prison Food Tray', weight = 500, stack = true, close = true },
['ziptie'] = { label = 'Zip Tie', weight = 25, stack = true, close = true },
['scissors'] = { label = 'Scissors', weight = 100, stack = false, close = true },
['wheel_clamp'] = { label = 'Wheel Clamp', weight = 2500, stack = false, close = true },
['mouthtape'] = { label = 'Mouth Tape', weight = 50, stack = true, close = true },
['tracking_band'] = { label = 'Tracking Band', weight = 100, stack = false, close = true },
['headbag'] = { label = 'Headbag', weight = 150, stack = true, close = true },
['lockpick'] = { label = 'Lockpick', weight = 100, stack = true, close = true },
['evidence_blood'] = { label = 'Blood Evidence', weight = 50, stack = false, close = false },
['evidence_bullet'] = { label = 'Bullet Evidence', weight = 25, stack = false, close = false },
['evidence_fingerprint'] = { label = 'Fingerprint Evidence', weight = 25, stack = false, close = false },Handheld radar weapon
Oxide Police includes a handheld speed radar addon weapon named WEAPON_RADAR.
The resource manifest must request the weapon metadata:
data_file 'WEAPONINFO_FILE' 'stream/meta/weapons.meta'
data_file 'WEAPON_METADATA_FILE' 'stream/meta/weaponarchetypes.meta'
data_file 'WEAPON_ANIMATIONS_FILE' 'stream/meta/weaponanimations.meta'
data_file 'PED_PERSONALITY_FILE' 'stream/meta/pedpersonality.meta'The following streamed files must remain in oxide-police/stream:
w_pi_radar.ydrw_pi_radar.ytd
The following metadata files must remain in oxide-police/stream/meta:
weapons.metaweaponarchetypes.metaweaponanimations.metapedpersonality.meta
Register the radar weapon in resources/[ox]/ox_inventory/data/weapons.lua:
['WEAPON_RADAR'] = {
label = 'Radar Gun',
weight = 750,
durability = 0.1,
},No ammo item is required. The radar uses this setting in oxide-police/shared/config.lua:
Config.Radar.HandheldWeapon = `WEAPON_RADAR`Officers must be on duty to use the handheld radar. Vehicle-mounted radar only works on fleet vehicles flagged with has_radar through Oxide Police fleet configuration.
Radial menu
Oxide Police registers its own actions through the radial menu module in o-link, so no radial setup is needed for it.
Current versions of qbx_radialmenu ship no police entries in config/client.lua — there is nothing to remove there. If you run an older or customized radial menu (or qb-radialmenu), check its config for citizen interaction entries that call removed qbx_police / qb-policejob events (police:client:CuffPlayer, police:client:EscortPlayer, police:client:RobPlayer, and similar) and a jobItems.police block, and remove them — with the legacy police resource disabled those buttons would silently do nothing.
Note: qbx_radialmenu also has a couple of police event calls hardcoded in its code (the trunk "get out" flow and the emergency button). These are not configurable; with qbx_police disabled they simply do nothing and are harmless.
Evidence compatibility
QBX robberies such as jewelry and house robbery may emit:
TriggerServerEvent('evidence:server:CreateFingerDrop', coords)Oxide Police listens for this compatibility event and routes it into the native world fingerprint evidence system. The resulting drop uses the configured fingerprint evidence type and creates evidence_fingerprint evidence with metadata from the player through o-link.
QBX robbery resources can keep their existing client-side fingerprint trigger as long as Oxide Police is running. The compatibility listener is server-side and does not require qbx_police.
Banking
If Oxide Banking is installed and detected, Oxide Police uses the Oxide Banking integration path. No separate QBX banking-specific police setup is required for that path.
Testing checklist
- SQL has been run.
qbx_policeandxt-prisonare disabled.- Oxide Police items are registered in
ox_inventory. - Oxide Police item images exist in
ox_inventory/web/images. - LEO jobs exist in
qbx_core/shared/jobs.lua. - LEO jobs are included in
inventory:police. - Old QBX police radial options are removed.
- Duty, cuffs, escort, jail/prison, evidence camera, world fingerprint drops, body camera, MDT, and dispatch alerts are tested with at least one on-duty officer.