Configuration
All configuration is done through config.lua. This file is not escrowed.
Core Settings
Config = {}
Config.Debug = false -- Enable debug prints in console
Config.Language = "en" -- UI / notification language ('en' | 'es')
Config.TestMode = false -- Seed a small set of test stores instead of the full list
-- Framework override (leave false for auto-detection)
-- Config.FrameworkOverride = "qbx" | "qbcore" | "esx" | "standalone"`Config.Debug`
Enables verbose logging in the server and client console. Keep false in production.
`Config.Language`
Selects the language for every user-facing string — in-game notifications, TextUI prompts, the entire NUI, and the static admin panel. Must match a file in locales/ (en, es). Any missing key falls back to English. Add a new locales/.lua to support more languages.
`Config.TestMode`
When true, the first-run seed uses a reduced set of test stores (one of each type) in downtown LS instead of the full production list. This only affects the initial seed into the admin panel — after the one-time seed runs, stores are managed entirely through /storeadmin.
Pricing
ORB Clothing includes an optional pricing system, configured via Config.Pricing:
Config.Pricing = {
enabled = true, -- false makes all customization free
currency = "cash", -- 'cash' | 'bank'
items = {
-- Per-category prices (set a category to 0 to make it free)
},
storeMultiplier = {
-- Multiply prices per store type
},
}Outfits
The Outfits system adds an Outfits tab inside clothing stores where players save, wear, rename, delete, and share named outfits. An outfit captures clothing + props + accessories (with textures) — it does not touch face, heritage, body, or hair. All limits, costs, and sharing are enforced server-side.
Config.Outfits = {
enabled = true, -- master switch: adds the "Outfits" tab to clothing stores
maxPerPlayer = 10, -- cap on saved outfits per player (server-enforced)
saveCost = 0, -- money charged when saving an outfit (0 = free)
applyCost = 0, -- money charged when applying an outfit (0 = free)
shareEnabled = true, -- allow sharing an outfit to another player
shareRadius = 0.0, -- 0 = any online player; >0 = only players within N metres
shareCooldown = 10, -- seconds between shares per player (anti-spam)
}Sharing sends the recipient an **accept/decline** prompt. On accept, the outfit is saved under their outfits with the same name (subject to their own cap). The new `orb_clothing_outfits` table is created automatically on first start.
Compatibility Mode
Config.CompatMode mirrors saved appearance to legacy clothing systems so other resources keep working:
Config.CompatMode = {
qbClothing = true, -- Mirror to qb-clothing tables
skinchanger = false, -- ESX skinchanger compatibility
esxSkin = false, -- esx_skin compatibility
}Store Types
Store types are defined in Config.StoreTypes. Each type sets which customization tabs open, the default blip, the interaction zone size, and the opening camera:
Config.StoreTypes = {
clothing = {
tabs = { "clothing" },
blip = { sprite = 73, color = 33, scale = 0.8, name = "Clothing Store" },
defaultSize = vector2(14.0, 10.0),
openCamera = "full",
},
accessories = {
tabs = { "accessories" },
blip = { sprite = 617, color = 44, scale = 0.8, name = "Accessories Store" },
defaultSize = vector2(10.0, 10.0),
openCamera = "upper",
},
barber = {
tabs = { "hair", "features", "makeup" },
blip = { sprite = 71, color = 51, scale = 0.8, name = "Barber Shop" },
defaultSize = vector2(4.0, 6.0),
openCamera = "face",
},
tattoo = {
tabs = { "tattoos" },
blip = { sprite = 75, color = 1, scale = 0.8, name = "Tattoo Parlor" },
defaultSize = vector2(7.0, 4.5),
openCamera = "full",
},
}Store Locations
The store lists in config.lua are seed data only — they are not the live source of stores. On the first server start they are copied once into the editable admin storage (data/admin_stores.json), and from then on every store is created, edited, and deleted in-game through the /storeadmin panel. Editing the lists below only affects a brand-new install (before the one-time seed runs).
To re-seed the defaults: delete `data/admin_stores.json` **and** `data/.stores_seeded`, then restart.
The seed lists live in Config.AllStoreLocations (production) and Config.TestStoreLocations (test). Config.TestMode selects which list seeds:
Config.StoreLocations = Config.TestMode and Config.TestStoreLocations or Config.AllStoreLocationsEach entry uses a vector4 for the player-facing coords (XYZ + heading), a type, and a pedPosition (where the shopkeeper ped stands):
Config.AllStoreLocations = {
{ coords = vector4(76.198, -1393.723, 29.375, 90.717), type = "clothing",
pedPosition = vector4(75.39, -1398.28, 29.38, 6.73) },
-- Optional per-store zone size override:
{ coords = vector4(-1194.865, -773.079, 17.323, 307.0), type = "clothing",
size = vector2(11.0, 13.0), pedPosition = vector4(-1194.86, -773.08, 17.32, 130.71) },
}Barber locations also support a chairs table so the player sits during customization. See the comments in config.lua for the full chair format.
Camera Configuration
Camera angles are defined once in Config.Camera and referenced by name from each store type's openCamera field:
Config.Camera = {
DefaultFov = 50.0,
Positions = {
full = { offset = vector3(0.0, 2.8, 0.0), pointAt = vector3(0.0, 0.0, 0.0) },
face = { offset = vector3(0.0, 1.6, 0.6), pointAt = vector3(0.0, 0.0, 0.65) },
head = { offset = vector3(0.0, 1.0, 0.65), pointAt = vector3(0.0, 0.0, 0.68) },
upper = { offset = vector3(0.0, 1.8, 0.15), pointAt = vector3(0.0, 0.0, 0.2) },
lower = { offset = vector3(0.0, 2.0, -0.4), pointAt = vector3(0.0, 0.0, -0.45)},
feet = { offset = vector3(0.0, 1.8, -0.7), pointAt = vector3(0.0, 0.0, -0.75)},
},
}Admin Settings
Config.AdminPermission = "admin" -- permission group required for /storeadmin
Config.AdminStoreFile = "data/admin_stores.json" -- where admin-created stores are savedThe admin panel is opened with /storeadmin. Access requires the configured permission group, checked server-side (ACE permission or framework admin group).