How Integrations Work#
Nothing inside Robberies Creator knows which framework, target, inventory or dispatch you run. Each one is reached through a small bridge file in client/custom/ or server/custom/ — unencrypted and editable — and only the bridge for the detected resource runs. Detection happens at boot, and the console prints what it picked.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Required. Money, jobs, grades, items and police counts all come from it. |
Inventory |
| Items are handled through the framework's own functions, and the item picker reads the |
Target |
| A built-in prompt: walk up, read |
Dispatch |
| A built-in alert: officers get a notification, a sound, and a flashing blip with a route for 60 seconds. |
Doors | Built in, on GTA's door system. | Nothing to install. No doorlock resource is used. |
Progress bar · Quick check |
| Required — ox_lib is a dependency. |
Lasers · Minigames |
| Required dependencies. |
Database |
| Required. |
Every optional integration degrades quietly. A missing target or dispatch falls back to the built-in one instead of throwing an error — which is why the boot line matters: it is the only place that tells you a layer fell back to
standalonebefore a player does.
Overriding Detection#
Each layer is found by looking for started resources in priority order — the first one found wins. To pin one by hand, replace the detection call in config/main.lua with the id from its list:
-- Auto, the default: the first started resource in the list wins.
Config.Inventory = DependencyCheck(inventories) or 'standalone'
-- Manual: skip detection entirely.
Config.Inventory = 'codem' -- codem-inventory
Config.Dispatch = 'ps-dispatch'This is worth doing when two candidates run at once — qs-police-creator is preferred over qs-dispatch when both run — or when a resource has been renamed on your server. These four are deliberately not in the settings panel: the bridges are chosen while the resource loads, so they can only change with a restart.
Setting | Ids |
|---|---|
|
|
|
|
|
|
|
|
Police and Dispatch#
Two different things, set in two places:
Question | Where |
|---|---|
How many officers must be online to start | The Police Count node in each robbery — its own job list, count and minimum grade. |
Which jobs receive the dispatch call |
|
The Police Alert node sends the call from the leader's client through the detected dispatch, at the leader's position or a fixed one. Its panel shows the extra fields your dispatch understands — priority and image for qs-dispatch and qs-police-creator, blip scale and duration for cd_dispatch, and so on. The built-in fallback alerts the usual police job names (police, sheriff, lspd, bcso, sasp, sahp, fib, ranger, trooper, marshal).
Item Use Triggers#
An Item Use trigger does not register the item itself; it listens to your inventory and framework for the moment any item is used. ox_inventory (and origen), qs-inventory, ESX, QBCore and Qbox are hooked automatically five seconds after start. The item must be a usable item in your inventory for the use to reach the script.
Notifications and Sounds#
Robberies Creator shows its own notifications, styled like the creator — no notification resource is needed. Each one also plays a short GTA frontend sound for its type. Config.NotificationSounds in config/main.lua changes them:
Config.NotificationSounds = nil -- the built-in sounds
Config.NotificationSounds = false -- silent
Config.NotificationSounds = { -- your own; a missing type uses info's
info = { name = 'NAV_UP_DOWN', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
success = { name = 'MISSION_PASS_NOTIFY', set = 'DLC_HEISTS_GENERAL_FRONTEND_SOUNDS' },
warning = { name = 'CHECKPOINT_PERFECT', set = 'HUD_MINI_GAME_SOUNDSET' },
error = { name = 'CHECKPOINT_MISSED', set = 'HUD_MINI_GAME_SOUNDSET' },
}Another resource can show one of these notifications to a player from the server:
TriggerClientEvent('qs-robberies:notify', source, 'The vault is open', 'success', 5000)
-- type: info · success · warning · errorDiscord Logs#
Logging is a node, not a config file: place a Discord Webhook node wherever you want a message — on start, on a tripped laser, on success. Each one has its own webhook URL, bot name and avatar, embed title, description, colour, footer and thumbnail, so different robberies can post to different channels. Only discord.com and discordapp.com webhook addresses are accepted.
Adding a Backend#
Supporting something that is not on the list is one file plus one line. Every bridge starts with a guard, so only the chosen one runs:
Copy the closest bridge
Copy the nearest file —
server/custom/inventory/ox.lua,client/custom/dispatch/standalone.lua— and rename it after your resource.Fill in its functions
Two functions feed the item picker. Giving and taking items falls back to the framework unless you also define
Inventory_AddItem,Inventory_RemoveItem,Inventory_HasItemandInventory_GetItemCount.lua -- server/custom/inventory/myinventory.lua if Config.Inventory ~= 'myinventory' then return end function GetAllItems() local items = {} for name, data in pairs(exports['my-inventory']:GetItems()) do items[#items + 1] = { name = name, label = data.label or name, weight = data.weight or 0 } end return items end function GetInventoryImagePath() return 'nui://my-inventory/html/images/', 'nui://my-inventory/html/images/placeholder.png' endOne client function receives the alert.
datacarriesmessage,alertCode,alertSnippet,coords,priority,imageand the blip settings.lua -- client/custom/dispatch/mydispatch.lua if Config.Dispatch ~= 'mydispatch' then return end function SendPoliceAlert(data) exports['my-dispatch']:CustomAlert({ code = data.alertCode, text = data.message, coords = data.coords, jobs = Config.PoliceJobs, }) endSix client functions:
AddSphereZone,RemoveZone,AddEntityTarget,RemoveEntityTarget,AddModelTargetandRemoveModelTarget. Each option carriesname,label,icon,distance,canInteractandonSelect— copyclient/custom/targets/ox_target.luaas the model.Register it for detection
Add one entry to the matching list at the top of
config/main.lua— resource name, then id — and restart.lua local inventories = { { 'ox_inventory', 'ox' }, -- … { 'my-inventory', 'myinventory' }, }
Languages#
Twenty translations ship in locales/, covering both the in-game messages and the whole creator:
EN · ES · FR · DE · PT · IT · NL · PL · TR · AR · ZH · JA · KO · RU · SV · DA · NO · CS · RO · HU
Pick one in /robberiesconfig → General; it applies live, without a restart. Any text missing from a translation falls back to English. To fix a wording, edit the JSON file for your language — the files are not encrypted.



