How Integrations Work#
Nothing inside Advanced Garages is tied to one framework, key system or fuel script. Every call to another resource sits in a small, unencrypted bridge file under client/custom/ or server/custom/. Most layers are detected at start by looking for a started resource from a list; menu and target are chosen by you.
Layer | Supported | Without it |
|---|---|---|
Framework (auto) | es_extended · qb-core · qbx_core | Required. Vehicles live in |
Vehicle keys (auto) | qs-vehiclekeys · qb-vehiclekeys · qbx_vehiclekeys · wasabi_carlock · MrNewbVehicleKeys · F_RealCarKeysSystem · fivecode_carkeys · glfp10_carkeys · jc_vehiclekeys · mono_carkeys · ti_vehicleKeys · vehicles_keys · xd_locksystem | Cars come out without keys being handed over. |
Fuel (auto) | qs-fuelstations · LegacyFuel · ox_fuel · cdn-fuel · ps-fuel · lj-fuel · okokGasStation · esx-sna-fuel · ti_fuel · BigDaddy-Fuel | Fuel is not saved; cars come out full. |
Inventory (auto) | qs-inventory · ox_inventory · qb-inventory · ps-inventory · core_inventory · codem-inventory · origen_inventory · tgiann-inventory · inventory (Chezza) | Stash furniture cannot be opened. Everything else works. |
Clothing (auto) | qs-appearance · illenium-appearance · fivem-appearance · qb-clothing · codem-appearance · ak47_clothing · rcore_clothes · rcore_clothing · raid_clothes · sleek-clothestore · tgiann-clothing · p_appearance | Wardrobe furniture has no outfit menu of its own to open. Everything else works. |
Weather sync (auto) | cd_easytime · qb-weathersync · vSync | The garage menu keeps your server's weather instead of a clear day. |
Menu (you choose) | ox_lib · qb-menu · nh-context · esx_menu_default · esx_context | Must be set: management, keys, recovery and aircraft lists use it. |
Target / radial (you choose) | ox_target · qb-target · qb-radialmenu · qs-radialmenu |
|
Gangs | qs-gangs | Gang restrictions on garages have no effect. |
Text UI · HUD | qs-textui · qs-interface | Native 3D text, and the HUD is left as it is. |
Database | oxmysql | Required. |
Choosing the Menu and the Target#
-- config/config.lua
Config.Menu = 'ox_lib' -- 'ox_lib' | 'qb-menu' | 'nh-context' | 'esx_menu_default' | 'esx_context'
Config.UseTarget = 'none' -- 'ox_target' | 'qb-target' | 'qb-radialmenu' | 'qs-radialmenu' | 'none'qb-menu also needs qb-input for its text fields, and nh-context needs nh-keyboard. With qs-radialmenu the garages register themselves as an item provider when they start, so open, store, enter, buy, recover, management, impound and job-garage buttons appear by themselves near a garage. qs-radialmenu's mechanic Repair button runs /repairvehicle.
Notifications and the HUD#
Messages are shown by the garage interface's own notifications. To send them to another system, edit Notification in client/custom/framework/esx.lua or qb.lua; commented examples for qs-interface and ox_lib are already there. ToggleHud in the same file hides your HUD while the garage menu, the creator or decoration is open.
SpawnVehicleEvents(vehicle, plate) in that file runs every time a car leaves a garage: the place to add anything your server needs on a fresh spawn.
Discord Logs#
Five kinds of action can be posted to Discord as an embed. Paste one webhook URL per kind; an empty one is simply not sent.
Key | Posted when |
|---|---|
| A car is taken out of a garage. |
| A car is stored. |
| A lost car is recovered at a recovery point. |
| An officer impounds a car. |
| An admin gives a vehicle with /givecar, /giveboat or /giveplane. |
-- server/custom/misc/webhooks.lua
Webhooks = {
['take_vehicle'] = 'https://discord.com/api/webhooks/...',
['save_vehicle'] = '',
['recovery_vehicle'] = '',
['impound_vehicle'] = 'https://discord.com/api/webhooks/...',
['give_vehicle'] = '',
}Housing#
Housing scripts add a garage to a house through the garage's own events, so the house's garage door opens a shell garage that only the owner and key holders can enter. qs-housing does this out of the box; start it after qs-advancedgarages. Other housing scripts can use the same events, listed in Commands and Exports.
Other Resources It Works With#
Resource | What happens |
|---|---|
qs-inventory | Four garage quests are created for every player: store a car, set a custom tag, mark a favourite, and visit a garage interior. |
qs-vehiclekeys | Keys on every take-out, and hot-wiring is disabled inside garage interiors. |
qs-mechanic-creator | Takes over the |
AdvancedParking | Stored cars are removed from AdvancedParking too, so they do not reappear. |
nfs-customs · wheel stancers | Stance settings are saved and restored with the car. |
FiveGuard | Set |
Vehicle shops | Insurance reads car prices from qbx_core, QBCore shared vehicles or the ESX |
Adding a Backend#
Supporting something that is not on the list takes one file, plus one line when the layer is detected automatically.
Copy the closest bridge
Every bridge is a small file in
client/custom/<layer>/:fuel,vehiclekeys,inventory,wardrobe,menu,target,weather. Copy the one most like yours. Everything in that folder loads automatically.Change the guard and the calls
The first line makes the file run only when it is the chosen backend. Rename it, then replace the calls inside while keeping the function names:
lua -- client/custom/fuel/my_fuel.lua if Config.Fuel ~= 'my_fuel' then return end function SetFuel(vehicle, fuel) exports['my_fuel']:SetFuel(vehicle, fuel) end function GetFuel(vehicle) return exports['my_fuel']:GetFuel(vehicle) endKeys implement
AddVehiclekeys/RemoveVehiclekeys, inventoriesopenStash, wardrobesopenWardrobe.Register it for detection
Add your resource to the matching list in
config/config.lua, for example['my_fuel'] = 'my_fuel'in thefuelstable. Menus and targets have no list: setConfig.MenuorConfig.UseTargetto your new name.
Languages#
42 translations ship in locales/: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tk, tr, uk, ur, vi and zh. Pick one in Config.Locale, or set it once for every Quasar resource in server.cfg:
setr qs:locale "es"A key missing from your language falls back to English, so a partial translation never shows blank text. Prices and dates follow Config.Intl, for example locales = 'es-ES' with currency = 'EUR'.



