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

# Configuração

> Todos os ajustes do Five Skins: comandos, economia, caixas, catálogo de skins, skins temporárias, trocas, aprimoramento, teste de armas e textos.

A configuração fica em `config/`. A tabela `globalConfig`, em `config/config.lua`, concentra os ajustes gerais, enquanto o catálogo de skins e as caixas têm arquivos próprios.

***

## Ajustes gerais

<AccordionGroup>
  <Accordion title="Comandos, permissão e aparência" icon="sliders">
    ```lua theme={null}
    globalConfig.command = "skins"              -- comando do painel do jogador
    globalConfig.adminCommand = "skinsadm"      -- comando do painel administrativo
    globalConfig.staffPermission = "Admin"      -- grupo exigido para o painel admin

    globalConfig.themeColor = "#0095f3"         -- cor base da interface
    globalConfig.logoUrl = ""                   -- logo exibida no topo do painel
    globalConfig.bannerUrl = ""                 -- banner promocional do painel
    globalConfig.skinCoinsShopUrl = ""          -- link do botão de comprar a moeda interna
    ```
  </Accordion>

  <Accordion title="Moeda, gravação e raridades" icon="coins">
    ```lua theme={null}
    globalConfig.useFrameworkCoins = false      -- true usa a moeda do servidor no lugar da moeda interna
    globalConfig.syncInterval = 60000 * 5       -- intervalo de gravação do inventário no banco
    globalConfig.lastWinsSize = 20              -- quantas vitórias recentes ficam em destaque

    globalConfig.rarityMap = {                  -- traduz as raridades usadas nas skins
        common = "comum", rare = "raro", epic = "epico", legendary = "lendario",
    }
    ```
  </Accordion>

  <Accordion title="Prévia 3D" icon="cube">
    ```lua theme={null}
    globalConfig.preview = {
        rotationSpeed = 0.35,  -- velocidade da rotação ao arrastar o mouse na inspeção 3D
    }
    ```
  </Accordion>
</AccordionGroup>

***

## Catálogo de skins

Cada skin define a aparência, a raridade, a chance no sorteio e o valor de mercado em `config/weapons.lua`.

```lua theme={null}
{
    id = "AK_Storm",              -- identificador único da skin
    name = "AK-103 Storm",        -- nome exibido na interface
    image = "./assets/images/WEAPON_ASSAULTRIFLE1_STORM/imgSkin.webp",
    rarity = "legendary",         -- chave correspondente em rarityMap
    chance = 10,                  -- peso da skin no sorteio das caixas
    price = 40,                   -- preço de compra, venda e aprimoramento
    modType = "modWeapon",        -- modWeapon (componente) ou alternativeWeapon (arma alternativa)
    data = {
        dbWeapon = "WEAPON_ASSAULTRIFLE",
        weapon = "...",
        component = "...",  -- opcional: componente/camo aplicado sobre a arma
        clip = "...",        -- opcional: componente adicional (ex: pente/carregador)
    },
}
```

<Note>
  A `image` é um caminho relativo pra dentro de `web/` (o painel já compilado dentro do recurso) — basta colocar o arquivo em `web/assets/images/<pasta>/imgSkin.webp`, sem precisar rebuildar nada.
</Note>

<Note>
  A chance de cada skin vem do campo `chance` aqui no catálogo, e não da caixa. Quanto maior o número, maior o peso no sorteio.
</Note>

***

## Caixas

As caixas ficam em `config/cases.lua`. Cada caixa lista as skins que pode entregar, e os campos opcionais controlam preço, cooldown e restrição de acesso.

