> 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/shops-and-locations.md).

# Shops and locations

Add, move and restrict clothing stores, barbers, tattoo parlours, the surgeon, salons and boutiques.

Every shop is an entry in `Config.Shops` (`config/shops.lua`). Its **type** decides what the player can change there and how it is priced.

## Shop types

Defined in `config/sections.lua` (`Config.ShopTypes`). Pick one with `type = "barber"` on a shop entry:

| Type                 | Sections the player sees      | Pricing profile | Blip                              |
| -------------------- | ----------------------------- | --------------- | --------------------------------- |
| `clothing` (default) | APPAREL                       | `clothing`      | 366 / colour 47, "Clothing Store" |
| `barber`             | HAIR                          | `barber`        | 71 / colour 0, "Barber"           |
| `salon`              | HAIR, OVERLAYS                | `barber`        | 71 / colour 48, "Salon"           |
| `tattoo`             | TATTOOS                       | `tattoos`       | 75 / colour 4, "Tattoo Shop"      |
| `surgeon`            | FACE & BODY, FACE ADJUSTMENTS | `surgery`       | 102 / colour 4, "Plastic Surgeon" |
| `cosmetic`           | FACE ADJUSTMENTS, OVERLAYS    | `cosmetic`      | 71 / colour 8, "Cosmetic Studio"  |

The pricing profiles are explained in [Prices and payment](/visionstore-docs/scripts/advanced-clothing/configuration/prices-and-payment.md#barber-tattoo-and-surgeon-prices).

You can add your own type next to the others:

```lua
Config.ShopTypes.piercing = {
    mode = "cosmetic",
    sections = { "overlays" },
    pricingProfile = "cosmetic",
    blip = { sprite = 71, color = 5, scale = 0.7, label = "Piercing Studio" },
    icon = "fas fa-gem",
    textui = "cosmetic",           -- locale key under client.textui
}
```

## Shop fields

| Field                          | Required | What it does                                                                                                                                              |
| ------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                           | ✅        | Unique id, also used by the exports (`OpenClothingShop("binco_strawberry")`).                                                                             |
| `label`                        | ✅        | Title in the interface and in the prompt (`[E] BINCO`).                                                                                                   |
| `type`                         |          | `"clothing"` (default), `"barber"`, `"salon"`, `"tattoo"`, `"surgeon"`, `"cosmetic"` or your own.                                                         |
| `coords`                       |          | `vector4(x, y, z, heading)` of the interaction point. Also used by the server distance check. Leave it out for shops you only open from your own scripts. |
| `radius`                       |          | Zone radius in metres (default 2.0). The target distance is `radius + 1`.                                                                                 |
| `blip`                         |          | `{ sprite, color, scale, label }` or `false`.                                                                                                             |
| `ped`                          |          | `{ model, scenario }` shopkeeper (only with `Config.Interaction.peds = true`).                                                                            |
| `priceMultiplier`              |          | `1.0` = base prices.                                                                                                                                      |
| `tax`                          |          | `false` disables tax here.                                                                                                                                |
| `free`                         |          | `true` makes every clothing item free here.                                                                                                               |
| `categories`                   |          | Clothing categories sold here, for example `{ "tops", "bottoms" }`. `nil` = all.                                                                          |
| `whitelist`                    |          | Item keys that are the **only** items sold here.                                                                                                          |
| `blacklist`                    |          | Item keys never sold here.                                                                                                                                |
| `job` / `gang`                 |          | Only this job / gang (or a list of names) can use the shop. `minGrade` optional.                                                                          |
| `gender`                       |          | `"male"` or `"female"` only.                                                                                                                              |
| `allowSaving` / `allowSharing` |          | Default `true`. `false` disables SAVE / SHARE and IMPORT here.                                                                                            |
| `outfitBags`                   |          | `false` keeps the **Buy Outfit Bags** option away from this clothing store.                                                                               |
| `mode`                         |          | Overrides the type's mode, for example `"boutique"` or `"event"` (see below).                                                                             |
| `sections`                     |          | Overrides the sections, for example `{ "hair", "overlays" }`.                                                                                             |
| `pricingProfile`               |          | Overrides the profile, or `false` to charge nothing here.                                                                                                 |
| `price`                        |          | Barber-style profiles: one flat price for any change here.                                                                                                |
| `tattooPrice`                  |          | Tattoo profile: one price for every tattoo here.                                                                                                          |

## The shipped stores

15 clothing stores at illenium's default locations. All use `radius = 3.0` and the "Clothing Store" blip.

| id                                                                                                                    | Label          | Multiplier |
| --------------------------------------------------------------------------------------------------------------------- | -------------- | ---------- |
| `suburban_grove`, `suburban_delperro`, `suburban_hawick`, `suburban_vespucci`                                         | SUB URBAN      | 1.0        |
| `ponsonbys_rock`, `ponsonbys_morning`, `ponsonbys_rockford`                                                           | PONSONBYS      | 2.5        |
| `binco_strawberry`, `binco_capital`, `binco_paleto`, `binco_harmony`, `binco_sandy`, `binco_chumash`, `binco_route68` | BINCO          | 0.8        |
| `discount_vespucci`                                                                                                   | DISCOUNT STORE | 0.7        |

Then the appearance businesses, all with `radius = 2.5`:

| Type                            | ids                                                                                                                     |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Barber (label HAIR)             | `barber_rockford`, `barber_davis`, `barber_vespucci`, `barber_sandy`, `barber_mirror`, `barber_hawick`, `barber_paleto` |
| Tattoo (label TATTOOS)          | `tattoo_vinewood`, `tattoo_vespucci`, `tattoo_hawick`, `tattoo_chumash`, `tattoo_sandy`, `tattoo_paleto`                |
| Surgeon (label PLASTIC SURGEON) | `surgeon_pillbox`                                                                                                       |

To remove the surgeon from the world, comment out its line. A salon and a cosmetic studio are included as commented examples: give them coordinates and uncomment them.

```lua
-- Config.Shops[#Config.Shops + 1] = { id = "salon_rockford", type = "salon", label = "SALON", coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 2.5 }
-- Config.Shops[#Config.Shops + 1] = { id = "clinic_cosmetic", type = "cosmetic", label = "COSMETIC STUDIO", coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 2.5 }
```

## Examples

{% tabs %}
{% tab title="New clothing store" %}

```lua
{ id = "mall_store", label = "MALL FASHION", coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 3.0,
  blip = { sprite = 366, color = 47, scale = 0.7, label = "Clothing Store" }, priceMultiplier = 1.2 },
```

Add it inside the `Config.Shops = { ... }` list.
{% endtab %}

{% tab title="Job-only boutique" %}
The commented example in the file: a real-estate boutique selling only a few categories, without tax and at three times the price.

```lua
{ id = "vip_boutique", label = "VIP BOUTIQUE", mode = "boutique", coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 3.0, blip = false,
  job = "realestate", categories = { "tops", "bottoms", "footwear", "watches" }, tax = false, priceMultiplier = 3.0 },
```

{% endtab %}

{% tab title="Free event shop" %}

```lua
{ id = "event_shop", label = "EVENT WARDROBE", mode = "event", coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 3.0, blip = false },
```

`event` mode charges nothing: players pick an outfit for free.
{% endtab %}

{% tab title="Cheaper barber" %}

```lua
Config.Shops[#Config.Shops + 1] = { id = "barber_budget", type = "barber", label = "BUDGET CUTS",
    coords = vector4(0.0, 0.0, 0.0, 0.0), radius = 2.5, priceMultiplier = 0.5 }
```

{% endtab %}
{% endtabs %}

## Modes

The mode decides what the main button does and what is charged. A shop type sets it for you; set `mode` only to change it.

| Mode                                                        | Main button | Charges               | Save / share outfits |
| ----------------------------------------------------------- | ----------- | --------------------- | -------------------- |
| `shop`                                                      | CONFIRM     | Clothing cart         | Yes                  |
| `boutique`                                                  | CONFIRM     | Clothing cart         | Yes                  |
| `event`                                                     | CONFIRM     | Nothing               | Yes                  |
| `barber` / `salon` / `tattoo_shop` / `surgeon` / `cosmetic` | CONFIRM     | Its pricing profile   | No                   |
| `admin`                                                     | CONFIRM     | Nothing (admins only) | Yes                  |

Wardrobe modes (`wardrobe`, `home`, `job`, `gang`, `outfit_bag`) are covered in [Wardrobes, uniforms and locks](/visionstore-docs/scripts/advanced-clothing/configuration/wardrobes-and-uniforms.md).

{% hint style="info" %}
**Server checks.** When a shop opens and again at checkout, the server checks the player's distance to `coords` (`radius + Config.ShopDistanceTolerance`), the job / gang / grade / gender rules and the shop's mode. A shop opened in another mode than its own is refused.
{% endhint %}

## Fallback entries for illenium requests

The end of `Config.Shops` holds four entries **without** `coords`:

```lua
{ id = "illenium_clothing", label = "CLOTHING",       type = "clothing", blip = false },
{ id = "illenium_barber",   label = "BARBER",         type = "barber",   blip = false },
{ id = "illenium_tattoo",   label = "TATTOO SHOP",    type = "tattoo",   blip = false },
{ id = "illenium_surgeon",  label = "PLASTIC SURGEON",type = "surgeon",  blip = false },
```

They are used when another script opens a shop through illenium-appearance (`Config.IlleniumIntercept.shops` in `config/config.lua`). Without `coords` they create no blip, ped, target or zone, and there is no distance check, but they still carry the prices and rules of their type.

{% hint style="warning" %}
Keep these four entries. If one is missing, the request goes back to illenium's own menu (the console says `Config.IlleniumIntercept.shops.<type> is not set`) or the shop answers **NOT ALLOWED**.
{% endhint %}
