# Grupos online e chat de voz em jogos do PlayDrop

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.

Source: https://www.playdrop.ai/pt-br/create/learn/online-party

Um grupo do PlayDrop é um conjunto de amigos que passa de um jogo para outro junto. Quando um grupo inicia seu jogo, o PlayDrop reserva vagas para os membros em uma das salas do seu servidor, para que os amigos cheguem na mesma partida em vez de ficarem separados. O chat de voz roda no PlayDrop, não no seu jogo.

## Do que você precisa

- Um [servidor de jogo em tempo real](https://www.playdrop.ai/pt-br/create/learn/game-servers): os grupos jogam nas suas salas Colyseus.
- Jogadores logados: as salas recusam convidados.
- Estas declarações no [catalogue.json](https://www.playdrop.ai/pt-br/create/learn/catalogue-json):

```json
{
  "types": ["solo", "online", "party"],
  "party": { "online": [2, 3, 4] },
  "roomVoice": true,
  "server": { "entry": "server/index.mjs", "rooms": ["game"] }
}
```

`party.online` lista os tamanhos exatos de grupo, até 4, que podem chegar juntos; `[2, 4]` exclui 3. É o tamanho do grupo que chega, não a capacidade da sala: dois grupos de quatro podem dividir uma sala de oito vagas. `party` exige o tipo `party`, e `party.online` exige `online`. `roomVoice: true` ativa a voz da sala e exige `online`.

## Entre na sala certa

```js
if (!sdk.me.isLoggedIn) {
  await sdk.me.promptLogin();
}
const room = await sdk.multiplayer.join("game", { mode: "versus" });
```

`join` usa a vaga reservada do jogador no grupo quando o PlayDrop iniciou um grupo; caso contrário, entra de forma independente. Se a entrada do grupo falhar, a chamada é rejeitada; ela nunca coloca o jogador em outra sala sem avisar. Um convidado recebe `authentication_required` e o PlayDrop mostra o login; chame `join` de novo a partir de `sdk.me.onAuthChange`. Mantenha a mesma sala entre as rodadas.

Depois de recarregar a página, `sdk.multiplayer.reconnect(roomName, token)` restaura a vaga reservada com um token de reconexão que você guardou de forma privada para este jogo, esta versão e este usuário. Descarte o token e chame `join` em caso de `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` ou `party_reconnect_mismatch`.

## A janela do grupo

A partir de um botão, `sdk.social.openParty({ mode: "online" })` abre a janela de grupo do PlayDrop, onde os jogadores convidam amigos e ligam ou desligam a voz. Um grupo existente é reaproveitado. `openParty()` abre o menu do grupo e `openParty({ section: "voice" })` abre as configurações de voz; não combine `mode` e `section`. A promise é resolvida quando a janela fecha, inclusive quando o jogador cancela.

Leia o grupo com `sdk.social.getParty()` ou `sdk.social.onPartyChange(callback)`, que entrega primeiro o estado atual: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` é `joining` ou `ready` quando o grupo está jogando este jogo. Fazer parte do grupo, por si só, não significa que os jogadores estão na mesma sala; use `join`.

Os membros do grupo são gerenciados pelo PlayDrop: os jogos não podem adicionar nem remover membros do grupo nem controlar microfones, e os jogadores convidam amigos para o grupo por esta janela. Um jogo ainda pode enviar seu próprio card de convite ou de desafio a um amigo com `sdk.social.sendMessage`; veja [compartilhamento, amigos e convites](https://www.playdrop.ai/pt-br/create/learn/social).

## Voz da sala

Com `roomVoice: true`, todos em uma sala podem falar, sem nenhum código no servidor. Para mudar quem ouve quem, vincule a sala no seu servidor e defina uma política:

```js
import { playdrop } from "@playdrop/server";

const platform = playdrop.multiplayer.forRoom(this);
platform.voice.setPolicy("team");
platform.voice.setTeam(client.auth, "red");
```

As políticas são `all`, `team`, `proximity` (com `{ range }`) e `off`. `setAudience(player, audience)` substitui a regra para um jogador e `updatePositions([{ player, position: { x, y, z } }])` alimenta a proximidade; passe `null` para limpar uma equipe ou uma substituição. O PlayDrop garante quem pode ouvir quem. No navegador, `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` só ajusta o volume e a posição estéreo.

A voz depende do consentimento dos jogadores, do silenciamento e dos bloqueios, além da versão do host e da liberação gradual do recurso.

## Pausa

A cápsula do grupo não pausa o jogo. A pausa do PlayDrop para o seu cliente, mas a sala continua conectada e o seu servidor continua rodando. A pausa de um jogador não pode interromper a partida dos outros; implemente no servidor qualquer pausa da partida.

## Teste

Envie uma versão privada e depois abra o link de teste em duas janelas, com `player=1` e `player=2`, como descrito em [servidores de jogo em tempo real](https://www.playdrop.ai/pt-br/create/learn/game-servers). Grupos locais com controles são um modo separado: veja [grupos locais e controles](https://www.playdrop.ai/pt-br/create/learn/local-party).

## Guias relacionados

- [Servidores em tempo real](https://www.playdrop.ai/pt-br/create/learn/game-servers): 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.
- [Grupos locais e controles](https://www.playdrop.ai/pt-br/create/learn/local-party): Leia controles físicos e de celular do PlayDrop com sdk.device, acompanhe as posições dos jogadores locais e declare suporte a controles e tamanhos de grupo.
- [Compartilhamento, amigos e convites](https://www.playdrop.ai/pt-br/create/learn/social): Compartilhe um jogo com imagem ou clipe, leia os dados de abertura, escolha amigos, envie cards de convite e desafio no PlayDrop Chat e recomende outros jogos.
