sh-policejob for duty-aware access and live duty sync, but the police-job bridge is configurable.
Overview
Features
Officer dashboard and live units
Officer dashboard and live units
Citizen profile lookup
Citizen profile lookup
Incident reports
Incident reports
Warrants
Warrants
Fines
Fines
Jail and custody
Jail and custody
/jailtime, and auto-release when the sentence ends.Dispatch calls
Dispatch calls
Evidence and forensics
Evidence and forensics
Localization and logging
Localization and logging
Requirements
Database
oxmysql. The resource declares @oxmysql/lib/MySQL.lua in fxmanifest.lua.Framework
vorp_core or rsg-core. Leave Config.Framework = 'auto' for auto-detection, or set it to vorp or rsg.Identity data
Config.Compatibility.IDSystem. Supported presets are sh-identity, ss-identitycard, fx-idcard, and af-idcard.Optional police-job bridge
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
Place the resource
sh-policemdt folder in your RedM server resources directory.Import the MDT schema
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.Install inventory items
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.Configure framework and identity
config.lua, set Config.Framework, Config.Compatibility.IDSystem, and your LEO job mappings.Configure duty access
sh-policejob, ensure it before the MDT. If not, set Config.Compatibility.PoliceJob.Name = 'none' or disable the on-duty requirement.Start in server.cfg
Inventory Items
The included item files define the default MDT and forensics items:Configuration
Important Config Areas
Access Rules
MDT access is checked server-side. A player must match the configured framework law job settings and meetConfig.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:
Commands
Common Workflows
- Open MDT
- Create Incident
- Manage Warrants
- Issue Fine
- Process Jail
- Forensics
/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:Config.Compatibility.IDSystem matches the installed identity resource.
Localization
Set the active language with: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 eventssh_mdt:api:request and sh_mdt:api:response. Responses use a standard envelope:
Troubleshooting
The UI opens blank
The UI opens blank
html/assets/vue.global.prod.js exists, check F8/NUI console for JavaScript errors, then run /mdtclose and reopen the MDT.Officers are denied access
Officers are denied access
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.Citizen search returns no results
Citizen search returns no results
Config.Compatibility.IDSystem. For example, sh-identity expects sh_idcards.Database writes fail
Database writes fail
oxmysql is started before the MDT, database credentials are valid, and install/sql.sql was imported.Dispatch commands do nothing
Dispatch commands do nothing
Config.Dispatch.Enabled = true. The default config disables dispatch commands, dispatch APIs, alert blips, and the Dispatch UI tab.Fines are recorded but not paid
Fines are recorded but not paid
Config.PayFineNPC.Jail outfit does not apply
Jail outfit does not apply
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.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.
Config.Forensics.ProfileSalt unique per server. Leaving the default value makes forensic profile hashes predictable across servers.