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

FiveM कोर्ट और कानूनी सिस्टम: यथार्थवादी ट्रायल स्क्रिप्ट करें

अपने FiveM सर्वर में एक कार्यशील न्यायालय प्रणाली जोड़ें। न्यायाधीश उपकरण, वकील भूमिकाएं, साक्ष्य UI और गहरे रोलप्ले के लिए सर्वश्रेष्ठ कानूनी प्रणाली स्क्रिप्ट।

Agency Scripts

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

कानूनी प्रणाली वास्तुकला

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

कानूनी रिकॉर्ड्स के लिए डेटाबेस स्कीमा

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

CREATE TABLE IF NOT EXISTS warrants (
    id INT AUTO_INCREMENT PRIMARY KEY,
    type ENUM('arrest', 'search', 'bench') NOT NULL,
    target_citizenid VARCHAR(50) NOT NULL,
    target_name VARCHAR(100) NOT NULL,
    reason TEXT NOT NULL,
    issued_by VARCHAR(50) NOT NULL,
    approved_by VARCHAR(50) DEFAULT NULL,
    status ENUM('pending', 'active', 'executed', 'expired', 'revoked') DEFAULT 'pending',
    issued_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expires_at TIMESTAMP NULL,
    executed_at TIMESTAMP NULL,
    INDEX idx_target (target_citizenid),
    INDEX idx_status (status)
);

CREATE TABLE IF NOT EXISTS court_cases (
    id INT AUTO_INCREMENT PRIMARY KEY,
    case_number VARCHAR(20) UNIQUE NOT NULL,
    defendant_citizenid VARCHAR(50) NOT NULL,
    defendant_name VARCHAR(100) NOT NULL,
    prosecutor_citizenid VARCHAR(50) DEFAULT NULL,
    defense_citizenid VARCHAR(50) DEFAULT NULL,
    judge_citizenid VARCHAR(50) DEFAULT NULL,
    charges TEXT NOT NULL,
    status ENUM('filed', 'arraignment', 'pretrial', 'trial', 'verdict', 'closed', 'dismissed') DEFAULT 'filed',
    plea ENUM('not_guilty', 'guilty', 'no_contest') DEFAULT NULL,
    verdict ENUM('guilty', 'not_guilty', 'mistrial', 'dismissed') DEFAULT NULL,
    sentence TEXT DEFAULT NULL,
    fine_amount INT DEFAULT 0,
    jail_minutes INT DEFAULT 0,
    filed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    hearing_scheduled TIMESTAMP NULL,
    closed_at TIMESTAMP NULL,
    INDEX idx_defendant (defendant_citizenid),
    INDEX idx_status (status)
);

CREATE TABLE IF NOT EXISTS evidence (
    id INT AUTO_INCREMENT PRIMARY KEY,
    case_id INT DEFAULT NULL,
    type ENUM('physical', 'digital', 'testimony', 'document', 'photo') NOT NULL,
    label VARCHAR(200) NOT NULL,
    description TEXT DEFAULT NULL,
    collected_by VARCHAR(50) NOT NULL,
    collected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    chain_of_custody TEXT DEFAULT NULL,
    is_admitted BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (case_id) REFERENCES court_cases(id)
);

CREATE TABLE IF NOT EXISTS legal_records (
    id INT AUTO_INCREMENT PRIMARY KEY,
    citizenid VARCHAR(50) NOT NULL,
    record_type ENUM('conviction', 'acquittal', 'fine', 'warning', 'restraining_order') NOT NULL,
    description TEXT NOT NULL,
    case_id INT DEFAULT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expunged BOOLEAN DEFAULT FALSE,
    INDEX idx_citizen (citizenid),
    FOREIGN KEY (case_id) REFERENCES court_cases(id)
);

वारंट सिस्टम

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

