> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dkscripts.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Configurações Compartilhadas

> Idioma, slots, preços, categorias e conjuntos — o config lido pelo client e pelo servidor

# ⚙️ Configurações Compartilhadas

Arquivo: `config/shared/config.lua`

É o único config lido pelos **dois lados**. Concentra idioma, preços, categorias, slots de outfit, conjuntos prontos e fotos das roupas.

<Warning>
  Mudanças aqui só valem **depois de reiniciar o recurso**.
</Warning>

***

## Visão geral

| Opção                | Padrão        | O que faz                                                       |
| -------------------- | ------------- | --------------------------------------------------------------- |
| `locale`             | `"pt-br"`     | Idioma dos textos do jogo e da interface                        |
| `outfitSlots.normal` | `3`           | Slots de outfit para todo jogador                               |
| `outfitSlots.vip`    | `3`           | Slots **extras** para VIP                                       |
| `purchasedDiscount`  | `true`        | Peça já comprada volta a custar zero                            |
| `conjuntoDiscount`   | `0.25`        | Desconto exibido nos conjuntos prontos                          |
| `categories`         | 15 categorias | O catálogo da loja e do guarda-roupa                            |
| `conjuntos`          | —             | Looks prontos vendidos como pacote                              |
| `itemImages`         | —             | [Fotos reais das roupas](/scripts/skinshop/configs/item-images) |
| `defaultVariations`  | —             | Qual variação representa "sem a peça"                           |

***

## Idioma

```lua theme={null}
locale = "pt-br"
```

Vêm inclusos `pt-br` e `en`. Para criar outro idioma, copie uma das pastas em `locales/`, mantenha as mesmas chaves, traduza só os valores e aponte o `locale` para ela.

<Info>
  O carregador monta o dicionário **pt-br primeiro** e aplica o idioma escolhido por cima. Chave faltando cai no texto em português, em vez de sumir da tela.
</Info>

Cada idioma é dividido em três arquivos:

| Arquivo      | Conteúdo                            |
| ------------ | ----------------------------------- |
| `game.lua`   | Notificações e rótulos dos keybinds |
| `shared.lua` | Textos comuns aos dois contextos    |
| `ui.lua`     | Textos da interface                 |

***

## Slots de outfit

```lua theme={null}
outfitSlots = {
    normal = 3,
    vip = 3,
},
```

| Campo    | Descrição                                     |
| -------- | --------------------------------------------- |
| `normal` | Slots disponíveis a todos os jogadores        |
| `vip`    | Slots **somados** aos normais para quem é VIP |

<Tip>
  Com o padrão, um jogador comum tem **3 slots** e um VIP tem **6**. Quem identifica o VIP é a `vipPermission`, nas [Configurações do Server](/scripts/skinshop/configs/sv-config).
</Tip>

***

## Preços e descontos

### purchasedDiscount

```lua theme={null}
purchasedDiscount = true
```

Com `true`, uma variação já comprada volta a ser vestida **de graça**.

<Info>
  O histórico é por **categoria e variação**, não por textura. Se o jogador já comprou a jaqueta 4, todas as cores dela saem de graça.
</Info>

Com `false`, toda troca é cobrada novamente — a loja passa a funcionar como aluguel, não como coleção.

### conjuntoDiscount

```lua theme={null}
conjuntoDiscount = 0.25
```

Desconto exibido no card do conjunto, de `0.0` a `1.0`. O padrão `0.25` mostra **25% off** sobre a soma das peças. Use `0` para desativar.

<Warning>
  O `conjuntoDiscount` altera **apenas o preço mostrado no card**. Na hora de cobrar, o servidor soma o preço cheio de cada peça — descontando somente o que o jogador já possui, via `purchasedDiscount`.
</Warning>

***

## Categorias

O catálogo do script. Remover uma categoria daqui a tira **da loja, do guarda-roupa e dos comandos** de uma vez.

```lua theme={null}
["torso"] = {
    name = "Jaqueta",
    command = "jaqueta",
    price = 250,
    featured = true,
    index = 11,
    isProp = false,
},
```

| Campo                | Função                                                                                             |
| -------------------- | -------------------------------------------------------------------------------------------------- |
| Chave (ex.: `torso`) | Identificador usado nas roupas, outfits, exports e fotos                                           |
| `name`               | Nome exibido na interface                                                                          |
| `command`            | Comando de chat, sem a barra. Omitido, o script gera um a partir do `name` (minúsculo, sem acento) |
| `price`              | Preço unitário da categoria                                                                        |
| `featured`           | Destaca a categoria no painel principal da loja                                                    |
| `index`              | Índice do componente ou prop no GTA                                                                |
| `isProp`             | `true` para acessórios, `false` para peças de roupa                                                |

<Warning>
  Não altere `index` e `isProp` sem necessidade: são eles que definem **qual parte do personagem** a categoria controla.
</Warning>

### As 15 categorias padrão

| Categoria | Chave       | Comando       | Preço | Destaque | `index` | `isProp` |
| --------- | ----------- | ------------- | ----: | :------: | ------: | :------: |
| Jaqueta   | `torso`     | `/jaqueta`    |   250 |     ⭐    |      11 |     —    |
| Sapatos   | `shoes`     | `/sapatos`    |   180 |     ⭐    |       6 |     —    |
| Camiseta  | `tshirt`    | `/blusa`      |   100 |     ⭐    |       8 |     —    |
| Calças    | `pants`     | `/calca`      |   100 |     ⭐    |       4 |     —    |
| Chapéu    | `hat`       | `/chapeu`     |   100 |     ⭐    |       0 |     ✅    |
| Máscara   | `mask`      | `/mascara`    |   100 |          |       1 |     —    |
| Mãos      | `arms`      | `/maos`       |   100 |          |       3 |     —    |
| Mochila   | `backpack`  | `/mochila`    |   100 |          |       5 |     —    |
| Acessório | `accessory` | `/acessorios` |   100 |          |       7 |     —    |
| Colete    | `vest`      | `/colete`     |   100 |          |       9 |     —    |
| Adesivos  | `decals`    | `/adesivo`    |   100 |          |      10 |     —    |
| Óculos    | `glass`     | `/oculos`     |   100 |          |       1 |     ✅    |
| Brinco    | `ear`       | `/brinco`     |   100 |          |       2 |     ✅    |
| Relógio   | `watch`     | `/relogio`    |   100 |          |       6 |     ✅    |
| Pulseira  | `bracelet`  | `/pulseira`   |   100 |          |       7 |     ✅    |

<Tip>
  Para **adicionar** uma categoria, crie a chave com todos os campos acima e use o `index` / `isProp` da parte do personagem que ela deve controlar.
</Tip>

***

## Conjuntos prontos

Looks completos, exibidos na aba **Conjuntos** da loja e vendidos como pacote.

```lua theme={null}
{
    name = "Executivo Clássico",
    description = "Look profissional para reuniões",
    badge = "popular",
    vip = false,
    pieces = {
        { categoryId = "torso", drawable = 4, texture = 0 },
        { categoryId = "pants", drawable = 10, texture = 0 },
        { categoryId = "shoes", drawable = 10, texture = 0 },
        { categoryId = "tshirt", drawable = 15, texture = 0 },
    },
},
```

| Campo         | Descrição                                                         |
| ------------- | ----------------------------------------------------------------- |
| `name`        | Nome exibido no card                                              |
| `description` | Linha de apoio no card                                            |
| `badge`       | Selo do card: `"popular"`, `"new"` ou `"vip"`. Omita para nenhum  |
| `vip`         | Muda o visual do card para o estilo VIP                           |
| `pieces`      | Lista de peças, cada uma com `categoryId`, `drawable` e `texture` |

### Montando um conjunto novo

<Steps>
  <Step title="Vista o look no jogo" icon="shirt">
    Use a loja ou os comandos de categoria até chegar no visual desejado.
  </Step>

  <Step title="Abra o guarda-roupa e clique em Copiar código" icon="copy">
    O código é a lista de peças em JSON codificada em base64.
  </Step>

  <Step title="Decodifique e cole em pieces" icon="paste">
    O resultado já está no formato esperado pelo campo `pieces`.
  </Step>
</Steps>

<Warning>
  O campo `vip` altera apenas a aparência do card e **não é validado no servidor**. Não use ele como trava de acesso — para restringir de verdade, use um ponto com permissão **VIP**.
</Warning>

***

## Variações padrão

`defaultVariations` define qual variação representa a **ausência** de cada peça, por modelo de ped. É o que o botão **Tirar** aplica, e também o comando sem número (`/blusa` tira a blusa).

```lua theme={null}
defaultVariations = {
    [GetHashKey("mp_m_freemode_01")] = {
        arms = { drawable = 15, texture = 0 },
        torso = { drawable = 15, texture = 0 },
        hat = { drawable = -1, texture = -1 },
    },
},
```

<Info>
  Categoria sem entrada aqui usa o padrão do GTA: variação `0` para peças de roupa e `-1` (removido) para acessórios. Preencha apenas o que fugir disso.
</Info>

O caso clássico nos modelos freemode é o `arms`: a variação `0` é uma manga, e as **mãos nuas** ficam na `15`.

<Tip>
  Usa peds addon no servidor? Adicione o hash do modelo aqui para que o botão **Tirar** funcione corretamente neles também.
</Tip>

***

<CardGroup cols={2}>
  <Card title="Fotos das Roupas" icon="image" href="/scripts/skinshop/configs/item-images">
    O bloco `itemImages`, em uma página só para ele.
  </Card>

  <Card title="Configurações do Client" icon="display" href="/scripts/skinshop/configs/cl-config">
    Teclas, comandos, câmera, pose e privacidade.
  </Card>
</CardGroup>
