ब्लॉग पर वापस
Guide10 मिनट पढ़ें

FiveM ट्रेन सिस्टम स्क्रिप्ट: कस्टम रेल रूट्स और स्टेशन

FiveM में ट्रेनों को जीवंत बनाएं। कस्टम रूट, नियंत्रित इंजन, यात्री सीटें और इमर्सिव ट्रांसपोर्ट रोलप्ले के लिए सर्वश्रेष्ठ ट्रेन स्क्रिप्ट।

Agency Scripts

Agency Scripts के संस्थापक और प्रमुख डेवलपर

सार्वजनिक परिवहन के रूप में सर्वर इन्फ्रास्ट्रक्चर

एक ट्रेन और सार्वजनिक परिवहन प्रणाली आपके FiveM सर्वर को एक कार-केंद्रित शहर से एक जीवंत महानगरीय क्षेत्र में बदल देती है जिसमें कार्यात्मक मास ट्रांजिट होता है। GTA के मौजूदा रेल नेटवर्क पर अनुसूची के अनुसार चलने वाली ट्रेनें, शहर की सड़कों के माध्यम से मार्गों का पालन करने वाली बसें, और जिलों के बीच तेज यात्रा प्रदान करने वाले मेट्रो स्टेशन सभी एक ऐसी दुनिया में योगदान करते हैं जो वास्तव में जीवंत महसूस होती है। सार्वजनिक परिवहन सर्वर पर हर खिलाड़ी के लिए लाभकारी है चाहे उनकी संपत्ति या नौकरी कुछ भी हो। नए खिलाड़ी जो कार खरीदने में सक्षम नहीं हैं, वे बस से नौकरी स्थानों तक जा सकते हैं। अनुभवी खिलाड़ी भीड़-भाड़ वाले ट्रैफिक के दौरान मेट्रो का उपयोग करते हैं ताकि जाम से बचा जा सके। आपराधिक खिलाड़ी बिना ट्रेस योग्य व्यक्तिगत वाहन के शहर में घूमने के लिए परिवहन का उपयोग करते हैं। परिवहन प्रणाली खिलाड़ी-चालित बस ड्राइवरों, ट्रेन कंडक्टरों, और ट्रांजिट प्राधिकरण कर्मचारियों के लिए अनूठे नौकरी अवसर भी बनाती है जो अनुसूचियां बनाए रखते हैं, किराया एकत्र करते हैं, और नेटवर्क पर घटनाओं का प्रबंधन करते हैं। तकनीकी दृष्टिकोण से, लगातार मार्गों पर चलने वाली ट्रेनें और बसें दुनिया को चलती हुई एंटिटीज़ से भरती हैं जो शहर को व्यस्त महसूस कराती हैं बिना अतिरिक्त खिलाड़ी संख्या की आवश्यकता के।

ट्रेन रूट और शेड्यूल कॉन्फ़िगरेशन

GTA V में एक अंतर्निर्मित रेलवे नेटवर्क है जो मानचित्र के चारों ओर घुमावदार है, और आपका ट्रेन सिस्टम अधिकतम संगतता के लिए इन मौजूदा ट्रैकों का लाभ उठाना चाहिए। ट्रेन मार्गों को स्टेशन स्टॉप्स के अनुक्रम के रूप में परिभाषित करें जिनमें आगमन और प्रस्थान समय ट्रेन की औसत गति के आधार पर गणना की जाती है। प्रत्येक स्टेशन को एक प्लेटफ़ॉर्म ज़ोन की आवश्यकता होती है जहां खिलाड़ी चढ़ते और उतरते हैं, एक टिकट मशीन इंटरैक्शन पॉइंट, और आने वाले आगमन दिखाने वाले डिस्प्ले बोर्ड। कई ट्रेन सेवाओं को कॉन्फ़िगर करें जो नेटवर्क के विभिन्न खंडों पर एक साथ चलती हैं, जिनकी टाइमटेबल्स आपके सर्वर के दिन-रात प्रगति के अनुरूप कॉन्फ़िगर करने योग्य चक्र पर दोहराई जाती हैं:

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 },
        },
    },
}

यह frequency मान निर्धारित करता है कि एक नई ट्रेन मार्ग के पहले स्टेशन से कितनी बार प्रस्थान करती है। एक ही मार्ग पर एक साथ कई ट्रेनें संचालित हो सकती हैं, जो आवृत्ति अंतराल द्वारा spaced होती हैं। stopDuration प्रत्येक स्टेशन पर खिलाड़ियों को चढ़ने या उतरने के लिए पर्याप्त समय देता है, जब ट्रेन आती है तो एक ऑडियो घोषणा चलती है और ट्रेन के जाने से कुछ सेकंड पहले प्रस्थान चेतावनी घंटी बजती है।

ट्रेन एंटिटी स्पॉनिंग और मूवमेंट

