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
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
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 servidorclient.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/3Ordena 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) endESX.RegisterServerCallback('tienda:comprar', function(source, cb, precio) if not xPlayer then return cb(false) endPista
Primero registras el callback, luego obtienes el jugador, validas y respondes con cb().
Completa la llamada del cliente que pide al servidor y espera la respuesta.
ESX.('tienda:comprar', function(exito) if exito then print('Compra OK') endend, 1500)Pista
Es la pareja cliente de RegisterServerCallback; el 1500 es el precio que se pasa al servidor.
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:
