Cómo añadir scripts y recursos en FiveM sin errores

Guía técnica para añadir resources en FiveM sin romper dependencias: estructura de carpetas, orden en server.cfg, fxmanifest, conflictos y logs de diagnóstico.

Añadir resources en FiveM parece trivial hasta que el servidor no arranca, la consola muestra Couldn't load resource o un script nuevo tumba al framework completo. La mayor parte de los errores no viene del resource en sí — viene de una estructura de carpetas incorrecta, un fxmanifest inválido, mal orden en el server.cfg o conflicto con otro script.

Esta guía está orientada a quien opera un servidor FiveM propio (Windows o Linux), ya tiene framework instalado (ESX o QBCore) y quiere añadir scripts de la comunidad o pagos sin romper nada. Tiempo estimado: 10 a 15 minutos por resource bien probado.

Requisitos previos

Lo que necesitas antes de empezar

Servidor FiveM (FXServer) en ejecución — Windows Server 2019+ o Ubuntu 22.04/24.04. Framework instalado (ESX Legacy, QBCore u otro). Acceso al filesystem del servidor (RDP en Windows o SSH en Linux). Acceso a la consola del servidor para recargar resources sin reiniciar.

Carpeta del servidor /path/to/server-data
Carpeta de resources resources/
Config principal server.cfg
Puerto por defecto 30120

Si tu servidor está en una VPS Linux, conecta vía SSH antes. En Windows, conecta vía RDP y abre una terminal PowerShell en la carpeta del servidor.

Entendiendo la estructura de un resource

Antes de añadir cualquier cosa, conviene conocer qué espera FXServer. Un resource FiveM válido es una carpeta dentro de resources/ (o en subcarpetas con prefijo [categoria]) que contiene al menos un fxmanifest.lua en el directorio raíz. Sin ese archivo, FXServer ignora el resource — no importa cuántos .lua o .js haya dentro.

La estructura típica:

resources/
└── [scripts]/
    └── mi-resource/
        ├── fxmanifest.lua
        ├── client.lua
        ├── server.lua
        ├── config.lua
        └── html/
            ├── index.html
            ├── style.css
            └── script.js

Las carpetas con corchetes ([scripts], [esx], [qb]) son solo organización visual — FXServer hace un escaneo recursivo. Puedes anidar hasta 2-3 niveles sin problema. Evita más que eso para no dificultar el mantenimiento.

El fxmanifest.lua mínimo

Todo resource debe declarar la versión de la API y el juego objetivo. El archivo mínimo viable:

fx_version 'cerulean'
game 'gta5'

author 'Nombre del autor'
description 'Descripción breve'
version '1.0.0'

client_scripts {
  'client.lua'
}

server_scripts {
  'server.lua'
}

shared_scripts {
  'config.lua'
}

fx_version 'cerulean' es el valor actual recomendado (soporta features modernas de FiveM). Versiones antiguas como adamant o bodacious siguen funcionando pero pierden capacidades.

Añadiendo un resource paso a paso

01

Copia la carpeta del resource dentro de resources/ en el servidor. En Linux, vía scp o SFTP:

scp -r mi-resource/ usuario@ip-del-servidor:/path/to/server-data/resources/[scripts]/

En Windows, arrástrala mediante la sesión RDP o usa un cliente SFTP como WinSCP. Coloca la carpeta dentro de una categoría con corchetes — [scripts], [custom], [esx], [qb] — para organizar. No copies el .zip: extráelo antes.

02

Verifica que exista fxmanifest.lua en el directorio raíz del resource. Si el archivo se llama __resource.lua (formato antiguo), el resource aún funciona, pero considera migrar a fxmanifest.lua — algunos recursos modernos ya no corren con el formato legado.

ls /path/to/server-data/resources/[scripts]/mi-resource/

Debes ver fxmanifest.lua listado. Si no, el resource está mal empaquetado.

03