FiveM में ट्रेनों को स्पॉन करना और नियंत्रित करना विशिष्ट नेटिव फंक्शंस की मांग करता है जो सामान्य वाहन हैंडलिंग से भिन्न होते हैं। उपयोग करें CreateMissionTrain रेल नेटवर्क पर ट्रेनें स्पॉन करने के लिए, जो उन्हें स्वचालित रूप से निकटतम ट्रैक पर रखता है और रेल फॉलोइंग भौतिकी को संभालता है। ट्रेन की गति नियंत्रित करें SetTrainSpeed और SetTrainCruiseSpeedऔर प्लेटफॉर्म निर्देशांक के पास पहुंचने पर गति को धीरे-धीरे कम करके ट्रेनों को स्टेशनों पर रोकें। ट्रेन को प्लेटफॉर्म स्थिति पर ठीक रुकना चाहिए ताकि दरवाजे बोर्डिंग क्षेत्रों के साथ संरेखित हों, जिसके लिए अगले स्टेशन की दूरी के आधार पर गति में सावधानीपूर्वक कमी की गणना आवश्यक है:

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)

यात्री बोर्डिंग और टिकटिंग

जब ट्रेन स्टेशन पर रुकती है, तो निकटवर्ती खिलाड़ियों को चढ़ने की अनुमति देने के लिए इंटरैक्शन प्रॉम्प्ट दिखाएं। चेक करें कि खिलाड़ी के पास वैध टिकट या ट्रांजिट पास है या नहीं। टिकट प्रत्येक स्टेशन पर टिकट मशीन प्रॉप्स से खरीदे जा सकते हैं, एक सरल NUI इंटरफ़ेस के माध्यम से जो उपलब्ध मार्ग और कीमतें दिखाता है। एक बार चढ़ने के बाद, खिलाड़ी को ट्रेन के डिब्बे के अंदर टेलीपोर्ट करें और उनकी स्थिति ट्रेन इकाई के सापेक्ष सेट करें ताकि वे इसके साथ चलें। GTA के अंतर्निर्मित ट्रेन इंटीरियर्स बुनियादी कार्यान्वयन के लिए काम करते हैं, लेकिन संलग्न वस्तुओं या इंस्टेंस का उपयोग करके कस्टम इंटीरियर्स बेहतर अनुभव प्रदान करते हैं जिसमें बैठने, खड़े होने के क्षेत्र, और खिड़कियाँ होती हैं जो गुजरते दृश्य दिखाती हैं। ट्रैक करें कि प्रत्येक यात्री किस स्टेशन पर चढ़ा ताकि सिस्टम दूरी-आधारित मूल्य निर्धारण के लिए किराया अंतर की गणना कर सके। डिब्बे के अंदर अगले स्टेशन का नाम और अनुमानित आगमन समय 3D टेक्स्ट एलिमेंट या संलग्न NUI डिस्प्ले के माध्यम से दिखाएं जो ट्रेन के मार्ग पर प्रगति के साथ अपडेट होता है।

बस सिस्टम और NPC ड्राइवर

बसें ट्रेन नेटवर्क को पूरक बनाती हैं जो उन क्षेत्रों को कवर करती हैं जहाँ रेल नहीं पहुँचती। NPC-चालित बसें उत्पन्न करें जो शहर की सड़कों के माध्यम से पूर्वनिर्धारित मार्गों का पालन करती हैं, चिह्नित बस स्टॉप पर रुकती हैं ताकि खिलाड़ी चढ़ सकें और उतर सकें। NPC ड्राइवर GTA के टास्क सिस्टम का उपयोग करता है स्टॉप्स के बीच नेविगेट करने के लिए TaskVehicleDriveToCoordLongrange यातायात नियमों का पालन करने और निर्दिष्ट स्थानों पर रुकने के लिए उपयुक्त ड्राइविंग फ्लैग्स के साथ। प्रत्येक स्टॉप पर, बस एक निर्धारित अवधि के लिए इंतजार करती है जबकि खिलाड़ी चढ़ते या उतरते हैं, फिर NPC ड्राइवर अगले स्टॉप पर जाता है। बस स्टॉप प्रॉप्स पर मार्ग संख्या, गंतव्य और अगले बस के आने तक अनुमानित प्रतीक्षा समय दिखाएं। खिलाड़ी-संचालित संस्करण के लिए, ट्रांजिट अथॉरिटी नौकरी वाले खिलाड़ियों को बसें मैन्युअल रूप से चलाने की अनुमति दें, प्रति यात्री परिवहन के लिए वेतन कमाएं और समय पालन के लिए बोनस वेतन प्राप्त करें।

ट्रांजिट मैप और स्टेशन UI

