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

# Exports

> Abra lojas, leia compras e altere roupas a partir de outros scripts

# 🔌 Exports

Os exports permitem integrar o dk\_skinshop com o resto do servidor: abrir uma loja a partir de um NPC, de um item ou de um menu próprio, checar se o jogador comprou uma peça, aplicar um uniforme por script.

<Tip>
  O arquivo `types.lua` do recurso descreve todos os exports para o **Lua LSP**. Ele não é carregado em runtime — serve só para o seu editor sugerir e validar as assinaturas enquanto você escreve a integração.
</Tip>

***

## Formatos usados

### ClotheData — mapa por categoria

Usado por todos os exports de roupa.

```lua theme={null}
{
    torso = { drawable = 4, texture = 0 },
    pants = { drawable = 10, texture = 0 },
}
```

### pieces — lista de peças

Usado pelos hooks de outfit.

```lua theme={null}
{
    { categoryId = "torso", drawable = 4, texture = 0 },
    { categoryId = "pants", drawable = 10, texture = 0 },
}
```

### BlipConfig — um ponto no mapa

| Campo                           | Tipo e uso                                                        |
| ------------------------------- | ----------------------------------------------------------------- |
| `id`                            | Número do ponto persistido. Opcional                              |
| `mode`                          | `"skinshop"` ou `"wardrobe"`                                      |
| `label`                         | Nome do ponto. Vazio esconde o ícone, mantendo o ponto utilizável |
| `coords`                        | `vector4` com posição e direção                                   |
| `radius`                        | Raio de interação, em metros                                      |
| `permission`                    | `"all"`, `"vip"`, `"admin"` ou `"group"`                          |
| `disabledCategories`            | Categorias bloqueadas na loja. Opcional                           |
| `disabledFeatures`              | Recursos bloqueados no guarda-roupa. Opcional                     |
| `maxOutfitSlots`                | Limite de outfits do ponto. Opcional                              |
| `leaderLabels` / `memberLabels` | Listas de permissões para pontos de grupo                         |

***

## Client

| Export               | Assinatura                                       | Retorno      |
| -------------------- | ------------------------------------------------ | ------------ |
| `toggle`             | `toggle(config: BlipConfig, open?: boolean)`     | —            |
| `openShop`           | `openShop(overrides?: BlipConfig)`               | —            |
| `openWardrobe`       | `openWardrobe(overrides?: BlipConfig)`           | —            |
| `openBlip`           | `openBlip(blipId: number)`                       | `boolean`    |
| `closeShop`          | `closeShop()`                                    | —            |
| `isShopOpen`         | `isShopOpen()`                                   | `boolean`    |
| `wearClothes`        | `wearClothes(clothes: ClotheData, ped?: number)` | —            |
| `loadSavedClothes`   | `loadSavedClothes()`                             | `boolean`    |
| `getEquippedClothes` | `getEquippedClothes()`                           | `ClotheData` |

<AccordionGroup>
  <Accordion title="toggle" icon="toggle-on">
    Abre ou fecha um ponto a partir do config dele.

    `true` força abrir, `false` força fechar, `nil` alterna.
  </Accordion>

  <Accordion title="openShop / openWardrobe" icon="shop">
    Abrem a loja ou o guarda-roupa **na posição atual** do jogador, sem exigir um ponto cadastrado.

    O `overrides` sobrescreve campos do ponto gerado — `label`, `permission`, `radius`, `disabledCategories`, `disabledFeatures`.
  </Accordion>

  <Accordion title="openBlip" icon="location-dot">
    Abre um ponto já cadastrado pelo **id**, de qualquer lugar do mapa, sem exigir proximidade.

    Retorna `false` quando o id não existe localmente.
  </Accordion>

  <Accordion title="closeShop" icon="xmark">
    Fecha a interface e **reverte a prova de roupa** ao estado anterior — o mesmo que o botão cancelar.

    Útil para interromper a prova de fora do script: combate, prisão, cutscene de outro recurso.
  </Accordion>

  <Accordion title="wearClothes" icon="shirt">
    Veste um conjunto de roupas no ped. **Apenas visual: não persiste.**

    Sem o segundo argumento, usa o ped do jogador local.
  </Accordion>

  <Accordion title="loadSavedClothes" icon="rotate-left">
    Busca a roupa salva do jogador no banco e a veste. Retorna `false` quando não há roupa salva.
  </Accordion>

  <Accordion title="getEquippedClothes" icon="eye">
    Devolve a roupa vestida no momento, lida **direto dos componentes e props do ped** — não depende de consultar o servidor.
  </Accordion>