Abre el server.cfg en la raíz del servidor y añade la línea de activación:

ensure mi-resource

Coloca esa línea en el orden correcto: después del framework y de las dependencias, antes de los scripts que dependan de él. Ejemplo práctico con QBCore:

# Frameworks primero
ensure qb-core

# Bibliotecas y dependencias
ensure ox_lib
ensure oxmysql

# Scripts de gameplay
ensure qb-multicharacter
ensure qb-spawn
ensure mi-resource
Usa ensure, no start

El comando start nombre carga el resource una vez, pero no respeta refresh ni reinicio limpio. ensure nombre recarga el resource en hot-reload y garantiza el orden de dependencias. Prefiere siempre ensure en servidores de producción.

04

Guarda el server.cfg y recarga el resource en la consola del servidor (no hace falta reiniciar todo):

refresh
ensure mi-resource

El comando refresh hace que FXServer vuelva a escanear la carpeta resources/ y detecte resources nuevos. Después, ensure mi-resource lo inicia. Si el resource ya estaba corriendo, usa restart mi-resource en vez de ensure para recargarlo.

05

Confirma en la consola del servidor que el resource arrancó sin error. Deberías ver algo como:

Started resource mi-resource

Si aparece Couldn't load resource mi-resource o Error parsing script, abre los logs y consulta la sección de resolución de problemas más abajo.

Verificando que todo funciona

En la consola del servidor, ejecuta resources para ver la lista completa de resources activos. El nombre de tu resource debe aparecer con estado started. Si aparece como stopped, fue reconocido pero no se está ejecutando — verifica el ensure en el server.cfg.

Para probar funcionalmente, conéctate al servidor con tu client FiveM. Los scripts client-side reaccionan generalmente a comandos (/comando), ítems del inventario o eventos automáticos. Abre la consola F8 del client (~ o F8) — los errores Lua o JavaScript del lado client aparecen ahí con stack trace.

Los logs están en logs/ dentro de la carpeta del servidor

FXServer escribe fxserver.log (Linux) o console.log (Windows) en la carpeta del servidor. Mantén una terminal con tail -f logs/fxserver.log corriendo mientras pruebas — verás los errores en tiempo real sin necesidad de abrir el panel.

Resolución de problemas comunes

”Couldn’t load resource X”

Casi siempre es un fxmanifest.lua ausente o inválido. Verifica:

  • El archivo se llama exactamente fxmanifest.lua (minúsculas, con .lua)
  • Tiene fx_version 'cerulean' y game 'gta5' declarados
  • Sintaxis Lua válida (comas y comillas balanceadas)

Si el archivo está correcto, confirma que el nombre de la carpeta coincide exactamente con el ensure del server.cfg. En Linux, MiResource y miresource son carpetas distintas — case-sensitive.

”Error loading script” con error Lua

La consola muestra la línea exacta del error. Causas frecuentes:

  • Variable del framework usada antes de que el framework cargue (orden incorrecto en el server.cfg)
  • Dependencia ausente (exports['ox_lib'] invocado sin ox_lib corriendo)
  • Sintaxis Lua rota por edición manual

Para aislar: comenta el resource en el server.cfg, reinicia y agrega uno por uno hasta reproducir el error.

El servidor crashea al iniciar

Comenta todos los ensure excepto los core (mapmanager, chat, spawnmanager, sessionmanager, framework). Reinicia. Si sube sin crash, añade resources uno a uno hasta identificar al culpable. Ese proceso lleva tiempo pero es el único confiable cuando el error ocurre muy temprano en el boot.

Cuidado con scripts pirateados u ofuscados

Resources con Lua ofuscado (códigos como _G[string.char(...)]) pueden contener backdoors, exfiltración de datos de jugadores o comandos remotos no autorizados. Usa solo scripts de fuentes confiables — foro Cfx verificado, Tebex, GitHub con historial público. Los scripts pagos legítimos tienen escrow y nunca obligan a ofuscación total.

