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_core
  • ox_lib
  • oxmysql
  • ox_inventory
  • ox_target
  • o-link
  • screenshot-basic
  • oxide-dispatch (required for the MDT Dispatch tab; set Config.MDT.dispatchEnabled = false if running ps-dispatch / cd_dispatch / qs-dispatch / wasabi_mdt / etc.)

Optional but recommended:

  • oxide-banking
  • pma-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_police
  • resources/[standalone]/xt-prison

A common pattern is to move them to a disabled folder:

  • resources/[disabled]/qbx_police
  • resources/[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-police

The 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:

  • police
  • lspd
  • bcso
  • sasp
  • sheriff
  • statetrooper

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/items

to:

resources/[ox]/ox_inventory/web/images

Required items:

  • body_cam
  • police_radio
  • megaphone
  • evidence_camera
  • breathalyzer
  • cctv_camera
  • prison_food_tray
  • ziptie
  • scissors
  • wheel_clamp
  • mouthtape
  • tracking_band
  • headbag
  • lockpick
  • evidence_blood
  • evidence_bullet
  • evidence_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.ydr
  • w_pi_radar.ytd

The following metadata files must remain in oxide-police/stream/meta:

  • weapons.meta
  • weaponarchetypes.meta
  • weaponanimations.meta
  • pedpersonality.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_police and xt-prison are 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.

Next Steps