Proyecto final: tu primer cajero (ATM) · Lección 4/4 · 7 min

Pulir, asegurar y publicar

Conecta el cliente con los callbacks, repasa la seguridad y súbelo a la comunidad.

Para cerrar, el cliente llama a los callbacks. Aquí lo simple (input por chat o ya tu NUI del módulo 5). Lo clave es que el cliente solo pide; el servidor ya valida.

lua
-- client.lua: abrir el cajero (versión simple)
function abrirCajero()
  ESX.TriggerServerCallback('cajero:saldo', function(cash, bank)
    print(('Efectivo: %s€  Banco: %s€'):format(cash, bank))
    -- aquí abrirías tu NUI con estos valores (módulo NUI)
  end)
end

-- ejemplo de retirar 100
RegisterCommand('retirar100', function()
  ESX.TriggerServerCallback('cajero:retirar', function(ok)
    print(ok and 'Retirado' or 'No se pudo')
  end, 100)
end)

client.lua

Repaso de seguridad (módulo 7)

  • Dinero movido solo en el servidor, con saldo comprobado. ✓
  • Cantidades validadas (número, positivas, límite). ✓
  • Anti-spam por jugador. ✓
  • Sin secretos hardcodeados, config en config.lua. ✓

Publícalo en la comunidad

Empaqueta la carpeta mi_cajero en un .zip y súbelo a la Comunidad de Crxative-M. Pasará la auditoría de seguridad automática y, si está limpio, otros dueños podrán usarlo. Acabas de forjar y compartir tu primer recurso completo.

Has cerrado el círculo: fundamentos, framework, cliente-servidor, base de datos, rendimiento y seguridad, todo en un recurso real. A partir de aquí, lo que imagines.

Practica lo aprendido

0/3
Test

En el cajero terminado, ¿por qué el cliente solo 'pide' y nunca mueve el dinero?

Pista

¿Qué máquina controla el jugador tramposo?

Rellena los huecos

Completa la llamada del cliente al callback que consulta el saldo.

1function abrirCajero()
2 ESX.('cajero:saldo', function(cash, bank)
3 print(cash, bank)
4 end)
5end
Pista

Desde el cliente se invoca un callback de servidor con ESX.TriggerServerCallback.

Corrige el error

Un principiante intentó dar dinero desde el CLIENTE. Eso es inseguro. Cámbialo para que pida al servidor el retiro.

Este código tiene un fallo:

1RegisterCommand('retirar100', function()
2 xPlayer.addMoney(100) -- mal: en el cliente
3end)

Reescríbelo corregido:

Pista

Llama a ESX.TriggerServerCallback('cajero:retirar', function(ok) ... end, 100); el servidor decide.

Reto: prográmalo tú

Empaqueta tu cajero en un .zip y súbelo a la comunidad para que pase la auditoría.

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

Ver pista

Comprime la carpeta del recurso y súbela en /comunidad/nuevo; revisa el informe de la auditoría.

Escribe aquí tu solución:

¿Qué tal esta lección?