```lua theme={null}
{
    id = "pistola",                  -- identificador único da caixa
    name = "Box Pistol",             -- nome exibido
    price = 75,                      -- custo na moeda interna
    badge = "new",                   -- selo visual: "new" ou "free"
    image = "https://.../caixa.png", -- imagem da caixa

    -- free = true,                  -- marca como caixa diária grátis
    -- cooldownSeconds = 86400,      -- tempo de espera da caixa grátis
    -- permission = "Policia",       -- restringe a abertura a um grupo

    skins = {
        { id = "Glock_Rajada_Anime" },
        { id = "Glock_Rajada_Fade", durationDays = 7 },  -- ganha como temporária
    },
}
```

<Note>
  O campo `durationDays` em uma skin da caixa a entrega como temporária, com a validade em dias definida ali mesmo. Sem o campo, a skin é permanente. A duração é definida por skin dentro da caixa.
</Note>

***

## Skins temporárias

As opções de período aparecem na compra de skins pela loja. Use `days = 0` para a opção permanente. O `price` fixa o valor da opção e, quando ausente, usa o preço base da skin.

```lua theme={null}
globalConfig.temporaryDurations = {
    { id = "7d",   label = "7 Dias",     days = 7,  price = 5000 },
    { id = "30d",  label = "30 Dias",    days = 30, price = 15000 },
    { id = "perm", label = "Permanente", days = 0,  price = nil },
}

globalConfig.expiringSoonDays = 3            -- destaca no painel as skins perto de expirar
globalConfig.expireMaxScheduleMs = 86400000  -- limite de cada agendamento de expiração (normalmente não precisa mexer)
```

***

## Trocas

```lua theme={null}
globalConfig.tradeExpireMs = 86400000  -- validade de uma proposta de troca
globalConfig.tradeVoucherRate = 0.02   -- taxa da troca, cobrada em vouchers
globalConfig.tradeSweepMs = 60000      -- de quanto em quanto tempo o script limpa trocas expiradas
```

***

## Aprimoramento

O aprimoramento consome skins e saldo para tentar uma skin de maior valor. A chance cresce conforme o valor investido e respeita os limites abaixo.

```lua theme={null}
globalConfig.improvement = {
    enabled = true,                  -- liga ou desliga o recurso no painel
    requirePlayerSkin = true,        -- exige ao menos uma skin do jogador na aposta
    chanceExponent = 1.5,            -- curva de chance conforme o investimento
    minChance = 1,                   -- chance mínima de sucesso
    maxChance = 95,                  -- chance máxima de sucesso
    minTargetMarkup = 1.2,           -- valor mínimo do alvo em relação ao investido
    maxTargetMarkup = 5.0,           -- valor máximo do alvo em relação ao investido
}
```

***

## Teste de armas

```lua theme={null}
globalConfig.weaponTest = {
    enabled = true,                                 -- desligado, some o botão "Testar" e o server recusa o teste
    coords = vec4(13.57, -1097.23, 29.82, 343.0),    -- ponto de teste isolado
    ammo = 250,                      -- munição entregue no teste
    maxRadius = 30.0,                -- raio máximo antes de encerrar o teste
    maxSeconds = 600,                -- duração máxima do teste
    exitKey = 177,                   -- tecla para sair do teste
    bucketOffset = 75000,             -- offset somado ao id do jogador pro routing bucket exclusivo
}
```

<Note>
  O teste move o jogador para um espaço isolado por routing bucket (o id do jogador somado a `bucketOffset`). Os outros jogadores não veem nem são afetados pelo teste.
</Note>

***

## Textos

Todas as mensagens enviadas ao jogador ficam em `globalConfig.language`, incluindo as de compra, venda, troca, aprimoramento e expiração de skins temporárias. Edite ali para adaptar a comunicação ao seu servidor.

```lua theme={null}
globalConfig.language = {
    buySuccess     = "Você comprou a skin %s por %s SkinsCoins.",
    buyTempSuccess = "Você comprou a skin %s por %s dias por %s SkinsCoins.",
    skinExpired    = "A skin %s expirou e foi removida do seu inventário.",
    -- ... demais mensagens (compra, venda, troca, aprimoramento, teste de arma, etc.)
}
```
