Skip to main content
sh-citation gives your law enforcement players a proper citation workflow built on a Vue 3 NUI form. An authorized officer opens the panel with a single command, fills in the suspect’s details and charges, draws a freehand signature on an HTML5 canvas, and submits — the fine is deducted from the suspect’s bank account automatically and a formatted embed lands in your Discord log channel. Because ACE permissions gate the command, only the groups you authorize can ever open the form.

Supported Frameworks

ValueFramework
ndND_Core (current)
ndoldND_Core v1 (legacy)
natNAT2K15
standaloneNo framework
QBCore and ESX are not supported by sh-citation. If your server runs either of those frameworks, this resource is not compatible.

Dependencies

  • sh-notify — default notification provider (bundled workflow; swap to custom in config if you use another system)
  • ND_Core — optional; uncomment the dependency line in fxmanifest.lua if you run ND_Core

ACE Permissions

sh-citation uses a single ACE node (sh.citation) to control who can open the citation UI. Add your law enforcement and admin groups in server.cfg:
server.cfg
add_ace group.police sh.citation allow
add_ace group.admin  sh.citation allow
Keep Config.AcePerm = true in production. Setting it to false removes the permission check and allows any player to open the citation form and issue fines.

Configuration

All settings live in shared/config.lua. The values below reflect the defaults shipped with the resource.
shared/config.lua
Config.Framework = 'nd'        -- 'nd', 'ndold', 'nat', 'standalone'
Config.Notify    = 'sh'        -- 'sh' or 'custom'
Config.Command   = 'ticket'    -- Command to open the citation UI
Config.AcePerm   = true        -- Keep true for production servers

Config.EmbedOptions = {
    WebHook   = 'https://discord.com/api/webhooks/YOUR_WEBHOOK',
    Thumbnail = 'https://your-thumbnail-url.png',
    Title     = 'Citation Issued',
    Color     = 3093146,  -- Decimal color for the embed
}
Config.EmbedOptions.Color expects a decimal integer, not a hex string. Use an online hex-to-decimal converter to get the right value for your preferred embed colour.

Citation Form Fields

When an officer runs the configured command (default /ticket), the Vue 3 NUI form opens full-screen. The officer fills in the following fields before submitting:
FieldDescription
Player IDIn-game server ID of the suspect
Suspect NameFull name of the suspect character
Officer NameIssuing officer’s character name
ChargesFree-text description of the violation(s)
Fine AmountDollar amount to deduct from the suspect’s bank
SignatureFreehand signature drawn on an HTML5 canvas
Press ESC at any time to close the form without submitting. No fine is applied and no Discord log is created unless the officer clicks the submit button.

Issuing a Citation

1

Ensure you have permission

Confirm your character’s group has the sh.citation ACE node. If the command produces no response, ask your server admin to check the ACE assignment.
2

Open the citation form

Run the configured command (default /ticket) while near the suspect. The Vue 3 NUI panel opens over the game world.
3

Fill in the citation details

Enter the suspect’s player ID, both character names, the charges, and the fine amount. All fields are required before submission is allowed.
4

Draw your signature

Use your mouse to draw a freehand signature on the canvas at the bottom of the form. You can clear and redraw as many times as needed.
5

Submit the citation

Click Submit. The script deducts the fine from the suspect’s bank account and sends the Discord embed to your configured webhook.

Discord Embed

Every submitted citation creates a Discord embed in the channel attached to your webhook. The embed includes:
  • Player ID and suspect name
  • Issuing officer’s name
  • Charges listed
  • Fine amount applied
  • Your configured thumbnail image
The embed colour is set by Config.EmbedOptions.Color in decimal format. The Title field appears as the embed header.

Installation

1

Add to server.cfg

Ensure sh-citation after its dependencies:
server.cfg
ensure sh-notify
ensure sh-citation
If you use ND_Core, uncomment the ND_Core dependency line in fxmanifest.lua before starting the resource.
2

Set your framework

Open shared/config.lua and set Config.Framework:
Config.Framework = 'nd'  -- change to 'ndold', 'nat', or 'standalone'
3

Add ACE permissions

Add the sh.citation ACE node to every group that should issue citations:
server.cfg
add_ace group.police sh.citation allow
4

Configure the Discord webhook

Paste your webhook URL into Config.EmbedOptions.WebHook and set a thumbnail URL and embed colour to match your server’s branding.
5

Restart and test

Restart the resource, log in as a player in the police group, run /ticket, and submit a test citation. Confirm the Discord embed arrives and the fine is deducted.
If your server uses a notification resource other than sh-notify, set Config.Notify = 'custom' and edit the notification wrapper in the client script to call your own export or event. The 'sh' value routes all notifications through sh-notify’s default export.