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

FiveM भोजन और रेस्तरां प्रणाली: रसोई स्क्रिप्टिंग

FiveM में इन-गेम रेस्तरां चलाएं। क्राफ्टिंग रेसिपी, कैशियर UI, डिलीवरी जॉब और अपने शहर के खाद्य दृश्य को जीवंत बनाने के लिए शीर्ष खाद्य स्क्रिप्ट।

Agency Scripts

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

रेस्टोरेंट सिस्टम रोलप्ले को कैसे बेहतर बनाते हैं

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

रेस्टोरेंट कॉन्फ़िगरेशन और मेनू डिज़ाइन

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

Config.Restaurants = {
    ['burgershot'] = {
        label = 'Burger Shot',
        blip = { sprite = 106, color = 1, scale = 0.8 },
        zones = {
            counter = vector3(-1196.42, -894.04, 13.98),
            kitchen = vector3(-1199.71, -897.12, 13.98),
            storage = vector3(-1202.84, -899.35, 13.98),
        },
        menu = {
            {
                item = 'bleeder_burger',
                label = 'Bleeder Burger',
                price = 25,
                ingredients = {
                    { item = 'raw_patty', amount = 2 },
                    { item = 'burger_bun', amount = 1 },
                    { item = 'lettuce', amount = 1 },
                    { item = 'cheese_slice', amount = 2 },
                },
                craftTime = 8000,
                buffs = {
                    hunger = 45,
                    thirst = 5,
                    armor_regen = { amount = 2, duration = 120 }
                }
            },
            {
                item = 'heartstopper',
                label = 'Heart Stopper',
                price = 40,
                ingredients = {
                    { item = 'raw_patty', amount = 3 },
                    { item = 'burger_bun', amount = 1 },
                    { item = 'bacon', amount = 4 },
                    { item = 'cheese_slice', amount = 3 },
                    { item = 'onion_ring', amount = 2 },
                },
                craftTime = 12000,
                buffs = {
                    hunger = 80,
                    thirst = -10,
                    stamina_boost = { amount = 15, duration = 180 }
                }
            },
        },
        requiredJob = 'burgershot',
    },
}

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

कुकिंग मैकेनिक्स और क्राफ्टिंग फ्लो

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

function StartCooking(restaurantId, menuIndex)
    local restaurant = Config.Restaurants[restaurantId]
    local recipe = restaurant.menu[menuIndex]

    -- Check ingredients in storage
    local hasAll = lib.callback.await('restaurant:checkIngredients', false,
        restaurantId, recipe.ingredients)

    if not hasAll then
        lib.notify({ description = 'Missing ingredients!', type = 'error' })
        return
    end

    -- Lock player into cooking animation
    local playerPed = PlayerPedId()
    local animDict = 'mini@repair'
    lib.requestAnimDict(animDict)
    TaskPlayAnim(playerPed, animDict, 'fixing_a_player', 8.0, -8.0,
        -1, 1, 0, false, false, false)

    -- Cooking progress with skill check
    local success = lib.skillCheck(
        {'easy', 'easy', 'medium'},
        {'w', 'a', 's', 'd'}
    )

    ClearPedTasks(playerPed)

    if success then
        TriggerServerEvent('restaurant:finishCooking', restaurantId, menuIndex)
        lib.notify({ description = 'Cooked: ' .. recipe.label, type = 'success' })
    else
        -- Failed cooking wastes some ingredients
        TriggerServerEvent('restaurant:failedCooking', restaurantId, menuIndex)
        lib.notify({ description = 'Burnt the food! Some ingredients wasted.',
            type = 'error' })
    end
end

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

सामग्री आपूर्ति श्रृंखला

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

RegisterNetEvent('restaurant:orderSupplies', function(restaurantId, order)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)

    -- Verify player is manager rank
    if Player.PlayerData.job.name ~= restaurantId then return end
    if Player.PlayerData.job.grade.level < 3 then
        TriggerClientEvent('QBCore:Notify', src,
            'Only managers can order supplies', 'error')
        return
    end

    -- Calculate total cost
    local totalCost = 0
    for _, item in ipairs(order) do
        local wholesalePrice = Config.WholesalePrices[item.name]
        if wholesalePrice then
            totalCost = totalCost + (wholesalePrice * item.amount)
        end
    end

    -- Deduct from restaurant bank account
    local balance = exports['qb-management']:GetAccount(restaurantId)
    if balance < totalCost then
        TriggerClientEvent('QBCore:Notify', src,
            'Insufficient restaurant funds', 'error')
        return
    end

    exports['qb-management']:RemoveMoney(restaurantId, totalCost)

    -- Add items to restaurant storage
    for _, item in ipairs(order) do
        AddToRestaurantStorage(restaurantId, item.name, item.amount)
    end

    TriggerClientEvent('QBCore:Notify', src,
        string.format('Order placed! $%d deducted', totalCost), 'success')
end)

ग्राहक ऑर्डरिंग और सेवा प्रवाह

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

खाद्य बफ़्स और उपभोग प्रभाव

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

local activeBuffs = {}

function ApplyFoodBuff(buffType, amount, duration)
    -- Remove existing buff of same type
    if activeBuffs[buffType] then
        activeBuffs[buffType].active = false
    end

    activeBuffs[buffType] = {
        amount = amount,
        endTime = GetGameTimer() + (duration * 1000),
        active = true
    }

    -- Send buff data to HUD
    SendNUIMessage({
        action = 'addBuff',
        buffType = buffType,
        amount = amount,
        duration = duration
    })

    -- Create buff application thread
    CreateThread(function()
        local buff = activeBuffs[buffType]
        while buff.active and GetGameTimer() < buff.endTime do
            if buffType == 'armor_regen' then
                local current = GetPedArmour(PlayerPedId())
                if current < 100 then
                    SetPedArmour(PlayerPedId(), math.min(100, current + amount))
                end
            elseif buffType == 'stamina_boost' then
                RestorePlayerStamina(PlayerId(), amount * 0.1)
            elseif buffType == 'health_regen' then
                local current = GetEntityHealth(PlayerPedId())
                local max = GetEntityMaxHealth(PlayerPedId())
                if current < max then
                    SetEntityHealth(PlayerPedId(), math.min(max, current + amount))
                end
            end
            Wait(1000)
        end

        activeBuffs[buffType] = nil
        SendNUIMessage({ action = 'removeBuff', buffType = buffType })
    end)
end

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

Employee Management and Payroll

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

प्रदर्शन अनुकूलन

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

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

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