# Online-Partys und Sprachchat in PlayDrop-Spielen

Freunde online zusammen spielen lassen: Partygrößen deklarieren, Party-Fenster öffnen, mit sdk.multiplayer.join reservierte Räume betreten, Sprachchat steuern.

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

Eine PlayDrop-Party ist eine Gruppe von Freunden, die gemeinsam von Spiel zu Spiel zieht. Wenn eine Party dein Spiel startet, reserviert PlayDrop für ihre Mitglieder Plätze in einem der Räume deines Servers, sodass Freunde im selben Match landen, statt getrennt zu werden. Der Sprachchat läuft in PlayDrop, nicht in deinem Spiel.

## Was du brauchst

- Einen [Echtzeit-Spielserver](https://www.playdrop.ai/de/create/learn/game-servers): Partys spielen in deinen Colyseus-Räumen.
- Angemeldete Spieler: Räume lehnen Gäste ab.
- Diese Angaben in der [catalogue.json](https://www.playdrop.ai/de/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` listet die genauen Gruppengrößen bis 4 auf, die gemeinsam ankommen dürfen; `[2, 4]` schließt 3 aus. Das ist die Größe der ankommenden Gruppe, nicht die Kapazität des Raums: Zwei Vierer-Partys können sich einen Raum mit acht Plätzen teilen. `party` erfordert den Typ `party`, und `party.online` erfordert `online`. `roomVoice: true` aktiviert den Raum-Sprachchat und erfordert `online`.

## Dem richtigen Raum beitreten

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

`join` nutzt den reservierten Party-Platz des Spielers, wenn PlayDrop eine Party gestartet hat, und tritt sonst eigenständig bei. Schlägt ein Party-Beitritt fehl, wird der Aufruf abgelehnt; er setzt den Spieler nie stillschweigend in einen anderen Raum. Ein Gast erhält `authentication_required`, und PlayDrop zeigt die Anmeldung; tritt danach aus `sdk.me.onAuthChange` erneut bei. Behalte denselben Raum über mehrere Runden.

Nach einem Neuladen stellt `sdk.multiplayer.reconnect(roomName, token)` den reservierten Platz mit einem Wiederverbindungstoken wieder her, das du privat für dieses Spiel, diese Version und diesen Nutzer gespeichert hast. Verwirf das Token und rufe `join` auf, wenn `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` oder `party_reconnect_mismatch` kommt.

## Das Party-Fenster

Über einen Button öffnet `sdk.social.openParty({ mode: "online" })` das Party-Fenster von PlayDrop, in dem Spieler Freunde einladen und den Sprachchat ein- oder ausschalten. Eine bestehende Party wird weiterverwendet. `openParty()` öffnet das Party-Menü und `openParty({ section: "voice" })` die Sprachchat-Einstellungen; kombiniere `mode` und `section` nicht. Das Promise wird erfüllt, wenn das Fenster geschlossen wird, auch beim Abbrechen.

Lies die Party mit `sdk.social.getParty()` oder `sdk.social.onPartyChange(callback)`, das zuerst den aktuellen Zustand liefert: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` ist `joining` oder `ready`, wenn die Party gerade dieses Spiel spielt. Mitgliedschaft allein heißt nicht, dass die Spieler sich einen Raum teilen; verwende `join`.

Die Party-Mitgliedschaft gehört PlayDrop: Spiele können keine Party-Mitglieder hinzufügen oder entfernen und keine Mikrofone steuern, und Spieler laden Freunde über dieses Fenster in die Party ein. Ein Spiel kann trotzdem mit `sdk.social.sendMessage` eine eigene Einladungs- oder Herausforderungskarte an einen Freund senden; siehe [Teilen, Freunde und Einladungen](https://www.playdrop.ai/de/create/learn/social).

## Raum-Sprachchat

Mit `roomVoice: true` kann jeder in einem Raum sprechen, ganz ohne Servercode. Um zu ändern, wer wen hört, binde den Raum auf deinem Server und lege eine Regel fest:

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

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

Die Regeln sind `all`, `team`, `proximity` (mit `{ range }`) und `off`. `setAudience(player, audience)` legt für einen einzelnen Spieler eine Ausnahme fest, und `updatePositions([{ player, position: { x, y, z } }])` liefert die Positionen für die Nähe; übergib `null`, um ein Team oder eine Ausnahme zu löschen. PlayDrop setzt durch, wer wen hören darf. Im Browser passt `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` nur Lautstärke und Stereoposition an.

Der Sprachchat hängt von der Zustimmung der Spieler, Stummschaltungen und Blockierungen ab, außerdem vom Build des Hosts und von der schrittweisen Einführung.

## Pausieren

Die Party-Kapsel pausiert das Gameplay nicht. Die Pause von PlayDrop hält deinen Client an, aber der Raum bleibt verbunden, und dein Server läuft weiter. Die Pause eines Spielers darf das Match für die anderen nicht anhalten; setze eine Match-Pause auf dem Server um.

## Testen

Lade eine private Version hoch und öffne dann den Testlink in zwei Fenstern mit `player=1` und `player=2`, wie unter [Echtzeit-Spielserver](https://www.playdrop.ai/de/create/learn/game-servers) beschrieben. Lokale Partys mit Controllern sind ein eigener Modus: siehe [lokale Partys und Controller](https://www.playdrop.ai/de/create/learn/local-party).

## Verwandte Anleitungen

- [Echtzeit-Spielserver](https://www.playdrop.ai/de/create/learn/game-servers): Gehosteter Colyseus-0.17-Server mit MongoDB-Datenbank für dein Spiel: Verbindung per SDK aus dem Browser, Test mit zwei Spielern und die Grenzen.
- [Lokale Partys und Controller](https://www.playdrop.ai/de/create/learn/local-party): Physische Gamepads und PlayDrop-Handy-Controller über sdk.device lesen, lokale Spielerplätze verfolgen, Controller-Unterstützung und Partygrößen deklarieren.
- [Teilen, Freunde und Einladungen](https://www.playdrop.ai/de/create/learn/social): Ein Spiel mit Bild oder Clip teilen, Startdaten lesen, Freunde auswählen, Einladungen und Herausforderungen in PlayDrop Chat senden und andere Spiele empfehlen.
