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

FiveM ईंधन प्रणाली स्क्रिप्ट्स: वाहनों के लिए यथार्थवादी रिफ्यूलिंग

अपने FiveM सर्वर में कार्यशील ईंधन जोड़ें। गैस स्टेशन, जेरी कैन, इलेक्ट्रिक वाहन और QBCore, ESX और स्टैंडअलोन सेटअप के लिए सर्वश्रेष्ठ ईंधन स्क्रिप्ट।

Agency Scripts

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

ईंधन खपत यांत्रिकी

एक यथार्थवादी ईंधन प्रणाली एक आवश्यक परत जोड़ती है जो डूबने वाली प्राकृतिक धन निकासी बनाती है जो आपके सर्वर की अर्थव्यवस्था को संतुलित करने में मदद करती है। मुख्य मैकेनिक प्रत्येक वाहन के ईंधन स्तर को 0 से 100 के बीच एक फ्लोटिंग-पॉइंट मान के रूप में ट्रैक करना है, जो इंजन गतिविधि और ड्राइविंग व्यवहार के आधार पर घटता है। ईंधन स्तर को entity state bags का उपयोग करके स्टोर करें Entity(vehicle).state.fuel ताकि मान सभी क्लाइंट्स में स्थायी रहे और नेटवर्क ओनरशिप परिवर्तन के बावजूद बचा रहे। वाहन के वर्तमान RPM के आधार पर प्रति टिक खपत दर की गणना करें जो GetVehicleCurrentRpm , थ्रॉटल स्थिति से GetControlNormalऔर वाहन की वर्ग-विशिष्ट खपत गुणक। स्पोर्ट्स और सुपर कारों को अर्थव्यवस्था वाहनों की तुलना में ईंधन काफी तेज़ी से खर्च करना चाहिए, जबकि ट्रक और SUV बीच में आते हैं। तीव्र त्वरण, उच्च निरंतर गति, और इंजन ब्रेकिंग जैसी आक्रामक ड्राइविंग व्यवहारों के लिए अतिरिक्त खपत संशोधक लागू करें। जब ईंधन शून्य हो जाए, तो वाहन की अधिकतम गति को धीरे-धीरे कम करें SetVehicleMaxSpeed इंजन को तुरंत बंद करने के बजाय फड़फड़ाने का अनुकरण करने के लिए, जिससे खिलाड़ी को सुरक्षित रूप से किनारे पर खींचने के लिए कुछ महत्वपूर्ण सेकंड मिलते हैं।

-- Client-side fuel consumption thread
local fuelConsumptionRate = 0.0

CreateThread(function()
    while true do
        local ped = PlayerPedId()
        local vehicle = GetVehiclePedIsIn(ped, false)

        if vehicle ~= 0 and GetPedInVehicleSeat(vehicle, -1) == ped then
            local engineOn = GetIsVehicleEngineRunning(vehicle)

            if engineOn then
                local rpm = GetVehicleCurrentRpm(vehicle)
                local speed = GetEntitySpeed(vehicle) * 3.6 -- km/h
                local classMultiplier = Config.ClassConsumption[GetVehicleClass(vehicle)] or 1.0

                -- Base consumption + RPM factor + speed factor
                fuelConsumptionRate = (Config.BaseConsumption
                    + (rpm * Config.RpmFactor)
                    + (speed * Config.SpeedFactor)
                ) * classMultiplier

                local currentFuel = Entity(vehicle).state.fuel or 100.0
                local newFuel = math.max(0.0, currentFuel - fuelConsumptionRate)

                Entity(vehicle).state:set('fuel', newFuel, true)

                -- Engine stall when empty
                if newFuel <= 0 then
                    SetVehicleUndriveable(vehicle, true)
                    SetVehicleEngineOn(vehicle, false, true, true)
                elseif newFuel <= 5.0 then
                    -- Sputtering effect
                    SetVehicleMaxSpeed(vehicle, 30.0 * (newFuel / 5.0))
                end
            end
        end

        Wait(1000) -- Update every second
    end
end)

गैस स्टेशन UI और रिफ्यूलिंग

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

Jerry Can और आपातकालीन रिफ्यूलिंग

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

-- Jerry can usage handler
RegisterNetEvent('fuel:useJerryCan')
AddEventHandler('fuel:useJerryCan', function(slot)
    local src = source
    local ped = GetPlayerPed(src)
    local coords = GetEntityCoords(ped)

    -- Find nearest vehicle
    local nearbyVehicle = GetClosestVehicle(coords, 3.0)
    if not nearbyVehicle or nearbyVehicle == 0 then
        return notify(src, 'No vehicle nearby.', 'error')
    end

    -- Get jerry can metadata
    local canData = exports.ox_inventory:GetSlot(src, slot)
    if not canData or not canData.metadata or not canData.metadata.fuel then
        return notify(src, 'Jerry can is empty.', 'error')
    end

    local canFuel = canData.metadata.fuel
    local vehicleFuel = Entity(nearbyVehicle).state.fuel or 0.0
    local maxTransfer = math.min(canFuel, 100.0 - vehicleFuel)

    if maxTransfer <= 0 then
        return notify(src, 'Vehicle tank is already full.', 'error')
    end

    -- Transfer fuel
    Entity(nearbyVehicle).state:set('fuel', vehicleFuel + maxTransfer, true)

    -- Update jerry can metadata
    local remainingFuel = canFuel - maxTransfer
    if remainingFuel <= 0 then
        exports.ox_inventory:SetMetadata(src, slot, { fuel = 0, label = 'Empty Jerry Can' })
    else
        exports.ox_inventory:SetMetadata(src, slot, { fuel = remainingFuel })
    end

    notify(src, ('Transferred %.1f liters to the vehicle.'):format(maxTransfer), 'success')
end)

इलेक्ट्रिक वाहन समर्थन

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

डायनेमिक फ्यूल प्राइसिंग इकॉनमी

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

गैस स्टेशन एक व्यवसाय के रूप में

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

HUD एकीकरण और ईंधन गेज

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

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

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

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

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