> ## 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 do Client

> Teclas, comandos, carregamento no spawn, pose, câmera e privacidade

# 🖥️ Configurações do Client

Arquivo: `config/client/config.lua`

Tudo que acontece no lado do jogador: teclas, comandos, a câmera da prova de roupa, a pose do personagem e a privacidade durante a prova.

<Note>
  Os **pontos de loja e guarda-roupa não são configurados aqui**. Eles são criados pelo [painel administrativo](/scripts/skinshop/usage/admin) dentro do jogo e ficam salvos no banco.
</Note>

***

## Visão geral

| Opção                        | Padrão                            | O que faz                                            |
| ---------------------------- | --------------------------------- | ---------------------------------------------------- |
| `debugMode`                  | `false`                           | Mostra o diagnóstico do client no console F8         |
| `keybinds.openShop`          | `"E"`                             | Abre o ponto em que o jogador está                   |
| `keybinds.toggleHands`       | `"X"`                             | Alterna a animação de mãos com a interface aberta    |
| `wardrobeCommand`            | `"guardaroupa"`                   | Comando que abre o guarda-roupa em qualquer lugar    |
| `copyClothesCommand`         | `"lroupas"`                       | Comando que copia os comandos da roupa vestida       |
| `devShop.enabled`            | `true`                            | Libera a loja reduzida enquanto a licença não valida |
| `devShop.command`            | `"skinshopdev"`                   | Comando dessa loja reduzida                          |
| `loadClothesOnSpawn.enabled` | `true`                            | Aplica a roupa salva quando o personagem carrega     |
| `iconsFolder`                | `nui://dk_skinshop/web/build/img` | Pasta dos ícones das categorias                      |

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

***

## Teclas

```lua theme={null}
keybinds = {
    openShop = "E",
    toggleHands = "X",
},
```

As duas são registradas via `RegisterKeyMapping` e o jogador pode remapeá-las em **Configurações → Controles** do FiveM.

<Warning>
  O FiveM salva a tecla escolhida **no perfil do jogador**. Mudar o valor aqui afeta principalmente quem ainda não tem um bind salvo.
</Warning>

Os nomes válidos estão na [referência de inputs do FiveM](https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/).

***

## Comandos

```lua theme={null}
wardrobeCommand = "guardaroupa",
copyClothesCommand = "lroupas",
```

| Opção                | O que abre                                                                                            |
| -------------------- | ----------------------------------------------------------------------------------------------------- |
| `wardrobeCommand`    | O guarda-roupa na posição atual do jogador, sem depender de ponto no mapa                             |
| `copyClothesCommand` | Um painel com os **comandos prontos** das peças vestidas, para copiar (ex.: `jaqueta 1 4; maos 3 0;`) |

<Note>
  Valor vazio (`""`) ou `nil` desativa o comando.
</Note>

***

## Modo de desenvolvimento

```lua theme={null}
devShop = {
    enabled = true,
    command = "skinshopdev",
},
```

Enquanto a licença do recurso **ainda não foi validada**, a loja abre em uma versão reduzida: câmera e pose funcionam, o jogador troca peça e cor por setas e consegue salvar a roupa — mas não há fotos, compra, outfits nem guarda-roupa.

Assim que a licença valida, a loja completa assume sozinha e o comando reduzido para de responder.

| Valor             | Comportamento                                            |
| ----------------- | -------------------------------------------------------- |
| `enabled = true`  | A loja abre em modo reduzido durante a espera            |
| `enabled = false` | A loja simplesmente não abre até a autenticação terminar |

***

## Roupa no spawn

```lua theme={null}
loadClothesOnSpawn = {
    enabled = true,
    events = {},
},
```

Aplica a roupa salva automaticamente quando o jogador entra no jogo. **Funciona sem configuração extra** — o script já escuta os eventos de login dos frameworks conhecidos:

```lua theme={null}
"vRP:Active"                      -- vRP Creative Network
"vRP:playerActive"                -- vRP Creative V5
"esx:playerLoaded"                -- ESX
"QBCore:Client:OnPlayerLoaded"    -- QBCore / Qbox
"qbx_core:client:playerLoggedIn"  -- Qbox (variante nova)
"playerSpawned"                   -- Fallback universal do FiveM
```

<Tip>
  Usa um sistema de spawn próprio? Adicione o nome do evento em `events`:

  ```lua theme={null}
  events = { "meuspawn:pronto" },
  ```
</Tip>

<Info>
  O script espera **500 ms** antes de aplicar, dando tempo do framework terminar de montar o ped, e ignora chamadas repetidas dentro de **1,5 s** — assim o jogador não é vestido duas vezes no mesmo login.
</Info>

***

## Pose

Deixa o personagem parado durante a prova, em vez de respirar e balançar.

