Frameworks: ESX y QBCore · Lección 3/5 · 9 min

Callbacks de ESX: pedir datos al servidor

Cuando el cliente necesita una respuesta del servidor (¿tengo saldo? ¿qué items tengo?), usas un callback.

Un evento normal es de ida (cliente avisa al servidor). Pero a veces el cliente necesita una RESPUESTA: «¿tengo bastante dinero para esto?». Para eso están los callbacks de servidor.

En el servidor: registrar el callback

lua
ESX.RegisterServerCallback('tienda:comprar', function(source, cb, precio)
  local xPlayer = ESX.GetPlayerFromId(source)
  if not xPlayer then return cb(false) end
  if xPlayer.getMoney() >= precio then
    xPlayer.removeMoney(precio)
    cb(true)   -- responde al cliente: compra OK
  else
    cb(false)  -- sin dinero
  end
end)

server.lua

En el cliente: llamarlo y esperar la respuesta

lua
ESX.TriggerServerCallback('tienda:comprar', function(exito)
  if exito then
    print('Compra realizada')
  else
    print('No tienes suficiente dinero')
  end
end, 1500) -- 1500 = precio que se pasa al servidor

client.lua

La decisión (¿tiene dinero?) y el cobro ocurren en el SERVIDOR. El cliente solo recibe sí/no. Así no se puede hacer trampa.

Practica lo aprendido

0/3
Ordena el código

Ordena un callback de servidor que cobra un precio solo si el jugador tiene dinero.

Coloca las líneas en el orden correcto con las flechas.

local xPlayer = ESX.GetPlayerFromId(source)
end)
if xPlayer.getMoney() >= precio then xPlayer.removeMoney(precio) cb(true) else cb(false) end
ESX.RegisterServerCallback('tienda:comprar', function(source, cb, precio)
if not xPlayer then return cb(false) end
Pista

Primero registras el callback, luego obtienes el jugador, validas y respondes con cb().

Rellena los huecos

Completa la llamada del cliente que pide al servidor y espera la respuesta.

1ESX.('tienda:comprar', function(exito)
2 if exito then print('Compra OK') end
3end, 1500)
Pista

Es la pareja cliente de RegisterServerCallback; el 1500 es el precio que se pasa al servidor.

Test

En un callback de ESX, ¿dónde se decide si el jugador tiene dinero y se le cobra?

Reto: prográmalo tú

Crea un callback que devuelva true solo si el jugador tiene el trabajo de 'police'.

Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.

Ver pista

Compara xPlayer.job.name == 'police' y responde con cb(true/false).

Escribe aquí tu solución:

¿Qué tal esta lección?