Skip to main content
sh-policemdt is an in-game Mobile Data Terminal for RedM law-enforcement roleplay. It gives authorized officers a NUI dossier interface for citizen profiles, incident reports, warrants, fines, jail processing, dispatch calls, evidence, and forensic reports. The resource supports VORP and RSG through a shared framework bridge. It can also integrate with sh-policejob for duty-aware access and live duty sync, but the police-job bridge is configurable.

Overview

If Config.Compatibility.PoliceJob.RequireOnDuty = true, start sh-policejob before sh-policemdt. Officers will be denied MDT access when the duty bridge cannot confirm they are on duty.

Features

The dashboard shows recent incidents, recent calls, evidence activity, and live officer state. Officer data is refreshed through the configured polling interval and stale heartbeat settings.
Search citizen records through the configured identity provider. Profiles can show notes, active warrants, incident history, fine history, jail history, and linked records.
Create structured incident reports with status, priority, location, linked people, linked units, charges, penal-code entries, evidence, and dispatch call attachments.
List and manage warrants with active, served, recalled, and expired lifecycle states. Supervisor/boss grades can create, resolve, and delete warrants. Expired warrants are handled by the automatic expiry sweep.
Issue fines from MDT records and penal-code workflows. Fines are recorded immediately. Payment can be handled later by your courthouse system or by the optional Pay Fine NPC.
Create jail records, transport prisoners directly to Siska or through a manual dock workflow, apply optional prison clothing, enforce escape radius, sync custody on reconnect, show /jailtime, and auto-release when the sentence ends.
Citizens can request law assistance with the configured dispatch command. Calls can create local alert blips, be attached to units, moved through statuses, routed with a waypoint, and linked to incidents.
Officers can collect world shell and blood traces, attach evidence bags to incidents, create configured evidence entries from inventory, compare DNA/fingerprint samples, confirm forensic matches, and link forensic reports to incidents.
Locale files are included for English, Spanish, and German. Optional Discord logging can record API calls, failed access attempts, and citizen calls.

Requirements

1

Database

Install and ensure oxmysql. The resource declares @oxmysql/lib/MySQL.lua in fxmanifest.lua.
2

Framework

Run either vorp_core or rsg-core. Leave Config.Framework = 'auto' for auto-detection, or set it to vorp or rsg.
3

Identity data

Choose the profile lookup source with Config.Compatibility.IDSystem. Supported presets are sh-identity, ss-identitycard, fx-idcard, and af-idcard.
4

Optional police-job bridge

Use sh-policejob when you want duty-only access and auto-close on duty end. Set Config.Compatibility.PoliceJob.Name = 'none' if you are not using that bridge.

Installation

1

Place the resource

Put the sh-policemdt folder in your RedM server resources directory.
2

Import the MDT schema

Run install/sql.sql once against your server database. It is non-destructive and uses CREATE TABLE IF NOT EXISTS, so it creates missing tables but does not reshape older custom tables.
3

Install inventory items

For VORP, import install/items.sql. For RSG, copy entries from install/RSG items.txt into rsg-core/shared/items.lua, then copy the matching PNGs from install/images into your inventory image directory.
4

Configure framework and identity

Edit config.lua, set Config.Framework, Config.Compatibility.IDSystem, and your LEO job mappings.
5

Configure duty access

If using sh-policejob, ensure it before the MDT. If not, set Config.Compatibility.PoliceJob.Name = 'none' or disable the on-duty requirement.
6

Start in server.cfg

Ensure dependencies first, then start the MDT.
server.cfg
The SQL install includes the normalized MDT tables for people, incidents, charges, calls, fines, jail records, warrants, evidence, world evidence, officer stats, forensic samples, forensic matches, forensic reports, and related join tables.

Inventory Items

The included item files define the default MDT and forensics items:

Configuration

config.lua

Important Config Areas

Access Rules

MDT access is checked server-side. A player must match the configured framework law job settings and meet Config.MDT.MinRank. When Config.Compatibility.PoliceJob.RequireOnDuty = true, the player must also be on duty through the police-job bridge. Privileged moderation actions use the configured grade window:
Grades in that inclusive range are treated as supervisor/boss-level for sensitive actions such as warrant management, record moderation, jail workflows, and forensics access when enabled by config.

Commands

Config.Dispatch.Enabled is false by default in the provided config. Enable it before expecting /alertlaw, MDT call APIs, alert blips, or the Dispatch UI tab to function.

Common Workflows

Officers use /mdt, the sheriffbook item, sh_mdt:openFromPed, or the sh_policejob:client:openMdt / sh_policejob:client:openMDT events. Access is still validated server-side before the UI opens.

Identity Provider Notes

Person search and profile lookup depend on the selected identity preset: Search is designed around roleplay names. If person lookup is empty, confirm the provider table exists and that Config.Compatibility.IDSystem matches the installed identity resource.

Localization

Set the active language with:
Locale files live in locales/*.lua. The package includes en.lua, es.lua, and de.lua. Translations are grouped under server messages, client messages, notification keys, UI tab labels, UI text, and UI literal replacements.

API Surface

The NUI talks to the server through the unified events sh_mdt:api:request and sh_mdt:api:response. Responses use a standard envelope:
Primary MDT actions include:

Troubleshooting

Confirm html/assets/vue.global.prod.js exists, check F8/NUI console for JavaScript errors, then run /mdtclose and reopen the MDT.
Check Config.Framework, Config.VorpLEOJobs, Config.RsgAllowedJobType, Config.RsgLEOJobs, and Config.MDT.MinRank. If RequireOnDuty is enabled, confirm sh-policejob is started and the officer is clocked in.
Confirm the identity provider table exists and matches Config.Compatibility.IDSystem. For example, sh-identity expects sh_idcards.
Confirm oxmysql is started before the MDT, database credentials are valid, and install/sql.sql was imported.
Set Config.Dispatch.Enabled = true. The default config disables dispatch commands, dispatch APIs, alert blips, and the Dispatch UI tab.
This is expected with the manual payment model. Use a courthouse payment flow or enable and configure Config.PayFineNPC.
If using Mode = 'd_labs_prisonclothes', ensure d_labs_prisonclothes is started and the configured event names match. For other clothing systems, use Mode = 'event' and set EventName.
Confirm Config.Forensics.Enabled = true, the officer is in the supervisor/boss grade window or a configured detective job, and the required items exist in inventory.

Upgrade Notes

install/sql.sql is safe for a first install and for creating missing tables, but it does not migrate existing table columns because it uses CREATE TABLE IF NOT EXISTS. Back up your database before upgrading from an older release, then compare schema changes before applying custom migrations.
Keep Config.Forensics.ProfileSalt unique per server. Leaving the default value makes forensic profile hashes predictable across servers.