Fundamentos: tu primer recurso en QBCore · Lección 3/5 · 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 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. En QBCore esto es igual de crítico que en ESX.

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', function()
  local src = source -- ID del jugador que disparó el evento
  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('nombre', fn): registra y escucha un evento de red (sintaxis moderna).
  • source (solo en el servidor): el ID del jugador que disparó el evento.

Convención de nombres recomendada en QBCore: recurso:client:accion y recurso:server:accion (los propios eventos del core siguen QBCore:Client:... y QBCore:Server:...). Así sabes de un vistazo dónde vive cada evento.

Practica lo aprendido

0/3
Test

Regla de oro del modelo cliente-servidor: ¿dónde se decide y ejecuta todo lo que da dinero, items o ventaja?

Ordena el código

Ordena el flujo de un comando /sueldo que el cliente pide y el servidor atiende.

Coloca las líneas en el orden correcto con las flechas.

RegisterCommand('sueldo', function()
end)
RegisterNetEvent('taxi:server:cobrarSueldo', function()
TriggerServerEvent('taxi:server:cobrarSueldo')
local src = source
end)
Pista

Primero el comando del cliente que dispara el evento, y luego el servidor que lo escucha con RegisterNetEvent.

Rellena los huecos

Completa la línea del cliente que avisa al servidor para cobrar el sueldo.

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

Es la función con la que el cliente dispara un evento que corre en el servidor.

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 en server.lua usando source.

Escribe aquí tu solución:

¿Qué tal esta lección?