-- Warrant request by police
RegisterNetEvent('legal:server:requestWarrant', function(data)
    local src = source
    local Officer = QBCore.Functions.GetPlayer(src)
    if not Officer or Officer.PlayerData.job.name ~= 'police' then return end

    local warrant = {
        type = data.type,
        target_citizenid = data.targetCitizenid,
        target_name = data.targetName,
        reason = data.reason,
        issued_by = Officer.PlayerData.citizenid,
    }

    local id = MySQL.insert.await(
        'INSERT INTO warrants (type, target_citizenid, target_name, reason, issued_by) VALUES (?, ?, ?, ?, ?)',
        { warrant.type, warrant.target_citizenid, warrant.target_name, warrant.reason, warrant.issued_by }
    )

    -- Notify judges
    local players = QBCore.Functions.GetQBPlayers()
    for _, player in pairs(players) do
        if player.PlayerData.job.name == 'judge' then
            TriggerClientEvent('legal:client:warrantPending', player.PlayerData.source, {
                id = id,
                type = warrant.type,
                targetName = warrant.target_name,
                reason = warrant.reason,
                officerName = Officer.PlayerData.charinfo.firstname .. ' ' .. Officer.PlayerData.charinfo.lastname,
            })
        end
    end

    TriggerClientEvent('QBCore:Notify', src, 'Warrant request submitted for judicial review', 'success')
end)

-- Judge approval
RegisterNetEvent('legal:server:approveWarrant', function(warrantId)
    local src = source
    local Judge = QBCore.Functions.GetPlayer(src)
    if not Judge or Judge.PlayerData.job.name ~= 'judge' then return end

    local warrant = MySQL.single.await('SELECT * FROM warrants WHERE id = ? AND status = "pending"', { warrantId })
    if not warrant then return end

    local expiryHours = warrant.type == 'search' and 48 or 168
    local expiresAt = os.date('!%Y-%m-%d %H:%M:%S', os.time() + (expiryHours * 3600))

    MySQL.update('UPDATE warrants SET status = "active", approved_by = ?, expires_at = ? WHERE id = ?',
        { Judge.PlayerData.citizenid, expiresAt, warrantId })

    -- Notify requesting officer if online
    TriggerClientEvent('QBCore:Notify', src, 'Warrant #' .. warrantId .. ' approved', 'success')
end)

कोर्ट सुनवाई वर्कफ़्लो

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

वकील भूमिका और रक्षा प्रणाली

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

Config.LawyerSystem = {
    barExamQuestions = 15,
    passingScore = 11,       -- 73% to pass
    examCooldown = 86400,    -- 24 hours between attempts
    maxActiveClients = 5,
    consultationFee = 500,   -- base fee for initial consultation
    trialFeeRange = { min = 2000, max = 25000 },

    motionTypes = {
        { id = 'suppress_evidence', label = 'Motion to Suppress Evidence', description = 'Request exclusion of illegally obtained evidence' },
        { id = 'dismiss_charges', label = 'Motion to Dismiss', description = 'Request dismissal due to insufficient evidence' },
        { id = 'continuance', label = 'Motion for Continuance', description = 'Request to postpone the hearing' },
        { id = 'change_venue', label = 'Motion for Change of Venue', description = 'Request trial at different location' },
        { id = 'bail_reduction', label = 'Motion for Bail Reduction', description = 'Request lower bail amount' },
        { id = 'expungement', label = 'Motion for Expungement', description = 'Request to clear prior conviction' },
    },
}

-- Hire a lawyer from jail
RegisterNetEvent('legal:server:hireLawyer', function(lawyerCitizenid)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local citizenid = Player.PlayerData.citizenid

    -- Find active case for this player
    local activeCase = MySQL.single.await(
        'SELECT * FROM court_cases WHERE defendant_citizenid = ? AND status NOT IN ("closed", "dismissed") ORDER BY filed_at DESC LIMIT 1',
        { citizenid }
    )
    if not activeCase then
        TriggerClientEvent('QBCore:Notify', src, 'No active case found', 'error')
        return
    end

    -- Assign lawyer to case
    MySQL.update('UPDATE court_cases SET defense_citizenid = ? WHERE id = ?',
        { lawyerCitizenid, activeCase.id })

    -- Notify lawyer
    local lawyerPlayer = QBCore.Functions.GetPlayerByCitizenId(lawyerCitizenid)
    if lawyerPlayer then
        TriggerClientEvent('QBCore:Notify', lawyerPlayer.PlayerData.source,
            'New client: ' .. Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname ..
            ' | Case #' .. activeCase.case_number, 'success')
    end

    TriggerClientEvent('QBCore:Notify', src, 'Attorney assigned to your case', 'success')
end)

साक्ष्य प्रबंधन प्रणाली

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

जुर्माना और जमानत तंत्र

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

न्यायाधीश कमांड और सजा

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

पुलिस, जेल, और MDT के साथ एकीकरण

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

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

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