How Integrations Work#
The core of Shutters Creator does not know which framework, inventory or target you run. Each one is reached through a small bridge file, and the right bridge is picked at start by looking at which resources are already running. The framework bridges (custom/) and the inventory bridges (server/custom/inventory/) are open for you to edit.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Required. The resource stops at start with an error. |
Inventory |
| Standalone mode: the creator's Required Item list is empty and the console repeats a warning. Everything else works. |
Target |
| A 3D prompt and the E key — the default. |
Gangs | QBCore and Qbox gangs · | No gang selector in the creator, and gang rules are not checked. |
Notifications · HUD |
| The script's own notifications; only the minimap is hidden while the creator is open. |
3D prompt |
| GTA's own 3D text on a dark box. |
Minigame | The ox_lib skill check | Always available — ox_lib is a dependency. |
Database |
| Required. |
Detection matches the exact resource names above and only sees resources that are already started. A renamed framework or inventory, or one that starts after Shutters Creator, is not found. Fix the order in
server.cfg, or add the new name to the tables inconfig/main.luaas shown below.
Frameworks#
There are two bridges: custom/esx/ for ESX and custom/qb/ for QBCore. Qbox uses the QB bridge through its built-in QBCore compatibility, so nothing extra is needed. Each bridge has a client and a server file, and this is what the script asks of it:
Used for | ESX | QBCore · Qbox |
|---|---|---|
Who is an admin | Group | Permission |
Jobs and grades | ESX's job list and the player's job | The shared jobs and the player's job grade level |
Gangs |
| The shared gangs and the player's gang |
Required item check | The player's inventory item count | The player's item by name |
The lockpick item | Registered as an ESX usable item | Registered as a QBCore usable item |
Who created a shutter | The player's identifier | The player's citizen id |
Gangs on ESX#
ESX has no gangs of its own, so gang access on ESX comes from qs-gangs. With it running, the creator lists every gang except the neutral one, with the ranks qs-gangs defines. Without it, the gang selector is hidden and gang rules are skipped.
Inventories#
The inventory bridge feeds one thing: the creator's Required Item list, with each item's name, label and picture. The check itself — does the player carry it? — goes through the framework. Each bridge in server/custom/inventory/ reads the pictures from that inventory's own image folder, so the creator shows the same pictures as the player's inventory. ox_inventory honours its inventory:imagepath convar.
Adding your own inventory#
Create a bridge that returns your item list, then tell the detection about your resource:
-- server/custom/inventory/myinventory.lua
if Config.Inventory ~= 'myinventory' then
return
end
function sv_inventory:formatItemList()
local itemList = {}
for name, item in pairs(exports['my-inventory']:Items()) do
itemList[name] = {
name = name,
label = item.label,
image = ('nui://my-inventory/images/%s.png'):format(name),
}
end
return itemList
end
-- config/main.lua — add your resource to the inventories table
-- ['my-inventory'] = 'myinventory',Targets#
Set Config.UseTarget = true and every interaction point becomes a target box instead of a 3D prompt. ox_target is used when it is running, qb-target otherwise.
Detail | Value |
|---|---|
Option label | Access <shutter name> — the |
Box size |
|
Reach | 2.5 m. With targets on, the creator's Interaction Distance is not used. |
When it exists | Created when the player first comes near the shutter, and removed when the resource stops. |
Lockpicking does not change with targets: the item is still used from the inventory, at a point with Enable Lockpick on.
Notifications, the 3D Prompt and the HUD#
These three live in custom/client.lua, each as one function you can rewrite to use another resource:
Function | With Quasar resources | Without them |
|---|---|---|
|
| The script's own notifications |
|
| GTA 3D text on a dark box |
| Hides the | Hides the minimap only |
Server messages reach the player through the same Notification, so one change covers both sides. For example, to use ox_lib's notifications, replace the body of the function:
-- custom/client.lua
function Notification(msg, type)
lib.notify({
description = msg,
type = type == 'info' and 'inform' or type, -- ox_lib calls it 'inform'
})
endAdding Your Own Framework#
A framework bridge is a plain Lua table. Copy custom/qb/ or custom/esx/ to custom/<name>/, rewrite each function for your core, and map your core's resource name to <name> in config/main.lua:
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['my_core'] = 'mycore', -- loads custom/mycore/server.lua and custom/mycore/client.lua
}Side | Functions the script calls |
|---|---|
Server |
|
Client |
|
The exact arguments and return values of every function are annotated in types.lua (ServerFramework and ClientFramework).



