Configuration
This section includes all configurable files for the selected script. Most settings are configured automatically, but each config.lua file contains a header comment explaining the purpose and usage of every configuration type. Be sure to read the header of each file carefully to fully understand how to customize and adapt the system for QBCORE, ESX, or standalone environments, ensuring seamless integration with your server.
qs-apartments/shared/config.lua
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] – Safe for users to modify. Adjust these values as needed.
-- • [INFO] – Informational note describing what the variable or block does.
-- • [ADV] – Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] – Core functionality. Do not modify unless you are a developer.
-- • [AUTO] – Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
Config = Config or {} -- [CORE]
Locales = Locales or {} -- [CORE]
--──────────────────────────────────────────────────────────────────────────────
-- Language Selection [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Main language for the asset. Locales are under locales/* — add yours if missing.
-- [INFO] Available: 'ar','bg','ca','cs','da','de','el','en','es','fa','fr','hi','hu','it','ja','ko','nl','no','pl','pt','ro','ru','sl','sv','th','tr','zh-CN','zh-TW'
--──────────────────────────────────────────────────────────────────────────────
Config.Language = 'en' -- [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- Framework Detection [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Auto-detects ESX/QB/QBX. If renamed, extend the table or set manually after adapting framework files.
-- [WARN] Do not edit detection logic unless you know what you are doing.
--──────────────────────────────────────────────────────────────────────────────
local function dependencyCheck(data) -- [CORE]
for k, v in pairs(data) do
if GetResourceState(k) == 'started' then
return v
end
end
return false
end
local frameworks = { -- [CORE]
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
}
Config.Framework = dependencyCheck(frameworks) -- [AUTO]
if not Config.Framework then -- [AUTO]
LoopError('Framework not found! Please make sure you start your framework before this resource.') -- [CORE]
end
Config.HasQBX = GetResourceState('qbx_core') == 'started' -- [AUTO]
Config.FiveGuard = false -- [EDIT] FiveGuard script name or false
--──────────────────────────────────────────────────────────────────────────────
-- Target System & Interaction Zones [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Supported targets: 'ox_target', 'qb-target', 'qtarget'. Others are unsupported.
--──────────────────────────────────────────────────────────────────────────────
Config.UseTarget = false -- [EDIT] Enable target interactions
Config.TargetDistance = 5.0 -- [EDIT]
Config.TargetWidth = 5.0 -- [EDIT]
Config.TargetLength = 5.0 -- [EDIT]
Config.ZoneDebug = false -- [EDIT] Draw zone bounds for debugging
Config.InitialSpawnEnabled = true -- [EDIT] Offer starter apartment on first spawn
--──────────────────────────────────────────────────────────────────────────────
-- Wardrobe Detection [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Auto-detect supported wardrobe systems. Add custom adapters in client/custom/wardrobe/*.lua.
--──────────────────────────────────────────────────────────────────────────────
local wardrobes = { -- [CORE]
['qs-appearance'] = 'qs-appearance',
['qb-clothing'] = 'qb-clothing',
['esx_skin'] = 'esx_skin',
['codem-appearance'] = 'codem-appearance',
['ak47_clothing'] = 'ak47_clothing',
['fivem-appearance'] = 'fivem-appearance',
['illenium-appearance'] = 'illenium-appearance',
['raid_clothes'] = 'raid_clothes',
['rcore_clothes'] = 'rcore_clothes',
['rcore_clothing'] = 'rcore_clothing',
['sleek-clothestore'] = 'sleek-clothestore',
['tgiann-clothing'] = 'tgiann-clothing',
}
Config.Wardrobe = dependencyCheck(wardrobes) -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Inventory Detection & Character Creation [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Auto-detect inventory system for per-house stash. Add custom hooks in client/custom/inventory/*.lua.
--──────────────────────────────────────────────────────────────────────────────
function TriggerCharacterCreation() -- [ADV]
print('create character')
TriggerEvent('qb-clothes:client:CreateFirstCharacter')
end
local inventories = { -- [CORE]
['qs-inventory'] = 'qs-inventory',
['qb-inventory'] = 'qb-inventory',
['ps-inventory'] = 'ps-inventory',
['ox_inventory'] = 'ox_inventory',
['core_inventory'] = 'core_inventory',
['codem-inventory'] = 'codem-inventory',
['inventory'] = 'inventory',
['origen_inventory'] = 'origen_inventory',
}
Config.Inventory = dependencyCheck(inventories) or 'default' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Default Stash Data [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Applies when creating per-apartment stashes.
--──────────────────────────────────────────────────────────────────────────────
Config.DefaultStashData = { -- [EDIT]
maxweight = 1000000,
slots = 30,
}
--──────────────────────────────────────────────────────────────────────────────
-- Shells / Interiors [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Define available shells and default stash per shell. Expand as needed.
--──────────────────────────────────────────────────────────────────────────────
Config.Shells = { -- [EDIT]
[1] = { model = 'shell_v16low', stash = { maxweight = 1000000, slots = 5 } },
[2] = { model = 'shell_office1', stash = { maxweight = 1000000, slots = 5 } },
[3] = { model = 'shell_v16low', stash = { maxweight = 1000000, slots = 5 } },
[4] = { model = 'shell_v16mid', stash = { maxweight = 1000000, slots = 5 } },
}
--──────────────────────────────────────────────────────────────────────────────
-- Apartments / Spawn Settings [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Catalog of apartments: labels, images, prices, entrances and box-zone data.
-- [INFO] Keys inside the catalog are technical IDs; do not localize the keys.
--──────────────────────────────────────────────────────────────────────────────
Config.ApartmentCatalog = { -- [EDIT]
['sr_drive_a'] = {
name = 'sr_drive_a',
label = 'South Rockford Drive',
image = 'https://i.ibb.co/zW1WJ6hS/1.png',
description = 'Located in a peaceful part of the city, this apartment combines comfort and modern style. It’s the perfect choice for players looking for a cozy place to begin their journey in Los Santos.',
price = 5000,
tier = 1,
coords = { enter = vector4(-667.02, -1105.24, 14.63, 242.32) },
area = { heading = 245, minZ = 13.5, maxZ = 16.0, debug = false, length = 1, width = 3, distance = 2.0, created = false },
},
['morningwood_blvd_b'] = {
name = 'morningwood_blvd_b',
label = 'Morningwood Blvd',
image = 'https://i.ibb.co/8nZPt1yr/2.png',
description = 'This elegant apartment sits in the heart of Morningwood. With quick access to shops, cafes, and public transport, it’s ideal for those who enjoy the city life without giving up comfort.',
price = 5000,
tier = 2,
coords = { enter = vector4(-1288.52, -430.51, 35.15, 124.81) },
area = { heading = 124, minZ = 34.0, maxZ = 37.0, debug = false, length = 1, width = 3, distance = 2.0, created = false },
},
['integrity_way_c'] = {
name = 'integrity_way_c',
label = 'Integrity Way',
image = 'https://i.ibb.co/zW1WJ6hS/1.png',
description = 'A modern apartment with stunning views over the city. Located in an elevated and exclusive area, it’s perfect for those seeking luxury, privacy, and a prime location.',
price = 5000,
tier = 3,
coords = { enter = vector4(269.73, -640.75, 42.02, 249.07) },
area = { heading = 250, minZ = 40.0, maxZ = 43.5, debug = false, length = 1, width = 1, distance = 2.0, created = false },
},
['tinsel_towers_d'] = {
name = 'tinsel_towers_d',
label = 'Tinsel Towers',
image = 'https://i.ibb.co/7dbHscrw/3.png',
description = 'Live above the city with this amazing apartment in Tinsel Towers. A dream home for lovers of luxury and exclusivity, featuring premium finishes and a vibrant environment.',
price = 5000,
tier = 4,
coords = { enter = vector4(-619.29, 37.69, 43.59, 181.03) },
area = { heading = 180, minZ = 41.0, maxZ = 45.5, debug = false, length = 1, width = 2, distance = 2.0, created = false },
},
['fantastic_plaza_e'] = {
name = 'fantastic_plaza_e',
label = 'Fantastic Plaza',
image = 'https://i.ibb.co/zW1WJ6hS/1.png',
description = 'Strategically located near downtown, this apartment is perfect for players looking for a convenient, modern space with great value and easy access to everything.',
price = 5000,
tier = 1,
coords = { enter = vector4(291.517, -1078.674, 29.405, 270.75) },
area = { heading = 270, minZ = 28.5, maxZ = 31.0, debug = false, length = 1, width = 2, distance = 2.0, created = false },
},
}
-- Backward compatibility export --------------------------------------------- --
Apartments = { Starting = true, Locations = Config.ApartmentCatalog } -- [AUTO]
exports('GetApartments', function() return Apartments end) -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Creator Controls (ActionControls) [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Bindings for creator/editor actions (movement, selection, rotation).
--──────────────────────────────────────────────────────────────────────────────
ActionControls = { -- [EDIT]
forward = { label = 'Forward +/-', codes = { 33, 32 } },
right = { label = 'Right +/-', codes = { 35, 34 } },
up = { label = 'Up +/-', codes = { 52, 51 } },
add_point = { label = 'Add Point', codes = { 24 } },
set_any = { label = 'Set', codes = { 24 } },
undo_point = { label = 'Undo Last', codes = { 25 } },
set_position = { label = 'Set Position', codes = { 24 } },
add_garage = { label = 'Add Garage', codes = { 24 } },
rotate_z = { label = 'RotateZ +/-', codes = { 20, 73 } },
rotate_z_scroll= { label = 'RotateZ +/-', codes = { 17, 16 } },
increase_z = { label = 'Z Boundary +/-', codes = { 180, 181 } },
decrease_z = { label = 'Z Boundary +/-', codes = { 21, 180, 181 } },
done = { label = 'Done', codes = { 191 } },
change_player = { label = 'Player +/-', codes = { 82, 81 } },
change_shell = { label = 'Change Shell +/-', codes = { 189, 190 } },
select_player = { label = 'Select Player', codes = { 191 } },
cancel = { label = 'Cancel', codes = { 194 } },
change_outfit = { label = 'Outfit +/-', codes = { 82, 81 } },
delete_outfit = { label = 'Delete Outfit', codes = { 178 } },
select_vehicle = { label = 'Vehicle +/-', codes = { 82, 81 } },
spawn_vehicle = { label = 'Spawn Vehicle', codes = { 191 } },
leftApt = { label = 'Previous Apartment', codes = { 174 } },
rightApt = { label = 'Next Apartment', codes = { 175 } },
testPos = { label = 'Test Pos', codes = { 47 } },
}
--──────────────────────────────────────────────────────────────────────────────
-- Free Mode Keys [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Key map and free mode bindings used by the decoration/creator flows.
--──────────────────────────────────────────────────────────────────────────────
Keys = { -- [ADV] Keycode map (do not modify unless you need custom bindings)
['ESC']=322,['F1']=288,['F2']=289,['F3']=170,['F5']=166,['F6']=167,['F7']=168,['F8']=169,
['F9']=56,['F10']=57,['~']=243,['1']=157,['2']=158,['3']=160,['4']=164,['5']=165,
['6']=159,['7']=161,['8']=162,['9']=163,['-']=84,['=']=83,['BACKSPACE']=177,['TAB']=37,
['Q']=44,['W']=32,['E']=38,['R']=45,['T']=245,['Y']=246,['U']=303,['P']=199,['[']=39,[']']=40,
['ENTER']=18,['CAPS']=137,['A']=34,['S']=8,['D']=9,['F']=23,['G']=47,['H']=74,['K']=311,['L']=182,
['LEFTSHIFT']=21,['Z']=20,['X']=73,['C']=26,['V']=0,['B']=29,['N']=249,['M']=244,[',']=82,['.']=81,
['LEFTCTRL']=36,['LEFTALT']=19,['SPACE']=22,['RIGHTCTRL']=70,['HOME']=213,['PAGEUP']=10,['PAGEDOWN']=11,
['DELETE']=178,['LEFT']=174,['RIGHT']=175,['TOP']=27,['DOWN']=173,['NENTER']=201,
['N4']=108,['N5']=60,['N6']=107,['N+']=96,['N-']=97,['N7']=117,['N8']=61,['N9']=118
}
Config.FreeModeKeys = { -- [EDIT]
ChangeKey = Keys['LEFTCTRL'],
MoreSpeed = Keys['.'],
LessSpeed = Keys[','],
MoveToTop = Keys['TOP'],
MoveToDown = Keys['DOWN'],
MoveToForward = Keys['TOP'],
MoveToBack = Keys['DOWN'],
MoveToRight = Keys['RIGHT'],
MoveToLeft = Keys['LEFT'],
RotateToTop = Keys['6'],
RotateToDown = Keys['7'],
RotateToLeft = Keys['8'],
RotateToRight = Keys['9'],
TiltToTop = Keys['Z'],
TiltToDown = Keys['X'],
TiltToLeft = Keys['C'],
TiltToRight = Keys['V'],
StickToTheGround = Keys['LEFTALT'],
}
--──────────────────────────────────────────────────────────────────────────────
-- Visuals / Interaction / Decoration [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] General client-side toggles for decorating and apartment handling.
--──────────────────────────────────────────────────────────────────────────────
Config.InteractInDoor = false -- [EDIT] DrawText interaction in door
Config.HideRadarInDecorate = true -- [EDIT] Hide radar while decorating
Config.ModernDecorateMode = true -- [EDIT] Use modern placement UI
Config.DynamicDoors = true -- [EDIT] Requires: setr game_enableDynamicDoorCreation "true"
Config.SpawnDistance = 100.0 -- [EDIT] Object/entity spawn radius
Config.DecorationMappingKey = 'F9' -- [EDIT] Keybind to open mapping
Config.ApartmentLocation = 'ApartmentLocation' -- [EDIT] Interior interaction point group
Config.ApartmentDecoration = 'ApartmentDecoration' -- [EDIT] Decoration command/context
Config.ApartmentSelector = 'Apartment' -- [EDIT] Selector name
--──────────────────────────────────────────────────────────────────────────────
-- HUD Hook [ADV]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Centralized HUD toggle when entering/exiting creator.
--──────────────────────────────────────────────────────────────────────────────
function ToggleHud(bool) -- [ADV]
DisplayRadar(bool)
if GetResourceState('qs-interface') == 'started' then
exports['qs-interface']:ToggleHud(bool)
end
Debug('ToggleHud', bool)
end
--──────────────────────────────────────────────────────────────────────────────
-- Creator Visuals / Camera [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.CreatorAlpha = 200 -- [EDIT] Ghost alpha in creator
Config.ShellSpawnCoords = vec4(279.46, 335.1, 98.57, 67.26) -- [EDIT] Shell spawn coords
Config.SellObjectCommision = 0.3 -- [EDIT] Furniture sell commission (0.30 = 30%)
CameraOptions = { -- [EDIT]
lookSpeedX = 500.0,
lookSpeedY = 500.0,
moveSpeed = 10.0,
climbSpeed = 10.0,
rotateSpeed = 50.0,
}
--──────────────────────────────────────────────────────────────────────────────
-- Debug Options [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Enable only during development; may spam console and impact performance.
--──────────────────────────────────────────────────────────────────────────────
Config.Debug = false -- [EDIT]
qs-apartments/shared/furniture.lua
--──────────────────────────────────────────────────────────────────────────────
-- Furniture Configuration [EDIT]
-- [INFO] Furniture shops, illegal/dynamic items, UI navigation, and per-item data.
-- [INFO] For functional items set: type='wardrobe' or type='stash' (with stash spec).
--──────────────────────────────────────────────────────────────────────────────
-- Shops & showrooms
Config.FurnitureShops = { -- [EDIT]
{
name = 'QS Furniture 1',
enter = vec3(2748.726318359375, 3476.238037109375, 55.67046737670898),
showRoom = vec4(2745.395751953125, 3476.0009765625, 56.43648910522461, 100.0),
offset = vec3(3.5, 1.3, 0.0), -- [INFO] showroom placement offset
blip = { active = true, sprite = 207, color = 17, scale = 0.8, label = 'Furniture Shop 1' },
categories = { 'washingmachine', 'toilet' } -- [INFO] use 'all' for every category
},
-- {
-- name = 'QS Furniture 2',
-- enter = vec3(2748.726318359375, 3476.238037109375, 55.67046737670898),
-- showRoom = vec4(2745.395751953125, 3476.0009765625, 56.43648910522461, 100.0),
-- offset = vec3(1.5, 1.3, 0.0),
-- blip = { active = true, sprite = 56, color = 0, scale = 0.8, label = 'Furniture Shop 1' },
-- categories = 'all'
-- },
}
-- Items that are illegal to place (removable by police)
Config.IllegalFurnitures = { -- [EDIT]
-- ['prop_ld_toilet_01'] = {
-- offset = { x = 0.0, y = 0.0, z = 1.0 }, -- [INFO] text offset for police-only hints
-- },
}
-- Custom interaction events for specific props
-- [INFO] For items already defined as 'stash' or 'wardrobe', custom events are ignored.
-- [INFO] First param is a unique id (string) you can use in your handler.
Config.DynamicFurnitures = { -- [EDIT]
-- ['prop_ld_toilet_01'] = {
-- event = 'housing:peep',
-- offset = { x = 0.0, y = 0.0, z = 0.0 }, -- [INFO] 3D text offset
-- },
}
-- Example:
-- RegisterNetEvent('housing:peep', function(uniq)
-- print('uniq', uniq)
-- end)
--──────────────────────────────────────────────────────────────────────────────
-- Furniture Data [EDIT]
-- [INFO] UI navigation (tabs) + per-category items. Add/rename freely.
--──────────────────────────────────────────────────────────────────────────────
Config.Furniture = {
-- Top navigation (rooms)
navigation = { -- [EDIT]
[1] = { label = 'Kitchen', img = './assets/img/decorate/categories/topbar/kitchen.svg', background = './assets/img/decorate/categories/rooms/background/indoor.svg' },
[2] = { label = 'Bathroom', img = './assets/img/decorate/categories/topbar/bathroom.svg', background = './assets/img/decorate/categories/rooms/background/indoor.svg' },
[3] = { label = 'Bedroom', img = './assets/img/decorate/categories/topbar/bedroom.svg', background = './assets/img/decorate/categories/rooms/background/indoor.svg' },
[4] = { label = 'Living', img = './assets/img/decorate/categories/topbar/living-room.svg', background = './assets/img/decorate/categories/rooms/background/indoor.svg' },
[5] = { label = 'Garden', img = './assets/img/decorate/categories/topbar/garden.svg', background = './assets/img/decorate/categories/rooms/background/garden-background.svg' },
},
-- Category: Washing machines
washingmachine = { -- [EDIT]
label = 'Washing machine',
img = './assets/img/decorate/categories/rooms/bathroom/bathroom-washingmachine-blue.svg',
navigation = 2, -- [INFO] link to navigation tab (Bathroom)
dynamic = true, -- [INFO] category has interactive items in UI
dynamicIcon = './assets/img/decorate/categories/rooms/bathroom/bathroom-washingmachine-blue.svg',
css = { width = 4.5, top = 7.7, left = 2.5 }, -- [INFO] category card layout
items = {
[1] = {
img = './assets/img/decorate/categories/rooms/bathroom/items/washing/prop_rub_washer_01.png',
object = 'prop_rub_washer_01',
price = 250,
label = 'Broken washing',
description = 'Old and dirty washing machine, its cheap at least.',
colorlabel = 'Gray',
colors = {},
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
},
[2] = {
img = './assets/img/decorate/categories/rooms/bathroom/items/washing/prop_washer_01.png',
object = 'prop_washer_01',
price = 250,
label = 'Old washing',
description = 'Old and dirty washing machine, it is cheap at least, better than the previous one if it is...',
colorlabel = 'Gray',
colors = {},
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
},
[3] = {
img = './assets/img/decorate/categories/rooms/bathroom/items/washing/prop_washer_02.png',
object = 'prop_washer_02',
price = 400,
label = 'Clear washing',
description = 'A beautiful washing machine, at a good price and completely new.',
colorlabel = 'White',
colors = {},
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
},
[4] = {
img = './assets/img/decorate/categories/rooms/bathroom/items/washing/prop_washer_03.png',
object = 'prop_washer_03',
price = 460,
label = 'Deluxe washing',
description = 'The best washing machine on the market, it performs all washing and drying functions in minutes!',
colorlabel = 'White',
colors = {},
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
},
[5] = {
img = './assets/img/decorate/categories/rooms/bathroom/items/washing/v_ret_fh_dryer.png',
object = 'v_ret_fh_dryer',
price = 360,
label = 'Simple modern washing',
description = 'A simple washing machine of good quality and modern, a luxury among the economical!',
colorlabel = 'New',
colors = {
{
label = 'Old',
object = 'v_ret_fh_washmach',
price = 310,
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
}
},
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
},
[6] = {
img = './assets/img/decorate/categories/rooms/bathroom/items/washing/bkr_prop_prtmachine_dryer_spin.png',
object = 'bkr_prop_prtmachine_dryer_spin',
price = 1390,
label = 'Money washing',
description = 'They say Pablo Escobar laundered his money here.',
colorlabel = 'Gray',
colors = {},
type = 'stash',
offset = { x = 0.0, y = 0.0, z = 0.0 },
stash = { maxweight = 50000, slots = 3 },
},
},
},
--──────────────────────────────────────────────────────────────────────────────
-- Additional furniture items would normally be listed here.
-- However, due to GitBook’s line and content limitations, we can’t include the full list,
-- as the complete configuration exceeds 8,000 lines.
-- To explore all available furniture options, please refer to the in-game menu or the
-- full configuration file provided within the script files.
--──────────────────────────────────────────────────────────────────────────────
}
for k, v in pairs(Config.FurnitureShops) do
if v.categories == 'all' then
Config.FurnitureShops[k].categories = {}
for a in pairs(Config.Furniture) do
if a ~= 'navigation' then
Config.FurnitureShops[k].categories[#Config.FurnitureShops[k].categories + 1] = a
end
end
end
end