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.
-- 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
-- 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¿Por qué se crean los vehículos en el SERVIDOR y no solo en el cliente?
Completa la creación server-side del vehículo y la espera a que exista antes de obtener su netId.
local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, true)while not (veh) do Wait(0) endlocal 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 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 = sourcePista
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:
