# Onlinegroepen en spraakchat in PlayDrop-games

Laat vrienden je game samen online spelen: geef groepsgroottes op, open het groepsvenster van PlayDrop, neem gereserveerde plaatsen in kamers in en regel kamerspraak.

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

Een PlayDrop-groep is een groep vrienden die samen van game naar game gaat. Als een groep je game start, reserveert PlayDrop plaatsen voor de leden in een van de kamers van je server, zodat vrienden in dezelfde wedstrijd terechtkomen in plaats van te worden opgesplitst. Spraakchat draait in PlayDrop, niet in je game.

## Wat je nodig hebt

- Een [realtime gameserver](https://www.playdrop.ai/nl/create/learn/game-servers): groepen spelen in de kamers (Colyseus-rooms) van je server.
- Ingelogde spelers: kamers weigeren gasten.
- Deze declaraties in [catalogue.json](https://www.playdrop.ai/nl/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` somt de exacte groepsgroottes op, tot 4, die samen mogen binnenkomen; `[2, 4]` sluit 3 uit. Het is de grootte van de binnenkomende groep, niet de capaciteit van de kamer: twee groepen van vier kunnen een kamer met acht plaatsen delen. `party` vereist het type `party` en `party.online` vereist `online`. `roomVoice: true` zet kamerspraak aan en vereist `online`.

## Naar de juiste kamer

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

`join` gebruikt de gereserveerde groepsplaats van de speler als PlayDrop een groep heeft gestart, en doet anders zelfstandig mee. Mislukt het meedoen van een groep, dan weigert het; het zet de speler nooit ongemerkt in een andere kamer. Een gast krijgt `authentication_required` en PlayDrop toont het inloggen; roep `join` opnieuw aan vanuit `sdk.me.onAuthChange`. Houd dezelfde kamer aan over rondes heen.

Na het herladen herstelt `sdk.multiplayer.reconnect(roomName, token)` de gereserveerde plaats met een token voor opnieuw verbinden dat je privé hebt bewaard voor deze game, versie en gebruiker. Gooi het token weg en roep `join` aan bij `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` of `party_reconnect_mismatch`.

## Het groepsvenster

Vanuit een knop opent `sdk.social.openParty({ mode: "online" })` het groepsvenster van PlayDrop, waar spelers vrienden uitnodigen en spraak aan- of uitzetten. Een bestaande groep wordt hergebruikt. `openParty()` opent het groepsmenu en `openParty({ section: "voice" })` opent de spraakinstellingen; combineer `mode` en `section` niet. De promise wordt afgerond wanneer het venster sluit, ook bij annuleren.

Lees de groep met `sdk.social.getParty()` of `sdk.social.onPartyChange(callback)`, dat eerst de huidige toestand levert: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` is `joining` of `ready` wanneer de groep deze game speelt. Lidmaatschap alleen betekent niet dat de spelers een kamer delen; gebruik `join`.

Groepslidmaatschap is van PlayDrop: games kunnen geen groepsleden toevoegen of verwijderen en geen microfoons besturen, en spelers nodigen vrienden voor de groep uit vanuit dit venster. Een game kan nog wel een eigen uitnodiging of uitdagingskaart naar een vriend sturen met `sdk.social.sendMessage`; zie [delen, vrienden en uitnodigingen](https://www.playdrop.ai/nl/create/learn/social).

## Kamerspraak

Met `roomVoice: true` kan iedereen in een kamer praten, zonder servercode. Om te wijzigen wie wie hoort, koppel je de kamer op je server en stel je een beleid in:

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

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

De beleidsopties zijn `all`, `team`, `proximity` (met `{ range }`) en `off`. `setAudience(player, audience)` overschrijft de instelling voor één speler en `updatePositions([{ player, position: { x, y, z } }])` levert de posities voor afstand; geef `null` mee om een team of een overschrijving te wissen. PlayDrop handhaaft wie wie mag horen. In de browser past `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` alleen het volume en de panning aan.

Spraak is onderhevig aan toestemming van spelers, dempen en blokkades, en hangt af van de build van de host en de uitrol.

## Pauzeren

De groepscapsule pauzeert de gameplay niet. De pauze van PlayDrop stopt je client, maar de kamer blijft verbonden en je server blijft draaien. De pauze van één speler mag de wedstrijd voor anderen niet stoppen; implementeer een eventuele wedstrijdpauze op de server.

## Testen

Upload een privéversie en open daarna de testlink in twee vensters met `player=1` en `player=2`, zoals beschreven in [realtime gameservers](https://www.playdrop.ai/nl/create/learn/game-servers). Lokale groepen met controllers zijn een aparte modus: zie [lokale groepen en controllers](https://www.playdrop.ai/nl/create/learn/local-party).

## Gerelateerde gidsen

- [Realtime gameservers](https://www.playdrop.ai/nl/create/learn/game-servers): Draai een gehoste Colyseus 0.17-server met een MongoDB-database voor je game, verbind vanuit de browser met de SDK, test met twee spelers en ken de limieten.
- [Lokale groepen en controllers](https://www.playdrop.ai/nl/create/learn/local-party): Lees fysieke gamepads en PlayDrop-telefooncontrollers via sdk.device, volg lokale spelersplaatsen en geef controllerondersteuning en lokale groepsgroottes op.
- [Delen, vrienden en uitnodigingen](https://www.playdrop.ai/nl/create/learn/social): Deel een game met een afbeelding of clip, lees startpayloads, kies vrienden, stuur uitnodigings- en uitdagingskaarten in PlayDrop Chat en raad andere games aan.
