Before You Begin#
Before installing Shutters Creator, make sure your server meets the minimum requirements. Four things are mandatory; everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
| Required | Declared as a dependency. It is on by default on txAdmin servers. |
| Required | Database access. Shutters and their state are stored in one table. |
| Required | Callbacks, the zones around each shutter and the lockpick skill check. |
Framework | Required |
|
Inventory | Recommended |
|
Target | Optional |
|
Gangs | Optional | QBCore and Qbox gangs work out of the box. On ESX, gang access needs |
| Optional | Quasar-styled notifications, HUD hiding and the 3D prompt. Without them the script uses its own notifications and GTA's 3D text. |
Everything framework- or inventory-specific sits behind a small bridge file, and the resource picks the right one by looking at what is already running:
Layer | Detected resources |
|---|---|
Framework |
|
Inventory |
|
Target |
|
Detection only sees resources that are already started. Integrations has the details, and how to plug in a renamed or custom resource.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Shutters Creator#
After purchasing Shutters Creator, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Shutters Creator. With a different account the asset does not appear.
After extracting the download, you should have the following folders:
[shutterscreator]/
├── qs-shutter-creator/ -- the script
│ ├── config/ -- what you may edit
│ ├── custom/ -- framework bridges, ESX and QBCore/Qbox (editable)
│ ├── server/custom/ -- the inventory bridges (editable)
│ ├── locales/ -- 27 languages (editable)
│ └── types.lua -- the data formats, for developers
├── shutters_props/ -- the six shutter models, streamed
├── [sql]/database.sql -- the qs_shutters table
└── [img]/shutter_lockpick.png -- the lockpick item pictureKeep the folder named
qs-shutter-creator. Its sounds are loaded fromnui://qs-shutter-creator/and every export is called on that name, so a renamed copy plays no sound and breaks any script that calls it.
Installing the Resource#
Move qs-shutter-creator and shutters_props into your server's resources directory. They can live anywhere inside it, including a category folder:
resources/
└── [qs]/
├── qs-shutter-creator/
└── shutters_props/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before Shutters Creator:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory, target and optional Quasar resources
ensure ox_inventory
# ensure ox_target
# ensure qs-gangs
# ensure qs-interface
# ensure qs-textui
ensure shutters_props
ensure qs-shutter-creatorThe loading order matters. A framework that starts after Shutters Creator is not found and the resource stops with an error; an inventory that starts after it is not found and the creator's item list stays empty.
The Database#
Shutters Creator keeps everything in a single table, qs_shutters. Import [sql]/database.sql into your server's database before the first start, with HeidiSQL or any MySQL / MariaDB client.
database.sql
CREATE TABLE IF NOT EXISTS `qs_shutters` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`creator` VARCHAR(80) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`model` VARCHAR(64) NOT NULL DEFAULT 'sf_prop_sf_shutter_01a' COLLATE 'utf8mb3_general_ci',
`coords` LONGTEXT NOT NULL COLLATE 'utf8mb3_general_ci',
`open_offset` FLOAT NOT NULL DEFAULT '3',
`interact_points` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`item` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`job` VARCHAR(30) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`job_grades` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`gang` VARCHAR(30) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`gang_grades` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`enable_pin` TINYINT(1) NOT NULL DEFAULT '0',
`pin_code` VARCHAR(10) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`pin_length` TINYINT NOT NULL DEFAULT '4',
`blip` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
`is_closed` TINYINT(1) NULL DEFAULT '1',
PRIMARY KEY (`id`) USING BTREE,
INDEX `creator` (`creator`) USING BTREE
)COLLATE='utf8mb3_general_ci';
ALTER TABLE `qs_shutters`
ADD COLUMN IF NOT EXISTS `enable_pin` TINYINT(1) NOT NULL DEFAULT 0 AFTER `gang_grades`,
ADD COLUMN IF NOT EXISTS `pin_code` VARCHAR(10) NULL DEFAULT NULL AFTER `enable_pin`,
ADD COLUMN IF NOT EXISTS `pin_length` TINYINT NOT NULL DEFAULT 4 AFTER `pin_code`;Columns | Hold |
|---|---|
| What the shutter is called, which model it uses, where it stands and how far it rolls up. |
| Every interaction point with its distance and lockpick switch, and the map blip. |
| The access rules. |
| The keypad code, if the shutter has one. |
| Whether the shutter is currently up or down, and the identifier of the admin who created it. |
Updating from an older version? Run the whole file again.
CREATE TABLE IF NOT EXISTSleaves your shutters untouched and theALTER TABLEadds the PIN columns when they are missing. TheADD COLUMN IF NOT EXISTSform is MariaDB syntax — on MySQL, see Common Errors.
Adding the Lockpick Item#
The lockpick is an ordinary usable item called shutter_lockpick. Shutters Creator registers its use through your framework; your inventory only needs to know the item exists.
Add the item
Paste the definition for your inventory from Inventory Items.
Add the picture
Copy
[img]/shutter_lockpick.pnginto your inventory's item image folder.Keep the names matching
To use an item you already have — a generic lockpick, for example — set its name in
Config.LockpickIteminstead.
Claiming Admin Access#
The creator is where shutters are placed and their access is decided, so it is admin-only. /shuttercreator asks your framework whether the player is staff:
Players in the admin or superadmin group. Set the group with ESX's own command, from the server console or as an existing admin:
setgroup <server id> adminPlayers with the admin or god permission, or allowed the command ace — which txAdmin admins already have. In server.cfg:
add_ace group.admin command allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.adminAnybody else who types the command sees You do not have permission to do this.
Configuring the Resource#
Shutters themselves are never configured in files — they are created in game. The files are for the server-wide behaviour and the bridges:
File | Contents |
|---|---|
| The language, target, lockpick item and minigame, the shutter animation, sounds, debug and the models offered in the creator. |
| Every text the script shows, one file per language. |
| The framework bridges: the admin check, jobs, gangs and items. |
| Notifications, the 3D prompt and the HUD — where another notification or text UI resource is plugged in. |
| One bridge per inventory: where the creator reads item names and pictures from. |
The values worth reviewing first:
Config.Locale = 'en' -- one of the 27 files in locales/
Config.UseTarget = false -- true: ox_target / qb-target instead of the E prompt
Config.LockpickItem = 'shutter_lockpick' -- the usable lockpick item
Config.LockpickMinigame = true -- ox_lib skill check before a pick succeeds
Config.AnimDuration = 3000 -- how long a shutter takes to roll, in ms
Config.Debug = true -- verbose console output: turn it off on a live server
Config.Debugships astrueso the first setup is easy to follow in the console. Set it tofalseonce everything works. Every option is described in Usage → Configuration Reference.
Verifying the Installation#
After completing the installation, restart your server and read the console. The server — and each client, in the F8 console — confirms which framework bridge it loaded:
[INFO] Successfully loaded the framework. esxIf the server instead repeats Using standalone inventory…, your inventory was not detected — move it above ensure qs-shutter-creator. Then join your server and work through the first loop:
Open the creator
Type
/shuttercreatoras an admin. On a fresh server the list on the left is empty.Create a shutter
Press Create shutter, name it, pick a model, press Select and place it over a doorway, add an interaction point, and save. Usage walks through every step.
Open it
Walk to the interaction point and press
Eat Press [E] to enter the shutter. The shutter rolls up for everyone nearby; press again to bring it down.
Nothing needs a restart from here on. Every shutter, its access rules and its blip are created, edited and deleted in game, and every player sees the change straight away.



