How Integrations Work#
Everything that touches another resource lives in a small, open bridge file under client/custom/ or server/custom/. When qs-housing starts it looks at which resources are already running and loads the matching bridge for each layer.
Layer | Supported | Without it |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Standalone: a template you complete in |
Inventory | qs-inventory · ox_inventory · qb-inventory · ps-inventory · core_inventory · codem-inventory · origen_inventory · jaksam_inventory · tgiann-inventory · ak47_inventory · inventory (Chezza) | Stashes do not open. On plain ESX set |
Garage | qs-advancedgarages · qb-garages · jg-advancedgarages · cd_garage · okokGarage · loaf_garage · rcore_garage · zerio-garage · codem-garage · ak47_garage · ak47_qb_garage · vms_garagesv2 · cs-garages · msk_garage · RxGarages · ws_garage-v2 · op-garages · op_garages_v2 · bazufix-garages | Houses have no garage. |
Wardrobe | qs-appearance · illenium-appearance · fivem-appearance · qb-clothing · codem-appearance · ak47_clothing · raid_clothes · rcore_clothes · rcore_clothing · origen_clothing · sleek-clothestore · tgiann-clothing · p_appearance · 0r-clothingv2 · 17mov_CharacterSystem | The framework's own outfit menu (esx_skin or qb-clothing). |
Target | ox_target · qb-target, with | On-screen [E] prompts and markers. |
Phone | qs-smartphone-pro · qs-smartphone · lb-phone · gksphone · okokPhone · roadphone · codem-phone | The phone number on "for sale" boards comes from the framework. |
Banking / society | Set by hand in |
|
Dispatch | qs-dispatch | A built-in alert: a 10-second blip and a notification for |
3D sound | mx-surround · qs-3dsound · xsound | The house music player is silent. |
Weather | Renewed-Weathersync · qb-weathersync · cd_easytime · vSync · av_weather | Rain and night may show inside shells. |
Text UI · HUD | qs-textui · qs-interface | Plain 3D text. |
Insurance | m-insurance | No home insurance policy on purchase. |
Overriding Detection#
Each layer in config/main.lua is a list of resource names. Replace the detection with a fixed value when two candidates run at once, or when you use a script the list does not know by name:
-- Auto, the default: the started resource from the list is used.
Config.Inventory = DependencyCheck(inventories) or 'default'
-- Forced: always use this bridge.
Config.Inventory = 'ox_inventory'
Config.Garage = 'jg-advancedgarages'
Config.Wardrobe = 'illenium-appearance'
Config.Phone = 'lb-phone'The value is the bridge file's name. Two bridges exist that are never auto-detected and must be set this way: esx_inventory (inventory) and yseries (phone).
Banking and Society Money#
When a house built in the creator is sold for the first time, Config.SocietyCommision of the price goes to the society of the creator's job. Rent from company rentals goes there too. Config.Society is not detected — set it to match your server:
Value | For |
|---|---|
| ESX (default). The |
| QBCore and Qbox. |
| Those banking scripts. The value is case-sensitive. |
| Paid as city tax. |
| No society: the creator receives the first sale directly. |
Banking apps can also pay mortgages, rent and bills on a player's behalf through the apps API — see Commands and Exports.
Targets and Radial Menus#
With Config.UseTarget = true, every prompt — doors, stash, wardrobe, furniture, junk, pets, the robot, agencies — becomes an ox_target or qb-target option. With it off, the script draws [E] prompts and markers.
To enter and leave from a radial menu instead, hide the door text with Config.DisableHouseEnterExitDrawText = true and trigger these client events:
TriggerEvent('housing:radial:enterHouse')
TriggerEvent('housing:radial:exitHouse')Phones#
Every supported phone provides the agent's number on "for sale" boards. With qs-smartphone or qs-smartphone-pro, the Housing app goes further: browse the market and the map, buy, rent and sell, pay rent and bills, switch the lights, manage vault codes, buy upgrades, and order food, dancers and furniture. Its rules are in Config.PhoneHousing:
Config.PhoneHousing = {
requireProximityForPurchase = true, -- must stand near a house to buy or rent it from the phone
purchaseMaxDistance = 48.0,
actionCooldownSeconds = 2,
}qs-smartphone also gets the in-house phone charger (F3 → Charge).
Weather Inside Houses#
Shells are placed in the sky, so the real weather would leak in. On entering, client/custom/weather/weather.lua pauses the weather script, forces clear weather and the hour Config.TimeInterior (23), and resumes it on leaving. For a weather script that is not listed, add its pause and resume events to that file.
Anticheat (FiveGuard)#
The creator, decorate mode, photo mode, the door camera and IPL previews move the camera away from the player, and entering a shell teleports them. Anticheats read that as freecam, noclip or teleport. Set your FiveGuard resource name and qs-housing asks for temporary permissions at exactly those moments:
Config.FiveGuard = 'your-fiveguard-resource' -- false to disablePermissions are only granted to players near a house or with creator access, and are taken back as soon as the camera closes. For another anticheat, replace the grant() function in server/custom/anticheat.lua. If your anticheat blocks InteractSound, set Config.DisableInteractSound = true.
Discord Logs and Photos#
Paste one webhook in config/webhooks.lua and every important action is posted as an embed: houses created, bought, rented, sold and transferred; rent and bills paid; evictions; upgrades and furniture bought or sold; physical keys created, given and deleted.
-- config/webhooks.lua
DiscordWebhook = 'https://discord.com/api/webhooks/...'
WebhookColor = 16711680Listing photos (creator and F3) and furniture thumbnails are uploaded to FiveManage. Put your token in config/fivemanage.lua; both files are server-only and never reach players.
-- config/fivemanage.lua
Config.FiveManageToken = 'your-token'Adding a Backend#
Supporting a script that is not on the list takes one file:
Copy the closest bridge
Each bridge is a small open file, for example
client/custom/inventory/ox_inventory.lua. Copy the one most like your script and rename it.Change its guard and functions
The first line returns early unless its layer matches the file, such as
if Config.Inventory ~= 'my_inventory' then return end. Point it at your name, then change the calls inside to your script's exports.Layer
Functions to provide
Inventory (client)
openStash(data, uniq),ToggleInventoryClothing(state)Wardrobe (client)
openWardrobe()Garage (server / client)
TriggerAddHouseGarage,TriggerHouseUpdateGarage,TriggerHouseRemoveGarage/OpenGarage,StoreVehiclePhone (server)
GetPlayerPhone(source)Society (server)
AddMoneyToSociety(source, society, amount)Dispatch (client)
AlarmDispatch(house),SensorDispatch()Select it
Set the value by hand (see Overriding Detection), or add
['your-resource'] = 'my_inventory'to the layer's list inconfig/main.lua. Restart.
Frameworks extend the same way: the standalone bridge lists every function the script calls, each marked with what it must return.
Languages#
41 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, tr, uk, ur, vi and zh. Pick one in config/main.lua, or for every Quasar resource at once in server.cfg:
setr qs:locale "es"Any text missing from a translation falls back to English. To add a language, copy en.json to a new code, translate it and set the locale — a resource restart is enough. Arabic text shaping uses the support-arabic resource. Aura Voice recognises commands in its own language, set in config/assistant.lua.



