Cómo funcionan las integraciones#
Nada dentro de la rueda sabe qué framework usas. Pregunta a un pequeño objeto, RadialBridge, quién es el jugador (su trabajo, banda, dinero, ítems) y responde un archivo por framework en custom/. Todos esos archivos son abiertos, así que dar soporte a un fork o a un core renombrado es una edición, no un ticket.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| Funciona de forma independiente. No hay trabajos ni bandas, así que los nodos restringidos permanecen ocultos. |
Trabajos y bandas | Los datos del jugador del framework, con el grado como número. Bandas en QBCore y Qbox, y en ESX o vRP cuando el servidor las ofrece. | Nodos restringidos por trabajo o banda ocultos. |
Servicio | QBCore y Qbox | Todos cuentan como de servicio. |
Dinero | Cuentas de ESX y dinero de QBCore: | Lee 0, así que las condiciones de dinero nunca se cumplen. |
Ítems |
| Las condiciones de ítems nunca se cumplen. |
Notificaciones |
| Se muestran en la consola F8. |
Administradores | Grupos de ESX, permisos de QBCore y Qbox, grupos de vRP. | ACE y |
Base de datos |
| Obligatoria. La única. |
Cada capa opcional se degrada sin hacer ruido. Si falta un framework o un inventario, los botones que dependen de él permanecen ocultos: nada da error y todo lo demás sigue funcionando.
Detección y cómo forzarla#
config/main.lua busca recursos iniciados cuando arranca Radial Menu, y elige el puente del primero que encuentra:
-- Auto, the default
Config.Framework = DependencyCheck({
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['vrp'] = 'vrp',
}) or 'standalone'
-- Pinned: replace the whole expression
Config.Framework = 'qb'Fíjalo cuando haya dos frameworks a la vez (la lista no tiene orden de prioridad), cuando tu core funcione con otro nombre de recurso, o para probar el menú sin framework. La elección se muestra en ambas consolas al iniciar: Server framework loaded: qb.
El puente#
Estas son las preguntas que hace el menú. Úsalas tú también en funciones canInteract y condiciones, en lugar de llamar al framework, y seguirán funcionando si el servidor cambia alguna vez de framework:
Función | Devuelve |
|---|---|
|
|
|
|
| Si el jugador está de servicio. |
| El saldo de |
| Si el jugador lleva al menos |
| Cuántos lleva. |
| El estado del jugador, leído del juego. |
| El identificador de ESX o el citizen ID de QBCore, y el nombre del personaje. |
| Muestra una notificación a través del framework. |
El puente también le dice al menú cuándo reconstruirse. La rueda se reconstruye tras los eventos propios del framework de jugador cargado, trabajo y banda (esx:setJob, QBCore:Client:OnJobUpdate, QBCore:Client:OnGangUpdate y similares), así que un ascenso o una nueva banda se ven sin que el jugador haga nada. vRP no tiene un evento de trabajo fiable, así que su puente también comprueba el trabajo una vez por segundo.
Escribir tus propias acciones y condiciones#
custom/registry.lua se carga después de la biblioteca integrada y es tuyo para editarlo. Lo que registres ahí aparece en los desplegables de /radialedit, listo para asignarlo a cualquier botón:
local reg = RadialEditorRegistry
-- An action that runs code
reg.RegisterAction({
id = 'myserver.repair',
label = 'Repair current vehicle',
fn = function()
local veh = GetVehiclePedIsIn(PlayerPedId(), false)
if veh ~= 0 then SetVehicleFixed(veh) end
end,
})
-- An action that is just an event or a command
reg.RegisterAction({
id = 'myserver.billing',
label = 'Open billing',
type = 'client', -- client | server | command | qbcommand
event = 'billing:client:open',
})
-- A condition: return true to show the node
reg.RegisterPredicate({
id = 'myserver.hasRadio',
label = 'Carrying a radio',
fn = function()
return RadialBridge.HasItem('radio')
end,
})Una acción necesita o bien fn, o un type y un event. Una condición es siempre una función. Registrar un ID que ya existe lo sustituye. Reinicia el recurso para cargar los cambios del archivo. Las condiciones se ejecutan cada vez que se abre la rueda, así que mantenlas tan ligeras como canInteract.
Las acciones que solo son un evento o un comando no necesitan Lua: créalas en /radialedit → Actions y se guardan en la base de datos.
Dejar que otros scripts añadan botones#
Otro recurso añade su propia sección con dos exports, sin tocar config/menu.lua:
-- client side of your resource
exports['qs-radialmenu']:CreateCategory('mystore', { label = 'My Store', icon = 'Store' })
exports['qs-radialmenu']:CreateItem('mystore', {
label = 'Open shop', icon = 'ShoppingCart',
event = 'mystore:client:open', eventType = 'client',
})Las funciones no pueden pasar de un recurso a otro, así que desde otro recurso un botón ejecuta un evento o un comando, y quién lo ve lo deciden job y gang. Las funciones action, canInteract y fn solo funcionan en los archivos propios de Radial Menu. Cuando el recurso se detiene o reinicia, todo lo que añadió desaparece de la rueda, y su código de inicio lo vuelve a añadir; no hace falta limpiar nada. Todas las opciones están en Comandos y exports.
Scripts escritos para otros menús radiales#
AddOption acepta la tabla de opciones habitual (id, title, icon, type, event, shouldClose) que usan las integraciones de qb-radialmenu, la coloca en el nivel superior de la rueda y devuelve su ID para RemoveOption. Apunta la llamada a exports['qs-radialmenu'] y funciona igual. Algunos nombres de iconos comunes de Font Awesome se traducen; para el resto, usa un nombre de Lucide.
Recursos de Quasar en el menú por defecto#
El menú incluido funciona con estos recursos de serie:
Recurso | Sección |
|---|---|
| Apartments, visible dentro de un apartamento. |
| Garages, para los trabajos mechanic y realestate. |
| Laboratory, visible dentro de un laboratorio. |
| Motorhome, visible dentro o cerca de una furgoneta. |
Otros botones ejecutan comandos como /configure_hud, /simcards, /casino o /openracingui, que pertenecen a los recursos que los proporcionan.
Añadir un framework#
Dar soporte a un core que no está en la lista es deliberadamente sencillo: dos archivos y una línea.
Copia el puente standalone
Copia
custom/standalone/encustom/<name>/y cambia la condición de la primera línea de ambos archivos por tu nombre:lua if Config.Framework ~= 'mycore' then return endResponde lo que sabe tu core
En
client.lua, sobrescribe las funciones deRadialBridgeque tu core pueda responder (GetJobyOnJobChangeprimero, como hacecustom/qb/client.lua). Enserver.lua, haz queRadialBridgeServer.IsAdmin(source)devuelva true para tu staff. Todo lo que no incluyas mantiene la respuesta standalone.Cárgalo y selecciónalo
Añade ambos archivos a
fxmanifest.luajunto a los demás puentes (el archivo de cliente enclient_scripts, el de servidor enserver_scripts) y ponConfig.Framework = 'mycore', o añade tu core a la listaDependencyCheck.
Idiomas#
Se incluyen 41 traducciones en locales/: ar bg bn ca cs da de el en es et fa fi fr he hi hr hu id it ja ko lt lv ms nl no pl pt ro ru sk sl sv sw th tr uk ur vi zh. Config.Locale elige uno, y cualquier texto que le falte usa el inglés.
Cada archivo contiene los textos de la interfaz y un bloque menu con las etiquetas del menú por defecto. Para añadir un idioma, copia en.json con un código nuevo, traduce los valores (nunca las claves) y asigna Config.Locale a ese código. Los textos Back, Home y "Press ESC to close" también se pueden fijar directamente con Config.ButtonTexts = { back = '…', home = '…', closeInstruction = '…' }.



