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

# doors

> Sistema de portas (door lock) baseado no door system nativo do GTA V, com sincronização em tempo real para todos os jogadores e controle de acesso por grupo/permissão.

O **doors** é um sistema de portas (door lock) baseado no door system nativo do GTA V. Registra portas pré-definidas (delegacias, etc.) via `AddDoorToSystem`. Ao se aproximar dentro do raio, aparece um prompt `E` para trancar/destrancar, só executado se o jogador tiver o grupo (`Permission`). O estado fica em memória no servidor e é propagado a todos via eventos. Suporta portas duplas (campo `Other`).

## Funcionalidades

<CardGroup cols={2}>
  <Card title="Door system nativo" icon="door-closed">
    Portas registradas via `AddDoorToSystem`, usando o sistema nativo do GTA V.
  </Card>

  <Card title="Sincronização em tempo real" icon="arrows-rotate">
    O estado fica em memória no servidor e é propagado a todos os jogadores via eventos.
  </Card>

  <Card title="Controle por permissão" icon="lock">
    Trancar/destrancar só é executado se o jogador tiver o grupo (`Permission`).
  </Card>

  <Card title="Portas duplas" icon="door-open">
    Espelhamento de estado entre duas portas via o campo `Other`.
  </Card>
</CardGroup>

***

## Dependências

<CardGroup cols={2}>
  <Card title="vrp" icon="server">
    `vRP.Passport`, `vRP.HasGroup`.
  </Card>

  <Card title="PolyZone" icon="draw-polygon" />
</CardGroup>

***

## Configuração

<Info>
  Sem pasta `config/`: as portas ficam na tabela `Doors` em `server-side/core.lua` (chave = identificador único string).
</Info>

<AccordionGroup>
  <Accordion title="server-side/core.lua → Doors" icon="door-closed">
    ```lua theme={null}
    local Doors = {
        ["1"] = { Coords = vec3(1844.99,2604.81,44.63), Hash = 741314661, Disabled = false, Lock = true, Distance = 7.0, Permission = "Emergencia" },
        -- porta dupla (espelha o estado):
        ["40"] = { Coords = vec3(...), Hash = 1079515784, Disabled = false, Lock = true, Distance = 1.75, Permission = "Policia", Other = "41" },
        ["41"] = { Coords = vec3(...), Hash = 1079515784, Disabled = false, Lock = true, Distance = 1.75, Permission = "Policia", Other = "40" },
    }
    ```

    | Campo        | Descrição                                   |
    | ------------ | ------------------------------------------- |
    | `Coords`     | Posição da porta.                           |
    | `Hash`       | Hash do modelo do prop.                     |
    | `Disabled`   | `true` desativa a interação.                |
    | `Lock`       | Estado inicial (`true` = trancada).         |
    | `Distance`   | Raio do prompt (1.75 comuns, 7.0 portões).  |
    | `Permission` | Grupo exigido (`vRP.HasGroup`).             |
    | `Other`      | (opcional) chave da porta dupla a espelhar. |
  </Accordion>
</AccordionGroup>

### Adicionar uma porta

<Steps>
  <Step title="Crie a entrada">
    Adicione uma entrada em `Doors` com chave única (`Coords`, `Hash`, `Lock`, `Distance`, `Permission`).
  </Step>

  <Step title="Configure portas duplas (opcional)">
    Para porta dupla, crie duas entradas apontando uma para a outra via `Other`.
  </Step>

  <Step title="Reinicie o recurso">
    Reinicie o recurso para aplicar a configuração.
  </Step>
</Steps>

***

## Comandos

Nenhum. A interação é pela tecla `E` (controle 38), com cooldown de 5s.

***

## Exports

Não publica exports Lua. Interface Tunnel `doors`: `Core.Permission(Number)` (valida grupo, inverte `Lock`, espelha `Other`, sincroniza).

***

## Eventos

| Evento          | Lado     | Descrição                                                                               |
| --------------- | -------- | --------------------------------------------------------------------------------------- |
| `doors:Connect` | Cliente  | Recebe a tabela `Doors` e registra todas as portas no door system nativo.               |
| `doors:Sync`    | Cliente  | Atualiza o estado de uma porta (`Number`, `Status` e a porta dupla `Other`) para todos. |
| `Connect`       | Servidor | Ao conectar, envia a tabela `Doors` atual ao jogador via `doors:Connect`.               |

<Note>
  Interface Tunnel `doors`: `Core.Permission(Number)` valida o grupo, inverte o `Lock`, espelha `Other` e sincroniza via `doors:Sync` (detalhada em **Exports**).
</Note>

***

## Banco de Dados

**Não usa banco.** A tabela `Doors` fica em memória; alterações em jogo voltam ao `Lock` da config ao reiniciar.

***

## Customização

<CardGroup cols={2}>
  <Card title="Portas" icon="door-closed">
    Tabela `Doors` (`server-side/core.lua`).
  </Card>

  <Card title="Tecla" icon="keyboard">
    Controle `38` em `IsControlJustPressed(1,38)`.
  </Card>

  <Card title="Cooldown" icon="clock">
    `5000` ms.
  </Card>

  <Card title="Comportamento nativo" icon="gears">
    `DoorSystemSetOpenRatio`/`DoorSystemSetAutomaticRate`.
  </Card>
</CardGroup>

<Note>
  O prompt é renderizado por `web-side/` (ações NUI `Show`/`Hide`).
</Note>
