Before You Begin#
Before installing Doorlock Creator, make sure your server meets the minimum requirements. Three resources and OneSync are mandatory; everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
| Required | Stores every door and its lock state. |
| Required | Callbacks and shared helpers. |
OneSync | Required | Enabled on your server (it is on by default on current artifacts). |
Framework | Required | ESX, QBCore or Qbox — auto-detected. There is no standalone mode: jobs, identifiers and money come from the framework. |
Inventory | Recommended | Fills the item list used by the Item Access rule. qs-inventory, ox_inventory, qb-inventory, tgiann-inventory or codem-inventory. |
Target | Optional | ox_target or qb-target, only if you switch |
| Optional | A styled 3D prompt instead of the plain game text. |
| Optional | Its HUD is hidden while the creator is open. |
Everything framework- or inventory-specific sits behind a small, editable bridge file, and the resource picks the right one by looking at what is already running:
Layer | Detected resources |
|---|---|
Framework | es_extended · qb-core · qbx_core |
Inventory | qs-inventory · ox_inventory · qb-inventory · tgiann-inventory · codem-inventory |
Target | ox_target · qb-target |
Run only one resource per layer. Integrations explains what each one is used for and how to pin one by hand.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Doorlock Creator#
After purchasing Doorlock 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 Doorlock Creator.
After extracting the download, you should have the following folder:
qs-doorlock-creator/
├── config/main.lua -- the configuration file
├── custom/ -- framework bridges: notifications, admins, money (editable)
├── client/custom/ -- target bridge (editable)
├── server/custom/ -- inventory bridges (editable)
├── database/ -- database.sql
├── locales/ -- 13 languages
├── docs/ -- an offline testing checklist
└── web/ -- the interface, its images and the lock soundsKeep the folder named
qs-doorlock-creator. The interface is loaded fromnui://qs-doorlock-creator/web/(Config.Path) and other scripts call its exports by that name, so a renamed copy opens a blank panel and breaks every integration.
Installing the Resource#
Move the qs-doorlock-creator folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-doorlock-creator/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before Doorlock Creator:
ensure oxmysql
ensure ox_lib
# Framework — one of them
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory, target and text UI
ensure ox_inventory
ensure ox_target # only used with Config.UseTarget = true
ensure qs-textui # optional
ensure qs-doorlock-creatorThe loading order matters. Detection only sees resources that are already started: a framework that starts later stops the resource with an error, and an inventory that starts later leaves the item list empty.
The Database#
Doorlock Creator keeps every door in a single table. It is not created automatically — import database/database.sql into your server's database (HeidiSQL, phpMyAdmin or the command line) before the first start:
CREATE TABLE IF NOT EXISTS `qs_doorlocks` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(128) NOT NULL,
`state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1 = locked, 0 = unlocked',
`data` LONGTEXT NOT NULL COMMENT 'JSON: door slots, distance, requirements, autolock, etc.',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `idx_state` (`state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;Column | Holds |
|---|---|
| The door's name. Unique — two doors cannot share one. |
|
|
| Everything else as JSON: the door models and positions, the distance, the access rules, the animation and the sounds. |
The script needs no items in your inventory. A door can require any item you already have — a keycard, a badge, a key — and Usage shows how to add one if you want a dedicated keycard.
Who Can Open the Creator#
The creator is where doors are made and their rules decided, so /doorlockcreator only opens for server staff and the jobs you list. Every save, edit and delete is checked again on the server.
Players in the admin or superadmin group. Nothing to configure.
Players with the god or admin permission, or the command ace — which the usual admin group in server.cfg already has:
add_ace group.admin command allow
add_principal identifier.license:xxxxxxxx group.adminLet a job manage its own doors without being staff. List it in config/main.lua; grade = false allows every grade, a list allows only those exact grades:
Config.CreatorJobs = {
{ job = 'police', grade = { 1, 2, 3 } }, -- only grades 1, 2 and 3
{ job = 'ambulance', grade = false }, -- every grade
}The admin check lives in custom/esx/server.lua and custom/qb/server.lua (playerIsAdmin), both editable if your server decides staff differently.
Configuring the Resource#
Doors themselves are never configured in files — they are made in game and live in the database. The files only hold server-wide behaviour:
File | Contents |
|---|---|
| Language, creator jobs, target or 3D text, door behaviour, money types, sounds and debug. |
| How notifications, the 3D prompt and the HUD behave. |
| The framework bridge: admins, jobs, identifiers, items and money. |
| The target bridge. |
| One bridge per inventory: item list and item images. |
| Every text in the interface and the prompts. |
The values worth reviewing first:
Config.Locale = 'en' -- cs · da · de · en · es · fr · it · nl · no · pt · ro · sl · sv
Config.UseTarget = false -- true = ox_target / qb-target, false = floating [E] prompt
Config.TargetWidth = 5.0 -- target box size around the door (target mode)
Config.TargetHeight = 5.0
Config.DisableSounds = false -- true mutes the interface and the lock / unlock sounds
Config.MaxSearchResults = 20 -- players returned by the creator's player search
Config.Debug = true -- set to false on a live server
Config.ZoneDebug = false -- draws the target boxes, for testing
Config.MoneyTypes = { -- the accounts a paid door can charge
{ label = 'Money', value = 'money' },
{ label = 'Bank', value = 'bank' },
{ label = 'Black Money', value = 'black_money' },
}And the door behaviour block:
Config.Doorlock = {
ToggleCooldownMs = 750, -- minimum time between two requests by one player on one door
SyncChunkSize = 25, -- doors per packet when a player joins
DefaultAutolockSeconds = 0, -- relock every door after N seconds (0 = off)
MaxInteractDistance = 3.0, -- extra metres the server tolerates over a door's distance
DrawTextZOffset = 0.35, -- height of the [E] prompt above the door
TargetZoneKey = 'qs_doorlock', -- prefix for target zone names (change only on a clash)
DefaultInteractionAnim = { -- animation for new doors
dict = 'anim@heists@keycard@',
clip = 'exit',
durationMs = 900,
},
}
Config.Debugships astrueso the first start is easy to diagnose. Turn it off once doors work — it prints a line for every action.
Verifying the Installation#
Restart your server and read the console. A healthy start prints the framework it loaded and no red errors about qs_doorlocks. Then join and work through the first loop:
Open the creator
Type
/doorlockcreator. The Door Locks panel opens, empty on a fresh install.Lock a door
Press Create new, name it, press Select 1 Door Entity, aim at a door and left-click. Save without any requirements.
Use it
Walk up to the door:
[E] Unlock doorappears. Press E — the door unlocks for everyone, with the keycard animation and the unlock sound.Restart and check
Restart the resource. The door is still there and still in the state you left it.
Nothing needs a restart from here on. Every door you create, edit or delete is pushed to every player the moment you save.
docs/doorlock_smoke.mdin the download holds a longer checklist covering jobs, money, passcodes and double doors.



