FiveM NUI: cómo funciona, errores comunes y la skill de IA

488 instalaciones en skills.sh

¿No quieres gestionar las skills tú mismo? Consigue la app completa.

FiveM NUI es el sistema que permite a un recurso dibujar su interfaz con HTML, CSS y JavaScript dentro de un navegador embebido. Cada inventario, teléfono, HUD y menú de tienda personalizado en un servidor FiveM es una página NUI. Si construyes una interfaz que ox_lib no cubre, necesitas entender cómo se declara la página, cómo se comunican Lua y JavaScript y dónde está la frontera de seguridad.

Qué te da FiveM NUI

El recurso declara su página en fxmanifest.lua con ui_page 'html/index.html' y lista cada asset que cargará el navegador en el bloque files {}. La página se renderiza a pantalla completa sobre el juego.

  • De Lua a JavaScript. SendNUIMessage({ action = 'open', data = ... }) en el cliente envía un objeto JSON. La página lo recibe con window.addEventListener('message', ...) y lee event.data.
  • Foco y cursor. SetNuiFocus(hasFocus, hasCursor) decide si la página captura teclado y ratón. Abre con SetNuiFocus(true, true) y cierra con SetNuiFocus(false, false).
  • De JavaScript a Lua. RegisterNUICallback('close', function(data, cb) ... cb('ok') end) en el cliente. La página lo llama con fetch('https://<resource-name>/close', { method: 'POST', body: JSON.stringify(data) }). Usa GetParentResourceName() en JS para obtener el nombre del recurso sin escribirlo a mano.
  • Seguridad. El código NUI corre en la máquina del jugador. Todo lo que envíe debe validarse en el servidor antes de tocar dinero, items o la base de datos.

Los natives están documentados en docs.fivem.net/natives.

Errores comunes con FiveM NUI

  • Olvidar SetNuiFocus(false, false) al cerrar. La página desaparece pero el jugador no puede moverse ni abrir el menú de pausa. Cada ruta de cierre, incluida la tecla Escape y el botón de cerrar, debe liberar el foco.
  • URL equivocada en fetch. La carpeta del recurso se llama my-shop pero el JS llama a https://myshop/buy. La consola F8 muestra un 404 o “failed to fetch”. Usa GetParentResourceName() y mantén el nombre del callback idéntico en ambos lados.
  • No llamar nunca a cb. El callback Lua se ejecuta, hace su trabajo y termina sin cb(...). La promesa del fetch en JS nunca se resuelve y la UI se queda colgada. Llama a cb siempre, aunque sea con una tabla vacía.
  • Confiar en los datos de la NUI como si el servidor los hubiera validado. Un callback recibe { price = 0 } y el cliente lo reenvía al servidor, que cobra cero. Los callbacks NUI llegan del cliente, así que el servidor debe consultar precios y permisos por su cuenta.
  • Archivos que faltan en files {}. La página carga en blanco y la consola F8 muestra un 404 para la hoja de estilos o el script. Cada archivo que carga la página debe estar listado, incluidas imágenes y fuentes.

Por qué los asistentes de IA se equivocan con FiveM NUI

Los asistentes genéricos confunden las capas. Ponen SendNUIMessage en un script de servidor, se inventan un RegisterNUICallback en el servidor o escriben fetch('/callback') con una ruta relativa que el navegador CEF no puede resolver. También tratan el payload del callback como entrada de confianza y escriben lógica de negocio en el cliente, que cualquier jugador puede editar.

La skill de FiveM NUI da al asistente un archivo de reglas por tema: setup.md para el manifest y la estructura de carpetas, fullscreen-nui.md para mensajería y foco, nui-callbacks.md para el contrato del callback y sus reglas de seguridad, best-practices.md para rendimiento y manejo de errores, y reference-links.md para la documentación oficial. El asistente lee la regla correspondiente y escribe el native correcto en el lado correcto.

Instala la skill de FiveM NUI en 30 segundos

  1. Haz clic en “Download SKILL.md” en la parte superior de esta página.
  2. Descomprímelo en la carpeta de skills o rules de tu herramienta de IA. La sección de instalación de abajo muestra la ruta exacta para Claude Code, Cursor y VS Code.
  3. Pide al asistente algo concreto, como “un menú a pantalla completa que se abre con un comando y se cierra con Escape”, y comprueba que usa SetNuiFocus, RegisterNUICallback con cb y lista todos los archivos en fxmanifest.lua.

Cómo instalar esta skill

Descarga el zip, descomprímelo y coloca la carpeta donde tu herramienta carga skills o reglas. La ruta exacta depende de la herramienta:

Claude Code

