> For the complete documentation index, see [llms.txt](https://atiysus-organization.gitbook.io/aty-scripts/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://atiysus-organization.gitbook.io/aty-scripts/clothing/clothing.md).

# Clothing

## Clothing

ATY Clothing is the character creator, the clothing, barber and tattoo shops and the wardrobe for a FiveM server running QBCore or ESX. One menu does all of it, and the menu is built around the character: categories follow the body, you can click a point on the character to open the matching category, pieces that belong together are fitted from GTA's own data, every changed item has its own price, and the whole thing works from a mouse, a keyboard or a controller.

This page is the full guide: what it does, how to install it, how every part behaves and every setting that exists. The other pages go deeper on two topics:

* Integrations — exports, events, hooks, menu types and category keys, and how to plug it into a multicharacter, housing or motel script
* How To Take Images — the photo studio that makes the item pictures
* Clothes as Items — wearable clothing items with aty\_inventory and other inventories

### What it does

| Feature                     | In short                                                                                                                                        |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **Character creator**       | Model, sex, heritage, skin tone, face shape, overlays, hair, apparel and tattoos in one menu                                                    |
| **Shops**                   | 27 clothing, barber and tattoo shops on the map, plus shops locked to a job                                                                     |
| **Wardrobe**                | Players save, wear and delete their own outfits                                                                                                 |
| **Presets**                 | Admins save character presets and an outfit catalogue (casual, work, activity) from inside the menu; a work outfit can be limited to a job      |
| **Match pieces**            | A jacket brings its own arms and a suit its shirt, read from GTA's shop data                                                                    |
| **Price per item**          | Every changed clothing slot has its own price, paid from cash or bank; each change can be undone or compared on its own                         |
| **Hair fade**               | Every freemode hairstyle gets its own scalp texture automatically; players can pick another by hand                                             |
| **Tattoo zones**            | Head, torso, each arm and each leg; picking a zone moves the camera there, and clothes come off for the visit and return afterwards             |
| **Clothes as items**        | With aty\_inventory the skin and the worn items stay one story: every save puts the pieces on as items, and taking one off leaves the slot bare |
| **Dedicated menus**         | Gloves, belts and other accessories carved out of GTA's fixed slots                                                                             |
| **Keyboard and controller** | Every part of the menu works without a mouse                                                                                                    |
| **Character codes**         | A whole character copied out as one code and pasted back in                                                                                     |
| **Theme editor**            | Admins restyle the menu live for every player and share the look as a code                                                                      |
| **Photo previews**          | Items show a picture instead of a number                                                                                                        |
| **Shop ownership**          | Players buy a shop, pay weekly rent and withdraw its takings                                                                                    |
| **Languages**               | English and Turkish                                                                                                                             |

### Requirements

| Resource                   | Needed   | Why                                                                        |
| -------------------------- | -------- | -------------------------------------------------------------------------- |
| `oxmysql`                  | Yes      | Database                                                                   |
| `ox_lib`                   | Yes      | Prompts, the shop-management menu and dialogs                              |
| `PolyZone`                 | Yes      | Loaded by the manifest; zones only use it with `Config.UsePolyZone = true` |
| `qb-core` or `es_extended` | Yes      | Set `Config.Framework` to match                                            |
| `ox_target` or `qb-target` | Optional | Only with `Config.DisplayMethod = "target"`                                |
| `aty_inventory`            | Optional | Only for clothes as items                                                  |
| `aty_lib`                  | Optional | Only names the shop blips on aty\_escmenu's map                            |
| A Fivemanage API key       | Optional | Only for the photo studio                                                  |

The photo studio does not need `screenshot-basic`; it reads the game's frames itself.

### Installation

**1. Extract**

Place the resource in your resources folder and keep the name **`aty_clothing`** — the scripts call their own exports by that name.

**2. Import the SQL**

Run `aty_clothing.sql`. It creates `player_outfits` (wardrobe outfits) and `aty_clothing_shops` (shop owners, balances and rent). Characters themselves stay where your framework keeps them: `playerskins` on QBCore, the `skin` column of `users` on ESX.

{% hint style="warning" %}
`CREATE TABLE IF NOT EXISTS` leaves an existing table as it is. If another clothing script already made a `player_outfits` table, it may lack the `skin` and `outfitId` columns this script writes, and every wardrobe save fails with `Unknown column 'skin'`. See Troubleshooting for the one-line fix.
{% endhint %}

**3. Choose the framework**

Set `Config.Framework` in `config.lua` to `"qb"` or `"esx"`.

**4. Start order**

```cfg
ensure oxmysql
ensure ox_lib
ensure PolyZone
ensure qb-core        # or es_extended
ensure aty_inventory  # optional: clothes as items (any position; it is looked up when a player buys)
ensure aty_clothing
```

{% hint style="warning" %}
Start the framework **before** `aty_clothing`. On QBCore the server side looks for `qb-core` the moment it loads; if it is not running yet, the resource fails to start. Start `ox_target` / `qb-target` before it too if you use them.
{% endhint %}

**5. Grant admin**

```cfg
add_ace group.admin aty_clothing.admin allow
# or one player directly:
add_ace identifier.license:YOUR_LICENSE_HERE aty_clothing.admin allow
```

Framework admin groups count as well — see Permissions.

**6. Photo studio key (optional, for item pictures)**

```cfg
set aty_clothing_fivemanage "YOUR_FIVEMANAGE_API_KEY"
```

{% hint style="danger" %}
Use **`set`**, never `setr`. `setr` replicates the value to every player, which would hand them your Fivemanage key. The key does not go in `config.lua` either — that file is sent to every client. The rest of the setup is on How To Take Images.
{% endhint %}

#### Verifying the install

| Check                                                                | Expected                                                                                 |
| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Server console on start                                              | No errors from `aty_clothing`                                                            |
| `/skin self creator` as an admin                                     | The character creator opens                                                              |
| Walk into a shop marked on the map                                   | A prompt; **E** opens the shop                                                           |
| `clothingcompat` in the server console                               | A status line for the piece-matching data                                                |
| Buy a mask, or save one in the creator, with `aty_inventory` running | A mask is worn as an item (`clothingitems status` shows the setup; see clothes as items) |

#### Updating

Copy the new files over the old folder, then run `refresh` and `restart aty_clothing`. A release never contains the files the server writes, so copying over keeps your theme, presets, matching data and photo records. If you delete the old folder first, back those files up.

### A tour of the menu

The menu is the same everywhere; what changes is which categories a shop offers.

**The stage.** The character stands in front of a camera. Left-drag orbits the camera, right-drag turns the character, the wheel zooms towards the cursor and middle-drag moves the camera up and down. Small markers sit on the body: clicking one opens the matching category and moves the camera there. With `Config.Camera.FocusOnCategory = true`, picking a category from the list moves the camera too.

**The categories.** A rail lists what the shop offers — for example Face & body, Face adjust, Overlays, Hair, Apparel and Tattoos in the creator. Apparel is split into shelves: Outfits, Clothing, Upper body, Hand & wrist and Head.

**The rows.** Each setting is a row: a picker with a style number and a texture number, a slider or a colour grid. With **Show Preview** on, pickers show a picture of every item instead of a number. A changed row shows its own price in a shop, and carries two small buttons: **Undo** puts that one row back, and **Hold to compare** shows the old value for as long as you hold it.

**The hint bar.** The bar at the bottom follows the device you used last (mouse, keyboard or controller) and holds two switches: **Show Preview** and **Match pieces**. Both are remembered. **Export** and **Import** at the top right copy the character as a code and paste one back in.

**Leaving.** **Esc** goes back one step and then leaves; leaving a shop without buying puts the character back as it was. Buying asks for confirmation first.

### Features in depth

#### Character creator

The creator is the menu a new character sees, and the menu `/skin <id> creator` opens for an admin. It offers every category and is free to use.

| Category     | What is in it                                                                                 |
| ------------ | --------------------------------------------------------------------------------------------- |
| Ped Selector | The model list (`shared/peds.lua`), only when `Config.PedSelector.Enabled` is on              |
| Face & body  | Sex, character presets, heritage (mother, father, how much of each), skin tone and eye colour |
| Face adjust  | Nose, brow, cheeks, eyes, lips, jaw, chin and neck, each from -1.0 to 1.0                     |
| Overlays     | Blemishes, ageing, makeup, blush, complexion, sun damage, lipstick, moles and body blemishes  |
| Hair         | Hair and its colours, eyebrows, beard, chest hair and the hair fade                           |
| Apparel      | Every clothing slot and prop                                                                  |
| Tattoos      | The six tattoo zones                                                                          |

`/skin <id> creator` charges only when the player is within 30 m of a shop. Hand a new character to the creator from a multicharacter script by following the example in Integrations.

#### Clothing shops

A clothing shop offers a wardrobe shelf and the Apparel category. The player changes what they like and presses **Buy**; the shop charges once per changed slot.

* **One fee per slot.** A garment's model and texture count as one change, and the arms a jacket brings with it are not charged separately
* **Cash or bank.** The player chooses in the menu; each shop's takings are credited to the shop if it has an owner (see Shop ownership)
* **Face, hair, makeup and tattoos have no price** in a clothing shop
* **Undo and compare** work per row, so a player can reject one change without losing the others
* **Nothing is bought until Buy.** Leaving restores the character

The server works out the total from the character's saved clothes and the new clothes, so the figure in the menu cannot be tampered with. A player with no saved clothes to compare against pays the flat `Config.ShopSystem.ClothingPrice`.

#### Matching pieces

GTA decides which arms a torso needs and which undershirts fit a jacket, but it keeps that in shop data rather than in the clothing itself. aty\_clothing reads that data and uses it twice:

* **Forced pieces.** Pick a jacket and the arms that go with it are set for you
* **Filtered lists.** The undershirt list shows only the shirts that fit the jacket you wear

The first time an admin opens the menu, the data is read in the background and kept in `compat.json`; it is read again when the game build changes or with `/clothingcompat`, and the console confirms every read. Players can switch **Match pieces** off in the hint bar, and then nothing is forced or filtered. For addon clothing, which GTA has no data for, fill in `Config.Compatibility` by hand.

#### Barber and hair fade

The barber offers Hair and Overlays: hair style and colours, eyebrows, beard, chest hair, makeup, blush and the other face overlays.

GTA does not put the scalp texture of short and shaved styles in the hair component. It is a separate "ped decoration", and without it a buzz cut or shaved sides show bare skin. With `Config.AutomaticFade = true`, every style of the freemode models gets its own scalp texture the moment it is picked, with no setup.

Players can overrule it in **Hair › Hair Fade**:

| Choice                 | Result                                 |
| ---------------------- | -------------------------------------- |
| Automatic              | The fade that belongs to the hairstyle |
| None                   | Hair only, no scalp texture            |
| A design (126 of them) | That fade, whatever the style          |

The choice is saved with the character (`hair_fade`), travels in character codes and presets, and is applied again whenever the character loads. Set `Config.AutomaticFade = false` to draw the hair component alone, as older versions did.

#### Tattoo shop

A tattoo shop offers the Tattoos category. It has six zones: head, torso, left and right arm, left and right leg. Picking a zone moves the camera to that part of the body, and a tattoo can be applied with an opacity.

GTA draws tattoos under clothes only where the skin shows, so the shop takes off the jacket, shirt, trousers and arms pieces for the visit. They are remembered, and come back:

* when the player switches to another category
* when they press **Show clothes** in the tattoo menu (a second press hides them again)
* when they close the menu, however they close it

#### Wardrobe

A wardrobe is a place on the map (and, for jobs, a locker) where a player saves, wears and deletes their own outfits.

* **Saving.** The player names the outfit and saves it. The name must be unique per character
* **What is in an outfit.** Clothes and accessories only; never face, hair or tattoos
* **The limit.** `Config.Wardrobe.MaxOutfits` (20 by default) per character
* **Wearing.** The wardrobe and the creator are free
* **Confirmed saves.** The wardrobe waits for the server to confirm the save. If it fails, the name stays in the box and the server console says why (`outfit not saved for player …`)

A purchase can also offer to keep the outfit it just bought. Outfits live in `player_outfits`. Wardrobes can be tied to a job with `Config.JobWardrobes`; the uniforms of a whole job are presets, not wardrobe outfits.

#### Presets

Presets are the admin's catalogue, built in game. Dress the character, open **Face & body › Character presets** or **Apparel › Outfits** (Casual, Work, Activity) and use **Save the current look**.

* A **character preset** stores a face, hair and overlays (a starting point in the creator)
* An **outfit preset** stores clothes and props, and belongs to a group: Casual, Work or Activity
* A **work outfit** can carry a job and a minimum grade, and then only that job sees it
* Presets go to `presets.json` and appear for every player at once; the limit is 200, with names up to 40 characters
* A preset holding something the blacklist withholds is hidden from that player
* Wearing a preset in a shop is a normal change: priced and undoable

Presets written in `config.lua` are built in and cannot be deleted in game. See Presets in the configuration for their format.

#### Character codes

**Export** (top right) turns the whole character into one text code and copies it. **Import** reads a code back and rebuilds that character, with a message when the text is not a character code. A code holds the model, heritage, face, overlays, hair with its fade, clothing, props and tattoos, so it is a way to move a character between servers, to share a look, or to keep a backup. Treat it like the character itself: anyone with the code can wear it.

#### Clothes as items

On a server where clothes are items, aty\_clothing keeps the character's skin, the inventory's worn items and the database as **one story**, in both directions, with **aty\_inventory** (and a documented path for core\_inventory and any other inventory):

* After every save — a shop purchase, the creator, an admin's `/skin`, a wardrobe outfit, a login — every clothing slot of the skin is handed to the inventory. A slot without an item gets one made and put **straight on**, the piece it replaces goes to the bag, and a slot the skin leaves empty takes its worn item off
* When the player puts a clothing item on or takes one off, the saved skin follows. A piece taken off leaves the slot **bare**; the clothes the skin had saved do not come back
* A top remembers its sleeves, and taking one off bares the arms with it

```lua
Config.ClothingItems = {
    Enabled = true,
    Inventory = "auto",   -- "auto", "aty_inventory", "core_inventory" or "custom"
    Equip = true,         -- false: a purchase only adds what it sold to the bag
    OnLogin = true,       -- tell the inventory what the skin wears when a player spawns
}
```

Undershirts, chains, decals, bracelets and arms are not items in aty\_inventory and stay part of the skin. `clothingitems status` and `clothingitems sync <id>` in the server console show what is set up and run the sync for one player.

The full guide — the model, when each step runs, both sides' settings, the support matrix for other inventories, the `custom` hook and troubleshooting — is on Clothes as Items.

#### Photo previews

With **Show Preview** on, every picker shows a picture of its items instead of a number: clothes, accessories, hair, face types, makeup and the other overlays. An admin takes the pictures once with `/clothingphotos`. The studio photographs every item on a green screen, cuts the background out and uploads the result to Fivemanage, and the server keeps the list of links. A run can be split between several players' games and each photographs its own part, so a full run finishes faster. See How To Take Images.

#### Theme editor

`/clothingtheme` opens the editor over the live menu: colours (accent, panels, text, danger, success, warning), panel opacity, surface contrast, corner roundness, scene darkening and font, plus seven ready-made themes. **Save for everyone** stores it in `theme.json` and restyles every player's menu at once. **Copy code** and **Paste code** move a theme between servers. Leave with **Close** at the top of the editor or with **Esc**; with unsaved changes it asks first, and the menu goes back to the saved theme. Until a theme is saved, the accent comes from `Config.UI.Primary` (`"#69ffec"`).

#### Shop ownership

A shop from `Config.ShopLocations` can have an owner. At the shop, a player presses **F6** (or the target option) for the management menu.

* An unowned shop is bought for `PurchasePrice`, in cash
* Clothing sold there goes to the shop's balance; the owner withdraws it minus the commission
* The owner pays `WeeklyRent` in cash once it is due. With `AutoRentDeduction`, every check takes overdue rent from the shop's balance, and a shop whose balance cannot cover it is taken back with its balance cleared
* Owners, balances and rent are in `aty_clothing_shops`

#### Job shops and wardrobes

`Config.JobShops` are shops that only certain jobs can enter, with a minimum grade, and `Config.JobWardrobes` are lockers that only certain jobs can open. Job shops draw no map blip. They share the shop menu: a police-only clothing shop is an ordinary shop with `jobs = { "police" }`.

#### Blacklist

The blacklist hides values from players who should not wear them, for example a police-only uniform, and the server refuses a purchase or a save that contains one. See Blacklist in the configuration.

#### Dedicated menus

GTA has twelve fixed clothing slots and no way to add one. `Config.Slots` carves a menu out of an existing slot, so "Gloves" is the arms slot showing only the drawables you tag, and a belt or a watch strap can be carved the same way. See Dedicated menus.

### Commands

| Command             | Who             | What it does                                                                                                               |
| ------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `/skin [id] [type]` | Admin           | Opens the menu for a player (`id` is a server ID or `self`). `type`: `clothing` (default), `barber`, `tattoo` or `creator` |
| `/ped [id] [model]` | Framework admin | Gives a player any ped model                                                                                               |
| `/refreshskin`      | Everyone        | Reloads your saved appearance — fixes invisible body parts or a desync. Once every 5 seconds                               |
| `/clothingtheme`    | Admin           | Opens the theme editor on the live menu                                                                                    |
| `/clothingphotos`   | Admin           | Opens the photo studio — see How To Take Images                                                                            |
| `/clothingcompat`   | Admin           | Reads GTA's "which pieces go together" data again                                                                          |

{% hint style="info" %}
`/skin` with a shop type is a normal shop visit: the player pays for what changes. Use `creator` for a free edit — it only charges when the player is within 30 m of a shop. From the server console, `skin` takes a player ID; `clothingcompat` and `clothingphotos` print a status report instead.
{% endhint %}

### Permissions

A player is a clothing admin when any of these is true:

| Check                                | Framework |
| ------------------------------------ | --------- |
| ACE `aty_clothing.admin`             | Any       |
| Group `admin`, `god` or `superadmin` | ESX       |
| Permission `admin` or `god`          | QBCore    |

The server console always counts. Admins run the admin commands, save and delete presets in the menu and see every job's uniforms; the server checks again on each action. `/ped` is registered through the framework's command system, so it follows the framework's `admin` permission or group rather than the ACE.

### What the server checks

The menu runs on the player's machine, so everything that costs money or grants something is decided on the server:

* The **price** of a purchase is worked out from the character's saved clothes and the new ones; the menu's figure is only a display
* A purchase or a save containing a **blacklisted** value is refused
* **Admin actions** (presets, the theme, the photo studio) are checked on each call
* A wardrobe save is checked for a name, the outfit limit and a duplicate name
* **Shop ownership** (buying a shop, withdrawing, paying rent) runs on the server

### Configuration

Everything lives in `config.lua`.

#### General

| Key                                    | Default      | What it does                                                                                |
| -------------------------------------- | ------------ | ------------------------------------------------------------------------------------------- |
| `Config.Framework`                     | `"qb"`       | `"qb"` or `"esx"`                                                                           |
| `Config.DisplayMethod`                 | `"drawtext"` | Shop and wardrobe prompt: `"target"`, `"3dtext"`, `"drawtext"` or `"none"`                  |
| `Config.UsePolyZone`                   | `false`      | `true`: PolyZone boxes from `width`, `length`, `minZ`, `maxZ`. `false`: 2 m around `coords` |
| `Config.Multicharacter`                | `true`       | ESX only. `false` makes the script load the skin itself on `esx:playerLoaded`               |
| `Config.TriggerPlayerLoadedOnCreation` | `false`      | After the creator saves, fire the framework's player-loaded events                          |
| `Config.PedSelector.Enabled`           | `true`       | Offer the Ped Selector (models in `shared/peds.lua`) wherever `pedSelector` is listed       |
| `Config.UseScreenFade`                 | `true`       | Fade to black while the menu opens and closes                                               |
| `Config.HideMinimap`                   | `true`       | Hide the minimap while the menu is open                                                     |
| `Config.AutomaticFade`                 | `true`       | Give every freemode hairstyle its own scalp texture; see Barber and hair fade               |
| `Config.UI.Primary`                    | `"#69ffec"`  | The accent colour until a theme is saved                                                    |
| `Config.DrawText`                      | left-centre  | Position, icon and icon colour of the `"drawtext"` prompt                                   |

`"target"` uses `ox_target` when it is running, otherwise `qb-target`. `"none"` hides only the prompt — zones and the **E** key keep working, so you can draw your own (see Integrations).

#### Hooks

`Config.Hooks.OnMenuOpen(menuType, shopData)` and `Config.Hooks.OnMenuClose(menuType)` run when the menu opens and closes, so you can hide a HUD or the chat. `menuType` is `"creator"`, `"clothing"`, `"barber"`, `"tattoo"` or `"market"`. The same moments fire two client events for other resources, with no config edit: `aty_clothing:client:menuOpened` and `aty_clothing:client:menuClosed`.

#### Language

Set `Locale = 'en'` or `'tr'` at the top of `shared/locale.lua`; the translations are in the same file. A typo there no longer stops the resource: the console names the broken line and English is used until you fix it, and missing keys fall back to English. Leave `shared/locale.default.lua` alone — it is that fallback.

#### Shops

```lua
Config.ShopLocations = {
    [1] = { shopType = "clothing", title = "Clothing Shop", -- shopType: a key of Config.ShopCategories
            coords = vector3(1693.2, 4828.11, 42.07),
            width = 2.0, length = 2.0, minZ = 39.0, maxZ = 46.0 }, -- zone for PolyZone and target
}
```

`Config.JobShops` (`Enabled`, `Locations`) takes the same fields plus `jobs = { "police" }` and a minimum `grade`. `Config.Blips` sets the sprite, colour, scale and name for clothing, barber and tattoo shops; job shops get no blip.

{% hint style="warning" %}
Public shops and job shops share one ID space when a player walks in: a public shop whose key is also used in `Config.JobShops.Locations` (both start at `[1]` by default) is checked against that job shop's jobs. Give job shops keys the public list does not use, such as `[101]`. The same goes for `Config.Wardrobe` and `Config.JobWardrobes`.
{% endhint %}

#### Wardrobes

`Config.Wardrobe.Locations` uses the same location fields, and `MaxOutfits` (default `20`) caps the saved outfits per character. `Config.JobWardrobes` adds `jobs` and `grade`. A wardrobe holds the player's own outfits: clothes and accessories only, never face, hair or tattoos, and each name once per character. A whole job's uniforms are presets.

#### What each shop offers

```lua
Config.ShopCategories = {
    ["clothing"] = { "wardrobe", "apparel" },
    ["barber"]   = { "hair", "overlays" },
    ["tattoo"]   = { "tattoos" },
    ["market"]   = { "apparel" },
    ["creator"]  = { "pedSelector", "faceBody", "faceAdjust", "overlays", "hair", "apparel", "tattoos" },
}
```

| Key           | Contains                                                                                  |
| ------------- | ----------------------------------------------------------------------------------------- |
| `pedSelector` | Ped Selector — the model list                                                             |
| `faceBody`    | Sex, character presets, heritage, skin tone, eye colour                                   |
| `faceAdjust`  | Nose, brow, cheeks, eyes, lips, jaw, chin, neck                                           |
| `overlays`    | Blemishes, ageing, makeup, blush, complexion, sun damage, lipstick, moles, body blemishes |
| `hair`        | Hair and its colour, eyebrows, beard, chest hair, hair fade                               |
| `apparel`     | Shelves: Outfits, Clothing, Upper body, Hand & wrist, Head                                |
| `tattoos`     | Head, torso, left and right arm, left and right leg                                       |
| `wardrobe`    | Saved outfits                                                                             |

Narrow a category with `"category:part"`: `"apparel:handWrist"` is a jewellery counter, `"tattoos:tattooHead"` sells head tattoos only. The pre-v3 keys (`dna`, `hairs`, `clothes`, `accessories`, `headTattoo` …) still work. All parts and old keys are listed in Integrations.

#### Dedicated menus

```lua
Config.Slots = {
    gloves = {
        control = "arms",          -- the picker it is carved from
        category = "apparel",
        section = "handWrist",     -- Apparel shelf: clothing, upperBody, handWrist, head
        label = "ui_slot_gloves", description = "ui_slot_gloves_desc", -- locale keys or plain text
        icon = "righthand",
        male = {}, female = {},    -- drawables: numbers or { from, to } ranges
    },
}
```

`control` is `arms` or any clothing or prop picker ending in `_1` (`torso_1`, `helmet_1` …). Tagged pieces leave the original menu unless `hideFromBase = false`; `none` adds a "nothing" entry (`0` for most slots, `-1` for props). An empty list hides the menu, and `gloves` ships empty because the numbers depend on your clothing — photograph the slot to find them. Two pieces on one slot still cannot be worn together; that is the game's rule.

#### Prices

```lua
Config.ClothingPrices = {
    Default = 100,
    Slots = {
        tshirt = 100, torso = 100, arms = 100, decals = 100, pants = 100,
        shoes = 100, mask = 100, bproof = 100, chain = 100, bags = 100,
        helmet = 100, glasses = 100, ears = 100, watches = 100, bracelets = 100,
    },
}
```

* One fee per changed slot: a garment's model and texture count once, and the arms a jacket brings with it are not charged separately
* Face, hair, makeup and tattoos have no price
* A slot left out of `Slots` costs `Default`; set it to `0` to make it free
* The server works out the total from the character's saved clothes, so the menu's figure cannot be tampered with. The player pays with **Cash** or **Bank**, chosen in the menu
* A player with no saved clothes to compare against pays `Config.ShopSystem.ClothingPrice`

#### Clothes as items

See the feature and the full guide, Clothes as Items.

```lua
Config.ClothingItems = {
    Enabled = true,
    Inventory = "auto",
    Equip = true,
    OnLogin = true,
    -- Custom = function(src, pieces, skin) end,
}
```

| Key         | Default  | What it does                                                                                                                                        |
| ----------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Enabled`   | `true`   | Turns it off without touching the inventory                                                                                                         |
| `Inventory` | `"auto"` | `"auto"` finds a supported inventory that is running; or `"aty_inventory"`, `"core_inventory"`, `"custom"`, or the name of a renamed aty\_inventory |
| `Equip`     | `true`   | The two-way flow. `false`: a purchase only adds what it sold to the bag                                                                             |
| `OnLogin`   | `true`   | Tell the inventory what the skin wears when a player spawns; it makes only what is missing                                                          |
| `Custom`    | —        | `function(src, pieces, skin)` for `Inventory = "custom"`                                                                                            |

#### Shop ownership

```lua
Config.ShopSystem = {
    Enabled = true, PurchasePrice = 50000, WeeklyRent = 5000,
    Commission = { Enabled = true, Rate = 5.0 }, -- % kept from each withdrawal
    RentCheckInterval = 24 * 60 * 60 * 1000,     -- ms
    AutoRentDeduction = true,
    ClothingPrice = 100,                         -- flat fee, see Prices
}
```

`Config.ShopManage` turns the management menu on and sets its `Label` and `Icon`; its `Key` only changes the prompt text, the key itself is always F6.

#### Presets

Presets in `config.lua` are built in and cannot be deleted in game. `gender` is required because drawable numbers belong to one model; an entry that does not validate is skipped with a console warning.

```lua
Config.Presets = {
    { kind = "outfit",   -- "character" (face, hair, overlays) or "outfit" (clothes, props)
      group = "work",    -- outfits only: "casual", "work" or "activity"
      name = "Patrol", gender = "male", job = "police", grade = 0,
      values = { torso_1 = 0, torso_2 = 0, tshirt_1 = 15, arms = 0, pants_1 = 0, shoes_1 = 1, helmet_1 = -1 } },
}
```

#### Matching pieces

Nothing to fill in for GTA's own clothing. `Config.Compatibility` is laid over the game's data, for addon clothing (which has none) and wherever you want to overrule the game:

```lua
Config.Compatibility = {
    male = {
        Arms = { [15] = 15, [26] = 6 },          -- torso drawable -> arms drawable
        Undershirts = { [26] = { 15, 57, 58 } }, -- torso drawable -> undershirts that fit
    },
    female = { Arms = {}, Undershirts = {} },
}
```

A torso with no `Undershirts` entry lists every undershirt.

#### Blacklist

```lua
Config.Blacklist = {
    ["hair_1"] = { [21] = { "police" } }, -- hair_1 21: police only
}
```

Keyed by any skin key (textures such as `torso_2` too), then value, then the jobs allowed. Other players cannot pick it, and the server refuses a purchase or save that contains it.

#### Camera

```lua
Config.Camera = {
    OrbitSpeed = 0.10, PedTurnSpeed = 0.14, PanSpeed = 0.0028, ZoomSpeed = 0.07,
    Inertia = true,          -- a released drag coasts to a stop
    FocusOnCategory = false, -- true: picking a category moves the camera to that body part
}
```

Clicking a marker on the character always moves the camera there.

#### QBCore clothing events

`Config.QBClothingEvents` answers the events other QBCore scripts expect from `qb-clothing` (`qb-clothing:saveSkin`, `qb-clothing:loadPlayerSkin` and the rest), so scripts written for it keep working. See Compatibility with other clothing resources.

#### Photos

`Config.Photos` sets the studio position, backdrop and camera per slot — see How To Take Images.

### Controls

| Action                           | Mouse                      | Keyboard                       | Controller               |
| -------------------------------- | -------------------------- | ------------------------------ | ------------------------ |
| Orbit the camera                 | Left drag                  | **A / D**                      | —                        |
| Turn the character               | Right drag                 | **Z / C**                      | Right stick left / right |
| Camera height                    | Middle drag                | **W / S**                      | Right stick up / down    |
| Zoom                             | Wheel (towards the cursor) | —                              | **LT** out / **RT** in   |
| Open a part of the body          | Click its marker           | —                              | —                        |
| Move between items               | —                          | **↑ ↓**                        | D-pad / left stick       |
| Change a value                   | —                          | **← →**                        | D-pad / left stick       |
| Previous / next category         | —                          | **Q / E**                      | **LB / RB**              |
| Select                           | Click                      | **Enter**                      | **A**                    |
| Undo                             | —                          | **Ctrl+Z**                     | **X**                    |
| Buy (shops) / Save (creator)     | —                          | **P**                          | **Y**                    |
| Re-centre on the whole character | —                          | **R**                          | **R3**                   |
| Search the menu                  | —                          | **F**                          | —                        |
| Back one step, then leave        | **Esc** leaves             | **Esc** (Backspace: back only) | **B**                    |

Dragging a slider does not turn the camera, and a left/right picker you have clicked can be stepped with the arrow keys.

### Files the server writes

| File                                 | Written by     | Holds                                       |
| ------------------------------------ | -------------- | ------------------------------------------- |
| `theme.json`                         | Theme editor   | The saved theme                             |
| `presets.json`                       | Preset shelves | Presets saved in game                       |
| `compat.json`                        | Piece matching | GTA's piece data for the current game build |
| `photos/<gender>_<kind>_<slot>.json` | Photo studio   | Which picture belongs to which item         |

They sit inside the resource folder and are never part of a release, so an update does not overwrite them. The server needs write access there; `photos/` ships with a README so the folder exists, because the server cannot create one.

### Skin data structure

What the exports and the database carry: a flat table of these keys.

| Part                      | Keys                                                                                                                                                                    |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Model                     | `sex` (`0` male, `1` female freemode), `model` (name or hash; `ped` is read when it is missing)                                                                         |
| Heritage                  | `mom`, `dad`, `mom_texture`, `dad_texture` (0-45), `face_md_weight`, `skin_md_weight` (0.0-1.0)                                                                         |
| Face shape (-1.0 to 1.0)  | `nose_1` … `nose_6`, `eyebrow_high`, `eyebrow_forward`, `cheeks_1` … `cheeks_3`, `eye_squint`, `lip_thickness`, `jaw_1`, `jaw_2`, `chin_1` … `chin_4`, `neck_thickness` |
| Hair and eyes             | `hair_1`, `hair_2`, `hair_color_1`, `hair_color_2`, `hair_fade` (`0` automatic, `1` none, `2` and up a design), `eye_color`                                             |
| Overlays with two colours | `eyebrows`, `beard`, `makeup`, `lipstick`, `bodyb` — each `_1` style (-1 none), `_2` opacity 0-10, `_3`, `_4` colours                                                   |
| Overlays with one colour  | `blush`, `chest` — `_1`, `_2`, `_3`                                                                                                                                     |
| Overlays without colour   | `age`, `blemishes`, `complexion`, `sun`, `moles`, `addbodyb` — `_1`, `_2`                                                                                               |
| Clothing                  | `tshirt`, `torso`, `decals`, `pants`, `shoes`, `mask`, `bproof`, `chain`, `bags` — `_1` drawable, `_2` texture. Arms are `arms` and `arms_2`                            |
| Props                     | `helmet`, `glasses`, `ears`, `watches`, `bracelets` — `_1` drawable (-1 none), `_2` texture                                                                             |
| Tattoos                   | `tattoos`, a list of `{ collection, texture, zone, opacity }`                                                                                                           |

```lua
-- a partial example
{ sex = 0, mom = 21, dad = 4, face_md_weight = 0.5, hair_1 = 3, beard_1 = 10, beard_2 = 10,
  torso_1 = 15, arms = 15, helmet_1 = -1,
  tattoos = { { collection = "mpairraces_overlays", texture = 1, zone = "body", opacity = 1.0 } } }
```

A tattoo's `zone` is `head`, `body`, `leftArm`, `rightArm`, `leftLeg` or `rightLeg`, and `texture` is the design's position in that zone of `Config.Tattoos` (`shared/tattoos.lua`), counting from 1. Records saved before v3 with `arms` or `legs` still load and keep drawing where they did before.

### Troubleshooting

| Symptom                                          | Cause and fix                                                                                                                                                                                                                                                                     |
| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| The resource fails to start on QBCore            | `qb-core` was not running yet. Start the framework before `aty_clothing`                                                                                                                                                                                                          |
| An admin command does nothing                    | The player is not a clothing admin. Add the `aty_clothing.admin` ACE, or use the framework's admin group — see Permissions                                                                                                                                                        |
| No prompt at a shop, or the wrong one            | Check `Config.DisplayMethod`. With `"target"`, `ox_target` or `qb-target` must be running; with `"none"` the zone and **E** still work                                                                                                                                            |
| A shop opens for a job it should not             | A public shop and a job shop share a key. Give job shops their own keys, such as `[101]`                                                                                                                                                                                          |
| Wardrobe saves fail with `Unknown column 'skin'` | Another clothing script made `player_outfits` first, with other columns. Run `ALTER TABLE player_outfits ADD COLUMN skin TEXT NULL, ADD COLUMN outfitId VARCHAR(50) NULL;`                                                                                                        |
| A saved outfit is not in the wardrobe            | The save failed. The name stays in the box and the server console says why: `outfit not saved for player …` or `wardrobe not read: …`                                                                                                                                             |
| Invisible body parts, or the look is out of sync | `/refreshskin` reloads the saved appearance                                                                                                                                                                                                                                       |
| Short hairstyles show bare scalp                 | `Config.AutomaticFade` is `false`, or the character's Hair Fade is set to *None*                                                                                                                                                                                                  |
| Clothes did not come back after the tattoo shop  | Press **Show clothes**, switch category, or close the menu; all three restore them                                                                                                                                                                                                |
| Pickers show numbers instead of pictures         | **Show Preview** is off in the hint bar, or the photo studio has not been run yet — see How To Take Images                                                                                                                                                                        |
| Bought or created clothes do not become items    | Run `clothingitems status` in the server console. `Config.ClothingItems.Enabled` must be on, an inventory must be found, and aty\_inventory's `Config.Wear.enabled` and `Config.Wear.clothingItems` set. The console names a missing item mapping or an inventory that is too old |
| A taken-off jacket comes back                    | aty\_inventory's `Config.Wear.clothingRestore` must be `'bare'` and `Equip` must be on — see Clothes as Items                                                                                                                                                                     |
| A piece did not become an item                   | Undershirts, chains, decals, bracelets and arms have no worn slot, and a "nothing" value never becomes an item. A full bag leaves pieces out and says how many                                                                                                                    |
| Matching pieces do nothing for addon clothing    | GTA has no data for it. Fill in `Config.Compatibility`                                                                                                                                                                                                                            |

### Where next

* Integrations — open the menu from your own script, read and apply appearances, listen to events
* How To Take Images — make the item pictures
