Skip to main content
The sh-courthouse resource brings a structured criminal justice workflow to your RedM roleplay server. Judges, clerks, lawyers, prosecutors, defenders, and bailiffs each have a defined role with specific capabilities inside the courthouse NUI. Players can manage fine payments, file disputes, process warrants, schedule hearings, and conduct full trials — all stored per-character in the database. sh-courthouse integrates with sh-telegram to deliver court documents in-character, and its fine desk NPC provides a dedicated interaction point for citizens to view and pay fines without needing a law role.

Framework Support

sh-courthouse supports both VORP and RSG frameworks. Set the framework in your server-side config.lua before starting the resource:
config.lua
Config.Framework = 'auto'  -- 'auto', 'vorp', or 'rsg'

Role-Based Access

sh-courthouse uses a role model rather than a single grade threshold. Each role grants a specific set of courthouse powers. You map your server’s job names to roles in Config.Access:
config.lua
Config.Access = {
    AllowCitizenActions = true,  -- citizens can view/appeal their own cases via /courthouse

    Vorp = {
        judge      = { judge = true, marshal = true },
        clerk      = { courtclerk = true },
        lawyer     = { lawyer = true, marshal = true },
        prosecutor = { prosecutor = true },
        defender   = { defender = true },
        bailiff    = { marshal = true },
    },

    Rsg = {
        judge      = { judge = true, marshal = true },
        clerk      = { courtclerk = true },
        lawyer     = { lawyer = true, marshal = true },
        prosecutor = { prosecutor = true },
        defender   = { defender = true },
        bailiff    = { bailiff = true },
    },
}
RoleCourthouse powers
JudgeApprove/deny warrants, decide fine disputes, rule on jail appeals, manage hearings, submit trial rulings
ClerkSchedule and manage hearings, issue summons, maintain case/trial docket entries
LawyerFile and track fine disputes, jail appeals, and case submissions
ProsecutorSame as lawyer for prosecution-side case preparation
DefenderSame as lawyer for defense-side appeals and case work
BailiffStaff-level courthouse access for courtroom operations
Citizens with AllowCitizenActions = true can open /courthouse to view their own cases and file appeals without needing a law role. They can always access the Fine Desk NPC regardless of this setting.

Features

Officers record fines against characters from the courthouse NUI or integrated MDT. The Fine Desk NPC provides a dedicated in-world interaction point where citizens visit to view their outstanding fines and make payment. Fine payment events are logged to the FinePayments Discord webhook.
Citizens and lawyers can file a dispute against an issued fine. Judges review dispute filings and issue decisions from the courthouse NUI. Dispute events are logged to the FineDisputes webhook.
Law enforcement submits warrant requests through the courthouse NUI. Judges review the warrant queue and approve or deny each request. Warrant events are logged to the Warrants webhook.
Jailed characters or their legal counsel can file a jail appeal. Judges review appeals and issue rulings that can modify or dismiss the sentence. Appeal events log to the JailAppeals webhook.
Clerks schedule hearings and issue summons to involved parties. Hearing status changes and summons deliveries are logged to the Hearings webhook. When sh-telegram is enabled, summons can be delivered as in-character telegrams.
Full trial workflows are supported: docket management, participant registration, phase tracking, and judicial rulings. Trial events are logged to the Trials webhook.

Fine Desk NPC

Configure the Fine Desk NPC — the in-world interaction point for citizen fine payments — in config.lua:
config.lua
Config.PayFineNPC = {
    Enabled  = true,
    PedModel = 's_m_m_bankclerk_01',
    Scenario = 'WORLD_HUMAN_STAND_WAITING',
    Locations = {
        vector4(-805.24, -1199.42, 44.19, 272.13),
    },
    InteractionDistance = 2.2,
    PromptControl       = 0xE30CD707,  -- R
    PromptLabel         = 'Visit Courthouse',
    PromptGroupLabel    = 'Courthouse Desk',
    ShowBlip = true,
    Blip = {
        Name  = 'Courthouse Desk',
        Scale = 0.2,
    },
}
If you run sh-policemdt alongside sh-courthouse and have sh-courthouse managing fine payments, set Config.PayFinesNPC = false in sh-policemdt to avoid duplicate Fine Desk NPCs.

sh-telegram Integration

When Config.SHTelegram = true, court documents such as hearing summons are delivered as in-character telegrams via sh-telegram rather than as on-screen notifications. Requires sh-telegram to be installed and running:
config.lua
Config.SHTelegram = true

Courthouse Command

The courthouse NUI is opened with the /courthouse command (configurable via Config.NUI.OpenCommand). Citizens use it to view their own records. Law roles use it to access the full courthouse interface for their assigned role.
config.lua
Config.NUI = {
    OpenCommand      = 'courthouse',
    RequestTimeoutMs = 8000,
}

Discord Webhook Logging

sh-courthouse supports per-event-type Discord webhooks for granular channel routing:
config.lua
Config.Webhooks = {
    Enabled       = false,  -- set true to enable logging
    Name          = 'sh-courthouse',
    FinePayments  = '',  -- fine payment receipts
    FineDisputes  = '',  -- dispute filings and rulings
    Warrants      = '',  -- warrant review queue and decisions
    JailAppeals   = '',  -- appeal filings and rulings
    Hearings      = '',  -- hearing scheduling and summons
    Trials        = '',  -- trial phase/ruling/docket updates
}

Installation

1

Add the resource

Copy the sh-courthouse folder into your server’s resources directory.
2

Add to server.cfg

Ensure sh-courthouse after your framework and any integrated resources:
server.cfg
ensure vorp_core      # or rsg-core
ensure sh-telegram    # optional, for in-character document delivery
ensure sh-courthouse
3

Import the SQL files

Run the SQL files from the resource against your database to create the sentencing records, fine, warrant, hearing, and trial tables.
4

Configure access roles

Edit Config.Access.Vorp (or .Rsg) to map your server’s job names to the courthouse roles that match your community’s law structure.
5

Place the Fine Desk NPC

Edit Config.PayFineNPC.Locations to position the Fine Desk NPC at the appropriate building on your map.
6

Enable webhooks

Set Config.Webhooks.Enabled = true and paste your Discord webhook URLs into the relevant channel fields.
7

Restart and test

Start the resource, open the courthouse terminal with /courthouse on a judge-role character, and confirm the full UI loads. Create a test fine and pay it at the Fine Desk NPC to verify end-to-end functionality.
Set Config.SHTelegram = true if your server runs sh-telegram — routing court summons as in-character telegrams significantly improves roleplay immersion compared to on-screen pop-up notifications.
Ensure your Config.Access job names exactly match the job names registered in your framework’s job registry. A mismatch will silently deny access to all courthouse features for the affected role.