Retro Radial
Installation
Section titled โInstallationโ1) Add The Resource
Section titled โ1) Add The ResourceโPlace rs_radial in your resources and ensure it in server.cfg:
ensure rs_radialThe 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.
2) Dependencies
Section titled โ2) Dependenciesโ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.
3) Framework Detection
Section titled โ3) Framework Detectionโ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.
4) Inventory Detection
Section titled โ4) Inventory Detectionโ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)end5) Job and Gang Setup (Optional)
Section titled โ5) Job and Gang Setup (Optional)โ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.
6) Icons
Section titled โ6) Iconsโ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 fromicons.js/custom_icons.js.'class'CSS class string (Font Awesome).'url'external URL (useConfig.Icons.allowExternalUrls = trueto enable).
To use Font Awesome icons, enable the CDN auto-injection:
Config.Icons.fontAwesome.enabled = trueThis loads Font Awesome from a CDN at NUI boot. Without it, fa-* classes will not render and the F8 console will log a warning.
7) Per-Page Items
Section titled โ7) Per-Page Itemsโ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).
8) Optional ox_lib Bridge
Section titled โ8) Optional ox_lib Bridgeโ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.
9) Optional Discord Logging
Section titled โ9) Optional Discord Loggingโ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://...' } }10) Production Notes
Section titled โ10) Production NotesโBefore production use, verify:
Config.Frameworkmatches your stack (or stays'auto').Config.Inventory.providermatches your inventory (or stays'auto').Config.Security.serverSideValidation = truefor any item with side effects.Config.Debug = falseso the F8 console isnโt spammed.Config.Icons.fontAwesome.enabled = trueif any items useiconType='class'withfa-*.Config.OxLibBridge.enabledis set deliberately (opt-in).- The folder is named exactly
rs_radial. escrow_ignoreinfxmanifest.luaalready lists the customer-editable files (config.lua,custom_functions.lua,bridge/ox_lib.lua).