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.TestMode = false           -- Load 4 test stores in downtown LS

-- 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.TestMode`

When true, loads a reduced set of 4 test stores (one of each type) in downtown LS for quick testing. Set to false to load all 28 production stores.

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
    },
}

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

Individual store locations live in Config.AllStoreLocations (production) and Config.TestStoreLocations (test). The active list is selected automatically:

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