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.
-- 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/3En el cajero terminado, ¿por qué el cliente solo 'pide' y nunca mueve el dinero?
Pista
¿Qué máquina controla el jugador tramposo?
Completa la llamada del cliente al callback que consulta el saldo.
function abrirCajero() ESX.('cajero:saldo', function(cash, bank) print(cash, bank) end)endPista
Desde el cliente se invoca un callback de servidor con ESX.TriggerServerCallback.
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:
RegisterCommand('retirar100', function() xPlayer.addMoney(100) -- mal: en el clienteend)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:
