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

# Wardrobes, uniforms and locks

Wardrobe and locker locations, job and gang uniforms, and items locked to a job, gang, ace or character.

All of this lives in `config/shops.lua`.

## Wardrobe locations

```lua
Config.Wardrobes = {
    -- { id = "motel_wardrobe", label = "WARDROBE", mode = "wardrobe", coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 2.0, citizenids = { "ABC12345" } },
    { id = "police_locker", label = "LSPD LOCKER ROOM", mode = "job", job = "police", onDutyOnly = false,
      coords = vector4(454.91, -990.89, 30.69, 193.4), radius = 2.5, allowSaving = false },
}
```

| Field                                     | What it does                                                    |
| ----------------------------------------- | --------------------------------------------------------------- |
| `id`, `label`, `coords`, `radius`, `blip` | Same as for shops. `label` is the heading in the interface.     |
| `mode`                                    | `"wardrobe"` (personal outfits), `"home"`, `"job"` or `"gang"`. |
| `citizenids`                              | Restrict a personal wardrobe to specific character ids.         |
| `job` / `gang`                            | Required job / gang for a locker. `minGrade` optional.          |
| `onDutyOnly`                              | Jobs only: `true` requires the player to be on duty.            |
| `gender`                                  | `"male"` or `"female"` only.                                    |
| `allowSaving` / `allowSharing`            | Default `true`.                                                 |

Players who don't qualify don't see the prompt, and the server checks the rules again when the wardrobe opens.

### Wardrobe modes

| Mode         | Main button | Save outfits   | Share / import | Browse clothing |
| ------------ | ----------- | -------------- | -------------- | --------------- |
| `wardrobe`   | EQUIP       | Yes            | Yes            | No              |
| `home`       | EQUIP       | Yes            | Yes            | No              |
| `job`        | EQUIP       | No             | No             | No              |
| `gang`       | EQUIP       | No             | No             | No              |
| `outfit_bag` | EQUIP       | Bag owner only | No             | No              |

Wardrobes are always free. Equipping an outfit is saved right away.

{% hint style="info" %}
**Housing scripts** usually don't add entries here. They open the wardrobe from their own interaction with `exports.Chapo_advanced_clothing:OpenWardrobe({ mode = "home" })`. See [Integration examples](/visionstore-docs/scripts/advanced-clothing/developers/integration-examples.md).
{% endhint %}

## Job outfits

`Config.JobOutfits[jobName][gender]` is a list of outfits. Gender keys are `male` / `female` (illenium's `Male` / `Female` work too). The job name is the framework job name (`police`, not `LSPD`).

Two formats are accepted and can be mixed in one list. The file ships three male (Patrol, Trooper Tan, SWAT) and one female (Patrol) police outfit as examples.

{% tabs %}
{% tab title="Native format" %}
Slot id → `{ drawable, texture }`:

```lua
{ name = "Patrol", grades = { 0, 1, 2, 3, 4 }, note = "Standard patrol uniform",
  components = { [1] = { 0, 0 }, [3] = { 19, 0 }, [4] = { 24, 0 }, [5] = { 0, 0 }, [6] = { 51, 0 }, [7] = { 0, 0 }, [8] = { 58, 0 }, [9] = { 0, 0 }, [10] = { 0, 0 }, [11] = { 55, 0 } },
  props = { [0] = { -1, 0 }, [1] = { -1, 0 }, [2] = { -1, 0 } } },
```

{% endtab %}

{% tab title="illenium format" %}
Copy an entry straight out of `illenium-appearance/shared/config.lua` (`Config.Outfits`):

```lua
{ name = "Trooper Tan", grades = { 0, 1, 2, 3, 4 },
  outfitData = {
      ["pants"] = { item = 24, texture = 0 }, ["arms"] = { item = 20, texture = 0 }, ["t-shirt"] = { item = 58, texture = 0 },
      ["vest"] = { item = 0, texture = 0 }, ["torso2"] = { item = 317, texture = 3 }, ["shoes"] = { item = 51, texture = 0 },
      ["accessory"] = { item = 0, texture = 0 }, ["bag"] = { item = 0, texture = 0 }, ["hat"] = { item = 58, texture = 0 },
      ["glass"] = { item = 0, texture = 0 }, ["mask"] = { item = 0, texture = 0 },
  } },
```

To move all your illenium uniforms at once, take `Config.Outfits["police"]["Male"]` from illenium's config and paste the list under `Config.JobOutfits.police.male` (or keep the `Male` key).
{% endtab %}
{% endtabs %}

| Entry field            | What it does                                                        |
| ---------------------- | ------------------------------------------------------------------- |
| `name`                 | Shown on the outfit card.                                           |
| `grades`               | Job grades that can see the outfit. Missing or empty = every grade. |
| `note`                 | Optional text on the card.                                          |
| `components` / `props` | Native format.                                                      |
| `outfitData`           | illenium format.                                                    |

The illenium keys map to these slots (a prop `item` of 0 or -1 removes the prop):

| Key         | Slot        | Key        | Slot         |
| ----------- | ----------- | ---------- | ------------ |
| `mask`      | component 1 | `decals`   | component 10 |
| `arms`      | component 3 | `torso2`   | component 11 |
| `pants`     | component 4 | `hat`      | prop 0       |
| `bag`       | component 5 | `glass`    | prop 1       |
| `shoes`     | component 6 | `ear`      | prop 2       |
| `accessory` | component 7 | `watch`    | prop 6       |
| `t-shirt`   | component 8 | `bracelet` | prop 7       |
| `vest`      | component 9 |            |              |

Slots an outfit doesn't mention keep what the player is wearing.

Job outfits appear in the **JOB OUTFITS** tab of the wardrobe whenever the player's job has an entry. In a locker opened in `job` mode, outfits that bosses created in illenium are added too (`Config.UseIlleniumManagementOutfits`). Uniforms can't be shared or sent.

## Gang outfits

Same structure, keyed by gang name (QBCore / Qbox gangs; on ESX and ox\_core the job is used as the gang). Ships empty with a commented example:

```lua
Config.GangOutfits = {
    -- ballas = { male = { { name = "Purple Set", grades = { 0, 1, 2 }, components = { [11] = { 3, 2 }, [4] = { 1, 0 } }, props = {} } } },
}
```

A gang locker:

```lua
{ id = "ballas_locker", label = "BALLAS WARDROBE", mode = "gang", gang = "ballas",
  coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 2.0 },
```

## Locked items

Lock specific items to a job, gang, ace or character. Everyone else sees a lock icon and gets **ITEM LOCKED** when selecting it and at checkout. Any matching list unlocks the item. Ships empty:

```lua
Config.LockedItems = {
    -- { keys = { "c:11:55", "c:11:317", "p:0:58" }, jobs = { "police" }, label = "POLICE" },
}
```

More examples:

```lua
Config.LockedItems = {
    { keys = { "c:11:55", "c:11:317", "p:0:58" }, jobs = { "police" }, label = "POLICE" },
    { keys = { "p:6:12" }, aces = { "group.vip" }, citizenids = { "ABC12345" }, label = "VIP" },
    { keys = { "c:11:3" }, gangs = { "ballas" }, label = "BALLAS" },
}
```

| Field                                    | What it does                                                                                         |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `keys`                                   | Item keys: `"c:<component>:<drawable>"` or `"p:<prop>:<drawable>"`.                                  |
| `jobs` / `gangs` / `aces` / `citizenids` | Who may buy and wear them. Aces are checked on the server when the menu opens and again at checkout. |
| `label`                                  | Short lock reason shown on the item (default `LOCKED`).                                              |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://visionstore.gitbook.io/visionstore-docs/scripts/advanced-clothing/configuration/wardrobes-and-uniforms.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
