# Gruppi online e chat vocale nei giochi PlayDrop

Fai giocare gli amici insieme online: dimensioni dei gruppi, finestra del gruppo di PlayDrop, stanze riservate con sdk.multiplayer.join e voce della stanza.

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

Un gruppo PlayDrop è un insieme di amici che si sposta da un gioco all’altro insieme. Quando un gruppo avvia il tuo gioco, PlayDrop riserva i posti ai suoi membri in una delle stanze del tuo server, così gli amici arrivano nella stessa partita invece di essere divisi. La chat vocale funziona in PlayDrop, non nel tuo gioco.

## Cosa ti serve

- Un [server di gioco in tempo reale](https://www.playdrop.ai/it/create/learn/game-servers): i gruppi giocano nelle tue stanze Colyseus.
- Giocatori che hanno effettuato l’accesso: le stanze rifiutano gli ospiti.
- Queste dichiarazioni in [catalogue.json](https://www.playdrop.ai/it/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` elenca le dimensioni esatte dei gruppi, fino a 4, che possono arrivare insieme; `[2, 4]` esclude 3. È la dimensione del gruppo in arrivo, non la capienza della stanza: due gruppi da quattro possono condividere una stanza da otto posti. `party` richiede il tipo `party` e `party.online` richiede `online`. `roomVoice: true` attiva la voce della stanza e richiede `online`.

## Entra nella stanza giusta

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

`join` usa il posto riservato al giocatore nel gruppo quando è stato PlayDrop ad avviare un gruppo, altrimenti entra in modo indipendente. Se l’ingresso di un gruppo non riesce, la chiamata viene rifiutata; non sposta mai il giocatore in un’altra stanza senza dirlo. Un ospite riceve `authentication_required` e PlayDrop mostra l’accesso; entra di nuovo da `sdk.me.onAuthChange`. Mantieni la stessa stanza tra un round e l’altro.

Dopo un ricaricamento, `sdk.multiplayer.reconnect(roomName, token)` ripristina il posto riservato con un token di riconnessione che hai salvato in privato per questo gioco, questa versione e questo utente. Scarta il token e chiama `join` in caso di `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` o `party_reconnect_mismatch`.

## La finestra del gruppo

Da un pulsante, `sdk.social.openParty({ mode: "online" })` apre la finestra del gruppo di PlayDrop, dove i giocatori invitano gli amici e attivano o disattivano la voce. Un gruppo esistente viene riutilizzato. `openParty()` apre il menu del gruppo e `openParty({ section: "voice" })` apre le impostazioni della voce; non combinare `mode` e `section`. La promise si risolve quando la finestra si chiude, anche in caso di annullamento.

Leggi il gruppo con `sdk.social.getParty()` oppure `sdk.social.onPartyChange(callback)`, che fornisce per primo lo stato attuale: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` vale `joining` o `ready` quando il gruppo sta giocando a questo gioco. Far parte dello stesso gruppo non significa che i giocatori condividano una stanza; usa `join`.

L’appartenenza al gruppo è gestita da PlayDrop: i giochi non possono aggiungere o rimuovere membri del gruppo né controllare i microfoni, e i giocatori invitano gli amici nel gruppo da questa finestra. Un gioco può comunque inviare a un amico una propria carta di invito o di sfida con `sdk.social.sendMessage`; vedi [condivisione, amici e inviti](https://www.playdrop.ai/it/create/learn/social).

## Voce della stanza

Con `roomVoice: true`, tutti in una stanza possono parlare, senza codice server. Per cambiare chi sente chi, collega la stanza sul tuo server e imposta una regola:

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

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

Le regole sono `all`, `team`, `proximity` (con `{ range }`) e `off`. `setAudience(player, audience)` imposta un’eccezione per un giocatore e `updatePositions([{ player, position: { x, y, z } }])` fornisce i dati per la prossimità; passa `null` per rimuovere una squadra o un’eccezione. È PlayDrop a imporre chi può sentire chi. Nel browser, `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` regola solo il volume e il bilanciamento stereo.

La voce dipende dal consenso dei giocatori, dall’audio disattivato e dai blocchi, oltre che dalla build dell’host e dal rilascio graduale.

## Pausa

La capsula del gruppo non mette in pausa il gioco. La pausa di PlayDrop ferma il tuo client, ma la stanza resta connessa e il tuo server continua a funzionare. La pausa di un giocatore non deve fermare la partita per gli altri; implementa sul server un’eventuale pausa della partita.

## Prova

Carica una versione privata, poi apri il link di prova in due finestre con `player=1` e `player=2`, come descritto in [server di gioco in tempo reale](https://www.playdrop.ai/it/create/learn/game-servers). I gruppi locali con i controller sono una modalità separata: vedi [gruppi locali e controller](https://www.playdrop.ai/it/create/learn/local-party).

## Guide correlate

- [Server in tempo reale](https://www.playdrop.ai/it/create/learn/game-servers): Esegui un server Colyseus 0.17 ospitato con un database MongoDB, collegati dal browser con l’SDK, prova con due giocatori e conosci i limiti.
- [Gruppi locali e controller](https://www.playdrop.ai/it/create/learn/local-party): Leggi i gamepad fisici e i telefoni usati come controller con sdk.device, segui i posti dei giocatori locali, dichiara controller e dimensioni dei gruppi locali.
- [Condivisione, amici e inviti](https://www.playdrop.ai/it/create/learn/social): Condividi un gioco con immagine o clip, leggi i dati di avvio, scegli amici, invia carte di invito e sfida nella Chat di PlayDrop e consiglia altri giochi.
