How Integrations Work#
Doorlock Creator does not hard-code your framework, inventory or target. Each lives behind a small, unencrypted bridge file, and the right bridge is chosen when the resource starts by checking which resources are already running. Nothing has to be selected by hand.
Layer | Supported | Used for | Without it |
|---|---|---|---|
Framework | es_extended · qb-core · qbx_core | Admins, jobs and grades, character identifiers, items carried, money. | The resource stops with an error. A framework is required. |
Inventory | qs-inventory · ox_inventory · qb-inventory · tgiann-inventory · codem-inventory | The item list, with pictures, in the creator's Required Item field. | The list is empty and the console repeats a warning every few seconds. Doors work otherwise. |
Target | ox_target · qb-target | The Lock / Unlock option on each door, when | Keep |
Text UI | qs-textui | A styled 3D | Plain game text on a dark box. |
HUD | qs-interface | Hidden while the creator is open. | Only the minimap is hidden. |
Detection only sees resources that have already started. Ensure your framework, inventory and target before
qs-doorlock-creatorinserver.cfg.
Frameworks#
QBCore and Qbox share one bridge (custom/qb/); ESX has its own (custom/esx/). What each one reads:
What | ESX | QBCore | Qbox |
|---|---|---|---|
Admins |
|
| |
Player whitelist |
|
| |
Money |
|
|
|
Every one of these is a short function in the bridge — playerIsAdmin, getIdentifier, getAccountMoney, removeAccountMoney, getItem, getJobName, getJobGrade — so a server with renamed accounts or a custom staff system changes one function rather than the script.
The [E] Prompt or a Target#
-- config/main.lua
Config.UseTarget = false -- true = ox_target / qb-target, false = [E] prompt
Config.TargetWidth = 5.0 -- size of the target box placed on each door
Config.TargetHeight = 5.0
Config.ZoneDebug = false -- true draws the boxes while you test
Config.Doorlock.DrawTextZOffset = 0.35 -- height of the [E] prompt above the doorWith a target, each door gets a box at its centre with one option — Unlock door or Lock door depending on its state — reachable from the door's distance. ox_target is used through its built-in qtarget compatibility, which it ships enabled. Doors marked hidden get no prompt and no target in either mode.
Notifications#
Messages such as Invalid passcode are drawn by Doorlock Creator's own interface. To send them to your notification system instead, edit Notification in custom/client.lua — examples for qs-interface and ox_lib are already there, commented out:
-- custom/client.lua
---@param msg string
---@param type 'info' | 'error' | 'success'
function Notification(msg, type)
lib.notify({ title = 'Doors', description = msg, type = type })
endServer scripts can show the same notification to a player with TriggerClientEvent('doorlock:notification', source, 'Vault opened', 'success').
The HUD and the prompt#
ToggleHud in the same file hides the minimap and the qs-interface HUD while the creator is open — add your own HUD's export there. DrawText3D draws the [E] prompt and can be pointed at any other 3D text resource the same way.
Overriding Detection#
Each layer is a small table in config/main.lua pairing a resource name with a bridge. When two candidates run at once the pick is not guaranteed, so remove the ones you do not want — or add a line for a renamed resource:
local inventories = {
['qs-inventory'] = 'qs',
-- ['ox_inventory'] = 'ox', -- commented out: never pick ox_inventory
['my-inventory'] = 'qb', -- a renamed qb-inventory
}
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
}Adding an Inventory#
Copy the closest bridge
Duplicate the file in
server/custom/inventory/whose inventory is most like yours, and name it after your key —myinv.lua.Change the guard and the item list
Set the first line to your key, and make
formatItemListreturn your items with a picture:lua if Config.Inventory ~= 'myinv' then return end function sv_inventory:formatItemList() local items = exports['my-inventory']:Items() for name, item in pairs(items) do item.name = name item.image = 'nui://my-inventory/html/images/' .. (item.image or name .. '.png') end return items endRegister it
Add
['my-inventory'] = 'myinv'to theinventoriestable inconfig/main.luaand restart.
Whether a player carries an item is asked through the framework, so a new inventory only needs the item list. A target that is not ox_target or qb-target is added the same way in client/custom/target/main.lua.
Languages#
Thirteen translations ship in locales/: Czech (cs), Danish (da), German (de), English (en), Spanish (es), French (fr), Italian (it), Dutch (nl), Norwegian (no), Portuguese (pt), Romanian (ro), Slovenian (sl) and Swedish (sv). Pick one with Config.Locale.
For another language, copy en.json to xx.json, translate the values (never the keys) and set Config.Locale = 'xx'. Any key a translation is missing falls back to English, and the console names it so you can fill it in.



