# Grupos en línea y chat de voz en juegos de PlayDrop

Deja que tus amigos jueguen en línea: declara tamaños de grupo, abre la ventana de grupo, entra en salas reservadas con sdk.multiplayer.join y gestiona la voz.

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

Un grupo de PlayDrop es un conjunto de amigos que pasan juntos de un juego a otro. Cuando un grupo inicia tu juego, PlayDrop reserva plazas para sus miembros en una de las salas de tu servidor, para que los amigos lleguen a la misma partida en lugar de quedar separados. El chat de voz funciona en PlayDrop, no en tu juego.

## Qué necesitas

- Un [servidor de juego en tiempo real](https://www.playdrop.ai/es/create/learn/game-servers): los grupos juegan en tus salas de Colyseus.
- Jugadores con la sesión iniciada: las salas rechazan a los invitados.
- Estas declaraciones en [catalogue.json](https://www.playdrop.ai/es/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` enumera los tamaños exactos de grupo, hasta 4, que pueden llegar juntos; `[2, 4]` excluye el 3. Es el tamaño del grupo que llega, no la capacidad de la sala: dos grupos de cuatro pueden compartir una sala de ocho plazas. `party` requiere el tipo `party` y `party.online` requiere `online`. `roomVoice: true` activa la voz de sala y requiere `online`.

## Entra en la sala correcta

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

`join` ocupa la plaza reservada del jugador cuando PlayDrop ha lanzado un grupo y, si no, entra por su cuenta. Si falla la entrada de un grupo, se rechaza; nunca coloca al jugador en otra sala sin avisar. Un invitado recibe `authentication_required` y PlayDrop muestra el inicio de sesión; vuelve a entrar desde `sdk.me.onAuthChange`. Conserva la misma sala entre rondas.

Tras una recarga, `sdk.multiplayer.reconnect(roomName, token)` recupera la plaza reservada con un token de reconexión que hayas guardado de forma privada para este juego, versión y usuario. Descarta el token y llama a `join` ante `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` o `party_reconnect_mismatch`.

## La ventana de grupo

Desde un botón, `sdk.social.openParty({ mode: "online" })` abre la ventana de grupo de PlayDrop, donde los jugadores invitan a sus amigos y activan o desactivan la voz. Si ya existe un grupo, se reutiliza. `openParty()` abre el menú del grupo y `openParty({ section: "voice" })` abre los ajustes de voz; no combines `mode` y `section`. La promesa se resuelve cuando se cierra la ventana, también si se cancela.

Lee el grupo con `sdk.social.getParty()` o `sdk.social.onPartyChange(callback)`, que entrega primero el estado actual: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` es `joining` o `ready` cuando el grupo está jugando a este juego. Pertenecer al grupo no significa por sí solo que los jugadores compartan sala; usa `join`.

Los miembros del grupo los gestiona PlayDrop: los juegos no pueden añadir ni quitar miembros ni controlar micrófonos, y los jugadores invitan a sus amigos al grupo desde esta ventana. Aun así, un juego puede enviar su propia tarjeta de invitación o de desafío a un amigo con `sdk.social.sendMessage`; consulta [compartir, amigos e invitaciones](https://www.playdrop.ai/es/create/learn/social).

## Voz de sala

Con `roomVoice: true`, todos los que están en una sala pueden hablar, sin código de servidor. Para cambiar quién oye a quién, vincula la sala en tu servidor y define una política:

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

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

Las políticas son `all`, `team`, `proximity` (con `{ range }`) y `off`. `setAudience(player, audience)` crea una excepción para un jugador y `updatePositions([{ player, position: { x, y, z } }])` alimenta la proximidad; pasa `null` para borrar un equipo o una excepción. Es PlayDrop quien impone quién puede oír a quién. En el navegador, `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` solo ajusta el volumen y la panorámica.

La voz está sujeta al consentimiento, el silencio y los bloqueos de los jugadores, y depende de la versión del host y del despliegue.

## Pausa

La cápsula del grupo no pausa el juego. La pausa de PlayDrop detiene tu cliente, pero la sala sigue conectada y tu servidor sigue funcionando. La pausa de un jugador no debe detener la partida de los demás; implementa cualquier pausa de partida en el servidor.

## Prueba

Sube una versión privada y abre el enlace de prueba en dos ventanas con `player=1` y `player=2`, como se explica en [servidores de juego en tiempo real](https://www.playdrop.ai/es/create/learn/game-servers). Los grupos locales con mandos son un modo aparte: consulta [grupos locales y mandos](https://www.playdrop.ai/es/create/learn/local-party).

## Guías relacionadas

- [Servidores en tiempo real](https://www.playdrop.ai/es/create/learn/game-servers): Ejecuta un servidor Colyseus 0.17 alojado con base de datos MongoDB, conéctate desde el navegador con el SDK, prueba con dos jugadores y conoce los límites.
- [Grupos locales y mandos](https://www.playdrop.ai/es/create/learn/local-party): Lee mandos físicos y mandos de teléfono de PlayDrop con sdk.device, sigue las posiciones de los jugadores locales y declara mandos y tamaños de grupo local.
- [Compartir, amigos e invitaciones](https://www.playdrop.ai/es/create/learn/social): Comparte un juego con una imagen o un clip, lee los datos de lanzamiento, elige amigos, envía invitaciones y desafíos en PlayDrop Chat y recomienda otros juegos.
