# Nettgrupper og stemmechat i PlayDrop-spill

La venner spille sammen på nett: deklarer gruppestørrelser, åpne PlayDrops gruppevindu, bli med i reserverte rom med sdk.multiplayer.join og styr romstemme.

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

En PlayDrop-gruppe er en gjeng venner som går fra spill til spill sammen. Når en gruppe starter spillet ditt, reserverer PlayDrop plasser til medlemmene i ett av serverens rom, slik at vennene havner i samme kamp i stedet for å bli delt opp. Stemmechatten kjører i PlayDrop, ikke i spillet ditt.

## Hva du trenger

- En [sanntidsserver for spill](https://www.playdrop.ai/nb/create/learn/game-servers): grupper spiller i Colyseus-rommene dine.
- Innloggede spillere: rom avviser gjester.
- Disse deklarasjonene i [catalogue.json](https://www.playdrop.ai/nb/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` lister de nøyaktige gruppestørrelsene, opptil 4, som kan komme inn sammen; `[2, 4]` utelukker 3. Det er størrelsen på gruppen som kommer inn, ikke romkapasiteten: to grupper på fire kan dele et rom med åtte plasser. `party` krever typen `party`, og `party.online` krever `online`. `roomVoice: true` slår på romstemme og krever `online`.

## Bli med i riktig rom

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

`join` bruker spillerens reserverte gruppeplass når PlayDrop har startet en gruppe, og blir ellers med på egen hånd. Hvis det ikke lykkes å bli med i gruppen, avvises kallet; det setter aldri spilleren i et annet rom uten å si fra. En gjest får `authentication_required`, og PlayDrop viser innlogging; bli med igjen fra `sdk.me.onAuthChange`. Behold det samme rommet på tvers av runder.

Etter en ny innlasting gjenoppretter `sdk.multiplayer.reconnect(roomName, token)` den reserverte plassen med et gjenoppkoblingstoken du har lagret privat for dette spillet, denne versjonen og denne brukeren. Forkast tokenet og kall `join` ved `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` eller `party_reconnect_mismatch`.

## Gruppevinduet

Fra en knapp åpner `sdk.social.openParty({ mode: "online" })` PlayDrops gruppevindu, der spillere inviterer venner og slår stemme av eller på. En eksisterende gruppe gjenbrukes. `openParty()` åpner gruppemenyen, og `openParty({ section: "voice" })` åpner stemmeinnstillingene; ikke kombiner `mode` og `section`. Promisen fullføres når vinduet lukkes, også ved avbryt.

Les gruppen med `sdk.social.getParty()` eller `sdk.social.onPartyChange(callback)`, som leverer den nåværende tilstanden først: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` er `joining` eller `ready` når gruppen spiller dette spillet. Medlemskap alene betyr ikke at spillerne deler et rom; bruk `join`.

Gruppemedlemskap hører til PlayDrop: spill kan ikke legge til eller fjerne gruppemedlemmer eller styre mikrofoner, og spillere inviterer venner til gruppen fra dette vinduet. Et spill kan likevel sende sitt eget invitasjons- eller utfordringskort til en venn med `sdk.social.sendMessage`; se [deling, venner og invitasjoner](https://www.playdrop.ai/nb/create/learn/social).

## Romstemme

Med `roomVoice: true` kan alle i et rom snakke, uten serverkode. For å endre hvem som hører hvem, binder du rommet på serveren og setter en regel:

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

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

Reglene er `all`, `team`, `proximity` (med `{ range }`) og `off`. `setAudience(player, audience)` overstyrer for én spiller, og `updatePositions([{ player, position: { x, y, z } }])` gir posisjoner til nærhetsregelen; send `null` for å fjerne et lag eller en overstyring. PlayDrop håndhever hvem som kan høre hvem. I nettleseren justerer `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` bare volum og panorering.

Stemme er underlagt spillerens samtykke, demping og blokkeringer, og avhenger av vertsappens versjon og utrulling.

## Pause

Gruppekapselen setter ikke spillingen på pause. PlayDrops pause stopper klienten din, men rommet forblir tilkoblet, og serveren din fortsetter å kjøre. At én spiller setter på pause, må ikke stoppe kampen for de andre; lag en eventuell kamppause på serveren.

## Test

Last opp en privat versjon, og åpne deretter testlenken i to vinduer med `player=1` og `player=2`, som beskrevet i [sanntidsservere for spill](https://www.playdrop.ai/nb/create/learn/game-servers). Lokale grupper med kontrollere er en egen modus: se [lokale grupper og kontrollere](https://www.playdrop.ai/nb/create/learn/local-party).

## Relaterte veiledninger

- [Sanntidsservere](https://www.playdrop.ai/nb/create/learn/game-servers): Kjør en hostet Colyseus 0.17-server med en MongoDB-database for spillet ditt, koble til fra nettleseren med SDK-en, test med to spillere og kjenn grensene.
- [Lokale grupper og kontrollere](https://www.playdrop.ai/nb/create/learn/local-party): Les fysiske spillkontrollere og PlayDrops telefonkontrollere via sdk.device, følg lokale spillerplasser, og deklarer kontrollerstøtte og gruppestørrelser.
- [Deling, venner og invitasjoner](https://www.playdrop.ai/nb/create/learn/social): Del et spill med et bilde eller klipp, les startdata, velg venner, send invitasjons- og utfordringskort i PlayDrop Chat og anbefal andre spill.
