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.
-- 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
-- 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¿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 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) endPista
Primero se crea, luego se confirma que existe, después se saca el netId y por último se avisa al cliente.
Completa el cliente: resuelve el netId a su entidad local y mete al jugador dentro.
RegisterNetEvent('garaje:client:setOwner')AddEventHandler('garaje:client:setOwner', function(netId) local veh = (netId) if DoesEntityExist(veh) then TaskWarpPedIntoVehicle((), veh, -1) endend)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:
