Comandos#
Radial Menu registra sus comandos en el cliente, así que cualquier jugador puede escribirlos. Solo el editor está protegido: el servidor decide quién puede abrir /radialedit y lo vuelve a comprobar en cada guardado. El resto sirve para abrir cosas o para sacar a un jugador de un apuro.
Comando | Quién | Descripción |
|---|---|---|
| Todos | Abre la rueda, o la cierra si está abierta. El nombre es |
| Todos | Abre o cierra los ajustes del jugador. El nombre es |
| Administradores | Abre o cierra el editor. Para cualquier otro no ocurre nada. El nombre no se puede cambiar. |
| Todos | Reconstruye el menú a partir del trabajo y la banda actuales del jugador y de lo que añadieron otros recursos. Para una rueda que parece desactualizada. |
| Todos | Cierra la rueda y devuelve el ratón al juego. También con |
| Todos | Recarga toda la interfaz y libera el ratón: el remedio más contundente cuando |
| Todos | Vuelve a obtener el menú del editor desde el servidor e imprime en F8 si el override está activo, seguido de su contenido. |
| Todos | Imprime si la rueda está abierta y quién tiene el ratón. Solo imprime con |
Asignación de teclas#
Cada jugador puede cambiarlas en Settings → Key Bindings → FiveM, y FiveM recuerda su elección:
Asignación | Predeterminada | Qué hace |
|---|---|---|
Radial Menu: Open |
| Abre la rueda. |
Radial Menu: Reset NUI Focus (emergency) |
| Igual que |
Radial Menu: Dump state (debug) |
| Igual que |
Eventos#
Para abrir la rueda desde tus propios scripts — una app del teléfono, una tecla propia, un tutorial — y para reaccionar cuando se abre o se cierra:
-- Client side
TriggerEvent('qs-radialmenu:client:openMenu')
TriggerEvent('qs-radialmenu:client:closeMenu')
-- Server side, for one player
TriggerClientEvent('qs-radialmenu:client:openMenu', source)
-- Fired by the wheel itself
AddEventHandler('qs-radialmenu:client:onRadialmenuOpen', function()
-- e.g. hide your HUD
end)
AddEventHandler('qs-radialmenu:client:onRadialmenuClose', function()
-- and bring it back
end)Eventos de vehículo#
La sección Vehicle se construye con estos eventos de cliente. Úsalos en tus propios botones, como acción client en el editor, o con TriggerEvent:
Evento | Qué hace |
|---|---|
| Abre o cierra una puerta: 0 conductor, 1 acompañante, 2 trasera izquierda, 3 trasera derecha, 4 capó, 5 maletero. |
| Cierra todas las puertas cuando la mitad o más están abiertas y, si no, las abre. |
| Baja o sube una ventanilla, en el mismo orden que las puertas. |
| Todas las ventanillas, del mismo modo. |
| Se mueve a ese asiento si está libre y el vehículo va a menos de 100 km/h. |
| Activa o desactiva un extra del vehículo. |
| Motor encendido o apagado, desde el asiento del conductor. |
| Vuelve a poner sobre sus ruedas el vehículo en el que está el jugador. |
Las puertas y ventanillas actúan sobre el vehículo en el que está el jugador o al que mira; los asientos, los extras, el motor y el volteo requieren que el jugador esté dentro.
Exports de cliente#
Todos los exports son del lado del cliente. Son la forma en que otro recurso añade su propia sección a la rueda — una tienda, un trabajo, un alquiler que ofrece un botón Return solo mientras hay algo alquilado — y añade entradas a la biblioteca del editor.
Abrir y cerrar la rueda
exports['qs-radialmenu']:OpenMenu()
exports['qs-radialmenu']:CloseMenu()CreateCategory
Añade una sección en el nivel superior de la rueda, o dentro de otra sección por su ID.
local ok, err = exports['qs-radialmenu']:CreateCategory('mystore', {
label = 'My Store',
icon = 'Store',
})
-- Nested inside another section
exports['qs-radialmenu']:CreateCategory('mystore_admin', {
label = 'Manage',
icon = 'Shield',
parent = 'mystore',
job = { shopowner = { grade = 2 } },
})Campo | Obligatorio | Descripción |
|---|---|---|
| Sí | El texto y el nombre de un icono de Lucide. |
| No | Una sección creada con este export, o una de config/menu.lua que tenga un |
| No | Los mismos formatos que en config/menu.lua. |
| No | Una función de visibilidad. Solo funciona cuando se llama desde los propios archivos de Radial Menu. |
Devuelve true, o false y un mensaje. Los IDs son globales entre todos los recursos, así que ponles como prefijo el nombre de tu recurso. Una sección sin botones visibles no se muestra.
CreateItem
Añade un botón a una sección creada con CreateCategory, y devuelve su ID para que puedas quitarlo después.
-- A client event
local itemId, err = exports['qs-radialmenu']:CreateItem('mystore', {
label = 'Open shop', icon = 'ShoppingCart',
event = 'mystore:client:open', eventType = 'client',
})
-- A server event, for one job
exports['qs-radialmenu']:CreateItem('mystore_admin', {
label = 'Restock', icon = 'PackagePlus',
event = 'mystore:server:restock', eventType = 'server',
job = 'shopowner',
})
-- A command, keeping the wheel open
exports['qs-radialmenu']:CreateItem('mystore', {
label = 'Wave', icon = 'Hand',
event = 'e wave', eventType = 'command',
closesRadial = false,
})Campo | Obligatorio | Descripción |
|---|---|---|
| Sí | El texto y el nombre de un icono de Lucide. |
| Uno de los dos | El evento o comando que se ejecuta. Funciona desde cualquier recurso. El evento recibe la tabla que pasaste. |
| Uno de los dos | Una función. Solo funciona cuando se llama desde los propios archivos de Radial Menu. |
| No |
|
| No |
|
| No | Igual que en |
Devuelve el ID del nuevo elemento, o nil y un mensaje. Si la rueda está abierta, el jugador ve el nuevo botón al instante.
RemoveCategory y RemoveItem
exports['qs-radialmenu']:RemoveItem('mystore', itemId) -- one button
exports['qs-radialmenu']:RemoveCategory('mystore') -- the section and everything in itAmbos devuelven true, o false si no había nada que quitar, así que llamarlos dos veces no causa problemas. Rara vez los necesitas: cuando un recurso se detiene o se reinicia, todo lo que creó se elimina automáticamente.
Engancharse a una sección de config/menu.lua
Dale a la sección un id, luego crea tu propia sección dentro y pon ahí tus botones:
-- config/menu.lua
{
id = 'services',
label = 'Services',
icon = 'Briefcase',
type = 'category',
items = { ... },
},
-- your resource
exports['qs-radialmenu']:CreateCategory('mechanic_shop', {
label = 'Mechanic', icon = 'Wrench',
parent = 'services',
})
exports['qs-radialmenu']:CreateItem('mechanic_shop', {
label = 'Call a tow', icon = 'Truck',
event = 'mechanic:client:callTow',
})Las secciones se buscan solo por ID, nunca por etiqueta. CreateItem solo acepta secciones creadas con CreateCategory, por eso los botones van en una sección propia.
RegisterAction y RegisterPredicate
Añaden entradas a la biblioteca con la que se construyen los desplegables del editor. Aparecen en /radialedit de inmediato y desaparecen cuando se detiene el recurso que las añadió.
exports['qs-radialmenu']:RegisterAction({
id = 'mystore.open',
label = 'Open my store',
type = 'client', -- client | server | command | qbcommand
event = 'mystore:client:open',
})
exports['qs-radialmenu']:UnregisterAction('mystore.open')
local actions = exports['qs-radialmenu']:ListActions() -- { id, label, type, event, hasFn }
local conditions = exports['qs-radialmenu']:ListPredicates() -- { id, label }RegisterAction también acepta una función fn en lugar de type y event, y RegisterPredicate (id, label, fn) siempre lleva una. Las funciones solo funcionan desde los propios archivos de Radial Menu, así que regístralas en custom/registry.lua — consulta Integraciones. UnregisterPredicate(id) elimina una condición.
Un ejemplo completo
Un script de alquiler que ofrece Return vehicle solo mientras hay algo alquilado:
-- client/main.lua of your resource — ensure it after qs-radialmenu
CreateThread(function()
exports['qs-radialmenu']:CreateCategory('myrental', {
label = 'Rentals', icon = 'KeyRound',
})
exports['qs-radialmenu']:CreateItem('myrental', {
label = 'Rent a car', icon = 'Car',
event = 'myrental:client:open',
})
end)
local returnItem
RegisterNetEvent('myrental:client:rented', function()
returnItem = exports['qs-radialmenu']:CreateItem('myrental', {
label = 'Return vehicle', icon = 'Undo2',
event = 'myrental:client:return',
})
end)
RegisterNetEvent('myrental:client:return', function()
if returnItem then
exports['qs-radialmenu']:RemoveItem('myrental', returnItem)
returnItem = nil
end
-- ...return the car
end)
-- No cleanup on stop: the section is removed with the resource.Exports heredados
Se mantienen para que las integraciones antiguas sigan funcionando. El código nuevo debería usar los exports anteriores.
Export | Comportamiento |
|---|---|
| Igual que |
| Igual que |
| El estilo de qb-radialmenu: |
| Cada vez que se abre la rueda, llama al export |
Lo que añaden otros recursos vive en memoria. Si se reinicia el propio Radial Menu, esas secciones desaparecen hasta que cada recurso vuelva a ejecutar su código: reinícialos después, o mantenlos con ensure después de
qs-radialmenupara que un reinicio completo del servidor siempre los cargue en orden.
Lado del servidor#
No hay exports de servidor: la rueda se construye en el propio juego de cada jugador. Para abrirla a un jugador desde el servidor, dispara el evento de cliente mostrado arriba con su server id.
Sobre los errores#
Los exports nunca lanzan errores. Cuando algo falla devuelven false o nil con un mensaje breve — parent not found: services, category already exists: mystore —, así que imprime el segundo valor devuelto mientras desarrollas. Cada mensaje y su significado aparecen en Errores comunes.



