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

# Armazenamento das Roupas

> Onde a roupa atual do jogador é salva e como escolher o adapter certo

# 💾 Armazenamento das Roupas

Todo servidor já tem um lugar onde a roupa do jogador mora. O dk\_skinshop **procura esse lugar** em vez de criar mais um: assim a roupa continua valendo no spawn e nos demais recursos que já leem de lá.

Configurado em `config/server/config.lua`:

```lua theme={null}
clothesStorage = "auto"
```

***

## Como o modo automático decide

O script não olha para o nome do framework — ele olha para o **schema do banco**. O primeiro adapter cujo teste passa vence, e a tabela própria fica por último como garantia.

<Steps>
  <Step title="vRP Creative V5 (Summerz)">
    Tabela `summerz_playerdata`, coluna `user_id`, chave `Clothings`.
  </Step>

  <Step title="vRP Creative Network">
    Tabela `playerdata`, coluna `Passport`, chave `Clothings`.
  </Step>

  <Step title="vRP Creative V3">
    Tabela `vrp_user_data`, chave `Clothings`.
  </Step>

  <Step title="vRPex clássico">
    Tabela `vrp_user_data`, chave `vRP:datatable`, dentro de `data.customization`.
  </Step>

  <Step title="ESX">
    Coluna `users.skin`, preservando as partes de aparência que não são roupa.
  </Step>

  <Step title="QBCore / Qbox">
    Skin ativa em `playerskins.skin`, nos arrays `components` e `props`.
  </Step>

  <Step title="Tabela própria">
    `dk_skinshop_clothes` — usada quando nenhum schema conhecido é encontrado.
  </Step>
</Steps>

<Info>
  O adapter escolhido aparece no console assim que o servidor sobe:

  ```
  [dk_skinshop] Storage de roupas: vrp.playerdata
  ```

  **Confira essa linha na primeira instalação.** É o jeito mais rápido de saber se a detecção acertou.
</Info>

***

## Valores aceitos

| Valor              | Comportamento                                                   |
| ------------------ | --------------------------------------------------------------- |
| `"auto"`           | Detecta pelo schema do banco (recomendado)                      |
| `"script"`         | Força a tabela própria `dk_skinshop_clothes`, isolando o script |
| Nome de um adapter | Força um adapter específico, sem depender da detecção           |

### Nomes dos adapters

| Nome                      | Estrutura usada                                                 |
| ------------------------- | --------------------------------------------------------------- |
| `vrp.summerz_playerdata`  | `summerz_playerdata`, coluna `user_id`, chave `Clothings`       |
| `vrp.playerdata`          | `playerdata`, coluna `Passport`, chave `Clothings`              |
| `vrp.user_data_clothings` | `vrp_user_data`, chave `Clothings`                              |
| `vrp.vrpex_datatable`     | `vrp_user_data`, chave `vRP:datatable`, em `data.customization` |
| `esx.users`               | `users.skin` (esx\_skin / skinchanger)                          |
| `qb.playerskins`          | `playerskins.skin` (illenium-appearance)                        |

```lua theme={null}
clothesStorage = "esx.users"
```

***

## Quando usar cada modo

<AccordionGroup>
  <Accordion title="auto — o padrão" icon="wand-magic-sparkles" defaultOpen>
    Serve para a grande maioria dos servidores. A roupa passa a ser **compartilhada** com o spawn e com os outros recursos que leem do mesmo lugar.
  </Accordion>

  <Accordion title="script — isolar o skinshop" icon="box">
    Use quando quiser que o dk\_skinshop tenha a **própria fonte de verdade**, sem conviver com o sistema de skin do framework.

    Também é a saída rápida quando a detecção automática pega um schema errado.
  </Accordion>

  <Accordion title="Adapter específico — forçar" icon="crosshairs">
    Use quando o banco tem **mais de um schema conhecido** (por exemplo, uma `playerdata` legada convivendo com a base atual) e a detecção precisa ser decidida por você.
  </Accordion>
</AccordionGroup>

***

## Pontos de atenção por framework

<AccordionGroup>
  <Accordion title="ESX" icon="circle-info">
    O jogador precisa ter uma **skin em `users.skin`** para o adapter funcionar. O script preserva as partes de aparência que não são roupa (rosto, cabelo, etc.) ao gravar.
  </Accordion>

  <Accordion title="QBCore / Qbox" icon="circle-info">
    O jogador precisa ter uma **skin ativa em `playerskins`**. A roupa é escrita nos arrays `components` e `props`.
  </Accordion>

  <Accordion title="vRPex clássico" icon="triangle-exclamation">
    A leitura funciona normalmente, mas o vRPex mantém o datatable **em memória** enquanto o jogador está online e pode sobrescrever a gravação direta no próximo save.

    Se a roupa não estiver persistindo nesse framework, o caminho mais seguro é `clothesStorage = "script"`.
  </Accordion>
</AccordionGroup>

***

## ❓ A roupa não salva ou não volta no spawn

<Steps>
  <Step title="Leia a linha Storage de roupas no console">
    Ela informa qual adapter foi escolhido.
  </Step>

  <Step title="Confirme se o adapter é o certo">
    Se a detecção pegou um schema errado, force o correto ou use `"script"`.
  </Step>

  <Step title="Confirme se o jogador tem uma base">
    No ESX, uma skin em `users.skin`. No QB/Qbox, uma skin ativa em `playerskins`.
  </Step>

  <Step title="Confirme o carregamento no spawn">
    `loadClothesOnSpawn.enabled` precisa estar `true`. Em spawns customizados, adicione o evento em `loadClothesOnSpawn.events`.
  </Step>

  <Step title="Ligue o debug">
    `debugMode = true` no config do servidor mostra o que está acontecendo em cada gravação. Volte para `false` depois do teste.
  </Step>
</Steps>

<Card title="Configurações do Server" icon="server" href="/scripts/skinshop/configs/sv-config" horizontal>
  O restante do `config/server/config.lua`.
</Card>
