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

# five-dismantle

> Desmanche de veículos: o jogador leva um veículo a um ponto, remove peças (portas, rodas, motor, escapamento) com animações, deposita na estante e recebe dinheiro sujo. Inclui painel NUI por organização, modo público com porcentagem, relocação do ponto e integração com garagem.

O **five-dismantle** cria pontos de desmanche (`Dismantle.Locations`). Fluxo: motorista pressiona `E` no marcador → lobby (todos no veículo entram) → progresso (ocupantes removem peças com barra de progresso) → cada peça é carregada até a estante e depositada → ao remover tudo (ou esgotar o tempo) o veículo é deletado e o pagamento é processado.

<Note>
  O líder não pode morrer nem se afastar mais de 50m. Veículos de NPC podem ser desmanchados se `AllowNpcVehicles = true`. Coordenadas alteradas pelo painel são persistidas e sobrescrevem a config.
</Note>

## Funcionalidades

<CardGroup cols={2}>
  <Card title="Desmanche em equipe" icon="car-burst">
    Lobby para os ocupantes do veículo e remoção de peças com animações e barra de progresso.
  </Card>

  <Card title="Painel NUI" icon="window-maximize">
    Painel de gerenciamento por organização, com itens acumulados e relocação do ponto.
  </Card>

  <Card title="Preços por classe" icon="money-bill">
    Valor base por classe nativa do GTA e classes customizadas por modelo, com porcentagem de pagamento.
  </Card>

  <Card title="Modo público" icon="users">
    Permite desmanche público com porcentagem própria.
  </Card>

  <Card title="Integração com garagem" icon="warehouse">
    Marca a placa como `DISMANTLED` via `five-vehicles` quando disponível.
  </Card>

  <Card title="Hooks editáveis" icon="code">
    `CanVehicleBeDismantled` e `OnPayment` para customizar regra e pagamento.
  </Card>
</CardGroup>

***

## Dependências

<CardGroup cols={2}>
  <Card title="vrp" icon="cube">
    Framework base.
  </Card>

  <Card title="oxmysql" icon="database">
    Banco.
  </Card>
</CardGroup>

<Info>
  Opcionais: `five-vehicles` (`updateVehicleStatus(plate,'DISMANTLED')`), `five_logs` (log `DESMANCHE`).
</Info>

***

## Configuração

`config/config.lua` (tabela `Dismantle`):

<AccordionGroup>
  <Accordion title="config/config.lua — Configurações principais" icon="sliders">
    ```lua theme={null}
    Dismantle.ThemeColor = "#0143bb"        -- Theme.main tem prioridade
    Dismantle.SessionVerifier = true        -- bloqueia se routing bucket ≠ 0
    Dismantle.AllowNpcVehicles = true       -- permite desmanchar carros de rua (NPC)
    Dismantle.Timers = { Lobby = 15, Progress = 300 }  -- segundos
    Dismantle.PanelCommand = "desmanche"

    Dismantle.PartsTimes = {                -- tempo (ms) por peça (padrão 10000)
        ["door_dside_f"] = 10000, ["wheel_lf"] = 7000, ["engine"] = 15000, ["exhaust"] = 7000, ...
    }

    Dismantle.PartItems = {                 -- item entregue por categoria
        ["money"] = "dollars", ["doors"] = "pizza", ["wheels"] = "pizza", ["ehxausts"] = "pizza", ["batteries"] = "pizza",
    }

    Dismantle.DefaultVehiclePrice = 50000
    Dismantle.DefaultPaymentPercent = 0.90  -- % paga ao jogador (carros fora das classes custom)

    Dismantle.VehiclePrices = {             -- valor base por classe nativa do GTA (chave = id string)
        ["0"] = 10000, ["7"] = 120000, ["8"] = 20000, ["19"] = 80000, ...
    }

    Dismantle.CustomClasses = {             -- valor + percent por modelo (prioridade sobre VehiclePrices)
        ["luxo"] = { price = 200000, percent = 0.0, models = { "adder", "zentorno", "t20" } },
    }

    Dismantle.Interaction = { DrawDistance = 25.0, InteractDistance = 10.0, StartDistance = 1.2, Key = 38 }
    Dismantle.BlockedAreas = { { center = vec3(-1268.62,-1482.11,4.31), radius = 60 } }
    ```
  </Accordion>

  <Accordion title="Pontos (Locations)" icon="map-pin">
    ```lua theme={null}
    Dismantle.Locations = {
        ["desmanche-1"] = {
            name = "Yellow Jack", cooldown = 60, hasPanel = true,
            permissions = { use = "Desmanche1", manage = "Desmanche1" },
            coords = { vehicle = { 1984.42,3033.06,47.11,235.28 }, shelf = { 1989.59,3035.36,47.11,334.49 } },
            allowedClasses = { ["0"]=true, ["7"]=true, ["18"]=false, ["19"]=false, ... },
            allowedRelocationArea = { center = vec3(1984.42,3033.06,47.11), radius = 250.0 },
        },
        -- desmanche-2, desmanche-3, desmanche-4
    }
    ```
  </Accordion>

  <Accordion title="Hooks (funções editáveis)" icon="code">
    ```lua theme={null}
    Dismantle.CanVehicleBeDismantled = function(entity, plate, model, class) return true end  -- regra de bloqueio
    Dismantle.OnPayment = function(source, userId, data, overTime) ... end  -- lógica de pagamento (player/painel, garagem, logs)
    ```

    Webhooks em `config/webhooks.lua`: `DismantleCompleted`, `PanelAction`.
  </Accordion>
