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

FiveM जेल सिस्टम: सार्थक जेल समय स्क्रिप्टिंग

एक ऐसा जेल सिस्टम बनाएं जिसमें खिलाड़ी वास्तव में भाग लें। जेल नौकरियां, भागने के रास्ते, गार्ड, पैरोल और गहरे रोलप्ले के लिए शीर्ष FiveM जेल स्क्रिप्ट।

Agency Scripts

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

जेल सिस्टम वास्तुकला

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

डेटाबेस स्कीमा और सेंटेंसिंग

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

CREATE TABLE IF NOT EXISTS prison_sentences (
    id INT AUTO_INCREMENT PRIMARY KEY,
    citizenid VARCHAR(50) NOT NULL,
    sentence_minutes INT NOT NULL,
    time_served INT DEFAULT 0,
    reduction_earned INT DEFAULT 0,
    jailed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    release_at TIMESTAMP NOT NULL,
    charges TEXT DEFAULT NULL,
    arresting_officer VARCHAR(50) DEFAULT NULL,
    status ENUM('active', 'released', 'escaped', 'pardoned') DEFAULT 'active',
    parole_eligible BOOLEAN DEFAULT FALSE,
    INDEX idx_citizen (citizenid),
    INDEX idx_status (status)
);

CREATE TABLE IF NOT EXISTS prison_activity_log (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    citizenid VARCHAR(50) NOT NULL,
    sentence_id INT NOT NULL,
    activity_type ENUM('mining', 'gym', 'cleaning', 'library', 'yard') NOT NULL,
    reduction_minutes INT DEFAULT 0,
    completed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (sentence_id) REFERENCES prison_sentences(id)
);

खिलाड़ी को सजा देना

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

RegisterCommand('jail', function(source, args)
    local src = source
    local Officer = QBCore.Functions.GetPlayer(src)
    if not Officer then return end

    -- Check police job
    if Officer.PlayerData.job.name ~= 'police' then
        TriggerClientEvent('QBCore:Notify', src, 'Unauthorized', 'error')
        return
    end

    local targetId = tonumber(args[1])
    local minutes = tonumber(args[2])
    local charges = table.concat(args, ' ', 3)

    if not targetId or not minutes or minutes <= 0 then
        TriggerClientEvent('QBCore:Notify', src, 'Usage: /jail [id] [minutes] [charges]', 'error')
        return
    end

    local Target = QBCore.Functions.GetPlayer(targetId)
    if not Target then
        TriggerClientEvent('QBCore:Notify', src, 'Player not found', 'error')
        return
    end

    local citizenid = Target.PlayerData.citizenid
    local releaseAt = os.date('!%Y-%m-%d %H:%M:%S', os.time() + (minutes * 60))

    -- Insert sentence
    local sentenceId = MySQL.insert.await(
        'INSERT INTO prison_sentences (citizenid, sentence_minutes, release_at, charges, arresting_officer) VALUES (?, ?, ?, ?, ?)',
        { citizenid, minutes, releaseAt, charges, Officer.PlayerData.citizenid }
    )

    -- Strip weapons and contraband
    local contraband = {'weapon_pistol', 'weapon_smg', 'lockpick', 'thermite'}
    for _, item in ipairs(contraband) do
        local playerItem = Target.Functions.GetItemByName(item)
        if playerItem then
            Target.Functions.RemoveItem(item, playerItem.amount)
        end
    end

    -- Set jail metadata and teleport
    Target.Functions.SetMetaData('injail', sentenceId)
    TriggerClientEvent('prison:client:enter', targetId, sentenceId, minutes)
    TriggerClientEvent('QBCore:Notify', src, 'Jailed ' .. GetPlayerName(targetId) .. ' for ' .. minutes .. ' minutes', 'success')
end, false)

जेल गतिविधियाँ

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