Conflicto entre dos scripts en el mismo evento

Dos resources que registran un handler para el mismo evento (AddEventHandler('playerSpawned', ...)) pueden competir por el orden de ejecución. FiveM no garantiza orden entre handlers del mismo evento en resources distintos. Solución: define explícitamente la dependencia en el fxmanifest.lua del resource que tiene que ejecutarse después:

dependencies {
  'otro-resource'
}

Eso garantiza que otro-resource se cargue primero.

Próximos pasos

Con la estructura limpia y los resources corriendo estables, vale la pena profundizar en:

  • Optimización de scripts: identificar resources que consumen mucha CPU usando resmon en el client (Shift+~). Resources por encima de 1.0ms client-side merecen revisión.
  • Backup automatizado de resources: versionar la carpeta resources/ en un Git privado evita perder trabajo cuando rompes algo probando.
  • Whitelist de scripts: en servidores roleplay, mantener una lista curada de resources aprobados reduce la superficie de bugs y exploits.
  • Base de datos separada por categoría: los scripts pesados (jobs, inventario) pueden usar databases aisladas para reducir contención.

Si estás ejecutando FiveM en producción con 32+ slots y quieres infraestructura que aguante latencia baja para Brasil y Latinoamérica, los servidores de juegos de Hostini entregan latencia por debajo de 30ms para todo el Sudeste brasileño con protección DDoS incluida en el precio.

Preguntas frecuentes

¿Por qué aparece 'Couldn't load resource' aunque la carpeta esté en el sitio correcto?

Casi siempre es un fxmanifest.lua inválido o ausente. FiveM exige `fx_version` y `game` declarados al inicio del archivo. Sin eso, el resource se ignora silenciosamente en runtime. Verifica también que el nombre de la carpeta coincida exactamente con el `ensure` en el server.cfg — Linux distingue mayúsculas y minúsculas.

¿Puedo simplemente copiar la carpeta del resource y reiniciar el servidor?

No es suficiente. Tienes que añadir `ensure nombre-del-resource` en el server.cfg. Solo colocar la carpeta en resources/ hace que FxServer reconozca el resource como disponible, pero no lo inicia. Usa `ensure` en lugar de `start` — `ensure` reinicia el resource en hot-reload y respeta las dependencias.

¿En qué orden deben cargarse los recursos en el server.cfg?

Primero los frameworks (ESX, QBCore), luego las bibliotecas compartidas (ox_lib, oxmysql, mysql-async) y después los resources de gameplay que dependen de ellos. Invertir ese orden causa errores de dependencia circular y scripts que no detectan los exports del framework.

¿Cómo sé si un resource es compatible con mi framework?

Lee el fxmanifest.lua del resource — declara `dependencies` o `shared_scripts` apuntando a qbcore-bridge, es_extended o similar. En general, los scripts marcados como 'QBCore' no funcionan en ESX sin adaptación. Verifica también la versión del framework: los scripts para QBCore 1.2.x rompen en ramas antiguas.

El servidor se cuelga al iniciar con un resource nuevo. ¿Cómo descubro cuál es?

Comenta todos los `ensure` del server.cfg y agrega uno por uno reiniciando entre cada uno. El resource que provoca el crash aparece con error Lua/JS en la consola. Otra opción es ejecutar con `+set sv_enforceGameBuild` y revisar console.log en logs/ dentro de la carpeta del servidor.

¿Puedo editar un script mientras el servidor está corriendo?

Sí. Usa `restart nombre-del-resource` en la consola del servidor o vía rcon. Eso recarga solo el resource modificado sin desconectar a los jugadores. Cuidado con scripts que abren conexiones persistentes (base de datos, WebSocket) — pueden mantener handlers huérfanos hasta el reinicio completo.

Temas:
Próximos pasos VPS, dedicado o panel gestionado para FiveM, SAMP, MTA, Tibia y más.Aloja tu servidor de juegos con Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp