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

FiveM टैक्सी सिस्टम: NPC और खिलाड़ी कैब ड्राइवरों के लिए स्क्रिप्टिंग

FiveM में एक कार्यशील टैक्सी प्रणाली जोड़ें। NPC टैक्सी, खिलाड़ी ड्राइवर, किराया तर्क, मीटर और जीवंत रोलप्ले शहरों के लिए शीर्ष टैक्सी स्क्रिप्ट।

Agency Scripts

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

टैक्सी जॉब सिस्टम आर्किटेक्चर

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

टैक्सी मीटर इम्प्लीमेंटेशन

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

local meterActive = false
local currentFare = 0.0
local lastPosition = nil
local baseFare = 50
local ratePerMile = 15
local waitRatePerSecond = 0.5
local totalDistance = 0.0

function StartMeter()
    meterActive = true
    currentFare = baseFare
    totalDistance = 0.0
    lastPosition = GetEntityCoords(PlayerPedId())

    SendNUIMessage({action = 'showMeter', fare = currentFare, distance = 0.0})

    CreateThread(function()
        while meterActive do
            Wait(500)
            local currentPos = GetEntityCoords(PlayerPedId())
            local speed = GetEntitySpeed(PlayerPedId())

            if speed > 1.0 then
                local dist = #(currentPos - lastPosition)
                totalDistance = totalDistance + dist
                local miles = totalDistance / 1609.34
                currentFare = baseFare + (miles * ratePerMile)
            else
                currentFare = currentFare + (waitRatePerSecond * 0.5)
            end

            lastPosition = currentPos

            SendNUIMessage({
                action = 'updateMeter',
                fare = math.floor(currentFare),
                distance = math.floor(totalDistance),
                speed = math.floor(speed * 2.236936)
            })
        end
    end)
end

function StopMeter()
    meterActive = false
    local finalFare = math.floor(currentFare)
    SendNUIMessage({action = 'stopMeter', fare = finalFare})
    return finalFare
end

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

NPC पिकअप मिशन सिस्टम

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

local MissionLocations = {
    {coords = vector3(-240.49, -987.78, 29.29), label = 'Pillbox Medical Center'},
    {coords = vector3(228.28, -790.70, 30.58), label = 'Legion Square'},
    {coords = vector3(-1044.57, -2739.76, 13.85), label = 'Los Santos Airport'},
    {coords = vector3(126.19, -1282.72, 29.27), label = 'Strawberry Avenue'},
    {coords = vector3(-556.18, -196.17, 38.22), label = 'Rockford Hills'},
    {coords = vector3(1159.56, -314.45, 69.21), label = 'Vinewood Hills'},
    {coords = vector3(-1222.08, -906.82, 12.32), label = 'Del Perro Pier'},
    {coords = vector3(373.58, 325.71, 103.57), label = 'Downtown Vinewood'},
}