Descomprime en .claude/skills/fivem-nui/ dentro del proyecto (la carpeta debe contener SKILL.md). Para todos los proyectos, usa ~/.claude/skills/fivem-nui/.

Documentación de skills de Claude Code

Cursor

Cursor carga las reglas del proyecto desde .cursor/rules/. Añade ahí un archivo de regla que apunte a la skill descomprimida, o pega el contenido de SKILL.md y los archivos de reglas en una regla. El formato es .mdc con frontmatter y cambia entre versiones, así que revisa la documentación de tu versión.

Documentación de reglas de Cursor

VS Code / Copilot

Copilot lee archivos de instrucciones desde .github/instructions/*.instructions.md. Copia SKILL.md ahí con un glob applyTo para tus archivos Lua y deja los archivos de reglas al lado.

Documentación de instrucciones de VS Code

El archivo SKILL.md

Este es el archivo que lee tu asistente de IA. Enlaza a los archivos de reglas incluidos en la descarga.

Contenido de la skill (incluye SKILL.md y cualquier otro archivo)

El contenido de la skill está en inglés: es documentación técnica pensada para agentes de IA.

FiveM NUI

HTML/CSS/JS interfaces for FiveM: manifest setup, Lua-to-browser messages, NUI callbacks and focus handling.

Activation Contract

Load this skill when the user asks to create or edit a FiveM UI, writes HTML/CSS/JS inside a resource, sets ui_page, or asks about SendNUIMessage, SetNUIFocus or RegisterNUICallback.

Hard Rules

  • Declare ui_page and include every UI file in files in fxmanifest.lua; a missing file silently fails to load.
  • Reference assets with https://cfx-nui-<resource>/path; the nui:// protocol is deprecated.
  • RegisterNUICallback handlers must ALWAYS call cb(...) (at least cb({})), or the browser request hangs.
  • Browser calls callbacks with fetch('https://' + GetParentResourceName() + '/<name>', { method: 'POST', body: JSON.stringify(...) }); the URL name must match the registered name exactly.
  • SetNUIFocus(keyboard, mouse): always call SetNUIFocus(false, false) when closing the UI.
  • NUI callbacks run on the CLIENT. Validate their data client-side, then re-validate on the server before any state change; never trust UI-sent prices, amounts or ids.
  • Minimize SendNUIMessage calls: batch updates rather than sending per frame.
  • Debug with F8 and Chrome DevTools; test the page in a browser with a mock mode.

Decision Gates

Direction Mechanism
Lua to browser SendNUIMessage({ type = ..., data = ... }) + window.addEventListener('message')
Browser to Lua fetch POST to https://<resource>/<callback> + RegisterNUICallback
Browser wants server data callback to Lua client, then a server callback
Show / hide cursor SetNUIFocus(true, true) / SetNUIFocus(false, false)
Keyboard only SetNUIFocus(true, false)

Execution Steps

  1. Add ui_page and files to the manifest (read rules/setup.md).
  2. Build index.html, CSS and JS; listen for message events keyed by type.
  3. Register Lua callbacks for every action the UI can request; call cb on every path.
  4. Manage focus on open/close; handle Escape to close.
  5. Forward any state-changing action to the server and validate there.

Output Contract

Return the manifest entries, the HTML/CSS/JS files, and the Lua client script with callbacks and focus handling. Keep security-relevant logic on the server.

References

  • rules/setup.md — folder layout, manifest, build tools, common mistakes.
  • rules/fullscreen-nui.md — SendNUIMessage, SetNUIFocus, focus stack, assets, devtools.
  • rules/nui-callbacks.md — RegisterNUICallback, fetch, async, errors, security.
  • rules/best-practices.md — performance, security, state, error handling, testing.
  • rules/reference-links.md — official docs and natives reference.

Upstream docs: https://docs.fivem.net/docs/scripting-manual/nui-development/

Preguntas frecuentes

¿Puedo usar React o Vue en una NUI de FiveM?
Sí. NUI es un navegador CEF, así que cualquier framework que compile a HTML, CSS y JS estáticos funciona. Compila el proyecto, apunta ui_page a la salida y lista cada archivo generado en el bloque files de fxmanifest.lua.
¿Uso NUI o ox_lib para mi interfaz?
Usa ox_lib para notificaciones, diálogos, menús y barras de progreso estándar. Construye una NUI solo cuando necesites una interfaz personalizada que ox_lib no ofrece, como una cuadrícula de inventario o un teléfono.
¿Puedo usar esta skill con ChatGPT?
Sí, con un paso manual. El SKILL.md es markdown plano, así que puedes pegarlo en la conversación como contexto. El soporte nativo de skills es para Claude Code, Cursor y VS Code.

Lecturas más largas del blog de FiveAI sobre el mismo tema.

Más skills