How Integrations Work#
Nothing inside Police Creator assumes which framework, inventory or voice script you run. Every third-party call goes through a small, unencrypted bridge file under client/custom/ or server/custom/, and at start-up the resource picks the bridge of the first supported resource it finds running.
Layer | Supported (detection order) | Without it |
|---|---|---|
Framework |
| Standalone: jobs are typed by hand in the admin panel and officers are recognised by ACE. |
Inventory |
| No usable items, stashes, searches or K9 detection. |
Target |
| Every point becomes a floor marker with an |
Voice |
| The radio uses native Mumble voice targets — a starting point for SaltyChat and similar. |
Clothing |
| Lockers and prison outfits are captured and applied with game natives. |
Vehicle keys |
| Fleet units are simply unlocked for the officer who takes them. |
Society banking |
| Department balances are kept in the resource's own table. |
Fuel |
| Fleet fuel is stored with the game's own fuel level. |
Text UI · Notifications |
| Built-in 3D prompts and ox_lib notifications. |
Screenshots |
| No mugshots, call photos or bodycam captures. |
Database |
| Required. |
Qbox is checked before QBCore on purpose: Qbox also answers to the name
qb-core, and its own events are the ones that report promotions and duty changes.
Overriding Detection#
Each layer is detected in config/shared/config.lua. To pin a choice, replace the detection call with the value — the boot summary then prints (manual) for it:
-- Auto, the default: the first started resource in the list wins.
Config.Inventory = ConfigAutoDetect('Inventory', { 'qs-advanced-inventory', 'qs-inventory', 'qb-inventory', 'ox_inventory' }, 'vanilla')
-- Manual: always this one.
Config.Inventory = 'ox_inventory'
Config.SocietyBanking = 'Renewed-Banking'
Config.VoiceSystem = 'pma-voice'Do this when two candidates run at once, or when a resource has been renamed on your server. The value must match the name of a bridge file in the matching custom/ folder.
Voice and the Radio#
Recommended. On its first start Police Creator adds two export lines to pma-voice/client/module/radio.lua (only if they are missing) and asks for one server restart in red until you do it. pma-voice's own radio commands keep working; the police radio drives it from the tablet.
Detected automatically. Channels and broadcast buttons are tuned through yaca's broadcast channel on the server.
With no supported voice script, the radio uses the game's native Mumble voice targets. That is the place to start for SaltyChat or a custom voice: copy client/custom/voice/mumble.lua and change the calls.
Society Money#
When a citizen pays a fine, the money goes into the bank account of the department that wrote the ticket — the same account officers see in their banking script.
Banking script | Where the money lands |
|---|---|
qs-banking | The job's society account. |
Renewed-Banking · fd_banking · okokBanking | The account named after the job. |
qbx_management · qb-banking · qb-management | The job / boss-menu account. |
esx_addonaccount |
|
None of the above | The resource's own |
Dedicated banking scripts are checked before the framework's own on purpose: a server running Renewed-Banking usually still has qb-management installed, but the balance players see is Renewed-Banking's.
Everything else is in Admin → Society money: the master switch, whether paid fines are deposited, the department share (100% keeps the whole ticket), a fallback job, excluded jobs, account names for banks that name accounts differently (police → society_lspd), and logging every deposit. Its Connection card has a test deposit that moves real money and reports what happened. The same test from the server console:
qs-society-check police # which adapter, which account, current balance
qs-society-check police 100 # a real deposit of 100, and whether the balance movedGarages, Impound and Vehicle Keys#
The police fleet garages are built in; they do not replace your civilian garage script. Two hooks connect the two:
Impound — after the tow truck leaves,
Config.OnImpoundVehicleinconfig/shared/impound.luahands the plate to your garage.qs-advancedgaragesis wired inserver/custom/garages/impound.lua; ESX and QBCore examples are in the config, commented.Fleet hooks —
Config.Garage.OnVehicleTakenandConfig.Garage.OnVehicleStoredinconfig/shared/garages.luarun on the client each time a unit leaves or returns.ESX garage column — vehicle records read whether a car is parked from
owned_vehicles. If your garage script uses its own column name, setConfig.OwnedVehiclesTableGarageColumn.
Vehicle keys are handed to the officer who takes a fleet unit, through the keys bridge in client/custom/vehiclekeys/. Without a keys script the unit is simply unlocked for them.
Discord Logs#
Every important action is written to the Action Logs page and can be posted to Discord as an embed. Paste a webhook per category in Admin → Action Logs — no file to edit:
Category | What goes there |
|---|---|
| Every setting changed in the admin panel. |
| Reports created, edited and deleted. |
| Clock-in and clock-out. |
| Dogs adopted, deployed and used. |
| Society deposits and withdrawals, and their failures. |
| Player and evidence actions. |
Logs are kept for 30 days by default (set on the same page). The embed colours are in Config.LogColors, config/server/webhooks.lua.
Adding a Backend#
Supporting something that is not on the list is one file plus one line:
Copy the closest bridge
Every bridge is a small, unencrypted file under
client/custom/<kind>/orserver/custom/<kind>/— framework, inventory, target, voice, clothing, vehiclekeys, society. Copy the one most like your resource and name it after it.Change the calls inside
The first line of each bridge is a guard, so it only runs when it is the chosen one. Update it to your name, then replace the exports with your resource's. A banking bridge, for example, only needs three functions:
lua -- server/custom/society/my_banking.lua if Config.SocietyBanking ~= 'my_banking' then return end function SocietyAddMoney(job, amount, reason) return exports['my_banking']:AddMoney(job, amount, reason) end function SocietyRemoveMoney(job, amount, reason) return exports['my_banking']:RemoveMoney(job, amount, reason) end function SocietyGetMoney(job) return exports['my_banking']:GetMoney(job) endRegister it for detection
Add your resource to the matching
ConfigAutoDetectlist inconfig/shared/config.lua, or set the value by hand. Restart and check the boot summary.
Everything in config/, client/custom/, server/custom/ and placeables/ stays editable; the rest of the resource is encrypted. Keep a copy of your changed bridges before updating, and re-apply them on top of the new files.
Languages#
Every resource ships in 15 languages in its locales/ folder (alerts and evidence in 14, without Traditional Chinese). Set Config.Locale in each resource's config. Anything not yet translated falls back to English, so an unfinished language is never a broken one.
Code | Language | Code | Language |
|---|---|---|---|
| English |
| Dutch |
| Spanish |
| Portuguese (Brazil) |
| German |
| Russian |
| French |
| Chinese (Simplified) |
| Italian |
| Chinese (Traditional) |
| Japanese |
| Arabic |
| Korean |
| Montenegrin |
| Hungarian |
The Admin → Updates page downloads the latest community translations for each resource straight into its locales/ folder. If you edited a locale file by hand, keep a copy: a download replaces that file.