</AccordionGroup>

***

## Server

| Export               | Assinatura                                                           | Retorno                         |
| -------------------- | -------------------------------------------------------------------- | ------------------------------- |
| `fetchPlayerClothes` | `fetchPlayerClothes(source: number)`                                 | —                               |
| `getPlayerClothes`   | `getPlayerClothes(source: number)`                                   | `ClotheData` ou `nil`           |
| `setPlayerClothes`   | `setPlayerClothes(source: number, clothes: ClotheData)`              | `boolean`                       |
| `getPlayerPurchases` | `getPlayerPurchases(source: number)`                                 | `table<categoria, drawables[]>` |
| `hasPurchased`       | `hasPurchased(source: number, categoryId: string, drawable: number)` | `boolean`                       |
| `getPlayerOutfits`   | `getPlayerOutfits(source: number)`                                   | Tabela indexada pelo slot       |
| `isVip`              | `isVip(source: number)`                                              | `boolean`                       |
| `isAdmin`            | `isAdmin(source: number)`                                            | `boolean`                       |
| `getBlips`           | `getBlips()`                                                         | Lista de `BlipConfig`           |

<AccordionGroup>
  <Accordion title="fetchPlayerClothes" icon="download">
    Busca a roupa salva do jogador e **manda o client dele vestir**.
  </Accordion>

  <Accordion title="setPlayerClothes" icon="pen">
    Sobrescreve a roupa salva e aplica no client. Retorna `true` quando a gravação dá certo.
  </Accordion>

  <Accordion title="getPlayerPurchases / hasPurchased" icon="receipt">
    Consultam o histórico de compras do jogador. O `hasPurchased` responde por **categoria e variação** — a textura não entra na conta.
  </Accordion>

  <Accordion title="isVip / isAdmin" icon="crown">
    Usam a mesma checagem do script, pela bridge do dk\_snippets. Lembre que **admins sempre contam como VIP**.
  </Accordion>
</AccordionGroup>

***

## Exemplos

### Abrir uma loja bloqueando categorias

```lua theme={null}
exports.dk_skinshop:openShop({
    permission = "all",
    disabledCategories = { "mask", "hat" },
})
```

### Fechar a prova quando outra interface precisar do foco

```lua theme={null}
if exports.dk_skinshop:isShopOpen() then
    exports.dk_skinshop:closeShop()
end
```

### Conferir se o jogador já comprou uma variação

```lua theme={null}
local ownsTorso = exports.dk_skinshop:hasPurchased(source, "torso", 4)
```

### Aplicar um uniforme por script

```lua theme={null}
exports.dk_skinshop:setPlayerClothes(source, {
    torso = { drawable = 55, texture = 0 },
    pants = { drawable = 31, texture = 0 },
    shoes = { drawable = 25, texture = 0 },
})
```

### Guardar o look atual antes de trocar

```lua theme={null}
local previous = exports.dk_skinshop:getEquippedClothes()

exports.dk_skinshop:wearClothes({
    torso = { drawable = 55, texture = 0 },
})

-- Mais tarde, devolver a roupa anterior:
exports.dk_skinshop:wearClothes(previous)
```

<Card title="Hooks" icon="bolt" href="/scripts/skinshop/dev/hooks" horizontal>
  Reaja a compras, outfits, compartilhamentos e criação de pontos.
</Card>
