Skip to main content
The sh-identity resource gives every character on your server a physical identity card they can create, carry, and present to other players or NPCs. Cards capture configurable character fields — name, date of birth, gender, address, height, weight, and residence — and are stored per-character in the database. Authorized law enforcement can inspect another character’s ID using a configurable command. sh-identity also ships with an optional Fake ID system, letting forger NPCs issue counterfeit papers for roleplay involving deception and document fraud. Other SH Development resources, such as sh-telegram, can check for a valid identity card before allowing access to their features.

Framework Support

sh-identity supports both VORP and RSG frameworks. Set the framework in your server-side config.lua:
config.lua
Config.Framework = 'vorp'  -- 'auto', 'vorp', or 'rsg'
Setting 'auto' (the default) lets the resource detect your running framework automatically and is recommended for most setups.

Identity Card Fields

Each issued identity card captures the following fields from the registration form:
FieldDescription
First nameCharacter’s registered first name
Last nameCharacter’s registered last name
Date of birthEntered in YYYY-MM-DD format; display year can be overridden in config
AddressFree-text address string (max 60 characters)
ResidenceDrop-down selection from Config.ResidenceOptions
HeightNumeric value in inches (capped at Config.CharacterLimits.maxHeight)
WeightNumeric value in pounds (capped at Config.CharacterLimits.maxWeight)
The birth year range available in the date picker is controlled by Config.BirthYearStart and Config.BirthYearEnd. The default range is 1845–1910 — widen it if your server uses a different era.

Commands

sh-identity exposes several commands that you can individually enable or disable:
CommandConfig keyDefaultDescription
/idregisterenableRegisterCommandfalseOpens the Registry NUI directly
/idshowenableShowCommandtrueShows your real ID to the nearest player
/idtestenableTestCommandtrueShows your real ID to yourself (for testing)
/inspectidConfig.Inspect.commandinspectidAuthorized jobs inspect another player’s ID
/fakeidshowFakeID.ShowCommandfakeidshowShows your fake ID to the nearest player
/fakeidtestFakeID.TestCommandfakeidtestShows your fake ID to yourself

How Players Obtain a Real ID

1

Visit a registry NPC

Players travel to a configured registry clerk NPC — set up in Config.NPCs — and press [R] to interact. Default locations include Valentine and Saint Denis.
2

Fill in character details

The NUI registration form prompts the player to enter their character fields. Pre-population from the framework’s character data is supported when the framework exposes it.
3

Pay the issuance fee

A configurable fee is charged on first-time registration (Config.Fees.real.register, default $50) and on updates (Config.Fees.real.update, default $25). Set Config.Fees.enabled = false to waive all fees.
4

Receive the identity card item

The completed card is added to the character’s inventory as the usable item defined by Config.IDItemName (default: id_card). Players can use the item to display their details.

Card Inspection

Authorized jobs can inspect another character’s identity card using the /inspectid command (configurable). The inspector must be within Config.Inspect.maxDistance (default: 3.0 meters) of the target. Configure which jobs are allowed to inspect in config.lua:
config.lua
Config.Inspect = {
    enabled     = true,
    command     = 'inspectid',
    maxDistance = 3.0,
    allowedJobs = {
        'marshal',
        'sheriff',
        'deputy',
        'lawman',
        'police',
        'vallaw',
    },
    -- RSG job type gate (optional)
    allowedJobTypes = {
        'leo',
    }
}
Card inspection does not require the inspecting player to hold their own identity card — only the character being checked needs to have a registered card.

Fake ID System

sh-identity includes a complete fake identity system gated behind a separate forger NPC. Fake IDs use a different inventory item (Config.FakeID.ItemName, default: fake_id) and separate fees (Config.Fees.fake.register, default $100). Forger NPCs are configured in Config.FakeID.NPCs and have no map blip by default, keeping their location hidden for roleplay purposes. Players with a fake ID can use /fakeidshow to present their forged papers to nearby players.
config.lua
Config.FakeID = {
    enabled      = true,
    ItemName     = 'fake_id',
    ShowCommand  = 'fakeidshow',
    TestCommand  = 'fakeidtest',
    UseNPCs      = true,
    NPCs = {
        {
            pedModel   = 'MP_DE_U_M_M_VANHORN_01',
            coords     = { 2845.91, -1130.72, 46.38, 20.54 }, -- Saint Denis Slums
            promptText = 'Press [R] to speak with Forger',
            blip = { enabled = false },
        },
    }
}

Integration With Other Resources

sh-identity exposes a server-side integration through Config.IdentityLink so that resources like sh-licenses can pull verified identity data directly from sh-identity records rather than re-collecting it:
config.lua
Config.IdentityLink = {
    enabled              = true,
    provider             = 'sh-identity',
    requireRealId        = false,   -- block license purchase if no real ID exists
    lockPrefilledFields  = true,    -- prevent editing synced fields in dependent UIs
    fallbackToCharacter  = true,    -- use framework character data if no real ID found
}
Resources in the SH Development suite that support this check include:
  • sh-telegram — gate telegraph office access behind a valid card by setting Config.UseSH_Identity = true
  • sh-licenses — pre-fill identity fields on license issuance from sh-identity records
Run sh-identity early in your server.cfg ensure order so that dependent resources can safely read its data on first load.

Installation

1

Add the resource

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

Add to server.cfg

Ensure sh-identity after your framework and before any resource that depends on it:
server.cfg
ensure vorp_core    # or rsg-core
ensure sh-identity
ensure sh-telegram  # example dependent resource
ensure sh-licenses  # example dependent resource
3

Import the SQL file

Run sql.sql from the resource folder against your database to create the character identity records table.
4

Register inventory items

Register both id_card and fake_id as usable items in your framework’s item registry. Item definition templates are provided in the items/ folder of the resource.
5

Configure

Open config.lua to set your framework, fees, residence options, birth year range, NPC locations, and optional Discord webhook URL. Add or remove entries from Config.Inspect.allowedJobs to match your server’s law enforcement job names.
6

Restart and test

Start the resource, visit a registry clerk NPC, and complete registration. Use /idshow to confirm the card displays correctly to a nearby character.
The Config.IDItemName value (default: id_card) must match the item name registered in your framework’s item registry exactly. A mismatch will prevent the card from being added to inventory on registration.