```lua theme={null}
pose = {
    enabled = true,
    dict = "anim@heists@heist_corona@team_idles@male_a",
    name = "idle",
    blendIn = 8.0,
    freeze = true,
    freezeTime = 0.0,
},
```

| Campo           | Descrição                                                  |
| --------------- | ---------------------------------------------------------- |
| `enabled`       | `false` deixa o jogador na postura padrão                  |
| `dict` / `name` | Dicionário e nome da animação                              |
| `blendIn`       | Velocidade de entrada na animação (`8.0` = imediato)       |
| `freeze`        | `true` trava a animação em um frame; `false` deixa em loop |
| `freezeTime`    | Frame em que travar, de `0.0` a `1.0`                      |

<Note>
  A animação de **levantar as mãos** (tecla `toggleHands`) substitui a pose enquanto está ativa, e a pose volta sozinha ao desativá-la.
</Note>

***

## Câmera

A câmera enquadra automaticamente a parte do corpo da categoria aberta.

### Presets

| Preset        | Usado por                                                       |
| ------------- | --------------------------------------------------------------- |
| `head`        | Chapéu, máscara, óculos e brinco                                |
| `chest`       | Jaqueta, camiseta, colete, mochila, adesivos, mãos e acessórios |
| `legs`        | Calças                                                          |
| `feet`        | Sapatos                                                         |
| `left_wrist`  | Relógio                                                         |
| `right_wrist` | Pulseira                                                        |
| `full`        | Personagem inteiro                                              |

Cada preset aceita:

| Campo         | Descrição                                                      |
| ------------- | -------------------------------------------------------------- |
| `height`      | Ajuste de altura em metros, somado à referência                |
| `radius`      | Distância da câmera até o personagem                           |
| `fov`         | Campo de visão em graus. Menor = mais zoom                     |
| `bone`        | Osso usado como referência de altura                           |
| `angleOffset` | Graus somados ao ângulo frontal, para orbitar lateralmente     |
| `screenShift` | Desloca o ponto de mira, para o alvo não ficar atrás do painel |

```lua theme={null}
head = {
    height = 0.6,
    radius = 0.9,
    fov = 50.0,
    bone = "SKEL_Head",
},
```

<Tip>
  O `bone` é o que faz a câmera acompanhar a **pose real** do personagem. Sem ele, a câmera usa a base do ped e desalinha em modelos mais altos ou mais baixos que o padrão.
</Tip>

### Qual preset cada categoria usa

```lua theme={null}
categories = {
    pants = "legs",
    shoes = "feet",
    hat = "head",
    watch = "left_wrist",
    bracelet = "right_wrist",
    torso = "chest",
    -- ...
},
```

### Zoom e transição

```lua theme={null}
minZoom = 0.5,
maxZoom = 5.0,
lerpSpeed = 8.0,
```

| Campo                 | Descrição                                                        |
| --------------------- | ---------------------------------------------------------------- |
| `minZoom` / `maxZoom` | Limites do zoom pelo scroll do mouse                             |
| `lerpSpeed`           | Velocidade da transição entre presets. Maior = troca mais rápida |

***

## Privacidade

Deixa os peds próximos invisíveis e sem colisão enquanto a interface está aberta, para ninguém atravessar na frente da câmera nem empurrar o personagem.

```lua theme={null}
privacy = {
    enabled = true,
    radius = 15.0,
    hideVisibility = true,
    removeCollision = true,
    affectPlayers = true,
    affectNpcs = true,
    updateInterval = 500,
    byMode = {
        wardrobe = {
            affectPlayers = false,
        },
    },
},
```

| Campo             | Padrão | Descrição                                     |
| ----------------- | ------ | --------------------------------------------- |
| `enabled`         | `true` | Liga o recurso                                |
| `radius`          | `15.0` | Raio, em metros, considerado "próximo"        |
| `hideVisibility`  | `true` | Torna os peds próximos invisíveis             |
| `removeCollision` | `true` | Remove a colisão entre o jogador e esses peds |
| `affectPlayers`   | `true` | Se outros jogadores são afetados              |
| `affectNpcs`      | `true` | Se NPCs são afetados                          |
| `updateInterval`  | `500`  | Intervalo da varredura, em ms                 |
| `byMode`          | —      | Sobrescritas por tipo de ponto                |

<Info>
  No **guarda-roupa**, `affectPlayers` vira `false`: os outros jogadores continuam visíveis, porque é para eles que o look é compartilhado. Os NPCs seguem escondidos.
</Info>

<Tip>
  Em `byMode`, só as chaves listadas mudam — o resto herda a configuração de cima. Os modos disponíveis são `skinshop` e `wardrobe`.
</Tip>

***

## Hooks

O `config/client/config.lua` também traz os hooks de integração do client.

<Card title="Hooks" icon="bolt" href="/scripts/skinshop/dev/hooks#client" horizontal>
  Bloqueie a abertura, reaja a trocas de roupa e integre com outros scripts.
</Card>
