El Libro·Capítulo 7/12·10 min

Los recursos que todo servidor usa

FiveM te da el motor del juego; un framework de roleplay le añade dinero, trabajos, inventario e identidad persistente. Aquí ves ESX, QBCore y el ecosistema ox, y descubres que los conceptos son los mismos en todos.

FiveM por sí solo te da un servidor de GTA V vacío: el motor, la red y la capacidad de cargar recursos. Pero no sabe qué es «dinero», ni un «trabajo», ni un «inventario», ni quién eres tú entre sesión y sesión. Todo eso lo aporta un framework de roleplay: una base de recursos que se instala encima de FiveM y define las reglas del juego de rol.

Qué es un framework de roleplay

Un framework es la capa que convierte un servidor vacío en un servidor de RP. Te da las piezas comunes que casi cualquier servidor necesita, para que no tengas que reinventarlas en cada recurso.

  • Identidad persistente: cada jugador tiene un personaje guardado en la base de datos (nombre, apariencia, datos).
  • Dinero: efectivo, banco y, a veces, dinero negro, con funciones para sumar y restar.
  • Trabajos: policía, mecánico, taxista... con rangos y permisos.
  • Inventario: objetos que el jugador lleva encima y que se guardan al desconectar.

Recuérdalo así: FiveM es el motor del coche; el framework es el coche montado a su alrededor. Los dos frameworks más usados en habla hispana son ESX y QBCore.

ESX Legacy (es_extended)

ESX es el framework más veterano y el que más recursos de terceros tiene disponibles. Su recurso principal se llama es_extended. Para usarlo desde tu script obtienes el «objeto compartido» (el core de ESX) y, a partir de él, accedes a los jugadores.

lua
-- Obtener el core de ESX (lado servidor)
ESX = exports['es_extended']:getSharedObject()

RegisterCommand('pagar', function(source)
  local xPlayer = ESX.GetPlayerFromId(source) -- objeto del jugador
  if not xPlayer then return end

  xPlayer.addMoney(500)            -- le damos 500 de efectivo
  print(xPlayer.getMoney())        -- cuánto efectivo tiene
  print(xPlayer.job.name)          -- su trabajo actual, ej. 'police'
end)

-- Callback: el cliente pregunta, el servidor responde
ESX.RegisterServerCallback('mi_recurso:saldo', function(source, cb)
  local xPlayer = ESX.GetPlayerFromId(source)
  cb(xPlayer.getMoney())
end)

Lo esencial de ESX

QBCore (qb-core)

QBCore es más moderno y modular, con una comunidad muy activa. Su recurso principal se llama qb-core. La idea es idéntica a la de ESX: obtienes el core y desde él accedes a cada jugador; solo cambian los nombres de las funciones.

lua
-- Obtener el core de QBCore (lado servidor)
local QBCore = exports['qb-core']:GetCoreObject()

RegisterCommand('pagar', function(source)
  local Player = QBCore.Functions.GetPlayer(source) -- objeto del jugador
  if not Player then return end

  Player.Functions.AddMoney('cash', 500)   -- le damos 500 de efectivo
  print(Player.PlayerData.job.name)         -- su trabajo, ej. 'police'
end)

-- Callback: el cliente pregunta, el servidor responde
QBCore.Functions.CreateCallback('mi_recurso:saldo', function(source, cb)
  local Player = QBCore.Functions.GetPlayer(source)
  cb(Player.PlayerData.money.cash)
end)

Lo esencial de QBCore

ESX y QBCore, lado a lado

Cuando ves los dos juntos, descubres que es la misma lógica con distinto vocabulario. Esta tabla mental te servirá para traducir cualquier recurso de un framework al otro:

  • Obtener el core: ESX.getSharedObject() ↔ QBCore:GetCoreObject()
  • Obtener al jugador: ESX.GetPlayerFromId(source) ↔ QBCore.Functions.GetPlayer(source)
  • Dar dinero: xPlayer.addMoney(500) ↔ Player.Functions.AddMoney('cash', 500)
  • Ver el trabajo: xPlayer.job.name ↔ Player.PlayerData.job.name
  • Crear callback: ESX.RegisterServerCallback(...) ↔ QBCore.Functions.CreateCallback(...)

El ecosistema ox (overextended)

Por encima del framework hay un conjunto de recursos del equipo overextended (los «ox») que se han vuelto el estándar moderno. Lo bueno es que funcionan tanto con ESX como con QBCore, así que aprenderlos te vale para ambos mundos.

  • oxmysql: la conexión a la base de datos MySQL/MariaDB. Casi todo el ecosistema depende de él.
  • ox_lib: caja de herramientas (menús, inputs, notificaciones, zonas, callbacks). Te ahorra escribir UI y utilidades a mano.
  • ox_inventory: un inventario completo, con peso, slots y objetos guardados en base de datos.
  • ox_target: interacción «por mirada»: apuntas a algo y aparece un menú de acciones contextuales.

Bridges: un recurso, varios frameworks

Muchos recursos modernos quieren venderse o usarse tanto en ESX como en QBCore. Para no escribir el código dos veces usan un «bridge» (puente): detectan qué framework está activo en el servidor y, a partir de ahí, llaman a las funciones correctas detrás de una interfaz común.

lua
-- Patrón de puente simplificado
local Framework, name

if GetResourceState('es_extended') == 'started' then
  Framework = exports['es_extended']:getSharedObject()
  name = 'esx'
elseif GetResourceState('qb-core') == 'started' then
  Framework = exports['qb-core']:GetCoreObject()
  name = 'qb'
end

-- Función unificada: el resto del recurso ya no se entera del framework
local function darDinero(src, cantidad)
  if name == 'esx' then
    Framework.GetPlayerFromId(src).addMoney(cantidad)
  elseif name == 'qb' then
    Framework.Functions.GetPlayer(src).Functions.AddMoney('cash', cantidad)
  end
end

Cómo un bridge soporta ambos frameworks

ESX o QBCore: cómo elegir

No hay una respuesta única, y los dos son opciones serias y mantenidas. ESX tiene la base de recursos más grande del mercado, así que es fácil encontrar (o comprar) casi cualquier sistema ya hecho. QBCore suele considerarse algo más moderno y modular en su diseño, con datos del jugador muy estructurados. Para empezar, elige el que use la comunidad o el creador de contenido que sigues, porque tendrás más ejemplos a mano.

Lo importante no es el framework, sino los CONCEPTOS: son los mismos en ambos. Aprende a obtener el core, a sacar al jugador, a mover su dinero y a hacer callbacks, y sabrás moverte en cualquiera de los dos.

El framework cambia los nombres, no la lógica. Si dominas la separación cliente-servidor y la seguridad (validar siempre en el servidor, no fiarte del cliente), te moverás con soltura tanto en ESX como en QBCore.

¿Una duda sobre esto? El chat de la IA lo sabe todo y te responde con código.

Pregunta a la IA
Recursos esenciales: ESX, QBCore y el ecosistema ox