</AccordionGroup>

***

## Comandos

Comando para abrir o painel de gerenciamento de um ponto de desmanche.

| Comando           | Descrição                                                                |
| ----------------- | ------------------------------------------------------------------------ |
| `/desmanche [id]` | Abre o painel de gerenciamento (requer permissão `manage` e `hasPanel`). |

***

## Localizações

Pontos definidos em `Dismantle.Locations` (`config/config.lua`). Cada ponto tem uma posição de veículo e uma estante (`shelf`); coordenadas alteradas pelo painel são persistidas e sobrescrevem a config.

| Local                       | Coordenadas (x, y, z, h)         | Tipo             |
| --------------------------- | -------------------------------- | ---------------- |
| Yellow Jack (desmanche-1)   | 1984.42, 3033.06, 47.11, 235.28  | Ponto do veículo |
| Yellow Jack (desmanche-1)   | 1989.59, 3035.36, 47.11, 334.49  | Estante (shelf)  |
| Racha Cranios (desmanche-2) | 1203.83, -3116.55, 5.54, 175.75  | Ponto do veículo |
| Racha Cranios (desmanche-2) | 1198.37, -3119.82, 5.54, 90.71   | Estante (shelf)  |
| Mansao Black (desmanche-3)  | -2792.37, 1449.59, 96.25, 328.82 | Ponto do veículo |
| Mansao Black (desmanche-3)  | -2789.72, 1453.81, 96.25, 328.82 | Estante (shelf)  |
| Rising Sun (desmanche-4)    | -326.71, -114.42, 39.06, 85.04   | Ponto do veículo |
| Rising Sun (desmanche-4)    | -333.37, -112.44, 39.06, 68.04   | Estante (shelf)  |

<Note>
  Cada ponto tem `allowedRelocationArea` de raio 250.0 centrada na própria coordenada do veículo (área onde o painel pode movê-lo).
</Note>

### Áreas bloqueadas (Dismantle.BlockedAreas)

| Local          | Coordenadas (x, y, z)              | Tipo                                     |
| -------------- | ---------------------------------- | ---------------------------------------- |
| Área bloqueada | -1268.62, -1482.11, 4.31 (raio 60) | Zona onde não se pode instalar desmanche |

***

## Exports

Não publica exports próprios. Consome `five-vehicles:updateVehicleStatus` e `five_logs:AddLog`.

***

## Banco de Dados

`five_dismantle` criada automaticamente. Por ponto com painel, guarda coordenadas customizadas e itens acumulados (`money`, `wheels`, `doors`, `ehxausts`, `batteries`, `public`, `percent`).

***

## Customização

* **Regras/pagamento:** hooks `CanVehicleBeDismantled` e `OnPayment`.
* **Preços:** `CustomClasses`, `VehiclePrices`, `DefaultVehiclePrice`/`DefaultPaymentPercent`.
* **Itens por peça:** `PartItems`. **Tempo por peça:** `PartsTimes`.
* **Pontos:** `Dismantle.Locations` (`allowedClasses`, `permissions`, `allowedRelocationArea`).
* **Webhooks:** `config/webhooks.lua`.
