FiveM Mahkeme ve Hukuk Sistemi: Gerçekçi Duruşmalar Kodlayın
FiveM sunucunuza çalışan bir mahkeme sistemi ekleyin. Derin rol yapma deneyimi için yargıç araçları, avukat rolleri, kanıt UI'ları ve en iyi hukuk sistemi scriptleri.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Yasal Sistem Mimarisi
Bir mahkeme ve hukuk sistemi, FiveM roleplay sunucusunu basit bir hırsız-polis oynanışından yasaların ağırlığı olduğu ve sonuçların yasal süreçleri takip ettiği yapılandırılmış bir topluma dönüştürür. Sistem, polisin arama ve tutuklamaları yetkilendirmek için kullandığı arama emirlerini, davaların bir yargıç önüne sunulduğu duruşma iş akışını, avukatlar için savunma ve iddia makamı rollerini, fiziksel ve dijital kanıtları takip eden bir delil yönetim sistemini ve para cezaları, hapis cezası ile alternatif cezalar için bir ceza tayin çerçevesini kapsar. Mimari, ilk suçlamadan iddianamenin okunmasına, yargılamaya ve karara kadar her yasal süreci takip eden bir dava yönetim veritabanı etrafında şekillenir. Her dava, ilgili taraflara, rollerine, sunulan delillere ve nihai sonuca bağlanır. Bu veriler kalıcı olarak saklanır ve oyuncuların ve yetkililerin gelecekteki davalarda başvurabileceği sunucuya ait bir adli geçmiş oluşturur.
Adli Kayıtlar İçin Veri Tabanı Şeması
Veritabanınızın arama emirlerini, mahkeme davalarını, kanıt ögelerini ve yasal kayıtları işlemesi gerekir. Şema, soruşturma sırasında toplanan ögelerin duruşmada sunulan delillere dönüştüğü ortak bir kanıt sistemi aracılığıyla polis soruşturmalarını mahkeme süreçlerine bağlar. Yasal bir süreçte gerçekleştirilen her eylemin eksiksiz bir denetim kaydını tutmak için tabloları tasarlayın:
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)
);
Yakalama ve Arama Emri Sistemi
Arama ve yakalama emirleri, polis soruşturması ile eylem arasındaki yasal köprüdür. Yakalama emri memurlara belirli bir kişiyi gözaltına alma yetkisi verir, arama emri bir mülkü veya aracı aramaya izin verir ve mahkemeye zorla getirme emri ise birisi mahkemeye çıkmadığında hâkim tarafından çıkarılır. Polis memurları, MDT üzerinden adli inceleme için bekleme sırasına giden emir talepleri oluşturur. Bir hâkim veya yetkili makam talebi inceler, makul şüphe açıklamasını değerlendirir ve onaylar ya da reddeder. Onaylanan emirler aktif hale gelir ve memurlar hedef kişiyle etkileşime girdiğinde polis MDT'sinde görünerek onları geçerli bir emir olduğu konusunda uyarır. Emirlerin sonsuza kadar kalmaması için süre aşımını uygulayın; yakalama emirleri onaylandıktan sonra gerçek zamanlı 7 gün, arama emirleri ise 48 saat geçerli olmalıdır:
-- 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)
Duruşma İş Akışı
Duruşmalar: davaları iddianame, duruşma öncesi talepler, yargılama ve ceza aşamalarından geçiren yapılandırılmış bir iş akışını takip eder. Bir dava açıldığında, sistem benzersiz bir dava numarası oluşturur ve davaya açıldı durumunu atar. Bir yargıç davayı inceler ve sanığın savunmasını yaptığı bir ilk duruşma planlar. Sanık suçsuz olduğunu beyan ederse, dava avukatların talep ve delil sunabileceği ön duruşmaya, ardından her iki tarafın da argümanlarını sunduğu ana duruşmaya geçer. Yargıç, dava durumunu ilerleten ve tüm katılımcılar için UI güncellemelerini tetikleyen komutlarla duruşmanın akışını kontrol eder. Dava bilgilerini, mevcut aşamayı gösteren ve yargıç, savcı ile savunma avukatı için role özel kontroller sağlayan bir mahkeme salonu NUI'si uygulayın. Yargıca karar butonları ve ceza giriş alanları sunulurken, avukatlara itiraz butonları ve delil sunma kontrolleri verilir.
Avukat Rolü ve Savunma Sistemi
Avukatlık mesleği, sunucuda farklı oynanış mekaniklerine sahip eksiksiz bir kariyer yolu oluşturur. Savunma avukatları, hapishaneden veya telefon uygulamasından erişilebilen bir avukat rehberi aracılığıyla sanıklar tarafından tutulabilir. Bir avukat bir müvekkili kabul ettiğinde, savcılık tarafından sunulan tüm kanıtlar da dahil olmak üzere hukuk sistemindeki dava dosyasına erişim kazanır. Avukatlar kanıtların reddi için dilekçe verebilir, duruşmaları ertelemek için süre talep edebilir, savcıyla uzlaşma müzakeresi yapabilir ve duruşma sırasında kendi kanıtlarını ve tanık ifadelerini sunabilir. Yeni avukat karakterlerinin avukatlık mesleğine kabul edilmeden önce bir bilgi testini geçmek zorunda olduğu bir baro sınavı sistemi uygulayarak asgari düzeyde bir hukuki roleplay kalitesi sağlayın. Müvekkilleri için kazanılan davalar, kaybedilen davalar ve ortalama ceza indirimi gibi avukat istatistiklerini takip ederek deneyimli avukatların daha yüksek ücretler talep edebileceği rekabetçi bir pazar oluşturun:
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)
Kanıt Yönetim Sistemi
Delil sistemi, olay yeri incelemesini mahkeme salonundaki sunuma bağlayan bir gözetim zinciri sağlar. Polis bir delil toplama komutu kullanarak olay yerinde delil topladığında, sistem toplayan memurun kimliği, zaman damgası ve konumu ile bir delil kaydı oluşturur. Her delil parçası, tüm yasal süreç boyunca korunan benzersiz bir tanımlayıcı alır. Delil türleri arasında silah, uyuşturucu ve kıyafet gibi fiziksel eşyalar, telefon kayıtları ve CCTV görüntüleri gibi dijital deliller, metin girişleri olarak kaydedilen tanık ifadeleri ve mali kayıtlar veya sahte kimlikler gibi belgeler yer alır. Avukatlar, toplama yöntemini veya gözetim zincirini sorgulayan önergeler yoluyla delillerin kabul edilebilirliğine itiraz edebilir. Yargıç bu önergeleri inceler ve delili kabul edilemez olarak işaretleyerek dava dosyasından çıkarabilir. Polis karakolunda fiziksel delil eşyalarının saklandığı bir delil deposu kurun ve soruşturmalar sırasında toplanan gerçek eşyaları takip etmek için envanter sistemi entegrasyonunu kullanın.
Para Cezası ve Kefalet Mekanikleri
Para cezaları ve kefalet, hukuk sistemi içinde ekonomik sonuçlar yaratır. Bir sanık mahkemeye çıkarıldığında hakim, suçlamaların ciddiyetine ve sanığın sabıka geçmişine göre bir kefalet tutarı belirler. Sanık, duruşmayı beklerken gözaltından salıverilmek için mahkeme sistemi aracılığıyla kefalet ödeyebilir veya duruşmaya kadar hapiste kalabilir. Kefalet ödemesi oyuncunun banka hesabından düşülür ve sanık tüm duruşmalara katılmışsa dava sonuçlandıktan sonra iade edilir. Sanık duruşmaya gelmezse kefalet yanar ve yakalama emri çıkarılır. Para cezaları mahkumiyet kararının bir parçası olarak verilir ve belirlenen bir zaman dilimi içinde ödenmelidir. Ödenmeyen para cezalarına faiz işler ve sürücü belgesinin askıya alınması veya mülk haczi gibi ek yasal sonuçları tetikleyebilir. Yüksek para cezaları için sanığın tutarın tamamını bir kerede ödemek yerine haftalık taksitler yapabileceği bir ceza ödeme planı sistemi uygulayın, bu da hukuk sistemini oyuncunun sunucudaki günlük deneyimiyle bağlantılı tutan kalıcı bir mali yükümlülük kazandırır.
Yargıç Komutları ve Ceza Hükmü
Yargıçlar, mahkeme işlemlerini yönetmek ve hukuk sistemini uygulamak için kapsamlı bir komut setine ihtiyaç duyar. Temel komutlar şunları içerir: /case vakaları görüntülemek ve yönetmek için, /warrant arama veya yakalama emri taleplerini onaylamak veya reddetmek için, /sentence hapis cezası ve para cezası uygulamak, /bail kefalet tutarlarını belirlemek, /gag duruşmalar sırasında huzuru bozan oyuncuları susturmak ve /contempt mahkemeye saygısızlık eden oyuncuları hapse atmak için. Ceza verme komutu, her suçlama için asgari ve azami cezaları tanımlayan bir ceza kanunu yapılandırmasına başvurmalı ve farklı yargıçlar arasında tutarlılık sağlamalıdır. Suçlamalara ve sanığın sabıka kaydına göre uygun cezalar öneren, ancak yargıçlara gerekçelendirerek farklı karar verme takdiri de tanıyan bir ceza kılavuzu sistemi uygulayın. Deneyimli oyuncuların gelecekteki davalarda başvurabileceği bir emsal külliyatı oluşturmak için tüm yargı kararlarını yasal kayıtlar tablosunda saklayın. Cezaların daha üst düzey bir yargıca veya bir heyete temyiz edilebileceği bir yargısal denetim süreci ekleyerek kararlı oyuncular için ek adli rol yapma katmanları oluşturun.
Polis, Cezaevi ve MDT ile Entegrasyon
Hukuk sistemi, uyumlu bir adalet süreci oluşturmak için mevcut polis, cezaevi ve MDT resource'ları ile sorunsuz bir şekilde entegre olmalıdır. Polis MDT üzerinden suçlamada bulunduğunda, sistem uygun dava numarasıyla otomatik olarak bir mahkeme davası oluşturmalı ve soruşturma sırasında toplanmış olan tüm kanıtları bağlamalıdır. Bir yargıç sanığı hapis cezasına çarptırdığında sistem, cezanın bir polis memurunun manuel olarak hapis komutu yürütmesine gerek kalmadan otomatik olarak uygulanması için cezaevi resource'unun jailing export fonksiyonunu doğrudan çağırmalıdır. Memurlar bir vatandaşı aradığında, aktif yakalama kararları polis MDT'sinde karar türünü, veren makamı ve son geçerlilik tarihini gösteren net göstergelerle görünmelidir. Mahkeme kararlarıyla oluşturulan adli sicil kayıtları, vatandaşın profilinde MDT altında mahkumiyetler, beraatler, aktif davalar ve ödenmemiş para cezaları dahil olmak üzere eksiksiz yasal geçmişini gösterecek şekilde erişilebilir olmalıdır. Diğer resource'ların arama kararı durumunu kontrol edebilmesi, avukat yetkilerini doğrulayabilmesi, adli sicil kayıtlarını arayabilmesi ve mahkeme sistemiyle programatik olarak etkileşime girebilmesi için tüm hukuk sistemi fonksiyonlarını export edin.