# Servidores de jogo em tempo real no PlayDrop: Colyseus e MongoDB

Rode um servidor Colyseus 0.17 hospedado com um banco MongoDB para o seu jogo, conecte o navegador com o SDK, teste com dois jogadores e conheça os limites.

Source: https://www.playdrop.ai/pt-br/create/learn/game-servers

O PlayDrop pode hospedar o lado servidor do seu jogo: um servidor Colyseus padrão com seu próprio banco de dados MongoDB, jogadores verificados e nenhuma infraestrutura para manter. Use-o para partidas em tempo real, jogos por turnos, mundos compartilhados e tudo em que um jogador não deve conseguir trapacear. Um servidor é opcional; seu jogo também pode chamar um servidor que você mesmo hospeda.

## Escreva o servidor

Exporte um mapa `rooms` de um único módulo ES. O PlayDrop inicia o servidor; não chame `listen()` nem defina `onAuth`, porque o PlayDrop verifica cada jogador antes de `onJoin`.

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  maxClients = 8;
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
    this.onMessage("move", (client, move) => this.applyMove(client.auth.userId, move));
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player: userId, username, appRole, isTestPlayer…
  }
  async onDispose() { await this.mongo?.close(); }
}

export const rooms = { game: defineRoom(GameRoom) };
```

Conecte-se ao MongoDB dentro do ciclo de vida da sala, nunca no escopo do módulo: `PLAYDROP_MONGO_URL` só existe durante a execução. Crie índices para as suas consultas.

## Declare o servidor

Empacote o servidor em um único arquivo e aponte o catálogo para ele:

```json
{ "server": { "entry": "server/index.mjs", "rooms": ["game"] } }
```

Envie-o em um [pacote](https://www.playdrop.ai/pt-br/create/learn/packaging); o caminho de HTML simples não comporta um servidor.

## Regras do ambiente hospedado

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), driver do MongoDB 7.5, no Node.js 24.22.1.
- Um único módulo ES autocontido de no máximo 2 MiB. Ele só pode importar `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` e `@playdrop/server`; empacote todo o resto.
- Até 2 tipos de sala, 8 jogadores por sala, 4 horas por sala, 30 mensagens por segundo por jogador e 512 KiB por mensagem.
- Sem acesso à internet: só o MongoDB e os serviços do PlayDrop são acessíveis.
- Os jogadores precisam estar logados.
- Um banco de dados por jogo, mantido entre as versões e contabilizado no armazenamento do criador. Nunca envie o endereço nem as credenciais dele a um navegador.

## Conecte o navegador

```js
const sdk = await playdrop.init();
const room = await sdk.multiplayer.join("game");
room.onStateChange((state) => render(state));
room.send("move", { x: 1 });
```

`join` cuida das vagas de grupo e do login do PlayDrop; veja [grupos online](https://www.playdrop.ai/pt-br/create/learn/online-party). Para um controle de nível mais baixo, `sdk.multiplayer.getConnection()` retorna `{ endpoint, token, expiresAt }` para o cliente oficial do Colyseus, obtido com `sdk.libs.colyseus.load()`.

## SDK de servidor

`@playdrop/server` adiciona chamadas confiáveis à plataforma: amigos e cards de jogo (`playdrop.social`), verificação de compras (`playdrop.shop`), geração com IA paga pelo criador (`playdrop.ai`) e voz da sala (`playdrop.multiplayer.forRoom`). Elas só funcionam em jogos enviados. Veja a [referência do SDK de servidor](https://www.playdrop.ai/pt-br/create/learn/server-sdk).

## Teste

Durante o desenvolvimento, rode o Colyseus 0.17 e o MongoDB localmente e conecte seu cliente local ao seu servidor local. Para testar o servidor hospedado, envie uma versão privada e abra `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` e depois o mesmo link com `player=2` em uma segunda janela. Cada janela joga como um jogador de teste diferente seu. Quando tudo funcionar, publique a versão testada com `publish_game_version`.

Pense nas desconexões: a reconexão do Colyseus guarda a vaga por pouco tempo, e o estado da sala deve permitir que um jogador que volta continue de onde parou.

## Guias relacionados

- [Grupos online e voz](https://www.playdrop.ai/pt-br/create/learn/online-party): Amigos jogam juntos online: declare tamanhos de grupo, abra a janela de grupo do PlayDrop, entre em salas reservadas com sdk.multiplayer.join e controle a voz.
- [SDK de servidor](https://www.playdrop.ai/pt-br/create/learn/server-sdk): Servidores de jogo hospedados no PlayDrop: regras de execução, o PlayDropPlayer verificado e playdrop.social, playdrop.shop, playdrop.ai e playdrop.multiplayer.
- [Empacotamento e .play](https://www.playdrop.ai/pt-br/create/learn/packaging): Organize uma pasta, ZIP ou .play compilado com o catalogue.json na raiz, declare a mídia da listagem e os servidores e envie com prepare_catalogue_upload.