एक ट्रांजिट मैप बनाएं जिसे खिलाड़ी अपने फोन, स्टेशन कियोस्क या बस स्टॉप डिस्प्ले से एक्सेस कर सकें। मैप सभी सक्रिय रूट्स को लाइन के अनुसार रंग-कोडित दिखाए, स्टेशन स्थानों को इंटरचेंज संकेतकों के साथ जहाँ कई लाइनें जुड़ती हैं, और वास्तविक समय ट्रेन की स्थिति हर कुछ सेकंड में अपडेट हो। कियोस्क पर स्टेशन UI वर्तमान समय, प्रत्येक लाइन के अगले आगमन, किसी भी सेवा व्यवधान या देरी, और टिकट खरीद इंटरफ़ेस दिखाए। ट्रांजिट मैप को एक NUI ओवरले के रूप में लागू करें जो रेल नेटवर्क को भौगोलिक रूप से नहीं बल्कि योजनाबद्ध रूप से प्रस्तुत करता है, वास्तविक दुनिया के मेट्रो मानचित्रों की तरह जो स्पष्टता को भौगोलिक सटीकता पर प्राथमिकता देते हैं। प्रत्येक ट्रेन की वर्तमान स्थिति को उसके मार्ग लाइन पर एक चलती बिंदु के रूप में दिखाने वाले वास्तविक समय संकेतक जोड़ें, जिससे खिलाड़ियों को अगली सेवा के लिए इंतजार करने का समय तुरंत पता चले।

किराया प्रणाली और ट्रांज़िट पास

एक स्तरित किराया प्रणाली लागू करें जिसमें सिंगल-राइड टिकट, डे पास, और मासिक सदस्यताएँ शामिल हों। सिंगल टिकट बेस किराया लागत करते हैं और एक यात्रा के बाद समाप्त हो जाते हैं। डे पास चौबीस इन-गेम घंटों के लिए असीमित सवारी की अनुमति देते हैं, एक निश्चित कीमत पर जो तीन या चार यात्राओं के बाद आर्थिक हो जाती है। मासिक पास नियमित यात्रियों के लिए प्रति सवारी सबसे अच्छा मूल्य प्रदान करते हैं और खिलाड़ी के इन्वेंटरी में एक आइटम के रूप में संग्रहीत होते हैं जिसमें समाप्ति समय होता है। स्टेशन प्रवेश द्वारों पर टर्नस्टाइल प्रॉप्स पर टारगेट इंटरैक्शन का उपयोग करके किराए की पुष्टि करें, और बसों में बोर्डिंग के समय ड्राइवर इंटरैक्शन के माध्यम से। दूरी-आधारित मूल्य निर्धारण के लिए, यात्री के बाहर निकलने पर यात्रा किए गए स्टेशनों की संख्या के आधार पर किराया गणना करें। जिन खिलाड़ियों के पास वैध टिकट नहीं है और जो ट्रांज़िट प्राधिकरण कर्मचारियों द्वारा यादृच्छिक निरीक्षण के दौरान पकड़े जाते हैं, उन्हें जुर्माना मिलता है, जो ट्रांज़िट प्राधिकरण नौकरी के लिए प्रवर्तन गेमप्ले जोड़ता है।

प्रदर्शन और सिंक्रोनाइज़ेशन

ट्रेन और बस बड़े एंटिटी हैं जिन्हें सभी क्लाइंट्स में सिंक्रोनाइज़ करना होता है, जिससे ये प्रदर्शन-संवेदनशील फीचर्स बन जाते हैं जिनके लिए सावधानीपूर्वक अनुकूलन आवश्यक है। ट्रेन की स्थिति नियंत्रित करने और क्लाइंट्स को अपडेट प्रसारित करने के लिए सर्वर-साइड स्टेट मैनेजमेंट का उपयोग करें, जिससे प्रत्येक क्लाइंट प्राप्त निर्देशांकों के आधार पर स्थानीय रूप से ट्रेन एंटिटी को रेंडर कर सके। उन खिलाड़ियों के लिए जो किसी स्टेशन या रेल लाइन से दूर हैं, ट्रेन एंटिटी को डिस्पॉन करें ताकि रेंडरिंग ओवरहेड कम हो, और केवल तब स्पॉन करें जब कोई खिलाड़ी रेल नेटवर्क के आसपास प्रवेश करे। बस एनपीसी ड्राइवरों को केवल तब सक्रिय रूप से कार्य सौंपा जाना चाहिए जब खिलाड़ी नजदीक हों, दूर की बसें पूर्ण एआई पाथफाइंडिंग के बजाय सरल स्थिति इंटरपोलेशन का उपयोग करें। प्रदर्शन गिरावट को रोकने के लिए सर्वर पर कुल समवर्ती ट्रेन और बस एंटिटी की संख्या सीमित करें। विभिन्न मार्गों पर प्रस्थान समय को stagger करें ताकि कई वाहन एक साथ स्पॉन न हों। रिसोर्स रिस्टार्ट पर सभी ट्रांजिट एंटिटीज़ को साफ करें और रिसोर्स शुरू होने पर टाइमटेबल के आधार पर ट्रेन की स्थिति पुनर्गणना करने वाली रिकवरी लॉजिक लागू करें, ताकि ट्रेनें हर बार पहले स्टेशन से शुरू होने के बजाय सही स्थानों पर तुरंत दिखाई दें।

शुरू करने के लिए तैयार?

हमारी शॉप से स्क्रिप्ट लें, या सपोर्ट, अपडेट और आगे आने वाली चीज़ों की झलक के लिए Discord से जुड़ें।