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

lua
-- 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
Test

¿Dónde debe decidirse y ejecutarse dar dinero a un jugador?

Pista

El cliente NUNCA es de fiar.

Rellena los huecos

Completa el comando del cliente para que avise al servidor de cobrar el sueldo.

1RegisterCommand('sueldo', function()
2 ('taxi:server:cobrarSueldo')
3end)
Pista

Del cliente hacia el servidor se usa TriggerServerEvent.

Corrige el error

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:

1RegisterNetEvent('pago:server:cobrar')
2AddEventHandler('pago:server:cobrar', function(cantidad)
3 local xPlayer = ESX.GetPlayerFromId(source)
4 xPlayer.addMoney(cantidad)
5end)

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:

¿Qué tal esta lección?