Config.PrisonActivities = {
    mining = {
        label = 'Quarry Mining',
        coords = vector3(1690.64, 2592.63, 45.56),
        radius = 15.0,
        reductionPerCycle = 2,   -- minutes reduced per completion
        cycleDuration = 45,       -- seconds per mining cycle
        cooldown = 30,            -- seconds between cycles
        maxReductionPerSession = 10,
        animation = { dict = 'amb@world_human_hammering@male@base', anim = 'base' },
        requiredProp = 'prop_tool_pickaxe',
    },
    gym = {
        label = 'Prison Gym',
        coords = vector3(1662.67, 2527.84, 45.56),
        radius = 10.0,
        reductionPerCycle = 1,
        cycleDuration = 30,
        cooldown = 60,
        maxReductionPerSession = 6,
        animation = { dict = 'amb@world_human_muscle_free_weights@male@barbell@base', anim = 'base' },
    },
    cleaning = {
        label = 'Facility Cleaning',
        coords = vector3(1653.18, 2499.26, 45.56),
        radius = 20.0,
        reductionPerCycle = 1,
        cycleDuration = 25,
        cooldown = 20,
        maxReductionPerSession = 8,
        animation = { dict = 'amb@world_human_janitor@male@base', anim = 'base' },
        requiredProp = 'prop_cs_broom',
    },
    library = {
        label = 'Prison Library',
        coords = vector3(1680.21, 2513.45, 45.56),
        radius = 8.0,
        reductionPerCycle = 1,
        cycleDuration = 60,
        cooldown = 45,
        maxReductionPerSession = 4,
        animation = { dict = 'amb@world_human_clipboard@male@base', anim = 'base' },
    },
}

-- Server-side activity completion handler
RegisterNetEvent('prison:server:completeActivity', function(activityType, sentenceId)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local citizenid = Player.PlayerData.citizenid
    local activity = Config.PrisonActivities[activityType]
    if not activity then return end

    -- Validate sentence is active
    local sentence = MySQL.single.await(
        'SELECT * FROM prison_sentences WHERE id = ? AND citizenid = ? AND status = "active"',
        { sentenceId, citizenid }
    )
    if not sentence then return end

    -- Check session reduction cap
    local sessionReduction = MySQL.scalar.await(
        'SELECT COALESCE(SUM(reduction_minutes), 0) FROM prison_activity_log WHERE sentence_id = ? AND activity_type = ? AND completed_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)',
        { sentenceId, activityType }
    )
    if sessionReduction >= activity.maxReductionPerSession then
        TriggerClientEvent('QBCore:Notify', src, 'Maximum reduction reached for this activity', 'error')
        return
    end

    -- Apply reduction
    local reduction = activity.reductionPerCycle
    MySQL.update('UPDATE prison_sentences SET reduction_earned = reduction_earned + ?, release_at = DATE_SUB(release_at, INTERVAL ? MINUTE) WHERE id = ?',
        { reduction, reduction, sentenceId })

    MySQL.insert('INSERT INTO prison_activity_log (citizenid, sentence_id, activity_type, reduction_minutes) VALUES (?, ?, ?, ?)',
        { citizenid, sentenceId, activityType, reduction })

    TriggerClientEvent('QBCore:Notify', src, 'Sentence reduced by ' .. reduction .. ' minute(s)', 'success')
    TriggerClientEvent('prison:client:updateTimer', src, reduction)
end)

पैरोल सिस्टम

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

जेल ब्रेक इवेंट्स

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

Config.PrisonBreak = {
    minPoliceOnline = 5,
    cooldown = 28800, -- 8 hours between break attempts
    requiredItems = {
        { name = 'electronickit', amount = 2, label = 'Electronic Kit' },
        { name = 'thermite', amount = 3, label = 'Thermite Charge' },
    },
    phases = {
        {
            name = 'hack_security',
            label = 'Hack Security Grid',
            coords = vector3(1746.23, 2488.90, 45.80),
            duration = 60,
            minigame = { type = 'hack', difficulty = 'hard', attempts = 3 },
        },
        {
            name = 'breach_wall',
            label = 'Breach Perimeter Wall',
            coords = vector3(1651.78, 2569.33, 45.56),
            duration = 30,
            minigame = { type = 'thermite', time = 10 },
        },
        {
            name = 'disable_lockdown',
            label = 'Disable Lockdown Protocol',
            coords = vector3(1691.45, 2565.12, 45.56),
            duration = 45,
            minigame = { type = 'hack', difficulty = 'expert', attempts = 2 },
        },
    },
    escapeWindow = 300, -- 5 minutes to escape after all phases complete
    escapeRoutes = {
        { label = 'Main Gate', coords = vector3(1845.12, 2585.87, 45.67) },
        { label = 'Drainage Tunnel', coords = vector3(1617.34, 2523.90, 44.12) },
        { label = 'Helipad', coords = vector3(1700.89, 2565.34, 52.34) },
    },
}

गार्ड NPC सिस्टम

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

सीमा प्रवर्तन और रिलीज़

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

पुलिस और कानूनी सिस्टम के साथ एकीकरण

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

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

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