Docs/ORB Clothing/Configuration

Configuration

All configuration is done through config.lua. This file is not escrowed.

Core Settings

lua
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:

lua
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.

lua
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:

lua
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:

lua
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:

lua
Config.StoreLocations = Config.TestMode and Config.TestStoreLocations or Config.AllStoreLocations

Each entry uses a vector4 for the player-facing coords (XYZ + heading), a type, and a pedPosition (where the shopkeeper ped stands):

lua
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:

lua
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

lua
Config.AdminPermission = "admin"                  -- permission group required for /storeadmin
Config.AdminStoreFile  = "data/admin_stores.json" -- where admin-created stores are saved

The admin panel is opened with /storeadmin. Access requires the configured permission group, checked server-side (ACE permission or framework admin group).