How Integrations Work#
Everything that depends on another resource sits behind a small, open bridge file. On start, the script looks for a known resource that is already running and uses the matching bridge. Nothing has to be configured if you run one of the supported resources.
Layer | Supported | Bridge files |
|---|---|---|
Framework | es_extended · qb-core · qbx_core |
|
Inventory | qs-inventory · ox_inventory · qb-inventory · ps-inventory · core_inventory · codem-inventory · origen_inventory · chezza inventory |
|
Clothing | qs-appearance · illenium-appearance · fivem-appearance · esx_skin · qb-clothing · codem-appearance · ak47_clothing · raid_clothes · rcore_clothes · rcore_clothing · sleek-clothestore · tgiann-clothing · p_appearance |
|
Dispatch | qs-dispatch · qs-police-creator · qb-policejob |
|
Target | ox_target · qb-target (when |
|
Weather | qb-weathersync · cd_easytime · vSync |
|
Lab music | xsound · mx-surround · qs-3dsound |
|
Text, progress and HUD | qs-textui · qs-interface, otherwise built in and ox_lib |
|
Phone | qs-smartphone-pro: phone chargers inside labs | — |
Sounds | interact-sound: door, doorbell and knock sounds ( | — |
Anticheat | FiveGuard: freecam and noclip are allowed while decorating ( | — |
Qbox is supported through qbx_core's QBCore bridge. When qbx_core is running, black money is treated as a
black_moneyitem instead of QBCore'smarkedbills.
Overriding Detection#
Detection picks the first known resource it finds running. If you run two of the same kind at once (two inventories, or two dispatch scripts), the choice is unpredictable. Set the value yourself in config/main.lua:
-- Auto, the default:
Config.Inventory = DependencyCheck(inventories) or 'default'
-- Forced:
Config.Inventory = 'ox_inventory'
Config.Dispatch = 'qs-dispatch'
Config.Wardrobe = 'illenium-appearance'The value must match a file name in the matching client/custom/ folder.
Inventories and Stashes#
Lab stashes, and furniture marked as a stash, open through OpenStash(customData, uniq) in client/custom/inventory/<inventory>.lua. Each stash has a unique id per lab and per piece of furniture, so its contents stay in that lab.
The stash is registered on the server the first time it is opened, with the slots and weight of the lab or furniture. Nothing to configure.
Works out of the box, for qs-inventory and qs-advancedinventory. With qs-inventory you also get six quests (see below).
Uses the server-side OpenInventory export of qb-inventory 2.x. The file contains commented lines for older versions of qb-inventory: swap them if your stash does not open.
The default ESX inventory has no stash bridge. On ESX, run one of the supported inventories (qs-inventory, ox_inventory, core_inventory, codem-inventory, origen_inventory or chezza) so lab stashes and stash furniture open. You can also write your own OpenStash as shown in Adding a Backend.
Target#
With Config.UseTarget = false (the default) every interaction is a floating [E] prompt. Set it to true to use ox_target or qb-target instead. Targets are added to:
Dealers, and the plants and barrels in farming zones.
Lab entries: Inspect, Show Contract, Enter Lab and Ring Door.
Inside labs: the exit and doorbell, the stash and vault code, the wardrobe, and every processing table.
The size of the target boxes comes from Config.TargetWidth, Config.TargetLength and Config.TargetDistance.
Police Dispatch#
Street corner deals can alert the police (Config.PoliceCallChance). The alert is sent by PoliceDispatch(alert) in client/custom/dispatch/<dispatch>.lua, where you can change the jobs that receive it, the blip and the text. Without a supported dispatch, nothing is sent.
-- client/custom/dispatch/qs-dispatch.lua: who receives it
jobs = { 'police', 'sheriff', 'traffic', 'patrol' },Notifications, Text and Progress Bars#
custom/client.lua holds the functions every message and prompt goes through. Change them to use any system you like:
Function | By default |
|---|---|
| The script's own notifications. qs-interface and ox_lib versions are in the file, commented. |
| qs-textui when running, otherwise built-in 3D text. |
| qs-interface when running, otherwise |
| In |
Clothing and Weather#
The wardrobe point in a lab calls OpenClotheMenu() from client/custom/wardrobe/<clothing>.lua. Inside a shell, WeatherSyncEvent pauses your weather script so the interior stays clear, and resumes it when you leave.
qs-inventory Quests#
With qs-inventory running, six quests are created for every player. Their titles, rewards and required levels are in server/custom/missions.lua.
Quest | Done by | Reward | Level |
|---|---|---|---|
Start Cooking | Buying a lab | 300 | 1 |
Harvest Season | Harvesting in farms | 250 | 1 |
Lab Designer | Placing furniture | 200 | 1 |
Production Run | Processing batches | 300 | 2 |
Dirty Money | Cutting black money | 200 | 2 |
Street Dealer | Selling to an NPC dealer | 250 | 2 |
Adding a Backend#
To support a resource that is not on the list:
Copy the closest bridge
Duplicate the most similar file in
client/custom/<kind>/and name it exactly like the resource, for exampleclient/custom/inventory/my_inventory.lua.Change the guard and the calls
The first line of each bridge returns unless that resource was selected. Change it to your resource's name, and replace the calls inside the function with your resource's exports or events.
lua if Config.Inventory ~= 'my_inventory' then return end function OpenStash(customData, uniq) exports['my_inventory']:OpenStash(uniq, customData.maxweight, customData.slots) endSelect it
Set
Config.Inventory = 'my_inventory'inconfig/main.luaand restart the script.
A whole framework is added the same way: copy custom/qb/ or custom/esx/ and fill in its functions: player data, money, items, jobs, admin check and usable items.
Languages#
41 translations ship in locales/: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk, ur, vi and zh. Choose one with Config.Locale. The same texts are used by the interface.
To add a language, copy en.json to a new file, such as xx.json, translate the values (keep the {{placeholders}}) and set Config.Locale = 'xx'. Any key missing from your file falls back to English, with a warning in the console.



