Skip to content

Retro Radial

Place rs_radial in your resources and ensure it in server.cfg:

ensure rs_radial

The folder MUST be named exactly rs_radial. The scriptโ€™s resource-name guard refuses any other name and prints ^1[rs_radial] FATAL: resource folder has been renamed^0 on both server and client console if the folder is renamed.

rs_radial has no hard dependencies.

It auto-detects:

  • Framework QBCore, Qbox / qbx_core, ESX, or standalone.
  • Inventory ox_inventory, qb-inventory, qbx_core inventory, ESX, or none.

pma-voice, ox_lib, and mysql-async are not required.

Config.Framework = 'auto' (default) detects the running framework automatically.

To force a specific framework:

Config.Framework = 'qbox' -- 'auto' | 'qb' | 'qbox' | 'esx' | 'standalone'

For standalone use, set Config.Framework = 'standalone' and call:

exports['rs_radial']:SetPlayerJob({ name = 'police', grade = 0, onDuty = true })
exports['rs_radial']:SetPlayerGang({ name = 'ballas', grade = 1 })

from your own resource whenever the playerโ€™s job / gang changes.

Config.Inventory.provider = 'auto' (default) detects ox_inventory / qb-inventory / qbx_core / ESX automatically.

To force a specific provider:

Config.Inventory.provider = 'ox' -- 'auto' | 'ox' | 'qb' | 'qbox' | 'esx' | 'custom' | 'none'

For custom, provide a callback:

Config.Inventory.customHasItem = function(name, count)
return exports['my_inventory']:HasItem(name, count)
end

Default job-gated pages: police, mechanic, ems (job name ambulance).

These pages appear on main only for players whose job matches. To use them, the job names must exist in your frameworkโ€™s job table. The pages can be removed or renamed in Config.Pages.

Boss-grade actions (e.g. fire employee, set salary) can be gated with jobs = { police = 3 } on individual items.

The default icons ship under html/assets/icons/. Icon types:

  • 'image' file path ('cuff.png', 'subfolder/x.webp'). Renders via CSS mask + theme color.
  • 'svg' / 'file' inline SVG via fetch.
  • 'builtin' named icon from icons.js / custom_icons.js.
  • 'class' CSS class string (Font Awesome).
  • 'url' external URL (use Config.Icons.allowExternalUrls = true to enable).

To use Font Awesome icons, enable the CDN auto-injection:

Config.Icons.fontAwesome.enabled = true

This loads Font Awesome from a CDN at NUI boot. Without it, fa-* classes will not render and the F8 console will log a warning.

Edit Config.Pages in config.lua to add, remove, or reorder items.

Each page has:

main = {
label = 'MAIN MENU',
items = {
{ id='cuff', label='CUFF', iconType='image', icon='cuff.png',
type='client', event='police:client:CuffPlayer' },
...
}
}

See Config.Pages in config.lua for the full item schema (jobs, gangs, cooldowns, predicates, confirm/input/select modals, async, badges, per-player visibility).

If you want third-party scripts that target ox_libโ€™s radial API to forward into rs_radial without code changes:

Config.OxLibBridge = {
enabled = true,
defaultPage = 'main',
autoMapIcons = true
}

If real ox_lib is installed alongside rs_radial, only the radial functions are patched. ox_libโ€™s notifications, callbacks, and other features keep working.

The bridge file is bridge/ox_lib.lua and is escrow-ignored so it can be customized.

For per-item or security-event Discord logging:

Config.Logging = {
enabled = true,
webhookUrl = 'https://discord.com/api/webhooks/...',
events = { itemUsed = true, blocked = true, securityViolation = true }
}

Per-item override:

{ id='jail', ..., logging = { webhookUrl = 'https://...' } }

Before production use, verify:

  • Config.Framework matches your stack (or stays 'auto').
  • Config.Inventory.provider matches your inventory (or stays 'auto').
  • Config.Security.serverSideValidation = true for any item with side effects.
  • Config.Debug = false so the F8 console isnโ€™t spammed.
  • Config.Icons.fontAwesome.enabled = true if any items use iconType='class' with fa-*.
  • Config.OxLibBridge.enabled is set deliberately (opt-in).
  • The folder is named exactly rs_radial.
  • escrow_ignore in fxmanifest.lua already lists the customer-editable files (config.lua, custom_functions.lua, bridge/ox_lib.lua).