# Verkkoryhmät ja puhechat PlayDrop-peleissä

Anna ystävien pelata yhdessä: ilmoita ryhmäkoot, avaa ryhmäikkuna, liity varattuihin huoneisiin sdk.multiplayer.join-kutsulla ja hallitse huoneen puhetta.

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

PlayDrop-ryhmä on joukko ystäviä, joka siirtyy yhdessä pelistä toiseen. Kun ryhmä käynnistää pelisi, PlayDrop varaa sen jäsenille paikat yhdestä palvelimesi huoneesta, joten ystävät päätyvät samaan otteluun sen sijaan, että heidät jaettaisiin eri huoneisiin. Puhechat toimii PlayDropissa, ei pelissäsi.

## Mitä tarvitset

- [Reaaliaikainen pelipalvelin](https://www.playdrop.ai/fi/create/learn/game-servers): ryhmät pelaavat Colyseus-huoneissasi.
- Kirjautuneet pelaajat: huoneet eivät päästä vieraita sisään.
- Nämä ilmoitukset tiedostossa [catalogue.json](https://www.playdrop.ai/fi/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` luettelee tarkat ryhmäkoot, enintään 4, jotka voivat saapua yhdessä; `[2, 4]` sulkee pois kolmen hengen ryhmät. Se on saapuvan ryhmän koko, ei huoneen kapasiteetti: kaksi neljän hengen ryhmää voi jakaa kahdeksan paikan huoneen. `party` vaatii `party`-tyypin, ja `party.online` vaatii arvon `online`. `roomVoice: true` ottaa huoneen puheen käyttöön ja vaatii arvon `online`.

## Liity oikeaan huoneeseen

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

`join` käyttää pelaajalle varatun ryhmäpaikan, kun PlayDrop käynnisti ryhmän, ja muuten liittyy itsenäisesti. Jos ryhmän liittyminen epäonnistuu, kutsu hylätään; se ei koskaan siirrä pelaajaa hiljaa toiseen huoneeseen. Vieras saa virheen `authentication_required`, ja PlayDrop näyttää kirjautumisen; liity uudelleen `sdk.me.onAuthChange`-tapahtumasta. Pidä sama huone kierroksesta toiseen.

Uudelleenlatauksen jälkeen `sdk.multiplayer.reconnect(roomName, token)` palauttaa varatun paikan uudelleenyhdistämistunnuksella, jonka tallensit yksityisesti tälle pelille, versiolle ja käyttäjälle. Hylkää tunnus ja kutsu `join`, kun saat virheen `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` tai `party_reconnect_mismatch`.

## Ryhmäikkuna

Painikkeesta `sdk.social.openParty({ mode: "online" })` avaa PlayDropin ryhmäikkunan, jossa pelaajat kutsuvat ystäviä ja kytkevät puheen päälle tai pois. Olemassa olevaa ryhmää käytetään uudelleen. `openParty()` avaa ryhmävalikon ja `openParty({ section: "voice" })` puheasetukset; älä yhdistä arvoja `mode` ja `section`. Lupaus täyttyy, kun ikkuna sulkeutuu, myös peruutettaessa.

Lue ryhmä kutsulla `sdk.social.getParty()` tai `sdk.social.onPartyChange(callback)`, joka toimittaa ensin nykyisen tilan: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` on `joining` tai `ready`, kun ryhmä pelaa tätä peliä. Pelkkä jäsenyys ei tarkoita, että pelaajat ovat samassa huoneessa; käytä `join`-kutsua.

Ryhmän jäsenyys kuuluu PlayDropille: pelit eivät voi lisätä tai poistaa ryhmän jäseniä eivätkä hallita mikrofoneja, ja pelaajat kutsuvat ystäviä ryhmään tästä ikkunasta. Peli voi silti lähettää ystävälle oman kutsu- tai haastekorttinsa kutsulla `sdk.social.sendMessage`; katso [jakaminen, ystävät ja kutsut](https://www.playdrop.ai/fi/create/learn/social).

## Huoneen puhe

Kun `roomVoice: true` on käytössä, kaikki huoneessa olevat voivat puhua ilman palvelinkoodia. Jos haluat muuttaa, kuka kuulee kenet, sido huone palvelimellasi ja aseta käytäntö:

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

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

Käytännöt ovat `all`, `team`, `proximity` (ja `{ range }`) sekä `off`. `setAudience(player, audience)` ohittaa yhden pelaajan asetuksen ja `updatePositions([{ player, position: { x, y, z } }])` syöttää sijainnit läheisyyttä varten; anna `null` tyhjentääksesi tiimin tai ohituksen. PlayDrop valvoo, kuka saa kuulla kenet. Selaimessa `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` säätää vain äänenvoimakkuutta ja panorointia.

Puhe edellyttää pelaajan suostumusta, noudattaa mykistyksiä ja estoja ja riippuu isännän versiosta ja käyttöönotosta.

## Tauot

Ryhmäkapseli ei keskeytä pelaamista. PlayDropin tauko pysäyttää asiakasohjelmasi, mutta huone pysyy yhdistettynä ja palvelimesi jatkaa toimintaansa. Yhden pelaajan tauko ei saa pysäyttää ottelua muilta; toteuta mahdollinen ottelun tauko palvelimella.

## Testaa

Lataa yksityinen versio ja avaa testilinkki kahdessa ikkunassa arvoilla `player=1` ja `player=2`, kuten sivulla [reaaliaikaiset pelipalvelimet](https://www.playdrop.ai/fi/create/learn/game-servers) kuvataan. Paikalliset ryhmät ohjaimilla ovat erillinen tila: katso [paikalliset ryhmät ja ohjaimet](https://www.playdrop.ai/fi/create/learn/local-party).

## Liittyvät oppaat

- [Reaaliaikaiset pelipalvelimet](https://www.playdrop.ai/fi/create/learn/game-servers): Aja pelillesi isännöityä Colyseus 0.17 -palvelinta MongoDB-tietokannalla, yhdistä selaimesta SDK:lla, testaa kahdella pelaajalla ja tunne rajat.
- [Paikalliset ryhmät ja ohjaimet](https://www.playdrop.ai/fi/create/learn/local-party): Lue peliohjaimia ja PlayDropin puhelinohjaimia sdk.device-rajapinnalla, seuraa paikallisten pelaajien paikkoja ja ilmoita ohjaintuki ja paikalliset ryhmäkoot.
- [Jakaminen, ystävät ja kutsut](https://www.playdrop.ai/fi/create/learn/social): Jaa peli kuvan tai leikkeen kera, lue käynnistysdata, valitse ystäviä, lähetä kutsu- ja haastekortteja PlayDrop Chatissa ja suosittele muita pelejä.
