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

Entidades en red: vehículos y props server-side

Crear vehículos y objetos 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 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')
AddEventHandler('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')
AddEventHandler('garaje:client:setOwner', function(netId)
  local veh = NetToVeh(netId) -- espera a que exista
  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.

Practica lo aprendido

0/3
Test

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

Pista

Piensa en qué ven los OTROS jugadores.

Ordena el código

Ordena el flujo del servidor: crear el vehículo, esperar a que exista, obtener su netId y avisar al cliente.

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

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

Primero se crea, luego se confirma que existe, después se saca el netId y por último se avisa al cliente.

Rellena los huecos

Completa el cliente: resuelve el netId a su entidad local y mete al jugador dentro.

1RegisterNetEvent('garaje:client:setOwner')
2AddEventHandler('garaje:client:setOwner', function(netId)
3 local veh = (netId)
4 if DoesEntityExist(veh) then
5 TaskWarpPedIntoVehicle((), veh, -1)
6 end
7end)
Pista

Del netId a la entidad local con NetToVeh; el ped del jugador con PlayerPedId.

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?