Script de trenes para FiveM: rutas y estaciones personalizadas
Da vida a los trenes en FiveM con rutas personalizadas, locomotoras controlables y asientos para pasajeros. Descubre los mejores scripts de trenes.
Agency Scripts
Fundador y desarrollador principal en Agency Scripts
El transporte público como infraestructura del servidor
Un sistema de trenes y transporte público transforma tu servidor de FiveM, de una ciudad centrada en los coches a un área metropolitana viva con transporte colectivo funcional. Los trenes que circulan según horarios por la red ferroviaria existente de GTA, los autobuses que siguen rutas por las calles de la ciudad y las estaciones de metro que ofrecen viajes rápidos entre distritos contribuyen a crear un mundo que parece realmente vivo. El transporte público beneficia a todos los jugadores del servidor, sin importar su riqueza o trabajo. Los nuevos jugadores que no pueden permitirse un coche pueden tomar el autobús para llegar a sus puestos de trabajo. Los jugadores con experiencia usan el metro durante las horas punta para evitar las carreteras congestionadas. Los jugadores criminales usan el transporte público para desplazarse por la ciudad sin un vehículo personal rastreable. El sistema de transporte también crea oportunidades de trabajo únicas para conductores de autobús, maquinistas y empleados de la autoridad de transporte, que mantienen los horarios, cobran tarifas y gestionan incidentes en la red. Desde el punto de vista técnico, los trenes y autobuses que circulan por rutas constantes llenan el mundo de entidades en movimiento, lo que hace que la ciudad parezca concurrida sin requerir más jugadores conectados.
Configuración de rutas y horarios de trenes
GTA V tiene una red ferroviaria integrada que rodea el mapa, y tu sistema de trenes debería aprovechar estas vías existentes para maximizar la compatibilidad. Define las rutas de tren como secuencias de paradas, con horas de llegada y salida calculadas según la velocidad media del tren entre estaciones. Cada estación necesita una zona de andén donde los jugadores puedan subir y bajar, un punto de interacción con una máquina expendedora de billetes y paneles que muestren las próximas llegadas. Configura varios servicios de tren que circulen simultáneamente por distintos tramos de la red, con horarios que se repitan en un ciclo configurable que coincida con la progresión de día y noche de tu servidor:
Config.TrainSystem = {
ticketPrice = 50,
speedMultiplier = 1.0,
despawnDistance = 500.0,
announceArrival = true,
announceDeparture = true,
}
Config.TrainRoutes = {
['metro_line_1'] = {
label = 'Metro Line 1 - City Loop',
model = 'metrotrain',
carriages = 3,
frequency = 300, -- seconds between departures
stations = {
{
name = 'Los Santos Central',
coords = vector3(268.09, -1204.28, 38.90),
platform = vector3(264.55, -1200.12, 38.90),
stopDuration = 20,
announceText = 'Now arriving at Los Santos Central Station',
},
{
name = 'Strawberry',
coords = vector3(36.81, -1393.78, 29.36),
platform = vector3(40.22, -1389.45, 29.36),
stopDuration = 15,
announceText = 'Now arriving at Strawberry Station',
},
{
name = 'Del Perro',
coords = vector3(-1359.88, -474.17, 15.02),
platform = vector3(-1355.44, -470.89, 15.02),
stopDuration = 15,
announceText = 'Now arriving at Del Perro Station',
},
{
name = 'Rockford Hills',
coords = vector3(-512.47, -680.33, 33.42),
platform = vector3(-508.12, -676.88, 33.42),
stopDuration = 15,
announceText = 'Now arriving at Rockford Hills Station',
},
{
name = 'Burton',
coords = vector3(-283.66, -324.78, 10.07),
platform = vector3(-279.33, -321.44, 10.07),
stopDuration = 15,
announceText = 'Now arriving at Burton Station',
},
},
},
}
Config.BusRoutes = {
['route_1'] = {
label = 'Route 1 - Downtown Express',
model = 'bus',
frequency = 180,
stops = {
{ name = 'Legion Square', coords = vector3(208.24, -935.88, 30.69),
stopDuration = 12 },
{ name = 'Pillbox Hospital', coords = vector3(311.44, -592.33, 43.29),
stopDuration = 12 },
{ name = 'Alta Street', coords = vector3(-226.87, -381.44, 30.05),
stopDuration = 12 },
{ name = 'Vinewood Blvd', coords = vector3(302.33, 193.67, 104.38),
stopDuration = 12 },
},
},
}
El frequency value determina la frecuencia con la que sale un nuevo tren de la primera estación de la ruta. Varios trenes pueden circular simultáneamente por la misma ruta, separados por el intervalo de frecuencia. El stopDuration en cada estación da a los jugadores tiempo suficiente para subir o bajar, con un anuncio de audio cuando llega el tren y un aviso sonoro de salida unos segundos antes de que parta.
Generación y movimiento de entidades de tren
Generar y controlar trenes en FiveM requiere funciones native específicas que difieren del manejo de vehículos normales. Usa CreateMissionTrain para generar trenes en la red ferroviaria, lo que los coloca automáticamente en la vía más cercana y gestiona la física de circulación sobre raíles. Controla la velocidad del tren con SetTrainSpeed y SetTrainCruiseSpeedy haz que se detenga en las estaciones reduciendo gradualmente la velocidad a medida que se acerca a las coordenadas del andén. El tren debe detenerse justo en la posición del andén para que las puertas queden alineadas con las zonas de embarque, lo que requiere calcular cuidadosamente la reducción de velocidad según la distancia a la siguiente estación:
local activeTrains = {}
function SpawnTrain(routeId)
local route = Config.TrainRoutes[routeId]
if not route then return end
local firstStation = route.stations[1]
local variation = 24 -- metro train variation
-- Create the mission train
local train = CreateMissionTrain(variation, firstStation.coords.x,
firstStation.coords.y, firstStation.coords.z, true)
if not DoesEntityExist(train) then
print('[Transit] Failed to spawn train for route: ' .. routeId)
return
end
SetTrainSpeed(train, 0.0)
SetTrainCruiseSpeed(train, 0.0)
SetEntityAsMissionEntity(train, true, true)
-- Store train state
activeTrains[routeId] = {
entity = train,
route = route,
currentStation = 1,
state = 'stopped', -- stopped, departing, moving, arriving
stateTimer = GetGameTimer(),
passengers = {},
}
return train
end
-- Train movement controller
CreateThread(function()
while true do
for routeId, trainData in pairs(activeTrains) do
local train = trainData.entity
if not DoesEntityExist(train) then
activeTrains[routeId] = nil
goto continue
end
local station = trainData.route.stations[trainData.currentStation]
local elapsed = GetGameTimer() - trainData.stateTimer
if trainData.state == 'stopped' then
if elapsed >= (station.stopDuration * 1000) then
-- Depart from station
trainData.state = 'departing'
trainData.stateTimer = GetGameTimer()
AnnounceToPassengers(trainData, 'Doors closing. Next stop: '
.. GetNextStationName(trainData))
end
elseif trainData.state == 'departing' then
local speed = math.min(15.0, elapsed * 0.005)
SetTrainCruiseSpeed(train, speed)
SetTrainSpeed(train, speed)
if speed >= 15.0 then
trainData.state = 'moving'
end
elseif trainData.state == 'moving' then
local nextIdx = trainData.currentStation + 1
if nextIdx > #trainData.route.stations then
nextIdx = 1
end
local nextStation = trainData.route.stations[nextIdx]
local trainCoords = GetEntityCoords(train)
local dist = #(trainCoords - nextStation.coords)
if dist < 200.0 then
trainData.state = 'arriving'
trainData.stateTimer = GetGameTimer()
AnnounceToPassengers(trainData, nextStation.announceText)
end
elseif trainData.state == 'arriving' then
local nextIdx = trainData.currentStation + 1
if nextIdx > #trainData.route.stations then
nextIdx = 1
end
local nextStation = trainData.route.stations[nextIdx]
local trainCoords = GetEntityCoords(train)
local dist = #(trainCoords - nextStation.coords)
-- Gradually slow down
local speed = math.max(0.0, dist * 0.08)
SetTrainCruiseSpeed(train, speed)
SetTrainSpeed(train, speed)
if dist < 3.0 then
SetTrainSpeed(train, 0.0)
SetTrainCruiseSpeed(train, 0.0)
trainData.currentStation = nextIdx
trainData.state = 'stopped'
trainData.stateTimer = GetGameTimer()
end
end
:continue:
end
Wait(100)
end
end)
Embarque de pasajeros y venta de billetes
Cuando un tren se detenga en una estación, muestra indicaciones de interacción a los jugadores cercanos para que puedan subir. Comprueba que el jugador tenga un billete o un pase de transporte válido antes de permitirle subir. Los billetes se pueden comprar en las máquinas expendedoras de cada estación mediante una interfaz NUI sencilla que muestre las rutas y los precios disponibles. Una vez a bordo, teletransporta al jugador al interior del vagón y establece su posición relativa a la entidad del tren para que se mueva con él. Los interiores de tren integrados en GTA sirven para implementaciones básicas, pero los interiores personalizados mediante objetos adjuntos o instancias ofrecen una mejor experiencia, con asientos, zonas para ir de pie y ventanas desde las que se ve el paisaje pasar. Registra en qué estación subió cada pasajero para que el sistema pueda calcular diferencias de tarifa según la distancia. Muestra el nombre de la próxima estación y la hora estimada de llegada dentro del vagón mediante un elemento de texto 3D o una pantalla NUI adjunta que se actualice a medida que el tren avanza por su ruta.
Sistema de autobuses y conductores NPC
Los autobuses complementan la red ferroviaria al cubrir las zonas a las que no llega el tren. Genera autobuses conducidos por NPC que sigan rutas predefinidas por las calles de la ciudad y se detengan en paradas señalizadas para recoger y dejar pasajeros. El conductor NPC usa el sistema de tareas de GTA para desplazarse entre paradas mediante TaskVehicleDriveToCoordLongrange con las opciones de conducción adecuadas para respetar las normas de tráfico y detenerse en los lugares designados. En cada parada, el autobús espera el tiempo configurado mientras los jugadores suben o bajan; después, el conductor NPC continúa hasta la siguiente parada. Muestra información de la ruta en los objetos de las paradas de autobús, como el número de ruta, el destino y el tiempo de espera estimado hasta la llegada del siguiente autobús. Para una variante conducida por jugadores, permite que los jugadores con el trabajo de autoridad de transporte conduzcan autobuses manualmente y ganen una paga por cada pasajero transportado, además de una paga adicional por cumplir el horario.
Mapa de transporte e interfaz de estaciones
Crea un mapa de transporte al que los jugadores puedan acceder desde su teléfono, los quioscos de las estaciones o las pantallas de las paradas de autobús. El mapa debe mostrar todas las rutas activas con colores distintos para cada línea, las ubicaciones de las estaciones con indicadores de transbordo donde se conecten varias líneas y las posiciones de los trenes en tiempo real, actualizadas cada pocos segundos. La interfaz de los quioscos de las estaciones debe mostrar la hora actual, las próximas llegadas de cada línea que pase por esa estación, las interrupciones o los retrasos del servicio y una interfaz para comprar billetes. Implementa el mapa de transporte como una superposición NUI que represente la red ferroviaria de forma esquemática en lugar de geográfica, de manera similar a los mapas de metro reales que priorizan la claridad por encima de la precisión geográfica. Añade indicadores en tiempo real que muestren la posición actual de cada tren como un punto en movimiento a lo largo de la línea de su ruta, para que los jugadores sepan de inmediato cuánto deben esperar al siguiente servicio.
Sistema de tarifas y pases de transporte
Implementa un sistema de tarifas por niveles con billetes de un solo trayecto, pases de un día y abonos mensuales. Los billetes individuales cuestan la tarifa base y caducan después de un viaje. Los pases de un día permiten viajes ilimitados durante veinticuatro horas dentro del juego, por un precio fijo que resulta más económico a partir de tres o cuatro viajes. Los abonos mensuales ofrecen el mejor precio por viaje para quienes usan el transporte con regularidad y se guardan como un objeto en el inventario del jugador con una fecha de caducidad. Valida las tarifas en los accesos de las estaciones mediante interacciones target en los torniquetes y en los autobuses mediante la interacción con el conductor al subir. Para las tarifas basadas en la distancia, calcula el precio cuando baje el pasajero, según el número de estaciones recorridas. Los jugadores sin billetes válidos a los que sorprendan durante inspecciones aleatorias realizadas por empleados de la autoridad de transporte reciben multas, lo que añade mecánicas de cumplimiento para el trabajo de la autoridad de transporte.
Rendimiento y sincronización
Los trenes y autobuses son entidades grandes que deben sincronizarse en todos los clientes, por lo que estas funciones requieren optimización cuidadosa para no afectar al rendimiento. Usa la gestión de estado del servidor para controlar las posiciones de los trenes y transmitir actualizaciones a los clientes, de modo que cada cliente represente la entidad del tren localmente según las coordenadas recibidas. Elimina las entidades de tren de los jugadores que estén lejos de cualquier estación o vía para reducir la carga de renderizado, y genéralas solo cuando un jugador se acerque a la red ferroviaria. Los conductores NPC de autobús solo deben recibir tareas activas cuando haya jugadores cerca; los autobuses lejanos deben usar una interpolación de posición simplificada en lugar del sistema completo de búsqueda de rutas de la IA. Limita el número total de entidades de tren y autobús simultáneas en el servidor para evitar que el rendimiento se degrade durante las horas punta. Espacia las salidas de distintas rutas para que no se generen varios vehículos a la vez. Elimina todas las entidades de transporte al reiniciar el recurso e implementa una lógica de recuperación que recalcule las posiciones de los trenes según el horario cuando se inicie el recurso, para que los trenes aparezcan de inmediato en las ubicaciones correctas en lugar de salir siempre de la primera estación.