# Grup online dan chat suara di game PlayDrop

Ajak teman bermain online bersama: deklarasikan ukuran grup, buka jendela grup PlayDrop, gabung ke room lewat sdk.multiplayer.join, dan atur suara ruang.

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

Grup PlayDrop adalah sekelompok teman yang berpindah dari satu game ke game lain bersama-sama. Saat sebuah grup memulai game Anda, PlayDrop memesan kursi untuk anggotanya di salah satu room server Anda, sehingga teman-teman tiba di pertandingan yang sama alih-alih terpisah. Chat suara berjalan di PlayDrop, bukan di game Anda.

## Yang Anda butuhkan

- [Server game realtime](https://www.playdrop.ai/id/create/learn/game-servers): grup bermain di room Colyseus Anda.
- Pemain yang sudah masuk: room menolak tamu.
- Deklarasi berikut di [catalogue.json](https://www.playdrop.ai/id/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` mencantumkan ukuran kelompok persis, maksimal 4, yang boleh tiba bersama; `[2, 4]` mengecualikan 3. Ini adalah ukuran kelompok yang tiba, bukan kapasitas room: dua grup berisi empat orang bisa berbagi room dengan delapan kursi. `party` memerlukan tipe `party` dan `party.online` memerlukan `online`. `roomVoice: true` mengaktifkan suara ruang dan memerlukan `online`.

## Gabung ke room yang tepat

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

`join` memakai kursi grup yang dipesan untuk pemain saat PlayDrop meluncurkan grup, dan jika tidak, bergabung secara mandiri. Jika gabung grup gagal, panggilan ini ditolak; panggilan ini tidak pernah diam-diam menempatkan pemain di room lain. Tamu mendapatkan `authentication_required` dan PlayDrop menampilkan halaman masuk; gabung lagi dari `sdk.me.onAuthChange`. Pertahankan room yang sama di antara ronde.

Setelah dimuat ulang, `sdk.multiplayer.reconnect(roomName, token)` memulihkan kursi yang dipesan dengan token sambung ulang yang Anda simpan secara privat untuk game, versi, dan pengguna ini. Buang token itu dan panggil `join` saat menerima `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable`, atau `party_reconnect_mismatch`.

## Jendela grup

Dari sebuah tombol, `sdk.social.openParty({ mode: "online" })` membuka jendela grup PlayDrop, tempat pemain mengundang teman serta menyalakan atau mematikan suara. Grup yang sudah ada dipakai ulang. `openParty()` membuka menu grup dan `openParty({ section: "voice" })` membuka pengaturan suara; jangan menggabungkan `mode` dan `section`. Promise selesai saat jendela ditutup, termasuk saat dibatalkan.

Baca grup dengan `sdk.social.getParty()` atau `sdk.social.onPartyChange(callback)`, yang lebih dulu mengirimkan status saat ini: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` bernilai `joining` atau `ready` saat grup sedang memainkan game ini. Keanggotaan saja tidak berarti para pemain berada di room yang sama; gunakan `join`.

Keanggotaan grup adalah milik PlayDrop: game tidak bisa menambahkan atau mengeluarkan anggota grup maupun mengontrol mikrofon, dan pemain mengundang teman ke grup dari jendela ini. Game tetap bisa mengirim kartu undangan atau tantangannya sendiri kepada teman dengan `sdk.social.sendMessage`; lihat [berbagi, teman, dan undangan](https://www.playdrop.ai/id/create/learn/social).

## Suara ruang

Dengan `roomVoice: true`, semua orang di sebuah room bisa berbicara, tanpa kode server. Untuk mengubah siapa yang mendengar siapa, ikat room di server Anda dan tetapkan kebijakan:

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

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

Kebijakannya adalah `all`, `team`, `proximity` (dengan `{ range }`), dan `off`. `setAudience(player, audience)` mengganti pengaturan untuk satu pemain dan `updatePositions([{ player, position: { x, y, z } }])` memberikan data untuk kedekatan; berikan `null` untuk menghapus tim atau penggantian. PlayDrop yang menegakkan siapa yang boleh mendengar siapa. Di browser, `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` hanya menyesuaikan volume dan posisi stereo.

Suara bergantung pada persetujuan, pembisuan, dan pemblokiran pemain, serta pada build host dan peluncuran fitur.

## Menjeda

Kapsul grup tidak menjeda gameplay. Jeda PlayDrop menghentikan klien Anda, tetapi room tetap terhubung dan server Anda tetap berjalan. Jeda satu pemain tidak boleh menghentikan pertandingan bagi pemain lain; terapkan jeda pertandingan apa pun di server.

## Uji

Unggah versi privat, lalu buka tautan uji di dua jendela dengan `player=1` dan `player=2`, seperti yang dijelaskan di [server game realtime](https://www.playdrop.ai/id/create/learn/game-servers). Grup lokal dengan pengontrol adalah mode terpisah: lihat [grup lokal dan pengontrol](https://www.playdrop.ai/id/create/learn/local-party).

## Panduan terkait

- [Server game realtime](https://www.playdrop.ai/id/create/learn/game-servers): Jalankan server Colyseus 0.17 yang di-hosting dengan MongoDB untuk game Anda, hubungkan dari browser lewat SDK, uji dengan dua pemain, dan pahami batasnya.
- [Grup lokal dan pengontrol](https://www.playdrop.ai/id/create/learn/local-party): Baca gamepad fisik dan pengontrol ponsel PlayDrop lewat sdk.device, ikuti slot pemain lokal, serta deklarasikan dukungan pengontrol dan ukuran grup lokal.
- [Berbagi, teman, dan undangan](https://www.playdrop.ai/id/create/learn/social): Bagikan game dengan gambar atau klip, baca payload peluncuran, pilih teman, kirim kartu undangan dan tantangan di PlayDrop Chat, serta rekomendasikan game lain.
