FiveM Tren Sistemi Scripti: Özel Raylı Güzergahlar ve İstasyonlar
FiveM'de trenlere hayat verin. Özel rotalar, kontrol edilebilir lokomotifler, yolcu koltukları ve sürükleyici taşımacılık rolü için en iyi tren scriptleri.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Sunucu Altyapısı Olarak Toplu Taşıma
Tren ve toplu taşıma sistemi, FiveM sunucunuzu otomobil odaklı bir şehirden işlevsel bir toplu taşımaya sahip yaşayan bir metropole dönüştürür. GTA'nın mevcut demiryolu ağı boyunca tarifelere göre çalışan trenler, şehir sokaklarındaki güzergahları takip eden otobüsler ve bölgeler arasında hızlı seyahat sağlayan metro istasyonları, gerçekten canlı hissettiren bir dünyaya katkıda bulunur. Toplu taşıma, serveti veya mesleği ne olursa olsun sunucudaki her oyuncuya fayda sağlar. Araba almaya gücü yetmeyen yeni oyuncular, iş yerlerine ulaşmak için otobüse binebilir. Deneyimli oyuncular, yoğun trafikte sıkışık yollardan kaçınmak için metroyu kullanır. İllegal oyuncular ise takip edilebilir kişisel bir araç olmadan şehirde dolaşmak için toplu taşımayı tercih eder. Taşıma sistemi ayrıca tarifeleri koruyan, ücret toplayan ve ağdaki olayları yöneten oyuncular tarafından işletilen otobüs şoförleri, tren kondüktörleri ve toplu taşıma personeli için benzersiz meslek fırsatları sunar. Teknik açıdan bakıldığında, düzenli güzergahlarda çalışan trenler ve otobüsler, ek oyuncu sayısına ihtiyaç duymadan dünyayı hareketli varlıklarla doldurarak şehrin kalabalık hissedilmesini sağlar.
Tren Rotası ve Sefer Saatleri Yapılandırması
GTA V, haritayı çevreleyen yerleşik bir demiryolu ağına sahiptir ve tren sisteminiz maksimum uyumluluk için mevcut bu raylardan yararlanmalıdır. Tren rotalarını, istasyonlar arasındaki trenin ortalama hızından hesaplanan varış ve kalkış saatleriyle birlikte hat boyunca bir dizi istasyon durağı olarak tanımlayın. Her istasyon için oyuncuların binip indiği bir peron bölgesi, bir bilet makinesi etkileşim noktası ve yaklaşan trenleri gösteren bilgi panoları gerekir. Sunucunuzun gece gündüz ilerleyişiyle eşleşen yapılandırılabilir bir döngüde tekrarlanan sefer saatleriyle, ağın farklı bölümlerinde aynı anda çalışan birden fazla tren seferi yapılandırın:
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 },
},
},
}
The frequency değeri, güzergahtaki ilk istasyondan yeni bir trenin ne sıklıkla kalkacağını belirler. Birden fazla tren, frekans aralığı ile ayrılarak aynı güzergahta aynı anda çalışabilir. stopDuration her istasyonda oyunculara binmeleri veya inmeleri için yeterli zaman tanır; tren vardığında sesli bir anons çalar ve hareket etmeden birkaç saniye önce bir kalkış uyarı sesi duyulur.
Tren Entity Spawn ve Hareketi
FiveM üzerinde tren spawn etmek ve kontrol etmek, normal araç kullanımından farklı belirli native fonksiyonlar gerektirir. Şunu kullanın: CreateMissionTrain trenleri demiryolu ağı üzerinde spawn etmek için; bu işlem trenleri otomatik olarak en yakın raya yerleştirir ve ray takip fiziğini yönetir. Tren hızını şununla kontrol edin: SetTrainSpeed ve SetTrainCruiseSpeed, ve peron koordinatlarına yaklaştıkça hızlarını kademeli olarak azaltarak trenleri istasyonlarda durdurun. Kapıların biniş alanlarıyla hizalanması için trenin peron konumunda tam olarak durması gerekir, bu da bir sonraki istasyona olan mesafeye göre dikkatli hız azaltma hesaplamaları gerektirir:
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)
Yolcu Binişi ve Biletleme
Bir tren istasyonda durduğunda, yakındaki oyunculara trene binmelerini sağlayan etkileşim istemleri gösterin. Oyuncunun binmesine izin vermeden önce geçerli bir bileti veya toplu taşıma kartı olup olmadığını kontrol edin. Biletler, her istasyondaki bilet makinesi prop'larından, mevcut rotaları ve fiyatları gösteren basit bir NUI arayüzü kullanılarak satın alınabilir. Trene bindikten sonra oyuncuyu vagonun içine ışınlayın ve trenle birlikte hareket etmesi için konumunu tren entity'sine göre sabitleyin. GTA'nın yerleşik tren iç mekanları temel uygulamalar için çalışır, ancak bağlı nesneler veya instance'lar kullanan özel iç mekanlar oturma alanları, ayakta durma alanları ve geçen manzarayı gösteren pencerelerle daha iyi bir deneyim sunar. Sistemin mesafeye dayalı fiyatlandırma için ücret farklarını hesaplayabilmesi amacıyla her yolcunun hangi istasyonda bindiğini takip edin. Tren güzergahı boyunca ilerledikçe güncellenen bir 3D metin öğesi veya ekli NUI ekranı aracılığıyla vagonun içinde bir sonraki istasyon adını ve tahmini varış süresini görüntüleyin.
Otobüs Sistemi ve NPC Sürücüler
Otobüsler, demiryolunun ulaşamadığı bölgeleri kapsayarak tren ağını tamamlar. Şehir sokaklarında önceden belirlenmiş rotaları takip eden, oyuncuları almak ve indirmek için işaretli otobüs duraklarında duran NPC kontrollü otobüsler oluşturun. NPC sürücüsü, duraklar arasında gezinmek için GTA'nın görev sistemini kullanır: TaskVehicleDriveToCoordLongrange trafik kurallarına uymak ve belirlenen yerlerde durmak için uygun sürüş flagleri ile. Her durakta otobüs, oyuncular binerken veya inerken yapılandırılan süre boyunca bekler, ardından NPC sürücü bir sonraki durağa devam eder. Otobüs durağı proplarında hat numarasını, varış noktasını ve bir sonraki otobüs gelene kadar tahmini bekleme süresini gösteren hat bilgilerini görüntüleyin. Oyuncuların işlettiği bir varyant için, transit authority mesleğine sahip oyuncuların otobüsleri manuel olarak sürmesine, taşınan yolcu başına ücret ve sefer saatlerine uyum sağladıkları için bonus ödeme kazanmalarına izin verin.
Toplu Taşıma Haritası ve İstasyon Arayüzü
Oyuncuların telefonlarından, istasyon büfelerinden veya otobüs durağı ekranlarından erişebilecekleri bir toplu taşıma haritası oluşturun. Harita: hatta göre renk kodlu tüm aktif güzergahları, birden fazla hattın bağlandığı aktarma göstergelerine sahip istasyon konumlarını ve birkaç saniyede bir güncellenen gerçek zamanlı tren konumlarını göstermelidir. Büfelerdeki istasyon UI arayüzü: geçerli saati, o istasyona hizmet veren her hat için sonraki varışları, olası sefer aksaklıklarını veya gecikmeleri ve bilet satın alma arayüzünü görüntülemelidir. Toplu taşıma haritasını, coğrafi doğruluk yerine netliği ön planda tutan gerçek dünyadaki metro haritalarına benzer şekilde, demiryolu ağını coğrafi olarak değil şematik olarak işleyen bir NUI katmanı olarak uygulayın. Her trenin mevcut konumunu güzergah çizgisi boyunca hareket eden bir nokta olarak gösteren gerçek zamanlı göstergeler ekleyin, böylece oyunculara bir sonraki sefer için ne kadar beklemeleri gerektiği konusunda anında geri bildirim sağlayın.
Ücret Sistemi ve Toplu Taşıma Kartları
Tek binişlik biletler, günlük kartlar ve aylık abonelikler içeren kademeli bir ücret sistemi uygulayın. Tek binişlik biletler taban fiyata mal olur ve tek bir yolculuktan sonra geçerliliğini yitirir. Günlük kartlar, üç veya dört yolculuktan sonra ekonomik hale gelen sabit bir fiyatla oyun içi yirmi dört saat boyunca sınırsız biniş hakkı tanır. Aylık kartlar, düzenli seyahat edenler için biniş başına en iyi değeri sunar ve son kullanma zaman damgasıyla oyuncunun envanterinde bir eşya olarak saklanır. Ücretleri istasyon giriş turnikelerinde hedef etkileşimlerini kullanarak, otobüslerde ise binerken sürücü etkileşimiyle doğrulayın. Mesafeye dayalı fiyatlandırma için ücreti, yolcu inerken katedilen istasyon sayısına göre hesaplayın. Ulaşım yetkililerinin rastgele denetimlerinde geçerli bileti olmadan yakalanan oyuncular ceza alır; bu da ulaşım kurumu mesleğine denetim oynanışı kazandırır.
Performans ve Senkronizasyon
Trenler ve otobüsler, tüm istemciler arasında senkronize edilmesi gereken büyük entity'lerdir; bu da onları dikkatli optimizasyon gerektiren, performansa duyarlı özellikler haline getirir. Tren konumlarını kontrol etmek ve istemcilere güncellemeleri yayınlamak için sunucu taraflı state management kullanın: her istemcinin tren entity'sini alınan koordinatlara göre yerel olarak render etmesini sağlayın. Render yükünü azaltmak için herhangi bir istasyondan veya demiryolu hattından uzaktaki oyuncular adına tren entity'lerini despawn edin ve bunları yalnızca bir oyuncu demiryolu ağının yakınına geldiğinde spawn edin. Otobüs NPC sürücüleri yalnızca oyuncular yakındayken aktif olarak görevlendirilmeli, uzaktaki otobüsler tam AI pathfinding yerine basitleştirilmiş konum interpolasyonu kullanmalıdır. Yoğun saatlerde performans düşüşünü önlemek için sunucu genelindeki eşzamanlı tren ve otobüs entity sayısını sınırlandırın. Birden fazla aracın aynı anda spawn olmasını engellemek için farklı rotalardaki kalkış saatlerini kademelendirin. Resource yeniden başlatıldığında tüm transit entity'lerini temizleyin ve resource başladığında tren konumlarını zaman çizelgesine göre yeniden hesaplayan bir kurtarma mantığı uygulayın: böylece trenler her seferinde ilk istasyondan başlamak yerine doğrudan doğru konumlarda görünür.