How Integrations Work#
Bunkers Creator never calls your framework, inventory, target or key script directly. Each one is reached through a small bridge file in client/custom/ or server/custom/, and only the bridge for what you run switches on. These folders are open: you can read and change every bridge.
Layer | Supported | Without it |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Standalone: money always succeeds, admins are players with the |
Inventory | ox_inventory · qb-inventory · qs-inventory · esx_inventoryhud · origen_inventory · mf-inventory · codem-inventory · tgiann-inventory · lj-inventory · core_inventory · chezza_inventory · ps-inventory · aj-inventory · mythic_inventory | An in-memory inventory: production works, but the storage and gun locker cannot be opened and items are not kept across restarts. |
Target | ox_target · qb-target | ox_lib zones with a text prompt, used with E. |
Vehicle keys | qs-vehiclekeys · qb-vehiclekeys · jg-vehiclekeys · wasabi_carlock · vehicles_keys · mk_vehiclekeys · t1ger_keys · Renewed-Vehiclekeys · jota-dev-vehicle-key · qbx_vehiclekeys | The caddy and vehicles driven in are handed over without keys. |
Phone | The BunkerHQ app for qs-smartphone | Bunkers are run from the laptop only. |
Database | oxmysql | Required. |
Overriding Detection#
Detection looks for a started resource with a known name. If yours is renamed, or two candidates run at once, set the value by hand in shared/config.lua:
-- Auto, the default
Config.Framework = checkDependencies(frameworks) or 'standalone'
Config.Inventory = checkDependencies(inventories) or 'standalone'
Config.Target = checkDependencies(targets) or 'standalone'
Config.VehicleKeys = checkDependencies(vehiclekeys) or 'standalone'
-- Pinned by hand
Config.Framework = 'qbcore' -- esx · qbcore · qbox · standalone
Config.Inventory = 'ox' -- ox · qbcore · qs · esx_inventoryhud · origen · mf · codem · tgiann · lj · core · chezza · ps · aj · mythic · standalone
Config.Target = 'ox' -- ox · qb · standalone
Config.VehicleKeys = 'qs' -- qs · qb · jg · wasabi · vehicles_keys · mk · t1ger · renewed · jotadev · qbx · standaloneDetection only sees resources that are already started, so the most common fix is simply to move the resource above ensure qs-bunkers-creator.
Money#
What | Account |
|---|---|
Buying a bunker | Bank |
Buying supplies | Bank |
Selling stock | ESX: |
To pay out somewhere else — dirty money as an item, a laundering script — change AddMoney in server/custom/frameworks/<framework>.lua.
The Bridge Files#
What each bridge provides, should you need to adapt one:
Frameworks — client/custom/frameworks · server/custom/frameworks
-- client
GetPlayerData()
GetPlayerIdentifier()
ShowNotification(message, type) -- change this to use your own notifications
WaitForPlayerLoaded()
-- server
GetPlayerFromId(source)
GetPlayerIdentifier(source)
GetPlayerName(source) -- { firstName, lastName }
GetPlayerJob(source) -- job name and grade, used for raids
GetPlayerMoney(source, account)
RemoveMoney(source, amount, account)
AddMoney(source, amount, account)
IsAdmin(source) -- who may open /bunkercreator
GetOnDutyPoliceCount(jobs) -- the police gate for missionsInventories — client/custom/inventories · server/custom/inventories
-- client
OpenInventory(type, id) -- opens a stash
GetItemMetadata(itemName) -- { stackable, maxStack }
-- server
AddItem(source, item, count)
RemoveItem(source, item, count)
GetItemCount(source, item)
GetPlayerInventory(source)
RegisterStash(stashId, label, slots, weight)
AddItemToStash(stashId, item, count)
RemoveItemFromStash(stashId, item, count)
GetStashItems(stashId) -- { item = count }
OpenStash(source, stashId)Stashes are named bunker_<id> (the bunker storage, 50 slots) and gunlocker_<id> (the gun locker, 50 slots). The qb-inventory bridge supports both the current and the legacy stash API.
Targets — client/custom/targets
A TargetSystem table that creates and removes the zones of a bunker: exterior, interior, raid, walk-in and mission completion. Most points use a 1.5 m zone, vehicle points 3 m and the garage 2 m.
Vehicle keys — client/custom/vehiclekeys
GiveVehicleKeys(vehicle, plate)
RemoveVehicleKeys(vehicle, plate)Item pictures in the workbench come from the folder set for your inventory in Config.InventoryImagePaths. If your inventory keeps its images elsewhere, change the path there.
The BunkerHQ Phone App#
server/custom/sv_bunkerhq.lua feeds the BunkerHQ app for the Quasar smartphone: the bunkers a player owns or holds keys to, with their stock, supplies, heat and raid state, the bunkers for sale, the sell value of the stock at each route, and keyholder management with a picker of players within 12 m. It reuses the same keyholder rules as the laptop.
Not using the app? The file does nothing harmful, but you can remove it together with its line in fxmanifest.lua.
Adding a Backend#
Copy the closest bridge
Copy, say,
server/custom/inventories/ox.luaand its client twin, and rename them after your resource. Every file in the folder is loaded automatically.Change the guard and the calls
Each bridge only runs when it is the chosen one. Change the guard to your own name and fill the functions with your resource's exports:
lua if Config.Inventory ~= 'my_inventory' then return end function AddItem(source, item, count) return exports['my_inventory']:AddItem(source, item, count) end -- ...and the rest of the list aboveRegister it for detection
Add your resource to the matching table at the top of
shared/config.lua—['my_inventory'] = 'my_inventory'— or pinConfig.Inventoryto it. Add its image folder toConfig.InventoryImagePaths.
Languages#
Eleven translations ship in locales/: English (en), Spanish (es), French (fr), German (de), Italian (it), Portuguese (pt), Dutch (nl), Hindi (hi), Japanese (ja), and Chinese simplified (zh-CN) and traditional (zh-TW). Set Config.Language in shared/config.lua. The interface uses the same file as the game.
To add another, copy locales/en.lua to a new file, change Locales["en"] at its top to your code, translate the values, and set Config.Language to that code.



