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

# slotmachine

> Caça-níquel (slot machine) de cassino com prop físico animado de rolos e pagamento direto no banco do jogador.

O **slotmachine** é um caça-níquel de cassino com prop físico animado. O jogador senta numa máquina, aposta um valor fixo e gira três rolos (props `vw_prop_casino_slot_*`). O resultado é sorteado **no servidor** e o pagamento creditado conforme a combinação.

## Funcionalidades

<CardGroup cols={2}>
  <Card title="Rolos Animados" icon="dice">
    Três rolos físicos (`vw_prop_casino_slot_*`) animados no cliente conforme o resultado sorteado.
  </Card>

  <Card title="Sorteio Server-side" icon="server">
    O resultado é gerado no servidor (`random(16)`), garantindo integridade; o cliente apenas anima.
  </Card>

  <Card title="Pagamento no Banco" icon="building-columns">
    O prêmio é creditado diretamente na conta bancária do jogador via `vRP.GiveBank`.
  </Card>

  <Card title="Reserva de Máquina" icon="lock">
    A máquina é reservada ao iniciar, impedindo uso simultâneo por outros jogadores.
  </Card>
</CardGroup>

### Fluxo de uso

<Steps>
  <Step title="Interação">
    Interagir com a mesa dispara `slotmachine:Init` (cliente).
  </Step>

  <Step title="Identificação e reserva">
    O cliente identifica a máquina pela proximidade (`Coords` ≤ 0.25) e chama `vSERVER.Check` (reserva, impede uso simultâneo).
  </Step>

  <Step title="Aposta">
    **E** → `vSERVER.Payment` cobra a aposta (`vRP.PaymentFull`); sem saldo, retorna `false`.
  </Step>

  <Step title="Sorteio">
    `vSERVER.StartSlots` sorteia `A/B/C = random(16)`, guarda em `Winner` e devolve via `vCLIENT.MachineSlots`.
  </Step>

  <Step title="Resultado">
    O cliente anima os 3 rolos e chama `vSERVER.Winner`, que credita o prêmio (`vRP.GiveBank`).
  </Step>
</Steps>

***

## Dependências

<CardGroup cols={2}>
  <Card title="vrp" icon="cubes">`PaymentFull`, `GiveBank`, `playAnim`, `Destroy`.</Card>
  <Card title="inventory" icon="boxes-stacked">`inventory:Buttons`/`CloseButtons`.</Card>
</CardGroup>

<Info>
  Opcional: **five\_logs**. Também usa a função `Dotted` + evento `Notify`.
</Info>

***

## Configuração

Este recurso não possui pasta `config/`. A tabela `Machines` está hardcoded **em ambos** `server-side/core.lua` e `client-side/core.lua` — mantenha as duas iguais.

<AccordionGroup>
  <Accordion title="Machines — nos dois arquivos (server e client)" icon="dice">
    ```lua theme={null}
    local Machines = {
        { Value = 250, Coords = vec3(984.25, 64.95, 122.12), Prop = "vw_prop_casino_slot_04a_reels" }
    }
    ```
  </Accordion>

  <Accordion title="Images e Multiplier — apenas em server-side/core.lua" icon="gears">
    * `Images`: 16 entradas que mapeiam o índice sorteado (1–16) ao símbolo.
    * `Multiplier`: multiplicador por símbolo (3 iguais): `1=2, 2=4, 3=6, 4=8, 5=10, 6=12, 7=14`.

    **Pagamento (`Core.Winner`):** 3 iguais = `Value * Multiplier[símbolo]`; apenas 2 iguais = `Value * 2`; nenhum par = nada.
  </Accordion>
</AccordionGroup>

***

## Eventos

A interface `slotmachine` é exposta com `Tunnel.bindInterface` em ambos os realms (servidor e cliente).

### Recebidos no servidor

| Evento       | Descrição                                    |
| ------------ | -------------------------------------------- |
| `Connect`    | Envia a tabela `Machines` ao jogador (core). |
| `Disconnect` | Libera a máquina reservada ao sair (core).   |

### Cliente

| Evento                 | Descrição                                            |
| ---------------------- | ---------------------------------------------------- |
| `slotmachine:Init`     | Recebe a tabela de máquinas ao interagir com a mesa. |
| `slotmachine:Machines` | Sincroniza o estado das máquinas (reservas).         |

***

## Customização

* **Aposta/prêmio:** `Value` por máquina + `Multiplier`.
* **Probabilidade:** tabela `Images` (símbolos repetidos = mais chance).
* **Novas máquinas:** entradas idênticas em `Machines` nos dois arquivos.

<Note>Sem comandos e sem persistência (economia via `vRP.PaymentFull`/`GiveBank`). O sorteio é server-side; o cliente só anima.</Note>
