Cliente y servidor a fondo · Lección 4/4 · 9 min

Entidades en red: vehículos server-side

Crear vehículos desde el servidor para que todos los vean igual y sin trampas.

Si creas un vehículo solo en el cliente, los demás no lo ven o lo ven raro. Lo correcto en FiveM moderno (con o sin QBCore) es crear las entidades en el SERVIDOR; así están sincronizadas para todos y son más difíciles de manipular.

lua
-- SERVIDOR: crea el vehículo y devuelve su netId
RegisterNetEvent('garaje:server:spawn', function(model, coords)
  local src = source
  -- valida que el jugador puede (trabajo, propiedad, distancia)…
  local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, true)
  while not DoesEntityExist(veh) do Wait(0) end
  local netId = NetworkGetNetworkIdFromEntity(veh)
  TriggerClientEvent('garaje:client:setOwner', src, netId)
end)

server.lua

lua
-- CLIENTE: del netId a la entidad local para meterte dentro
RegisterNetEvent('garaje:client:setOwner', function(netId)
  local veh = NetToVeh(netId)
  local tries = 0
  while not DoesEntityExist(veh) and tries < 100 do
    veh = NetToVeh(netId); tries = tries + 1; Wait(10)
  end
  if DoesEntityExist(veh) then
    TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
  end
end)

client.lua

netId (network ID) es el «DNI» de una entidad que vale igual en todos los clientes. Server crea → manda netId → cada cliente lo resuelve a su entidad local con NetToVeh/NetToObj/NetToPed. En QBCore esto es habitual en garajes (qb-garages sigue este patrón).

Practica lo aprendido

0/3
Test

¿Por qué se crean los vehículos en el SERVIDOR y no solo en el cliente?

Rellena los huecos

Completa la creación server-side del vehículo y la espera a que exista antes de obtener su netId.

1local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, true)
2while not (veh) do Wait(0) end
3local netId = NetworkGetNetworkIdFromEntity(veh)
Pista

Tras CreateVehicle la entidad tarda un instante en existir; espera en un bucle corto hasta que la comprobación devuelva true.

Ordena el código

Ordena el evento de servidor que crea un vehículo, espera a que exista y manda su netId al cliente dueño.

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

local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, true)
RegisterNetEvent('garaje:server:spawn', function(model, coords)
TriggerClientEvent('garaje:client:setOwner', src, netId)
end)
while not DoesEntityExist(veh) do Wait(0) end
local netId = NetworkGetNetworkIdFromEntity(veh)
local src = source
Pista

source → crear vehículo → esperar a que exista → sacar netId → avisar al cliente con ese netId.

Reto: prográmalo tú

Haz que al spawnear el vehículo en el servidor también se le ponga una matrícula concreta antes de avisar al cliente.

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

Ver pista

Tras CreateVehicle y DoesEntityExist, llama a SetVehicleNumberPlateText(veh, 'CRX 001').

Escribe aquí tu solución:

¿Qué tal esta lección?