# Grupy online i czat głosowy w grach PlayDrop

Pozwól znajomym grać razem online: zadeklaruj rozmiary grup, otwórz okno grupy, dołączaj do zarezerwowanych pokoi przez sdk.multiplayer.join i steruj głosem.

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

Grupa PlayDrop to znajomi, którzy razem przechodzą z gry do gry. Gdy grupa uruchamia twoją grę, PlayDrop rezerwuje miejsca dla jej członków w jednym z pokoi twojego serwera, więc znajomi trafiają do tego samego meczu, zamiast zostać rozdzieleni. Czat głosowy działa w PlayDrop, a nie w twojej grze.

## Czego potrzebujesz

- [Serwera gry czasu rzeczywistego](https://www.playdrop.ai/pl/create/learn/game-servers): grupy grają w twoich pokojach Colyseus.
- Zalogowanych graczy: pokoje odrzucają gości.
- Tych deklaracji w [catalogue.json](https://www.playdrop.ai/pl/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` wymienia dokładne rozmiary grup, do 4, które mogą dołączyć razem; `[2, 4]` wyklucza 3. To rozmiar dołączającej grupy, a nie pojemność pokoju: dwie czteroosobowe grupy mogą dzielić pokój na osiem miejsc. `party` wymaga typu `party`, a `party.online` wymaga `online`. `roomVoice: true` włącza głos pokoju i wymaga `online`.

## Dołącz do właściwego pokoju

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

`join` wykorzystuje zarezerwowane miejsce gracza w grupie, gdy grę uruchomiła grupa PlayDrop, a w przeciwnym razie dołącza niezależnie. Jeśli dołączenie grupy się nie powiedzie, wywołanie zostaje odrzucone; nigdy nie umieszcza po cichu gracza w innym pokoju. Gość dostaje `authentication_required`, a PlayDrop pokazuje logowanie; dołącz ponownie z `sdk.me.onAuthChange`. Zachowaj ten sam pokój między rundami.

Po przeładowaniu `sdk.multiplayer.reconnect(roomName, token)` przywraca zarezerwowane miejsce za pomocą tokenu ponownego połączenia, który zapisano prywatnie dla tej gry, wersji i użytkownika. Przy `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` lub `party_reconnect_mismatch` odrzuć token i wywołaj `join`.

## Okno grupy

Wywołane po naciśnięciu przycisku w grze `sdk.social.openParty({ mode: "online" })` otwiera okno grupy PlayDrop, w którym gracze zapraszają znajomych oraz włączają i wyłączają głos. Istniejąca grupa jest używana ponownie. `openParty()` otwiera menu grupy, a `openParty({ section: "voice" })` otwiera ustawienia głosu; nie łącz `mode` i `section`. Obietnica spełnia się po zamknięciu okna, także przy anulowaniu.

Odczytuj grupę przez `sdk.social.getParty()` lub `sdk.social.onPartyChange(callback)`, które najpierw dostarcza bieżący stan: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` ma wartość `joining` lub `ready`, gdy grupa gra w tę grę. Samo członkostwo nie oznacza, że gracze są w jednym pokoju; użyj `join`.

Członkostwo w grupie należy do PlayDrop: gry nie mogą dodawać ani usuwać członków grupy ani sterować mikrofonami, a gracze zapraszają znajomych do grupy z tego okna. Gra nadal może wysłać znajomemu własną kartę zaproszenia lub wyzwania przez `sdk.social.sendMessage`; zobacz [udostępnianie, znajomi i zaproszenia](https://www.playdrop.ai/pl/create/learn/social).

## Głos pokoju

Przy `roomVoice: true` każdy w pokoju może rozmawiać, bez kodu serwera. Aby zmienić, kto kogo słyszy, powiąż pokój na serwerze i ustaw zasady:

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

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

Dostępne zasady to `all`, `team`, `proximity` (z `{ range }`) i `off`. `setAudience(player, audience)` nadpisuje ustawienie jednego gracza, a `updatePositions([{ player, position: { x, y, z } }])` dostarcza pozycje graczy dla trybu bliskości; przekaż `null`, aby wyczyścić drużynę lub nadpisanie. PlayDrop egzekwuje, kto kogo może słyszeć. W przeglądarce `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` dostosowuje tylko głośność i panoramę.

Głos podlega zgodzie gracza, wyciszeniu i blokadom oraz zależy od wersji hosta i wdrożenia.

## Pauza

Kapsuła grupy nie wstrzymuje rozgrywki. Pauza PlayDrop zatrzymuje twojego klienta, ale pokój pozostaje połączony, a serwer działa dalej. Pauza jednego gracza nie może zatrzymać meczu pozostałym; pauzę meczu zaimplementuj na serwerze.

## Testuj

Prześlij wersję prywatną, a potem otwórz link testowy w dwóch oknach z `player=1` i `player=2`, jak opisano w poradniku [serwery gier czasu rzeczywistego](https://www.playdrop.ai/pl/create/learn/game-servers). Grupy lokalne z kontrolerami to osobny tryb: zobacz [grupy lokalne i kontrolery](https://www.playdrop.ai/pl/create/learn/local-party).

## Powiązane poradniki

- [Serwery czasu rzeczywistego](https://www.playdrop.ai/pl/create/learn/game-servers): Uruchom hostowany serwer Colyseus 0.17 z bazą MongoDB dla swojej gry, łącz się z przeglądarki przez SDK, testuj z dwoma graczami i poznaj limity.
- [Grupy lokalne i kontrolery](https://www.playdrop.ai/pl/create/learn/local-party): Odczytuj gamepady i kontrolery PlayDrop na telefonie przez sdk.device, śledź lokalne sloty graczy, deklaruj obsługę kontrolerów i rozmiary grup lokalnych.
- [Udostępnianie, znajomi i zaproszenia](https://www.playdrop.ai/pl/create/learn/social): Udostępniaj grę z obrazem lub klipem, odczytuj dane startowe, wybieraj znajomych, wysyłaj karty zaproszeń i wyzwań na czacie PlayDrop oraz polecaj inne gry.