RegisterNetEvent('taxi:server:requestNPCMission', function()
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player or Player.PlayerData.job.name ~= 'taxi' then return end

    local pickup = MissionLocations[math.random(#MissionLocations)]
    local dropoff = MissionLocations[math.random(#MissionLocations)]

    while pickup.label == dropoff.label do
        dropoff = MissionLocations[math.random(#MissionLocations)]
    end

    local estimatedDistance = #(pickup.coords - dropoff.coords)
    local basePay = 50
    local distancePay = math.floor(estimatedDistance / 1609.34 * 15)
    local totalPay = basePay + distancePay

    TriggerClientEvent('taxi:client:startNPCMission', src, {
        pickup = pickup,
        dropoff = dropoff,
        estimatedPay = totalPay,
        npcModel = Config.NPCModels[math.random(#Config.NPCModels)],
        missionId = 'TAXI-' .. os.time() .. '-' .. math.random(1000, 9999)
    })
end)

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

किराया गणना और सर्ज प्राइसिंग

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

function CalculateFare(pickupCoords, dropoffCoords, vehicleClass)
    local distance = #(pickupCoords - dropoffCoords)
    local miles = distance / 1609.34

    local rates = Config.FareRates
    local baseFare = rates.base
    local perMile = rates.perMile

    -- Vehicle class multiplier
    local classMultiplier = {
        [0] = 0.8,   -- Compacts (budget)
        [1] = 1.0,   -- Sedans (standard)
        [2] = 1.0,   -- SUVs
        [3] = 1.2,   -- Coupes (comfort)
        [18] = 1.5,  -- Super (luxury)
    }
    local vehMultiplier = classMultiplier[vehicleClass] or 1.0

    -- Time-of-day multiplier (night premium)
    local hour = GetClockHours()
    local timeMultiplier = 1.0
    if hour >= 22 or hour <= 5 then
        timeMultiplier = 1.3  -- 30% night surcharge
    end

    -- Surge pricing based on demand
    local surgeMultiplier = GetCurrentSurgeMultiplier()

    local totalFare = (baseFare + (miles * perMile)) * vehMultiplier * timeMultiplier * surgeMultiplier

    return {
        total = math.floor(totalFare),
        breakdown = {
            base = baseFare,
            distance = math.floor(miles * perMile),
            vehicleClass = vehMultiplier,
            nightSurcharge = timeMultiplier > 1.0,
            surgeActive = surgeMultiplier > 1.0,
            surgeRate = surgeMultiplier
        }
    }
end

जब यात्री राइड का अनुरोध करता है तो किराए का विवरण दिखाएं ताकि वे समझ सकें कि वे क्या भुगतान कर रहे हैं। यदि सर्ज प्राइसिंग सक्रिय है, तो UI में स्पष्ट रूप से मल्टीप्लायर को अलग रंग संकेतक के साथ दिखाएं। यह पारदर्शिता ड्राइवरों और यात्रियों के बीच विश्वास बनाती है और किराए की राशि पर विवाद कम करती है। यात्रियों को बुकिंग के समय अपनी पसंदीदा वाहन श्रेणी चुनने की अनुमति दें, बजट विकल्पों के लिए कॉम्पैक्ट कारें और लक्ज़री विकल्पों के लिए उच्च श्रेणी के सेडान या SUV प्रीमियम दरों पर।

रूट डिस्प्ले और GPS नेविगेशन

दृश्य मार्ग मार्गदर्शन प्रदान करने से टैक्सी अनुभव नए और अनुभवी दोनों ड्राइवरों के लिए सहज हो जाता है। FiveM प्रदान करता है SetNewWaypoint native बुनियादी GPS रूटिंग के लिए, लेकिन एक अधिक परिष्कृत तरीका सीधे मिनीमैप पर मार्ग बनाता है और वैकल्पिक रूप से दुनिया में 3D पथ रेंडर करता है। उपयोग करें SetBlipRoute function गंतव्य ब्लिप्स पर GPS पथ को सक्षम करने के लिए, और मार्ग के प्रमुख वेपॉइंट्स पर कस्टम ब्लिप्स के साथ इसे बढ़ाएं। यात्री के लाभ के लिए, मीटर UI में अनुमानित आगमन समय और शेष दूरी दिखाएं, जो वाहन की प्रगति के साथ वास्तविक समय में अपडेट होता है। यहाँ वेपॉइंट ट्रैकिंग के साथ रूट डिस्प्ले सिस्टम सेटअप करने का तरीका है:

local routeBlip = nil
local checkpointBlips = {}

function SetTaxiRoute(destination, checkpoints)
    ClearTaxiRoute()

    routeBlip = AddBlipForCoord(destination.x, destination.y, destination.z)
    SetBlipSprite(routeBlip, 198)
    SetBlipColour(routeBlip, 5)
    SetBlipScale(routeBlip, 1.0)
    SetBlipRoute(routeBlip, true)
    SetBlipRouteColour(routeBlip, 5)
    BeginTextCommandSetBlipName('STRING')
    AddTextComponentSubstringPlayerName('Destination')
    EndTextCommandSetBlipName(routeBlip)

    if checkpoints then
        for i, cp in ipairs(checkpoints) do
            local cpBlip = AddBlipForCoord(cp.x, cp.y, cp.z)
            SetBlipSprite(cpBlip, 1)
            SetBlipColour(cpBlip, 3)
            SetBlipScale(cpBlip, 0.6)
            table.insert(checkpointBlips, cpBlip)
        end
    end
end

function ClearTaxiRoute()
    if routeBlip then
        SetBlipRoute(routeBlip, false)
        RemoveBlip(routeBlip)
        routeBlip = nil
    end
    for _, blip in ipairs(checkpointBlips) do
        RemoveBlip(blip)
    end
    checkpointBlips = {}
end

function UpdateETADisplay(destination)
    CreateThread(function()
        while routeBlip do
            Wait(2000)
            local pos = GetEntityCoords(PlayerPedId())
            local remaining = #(pos - destination)
            local speed = GetEntitySpeed(PlayerPedId())

            local etaSeconds = speed > 2.0 and (remaining / speed) or 0
            local etaMinutes = math.floor(etaSeconds / 60)

            SendNUIMessage({
                action = 'updateETA',
                distance = math.floor(remaining),
                eta = etaMinutes > 0 and (etaMinutes .. ' min') or 'Arriving'
            })
        end
    end)
end

अतिरिक्त इमर्सन के लिए, एक रेटिंग सिस्टम लागू करें जहाँ यात्री अपनी सवारी को यात्रा समय की तुलना अनुमान से, यात्रा के दौरान टक्करों की संख्या, और चालक द्वारा ट्रैफ़िक नियमों का पालन करने जैसे कारकों के आधार पर रेट करते हैं। चालक की औसत रेटिंग उनके टैक्सी प्रोफ़ाइल पर प्रदर्शित करें ताकि यात्री सवारी स्वीकार करने से पहले इसे देख सकें, जिससे चालकों को अच्छी सेवा प्रदान करने के लिए प्रोत्साहन मिलता है।

टिप सिस्टम और ड्राइवर रेटिंग्स

एक टिप प्रणाली एक पुरस्कृत सामाजिक मैकेनिक जोड़ती है जो ड्राइवरों को उत्कृष्ट सेवा प्रदान करने के लिए प्रोत्साहित करती है। किराया भुगतान होने और यात्री वाहन से बाहर निकलने के बाद, यात्री को 10%, 15%, 20%, या एक कस्टम राशि जैसे पूर्वनिर्धारित विकल्पों के साथ टिप प्रॉम्प्ट दिखाएं। टिप सीधे ड्राइवर को बेस किराए और टैक्सी कंपनी से किसी भी कमीशन के ऊपर जाती है। डेटाबेस में प्रति ड्राइवर संचयी टिप ट्रैक करें ताकि लीडरबोर्ड बनाए जा सकें और शीर्ष रेटेड ड्राइवरों के लिए बोनस अनलॉक हो सकें। सर्वर पक्ष पर, टिप को किराए के समान लेनदेन प्रणाली के माध्यम से संसाधित करें ताकि स्थिरता सुनिश्चित हो और डुप्लीकेशन से बचा जा सके। जो ड्राइवर उच्च रेटिंग और टिप औसत बनाए रखते हैं, वे प्रीमियम वाहनों तक पहुंच, कंपनी कमीशन दरों में कमी, या डिस्पैच कतार में प्राथमिकता जैसे लाभ अनलॉक कर सकते हैं। टिप प्रणाली को समीक्षा प्रणाली के साथ जोड़ें जहां यात्री एक संक्षिप्त टेक्स्ट समीक्षा छोड़ते हैं जो ड्राइवर को दिखाई देती है, एक फीडबैक लूप बनाते हुए जो सर्वर पर कुल टैक्सी सेवा गुणवत्ता में सुधार करता है।

डिस्पैच बोर्ड और राइड अनुरोध

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

वाहन प्रबंधन और बेड़े की प्रणाली

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

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

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