Fundamentos: tu primer recurso · Lección 3/6 · 9 min
Cliente vs Servidor: el modelo mental clave
El cliente corre en el PC del jugador (no fiable); el servidor es la autoridad. Se comunican por eventos.
Este es EL concepto que separa a un script seguro de un coladero. El código de cliente corre en el PC de cada jugador: cualquiera puede manipularlo. El código de servidor corre en tu máquina: es la única fuente de verdad.
Regla de oro: todo lo que dé dinero, items o ventaja se DECIDE y se EJECUTA en el servidor. El cliente solo pide; nunca confíes en lo que envía.
Hablar entre cliente y servidor: eventos
-- CLIENTE: pide al servidor cobrar un sueldo
RegisterCommand('sueldo', function()
TriggerServerEvent('taxi:server:cobrarSueldo')
end)
-- SERVIDOR: decide y ejecuta (autoridad)
RegisterNetEvent('taxi:server:cobrarSueldo')
AddEventHandler('taxi:server:cobrarSueldo', function()
local src = source -- ID del jugador que disparó el evento
-- aquí validas y das el dinero en el servidor
print(('El jugador %s pidió su sueldo'):format(src))
end)Cliente → Servidor
- TriggerServerEvent('nombre', ...): el cliente avisa al servidor.
- TriggerClientEvent('nombre', targetId, ...): el servidor avisa a un cliente.
- RegisterNetEvent + AddEventHandler: registran un evento de red para escucharlo.
- source (solo en el servidor): el ID del jugador que disparó el evento.
Convención de nombres recomendada: recurso:client:accion y recurso:server:accion. Así sabes de un vistazo dónde vive cada evento.
Practica lo aprendido
0/3¿Dónde debe decidirse y ejecutarse dar dinero a un jugador?
Pista
El cliente NUNCA es de fiar.
Completa el comando del cliente para que avise al servidor de cobrar el sueldo.
RegisterCommand('sueldo', function() ('taxi:server:cobrarSueldo')end)Pista
Del cliente hacia el servidor se usa TriggerServerEvent.
Este código de SERVIDOR confía en la cantidad que manda el cliente (¡dinero infinito!). Reescríbelo para pagar un valor fijo de 250, sin usar el argumento del cliente.
Este código tiene un fallo:
RegisterNetEvent('pago:server:cobrar')AddEventHandler('pago:server:cobrar', function(cantidad) local xPlayer = ESX.GetPlayerFromId(source) xPlayer.addMoney(cantidad)end)Reescríbelo corregido:
Pista
La cantidad la decide el servidor: usa 250 fijo, no el argumento 'cantidad'.
Reto: prográmalo tú
Haz un comando /hola en el cliente que dispare un evento al servidor, y que el servidor imprima por consola el ID del jugador.
Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.
Ver pista
RegisterCommand en client.lua → TriggerServerEvent; RegisterNetEvent + AddEventHandler en server.lua usando source.
Escribe aquí tu solución:
