Skip to content

Retro Radial

A: It is an orbit-style radial menu for FiveM with multi-page navigation, runtime API for adding items from other resources, server-side validation, per-player customization (theme / scale / position / sounds), a Vehicle Control bar, predicates, cooldowns, async actions, Discord logging, and an opt-in ox_lib compatibility bridge.

A: No. It has no hard dependencies. ox_lib is optional. If you enable Config.OxLibBridge.enabled = true, third-party scripts that call ox_libโ€™s radial API are forwarded into rs_radial without code changes.

A: Only when Config.OxLibBridge.enabled = true. The bridge patches the global lib table with addRadialItem, removeRadialItem, registerRadial, hideRadial, and getCurrentRadialId. If real ox_lib is installed, only those radial functions are patched ox_libโ€™s notifications and other features keep working normally.

A: No. pma-voice is unrelated to this resource.

A: QBCore, Qbox / qbx_core, ESX, or standalone. Config.Framework = 'auto' (default) detects the running framework. In standalone mode, push job/gang data via SetPlayerJob / SetPlayerGang from your own resource.

A: ox_inventory, qb-inventory, qbx_core inventory, ESX. A custom mode is supported via Config.Inventory.customHasItem. Items that donโ€™t use reqItems work regardless of which inventory you have.

A: For permanent items: edit Config.Pages in config.lua. For dynamic / per-player / per-session items: call exports['rs_radial']:AddMenuItem(pageId, item) from your own resource. The runtime-API items are auto-cleaned when the owning resource stops.

A: For permanent pages: add a new entry under Config.Pages in config.lua. For runtime pages: call exports['rs_radial']:AddSubMenu(pageId, { label='...', items={...} }). Navigate to it from any item with type='page', targetPage='your_page_id'.

A: It shouldnโ€™t be the page label is always rendered under the hub on every page. If youโ€™re seeing it missing, force a CEF cache refresh: restart rs_radial in the server console, or press Ctrl+F5 in the F8 NUI dev tools.

Why does the page label look like itโ€™s inside the hub on a 1080p client?

Section titled โ€œWhy does the page label look like itโ€™s inside the hub on a 1080p client?โ€

A: This was a positioning bug in older builds where the labelโ€™s calc() offset placed it inside the hubโ€™s glow halo on certain resolutions. The fix in v1.0.1 anchors the label directly to the hub via top: 100% so it is always rendered below the hub, regardless of viewport / DPI / scale. Make sure the customer has the latest build and has cache-busted.

A: Set Config.Icons.fontAwesome.enabled = true. This injects Font Awesome from a CDN at NUI boot. Then use iconType='class' and icon='fa-solid fa-shield-halved' on your items. Without enabling the flag, fa-* classes will not render and the F8 console will log a warning.

A: No. The folder must be named exactly rs_radial. If renamed, both server and client print ^1[rs_radial] FATAL: resource folder has been renamed^0 and the script refuses to run. This is intentional it prevents resource-name drift breaking exports and Tebex escrow checks.

A: The release build of app.js is intentionally obfuscated (string-array + control-flow flattening + identifier mangling), which roughly doubles the byte size. Cross-file globals (window.RS_ICON, window.RS_ICONS, window.__rsIconOnError, etc.) are preserved by name so the inline onerror handlers and icon registry keep working.

A: They are intentionally plain-text so buyers can register their own built-in icons (custom SVG paths, theme variants). app.js is the only file where business logic lives, and thatโ€™s the one thatโ€™s obfuscated.

Whatโ€™s the difference between config.lua and custom_functions.lua?

Section titled โ€œWhatโ€™s the difference between config.lua and custom_functions.lua?โ€

A: config.lua is for declarative settings (pages, items, theme, feature toggles). custom_functions.lua is for code server-specific functions that items can reference with type='customFunction'. Both are customer-editable and escrow-ignored. custom_functions.lua is loaded BEFORE client.lua so itโ€™s available when items are registered.

How do I prevent cheaters from triggering server events directly?

Section titled โ€œHow do I prevent cheaters from triggering server events directly?โ€

A: Set Config.Security.serverSideValidation = true. Every type='server' item is routed through rs_radial:server:dispatch, which re-runs all visibility checks server-side before firing the configured event. For extra safety, also use Config.Security.triggerProtection = true so the server refuses events for items that fail validation.

A: Set Config.Logging.enabled = true and provide Config.Logging.webhookUrl. Per-event filters (itemUsed, blocked, securityViolation) let you control what gets logged. Per-item override is available via logging = { webhookUrl = '...' } on individual items.

A: Yes. Config.Controls.openMode = 'hold' or 'toggle', and the actual key binding is configured via FiveMโ€™s keymapper system (players can rebind from the pause menu).

A: Yes. Listen to AddEventHandler('rs_radial:event:<name>', fn). Client hooks: menuOpened, menuClosed, pageChanged, itemClicked, itemConfirmed, itemCancelled, itemFailed, settingsSaved, vehicleControlUsed, blipToggled. Server hooks: server:dispatched, server:blocked. See docs/development.md for details.