# Entrega no jogo

Entenda como as compras chegam no personagem, com o jogador online ou offline, o que cada framework entrega e como reenviar uma entrega que falhou.

Source: https://fivedash.fivex.gg/docs/pt/store/in-game-delivery

Quando um jogador paga na loja, o recurso do FiveDash no servidor entrega a compra na cidade: o VIP, o carro na garagem, o dinheiro no banco, o item na mochila. Se o jogador estiver fora, a compra espera ele entrar. Esta página explica o caminho inteiro, o que cada framework faz e o que fazer quando algo não chega. É para quem cuida do servidor e da loja.

## Antes de começar

* **Plano:** a entrega automática vem com a Loja em todos os planos (Plus, Pro e Ultra).
* **Recurso:** o recurso `fivedash` instalado e conectado ao painel, com a chave em `config.lua`. Veja [Instalar o recurso](https://fivedash.fivex.gg/docs/pt/getting-started/install-resource).
* **Banco de dados:** o servidor precisa de um driver MySQL iniciado: `oxmysql`, `mysql-async` ou `ghmattimysql`. A loja guarda as entregas no banco da cidade.
* **Entrega ligada:** `Enabled = true` no `fivedash/loja.lua`.
* **Permissão:**

| Ação                                                             | Página                 | Nível          |
| ---------------------------------------------------------------- | ---------------------- | -------------- |
| Ver pedidos e o estado de cada entrega                           | **Loja → Pedidos**     | **Ver**        |
| Configuração inicial (escolher como o comprador diz quem recebe) | **Loja → Visão geral** | **Configurar** |
| Marcar como entregue e reenviar para a cidade                    | **Loja → Pedidos**     | **Gerenciar**  |
| Dar um produto de presente                                       | **Loja → Clientes**    | **Gerenciar**  |

## Como funciona

### O pedido é pago

Quando o pagamento é confirmado, o FiveDash transforma cada entrega do produto numa ação exata (grupo, veículo, dinheiro, item ou comando) e manda para o servidor da cidade. Mudar o produto depois não muda o que esse pedido entrega.

### O servidor guarda antes de responder

O recurso grava cada entrega na tabela `fivedash_store_deliveries` do banco da cidade antes de confirmar. Um restart, uma queda ou um jogador que só entra semana que vem não perde nada.

### Entrega na hora ou espera o jogador

O que funciona com o jogador fora (depende do framework, veja abaixo) é entregue na hora. O que precisa do personagem na cidade, como itens e dinheiro na carteira, espera ele entrar.

### O painel acompanha

O recurso conta ao painel o estado de cada entrega a cada sincronização. O pedido em **Loja → Pedidos** passa para **Entregue** quando tudo chega, ou **Falhou** quando algo dá errado.

### O jogador é avisado

Com `Notify = true`, o jogador vê na tela "Sua compra #N chegou" com o que recebeu.

> Uma entrega nunca é dada duas vezes. Cada uma tem um identificador fixo, e antes de entregar o servidor "reserva" a entrega no banco: se duas tentativas correrem ao mesmo tempo, só uma entrega.

## Quem recebe a compra

Na configuração da loja, no passo **Entrega no jogo**, você responde **Como o comprador diz quem recebe?**:

| Opção                | Como funciona                                                                                                                                   |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Pelo ID do framework | O jogador digita o ID dele na compra, e a cidade confere de quem é antes do pagamento. O nome do campo vem do framework (veja a tabela abaixo). |
| **Conta do Discord** | O jogador entra com o Discord, e a compra vai para o personagem da conta da cidade ligada a ele.                                                |

Como cada framework chama o ID:

| Framework                  | ID que o jogador usa          |
| -------------------------- | ----------------------------- |
| ESX                        | ID (o `id` da tabela `users`) |
| QBCore                     | Citizen ID                    |
| Qbox                       | Citizen ID                    |
| ox_core                    | State ID                      |
| vRP / vRPex                | ID (o `id` de `vrp_users`)    |
| Creative Network Enchanted | Passaporte                    |

Antes do pagamento, o checkout pergunta à cidade se o ID existe e mostra o nome do personagem. Um ID que não existe, ou uma conta do Discord sem personagem, é recusado. Se o servidor não responder a tempo (fora do ar, reiniciando), a venda não trava: a cidade confere quando o pedido chegar.

## Quando a loja para de vender

A loja só vende enquanto o servidor diz que a entrega está pronta. Se não estiver, o site para de vender e **Loja → Visão geral** mostra **Vendas pausadas: a entrega na cidade está desligada**.

| Situação                   | O que o painel diz                                                                                                   | Como resolver                                                                                                        |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| Recurso nunca conectou     | Instale o recurso do FiveDash no servidor: é ele que entrega as compras na cidade.                                   | [Instale o recurso](https://fivedash.fivex.gg/docs/pt/getting-started/install-resource) e use **Conectar servidor**. |
| Recurso antigo, sem a loja | O recurso do FiveDash no servidor é de antes da loja. Reinicie o servidor para ele se atualizar.                     | Reinicie o servidor ou digite `restart fivedash`.                                                                    |
| Entrega desligada          | A entrega está desligada no loja.lua do servidor (Enabled = false). A loja não vende enquanto isso.                  | Mude para `Enabled = true` e rode `restart fivedash`.                                                                |
| Sem driver MySQL           | O servidor não tem driver MySQL iniciado (oxmysql, mysql-async ou ghmattimysql): a loja guarda as entregas no banco. | Inicie um desses recursos antes do `fivedash`.                                                                       |

> Servidor fora do ar não pausa a loja. As compras ficam na fila e chegam quando ele voltar.

## Jogador online e offline

| Tipo de entrega          | ESX           | QBCore        | Qbox          | ox_core       | vRP / vRPex   | Creative      |
| ------------------------ | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| **VIP ou cargo**         | Na hora       | Na hora       | Na hora       | Na hora       | Espera entrar | Na hora       |
| **Veículo**              | Na hora       | Na hora       | Na hora       | Na hora       | Na hora       | Na hora       |
| **Dinheiro** no banco    | Na hora       | Na hora       | Na hora       | Na hora       | Na hora       | Na hora       |
| **Dinheiro** na carteira | Espera entrar | Espera entrar | Na hora       | Espera entrar | Espera entrar | Espera entrar |
| **Item**                 | Espera entrar | Espera entrar | Espera entrar | Espera entrar | Espera entrar | Espera entrar |
| **Comando**              | Na hora       | Na hora       | Na hora       | Na hora       | Na hora       | Na hora       |

"Na hora" vale com o jogador online ou offline. "Espera entrar" fica na fila com o motivo "Aguardando o jogador entrar na cidade".

### Tentativas e fila

| Situação                                    | O que o servidor faz                                                                                                                                                       |
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Jogador escolhe o personagem                | Espera `SpawnDelay` segundos (padrão 10) e entrega o que estava esperando.                                                                                                 |
| Mochila cheia                               | A entrega fica na fila com o motivo "Mochila cheia: chega quando o jogador liberar espaço" e é tentada de novo a cada minuto enquanto ele estiver na cidade.               |
| Jogador já está na cidade                   | A cada minuto o servidor tenta de novo as entregas de quem está online.                                                                                                    |
| Várias entregas para o mesmo personagem     | Rodam uma depois da outra, na ordem do produto. Até 4 personagens recebem ao mesmo tempo.                                                                                  |
| Servidor parou no meio de uma entrega       | No próximo boot a entrega vira **Falhou** com o motivo "O servidor parou no meio desta entrega: confira no jogo se chegou antes de reenviar". Ela nunca é refeita sozinha. |
| Pedido pago que não chegou ao servidor      | O painel manda de novo a cada sincronização, por até 7 dias depois do pagamento.                                                                                           |
| Pedido reembolsado ou marcado como entregue | O que ainda estava esperando na cidade é descartado. O que já foi entregue fica.                                                                                           |

### Quantidade

Se o jogador compra mais de uma unidade, os dias de VIP e os valores de dinheiro e item somam (VIP até 3.650 dias), e um comando roda uma vez por unidade (até 100 vezes por entrega).

## VIPs com prazo

Um **VIP ou cargo** com **Duração** em dias é tirado sozinho quando vence. O servidor guarda os prazos na tabela `fivedash_store_groups`.

| Situação                       | O que acontece                                                                                                                                                     |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Compra de novo antes de vencer | Os dias somam por cima do que falta.                                                                                                                               |
| Compra **Permanente**          | Fica para sempre, mesmo que antes tivesse prazo.                                                                                                                   |
| Grupo dado à mão pela equipe   | O FiveDash nunca põe prazo nem tira.                                                                                                                               |
| Venceu                         | O servidor confere a cada minuto, tira o grupo e, se o jogador estiver na cidade, avisa: "Seu `vip_ouro` acabou. Renove na loja da cidade." (com o nome do grupo). |

### Grupos ACE

No ESX, QBCore e Qbox, um nome de grupo que não é emprego nem gangue do framework vira um grupo ACE na licença Rockstar do jogador: `group.<nome>` no ESX e no Qbox, `qbcore.<nome>` no QBCore. O FiveDash guarda esses grupos na tabela `fivedash_ace_groups` e adiciona de novo a cada boot. Dê as permissões ao grupo no `server.cfg`:

```bash
add_ace group.vip vip allow
```

Os scripts conferem com `IsPlayerAceAllowed`.

## Comandos

A entrega **Comando** roda uma linha no console do servidor. Antes de rodar, o servidor troca as variáveis:

| Variável       | Vira                                        |
| -------------- | ------------------------------------------- |
| `{id}`         | O ID do personagem na cidade                |
| `{discord}`    | O ID do Discord do comprador                |
| `{pedido}`     | O número do pedido                          |
| `{quantidade}` | Só em moedas: o total comprado mais o bônus |

Regras de segurança do servidor:

* Uma linha é um comando: `;` e quebras de linha são recusados.
* Estes comandos nunca rodam pela loja: `quit`, `stop`, `start`, `restart`, `ensure`, `refresh`, `exec`, `set`, `sets`, `setr`, `seta`, `rcon_password`, `sv_licensekey`, `sv_hostname`, `sv_maxclients`, `endpoint_add_tcp`, `endpoint_add_udp`, `load_server_icon`, `fivedash`.
* Com `AllowedCommands` preenchido no `loja.lua`, só rodam os comandos que começam com um dos itens da lista.
* Um comando com `{id}` falha se o pedido não tiver o ID do jogador.

> Sem um framework reconhecido, o servidor só entrega **Comando**. Nesse caso `{id}` é o ID que o comprador digitou.

## O que cada framework faz

O recurso detecta o framework sozinho (`Framework = "auto"` no `config.lua`). Veja também [Frameworks](https://fivedash.fivex.gg/docs/pt/developers/frameworks).

### ESX

ID: o `id` da tabela `users`.

| Tipo             | Como entrega                                                                                                                                                                                                                |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **VIP ou cargo** | Se existir em `job_grades` (`police` ou `police.2` para o cargo 2), vira o emprego: `setJob` online ou direto em `users` offline. Outro nome vira o grupo ACE `group.<nome>`. Ao vencer, o emprego volta para `unemployed`. |
| **Veículo**      | Uma linha em `owned_vehicles`, guardado, com placa livre. Se a tabela `vehicles` tiver a coluna `model`, o modelo precisa estar nela.                                                                                       |
| **Dinheiro**     | Banco online (`addAccountMoney`) ou offline (`users.accounts`). Carteira só online.                                                                                                                                         |
| **Item**         | Só online. Usa o `ox_inventory` quando ele roda; senão, o inventário do ESX (`canCarryItem` e `addInventoryItem`).                                                                                                          |

Aviso na tela: `esx:showNotification`.

### QBCore

ID: Citizen ID (`citizenid` da tabela `players`).

| Tipo             | Como entrega                                                                                                                                                                                                                                                                                               |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **VIP ou cargo** | Um emprego de `QBCore.Shared.Jobs` (`police` ou `police.2`) ou uma gangue de `Shared.Gangs` vira o emprego ou a gangue do personagem (`SetJob` / `SetGang`), online ou offline. Outro nome vira o grupo ACE `qbcore.<nome>`. Versões antigas do qb-core sem o personagem offline esperam o jogador entrar. |
| **Veículo**      | Uma linha em `player_vehicles` na garagem `pillboxgarage`. O modelo precisa estar em `qb-core/shared/vehicles.lua`.                                                                                                                                                                                        |
| **Dinheiro**     | Banco online ou offline. Carteira (`cash`) só online.                                                                                                                                                                                                                                                      |
| **Item**         | Só online. Usa o `ox_inventory` quando ele roda; senão, o `qb-inventory`.                                                                                                                                                                                                                                  |

Aviso na tela: `QBCore:Notify`.

### Qbox

ID: Citizen ID.

| Tipo             | Como entrega                                                                                                                                                    |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **VIP ou cargo** | Emprego ou gangue por `AddPlayerToJob` / `AddPlayerToGang`, online ou offline (o personagem pode ter vários). Outro nome vira o grupo ACE `group.<nome>`.       |
| **Veículo**      | `CreatePlayerVehicle` do `qbx_vehicles` (sem ele, uma linha em `player_vehicles` na `pillboxgarage`). O modelo precisa estar em `qbx_core/shared/vehicles.lua`. |
| **Dinheiro**     | `AddMoney` no banco ou na carteira, online ou offline.                                                                                                          |
| **Item**         | Só online, pelo `ox_inventory`.                                                                                                                                 |

Aviso na tela: `ox_lib:notify`.

### ox_core

ID: State ID.

| Tipo             | Como entrega                                                                                                                                           |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **VIP ou cargo** | Um grupo do ox_core (`police` ou `police.2`; os cargos começam em 1) que exista em `ox_group_grades`: `setGroup` online ou `character_groups` offline. |
| **Veículo**      | `CreateVehicle` em nome do personagem, guardado na garagem da convar `ox:defaultVehicleStore` (padrão `impound`).                                      |
| **Dinheiro**     | Banco: `addBalance` na conta padrão do personagem, online ou offline. Carteira: o item `money` do `ox_inventory`, só online.                           |
| **Item**         | Só online, pelo `ox_inventory`.                                                                                                                        |

Aviso na tela: `ox_lib:notify`.

### vRP / vRPex

ID: o `id` de `vrp_users`. Vale para vRPex e forks como ZIRIX (não para Creative).

| Tipo             | Como entrega                                                                                                     |
| ---------------- | ---------------------------------------------------------------------------------------------------------------- |
| **VIP ou cargo** | Só online, por `addUserGroup`. O grupo precisa existir em `vrp/cfg/groups.lua`.                                  |
| **Veículo**      | Uma linha em `vrp_user_vehicles`, online ou offline. Falha se o ID já tiver esse veículo.                        |
| **Dinheiro**     | Banco: `giveBankMoney` online, ou `vrp_user_moneys.bank` offline. Carteira: `giveMoney`, só online.              |
| **Item**         | Só online, por `giveInventoryItem`, conferindo o peso da mochila. O item precisa existir em `vrp/cfg/items.lua`. |

Aviso na tela: evento `Notify`.

### Creative Network Enchanted

ID: Passaporte (o `id` da tabela `characters`; uma conta tem vários).

| Tipo             | Como entrega                                                                                                                                                                 |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **VIP ou cargo** | `SetPermission`, online ou offline. O grupo precisa existir em `vrp/config/Groups.lua`.                                                                                      |
| **Veículo**      | Entra na tabela `vehicles` pela query da própria base, online ou offline. O modelo precisa existir em `vrp/config/Vehicle.lua`. Falha se o passaporte já tiver esse veículo. |
| **Dinheiro**     | Banco: `GiveBank`, online ou offline. Carteira: o item `dollar`, só online.                                                                                                  |
| **Item**         | Só online. O item precisa existir em `vrp/config/Item.lua`. Se o peso não couber, espera; sem espaço livre, a base deixa o item no chão perto do jogador.                    |

Aviso na tela: evento `Notify`.

## Configurar o servidor

### loja.lua

O arquivo `fivedash/loja.lua` é criado no primeiro boot e só o servidor lê. Depois de mudar algo, rode `restart fivedash`. As atualizações nunca apagam nem mudam o que está nele.

| Campo             | O que faz                                                                                                              | Padrão   |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------- | -------- |
| `Enabled`         | Liga a entrega nesta cidade. Desligada, o site da loja para de vender até você ligar de novo.                          | `true`   |
| `Notify`          | Avisa o jogador na tela quando a compra chega e quando um VIP vence.                                                   | `true`   |
| `NotifyTitle`     | Título do aviso, até 40 caracteres. Com `"Loja"`, o título segue o idioma da cidade.                                   | `"Loja"` |
| `Announce`        | Anuncia para a cidade inteira quem comprou o quê. Presentes da equipe não são anunciados.                              | `false`  |
| `SpawnDelay`      | Segundos entre o jogador escolher o personagem e a entrega (dá tempo do inventário carregar). De 0 a 120.              | `10`     |
| `AllowedCommands` | Comandos que a loja pode rodar. Vazio libera qualquer um, menos os bloqueados. Para travar, liste o começo de cada um. | `{}`     |

```lua
Loja = {
	Enabled = true,
	Notify = true,
	NotifyTitle = "Loja",
	Announce = false,
	SpawnDelay = 10,
	AllowedCommands = { "darmoedas", "addcar" },
}
```

### config.lua

| Campo        | O que faz                                                                                                             | Padrão   |
| ------------ | --------------------------------------------------------------------------------------------------------------------- | -------- |
| `Key`        | A chave do painel, de **Servidor → Conexão com o jogo → Conectar servidor**. Não compartilhe este arquivo.            | `""`     |
| `Framework`  | `"auto"` detecta sozinho. Para forçar: `"creative-enchanted"`, `"qbox"`, `"qbcore"`, `"esx"`, `"ox-core"` ou `"vrp"`. | `"auto"` |
| `AutoUpdate` | Instala sozinho as versões novas do recurso. A versão nova entra no próximo restart.                                  | `true`   |
| `Debug`      | Mostra cada sincronização e comando no console.                                                                       | `false`  |

### Comandos de console

| Comando                                               | O que faz                                                                                                                                      |
| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `fivedash`                                            | Estado do recurso: framework, conexão, versão e entregas esperando.                                                                            |
| `fivedash loja` (ou `fivedash store`)                 | Estado da loja: ligada ou desligada, o que entrega e por qual ID, quantas entregas esperam e quantas foram entregues ou falharam desde o boot. |
| `fivedash loja entregar` (ou `fivedash loja deliver`) | Roda agora o que está esperando jogadores que já estão na cidade.                                                                              |
| `fivedash detect`                                     | Detecta o framework de novo.                                                                                                                   |
| `restart fivedash`                                    | Recarrega o `loja.lua` e o `config.lua`, e aplica uma atualização já baixada.                                                                  |

## Quando uma entrega falha

Em **Loja → Pedidos**, o pedido mostra **A entrega falhou** e o motivo de cada entrega.

### Leia o motivo

Abra o pedido. Cada entrega mostra **entregue**, **na fila** ou **falhou**, com o motivo que a cidade mandou.

### Corrija e reenvie

Se o ID estava errado, corrija em **ID na cidade** e clique em **Reenviar para a cidade**. Só as entregas que falharam voltam para a fila; o que já chegou não é entregue de novo.

### Ou feche à mão

Se a equipe entregou no jogo, clique em **Marcar como entregue**. O que ainda esperava na cidade é descartado.

Motivos comuns:

| Motivo                                                                      | O que fazer                                                               |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| O ID não existe na cidade                                                   | Corrija o ID e reenvie.                                                   |
| A conta do Discord do comprador não tem personagem na cidade                | Peça o ID e reenvie com ele.                                              |
| O grupo, veículo ou item não existe na cidade (com o arquivo onde procurar) | Cadastre no framework ou corrija o nome no produto, depois reenvie.       |
| O comando não está em AllowedCommands no loja.lua                           | Adicione o começo do comando em `AllowedCommands` e reenvie.              |
| O servidor parou no meio desta entrega                                      | Confira no jogo se chegou. Se não, reenvie; se sim, marque como entregue. |
| A framework da cidade ainda não entrega isso pelo FiveDash                  | Use uma entrega por **Comando**.                                          |

## Perguntas frequentes

**O jogador comprou offline. Quando chega?**
O que funciona offline chega na hora. Itens e dinheiro na carteira chegam `SpawnDelay` segundos depois de ele escolher o personagem.

**Posso reiniciar o servidor com entregas na fila?**
Pode. Elas estão no banco da cidade e continuam depois do boot.

**Um jogador pode receber duas vezes se eu clicar em reenviar duas vezes?**
Não. Só o que falhou volta para a fila, e cada entrega só é dada uma vez.

**Por que o VIP do jogador não venceu?**
Se a equipe tinha dado o grupo à mão antes da compra, o FiveDash não põe prazo nele.

## Próximos passos

[Produtos](https://fivedash.fivex.gg/docs/pt/store/products)Configure as entregas de cada produto.
[Pedidos](https://fivedash.fivex.gg/docs/pt/store/orders)Acompanhe e reenvie entregas.
[Instalar o recurso](https://fivedash.fivex.gg/docs/pt/getting-started/install-resource)Conecte o servidor ao FiveDash.
[Frameworks](https://fivedash.fivex.gg/docs/pt/developers/frameworks)Detalhes técnicos de cada framework.
