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

FiveM रेसिंग सिस्टम: ट्रैक्स, लीडरबोर्ड और बेट्स

अपने FiveM सर्वर में स्ट्रीट रेसिंग जोड़ें। ट्रैक बिल्डर, चेकपॉइंट, दांव, लीडरबोर्ड और गंभीर ट्यूनर समुदायों के लिए सर्वश्रेष्ठ रेसिंग स्क्रिप्ट।

Agency Scripts

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

दौड़ निर्माण प्रणाली डिजाइन करना

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

चेकपॉइंट सिस्टम और रेस लॉजिक

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

-- Client-side checkpoint detection
local currentCheckpoint = 1
local raceCheckpoints = {} -- populated when race starts

CreateThread(function()
    while isRacing do
        local playerCoords = GetEntityCoords(PlayerPedId())
        local checkpoint = raceCheckpoints[currentCheckpoint]

        if checkpoint then
            local dist = #(playerCoords - checkpoint.coords)

            -- Draw current checkpoint marker
            DrawMarker(1, checkpoint.coords.x, checkpoint.coords.y,
                checkpoint.coords.z - 1.0, 0, 0, 0, 0, 0, 0,
                checkpoint.radius * 2, checkpoint.radius * 2, 2.0,
                45, 212, 191, 120, false, true, 2, false, nil, nil, false)

            if dist < checkpoint.radius then
                PlaySoundFrontend(-1, 'CHECKPOINT_NORMAL', 'HUD_MINI_GAME_SOUNDSET', true)
                currentCheckpoint = currentCheckpoint + 1

                if currentCheckpoint > #raceCheckpoints then
                    -- Race finished
                    local finishTime = GetGameTimer() - raceStartTime
                    TriggerServerEvent('racing:finished', raceId, finishTime)
                    isRacing = false
                else
                    -- Notify server of checkpoint progress
                    TriggerServerEvent('racing:checkpoint', raceId, currentCheckpoint)
                end
            end
        end
        Wait(50)
    end
end)

लीडरबोर्ड और रैंकिंग सिस्टम

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

शर्त लगाने और पुरस्कार प्रणाली

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

-- Server-side betting handler
local raceBets = {}

RegisterNetEvent('racing:placeBet')
AddEventHandler('racing:placeBet', function(raceId, targetRacerId, amount)
    local src = source
    if not activeRaces[raceId] then return end
    if activeRaces[raceId].state ~= 'lobby' then
        return notify(src, 'Betting is closed once the race starts.', 'error')
    end

    -- Validate the target racer is in this race
    local racerFound = false
    for _, racer in ipairs(activeRaces[raceId].participants) do
        if racer.src == targetRacerId then racerFound = true break end
    end
    if not racerFound then return end

    -- Check and deduct funds
    local playerMoney = GetPlayerMoney(src)
    if playerMoney < amount or amount < Config.MinBet then
        return notify(src, 'Insufficient funds or below minimum bet.', 'error')
    end

    RemoveMoney(src, amount)

    if not raceBets[raceId] then raceBets[raceId] = {} end
    table.insert(raceBets[raceId], {
        bettor = src,
        target = targetRacerId,
        amount = amount,
    })

    notify(src, ('Bet $%s on %s'):format(amount, GetPlayerName(targetRacerId)), 'success')
end)

NUI के साथ रेस UI बनाना

रेसिंग UI को महत्वपूर्ण वास्तविक समय की जानकारी बिना स्क्रीन को अव्यवस्थित किए या चालक को विचलित किए संप्रेषित करनी चाहिए। एक न्यूनतम HUD डिज़ाइन करें जो रेसर्स के बीच वर्तमान स्थिति, यदि लागू हो तो लैप संख्या, व्यक्तिगत सर्वश्रेष्ठ या ट्रैक रिकॉर्ड के खिलाफ वर्तमान रन की तुलना करने वाला स्प्लिट टाइमर, और आगामी चेकपॉइंट दिशा को हाइलाइट करने वाला मिनीमैप ओवरले दिखाए। एक स्पीडोमीटर का उपयोग करें जो रेस थीम से मेल खाता हो, जो खिलाड़ी की पसंद के आधार पर mph या km/h में गति दिखाता हो। रेस से पहले लॉबी स्क्रीन में सभी पंजीकृत प्रतिभागियों को उनके वाहनों के साथ, ट्रैक का नाम और दूरी, पुरस्कार पूल का विवरण, और एक काउंटडाउन टाइमर दिखाएं। UI को HTML, CSS, और JavaScript के साथ NUI सिस्टम का उपयोग करके बनाएं, और क्लाइंट-साइड Lua से NUI फ्रेम को रेस स्थिति अपडेट संचारित करें। SendNUIMessage। UI को प्रतिक्रियाशील बनाए रखें, स्थिति अपडेट को प्रति सेकंड 4-5 बार थ्रॉटल करके बजाय हर फ्रेम के, जो NUI ओवरहेड को काफी कम करता है बिना प्रदर्शित जानकारी पर कोई दृश्य प्रभाव डाले। पोस्ट-रेस परिणाम स्क्रीन जोड़ने पर विचार करें जिसमें शीर्ष गति, औसत गति, और प्रत्येक चेकपॉइंट खंड के लिए समय तुलना जैसी विस्तृत सांख्यिकी हो।

रेस श्रेणियाँ और वाहन वर्ग

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

पुलिस इंटीग्रेशन और अवैध रेसिंग

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

रेसिंग के लिए प्रदर्शन अनुकूलन

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

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

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