# Server di gioco PlayDrop: Colyseus, MongoDB e SDK server

Multiplayer ospitato facoltativo: carica un server.js Colyseus con MongoDB, provalo con i giocatori di prova e usa l’SDK server per amici e IA.

Source: https://www.playdrop.ai/it/create/learn/server-sdk

Un server di gioco è facoltativo. Il tuo gioco può chiamare qualsiasi server che gestisci tu. Se preferisci, PlayDrop ospita per il tuo gioco un server Colyseus standard con un database MongoDB: caricalo come `server.js` accanto a `index.html` tramite [PlayDrop Connector](https://www.playdrop.ai/it/create/connectors), oppure chiedi a [PlayDrop Cloud](https://www.playdrop.ai/it/create) di costruirlo. Anche il pacchetto `@playdrop/server` è facoltativo.

## Scrivi un server Colyseus standard

Esporta una mappa `rooms` da `server.js` ed elenca i nomi delle stanze in [catalogue.json](https://www.playdrop.ai/it/create/learn/catalogue-json) come `"server": { "rooms": ["game"] }`. PlayDrop esegue il server, quindi non avviarne uno tu. Salva i dati con il driver MongoDB standard tramite `PLAYDROP_MONGO_URL`, dentro il ciclo di vita della stanza.

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player, for example client.auth.userId.
  }
  async onDispose() { await this.mongo?.close(); }
}

export const rooms = { game: defineRoom(GameRoom) };
```

## Regole del server ospitato

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), il driver MongoDB 7.5 e Node 22.
- Un unico modulo ES autonomo fino a 2 MiB. Può importare solo `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` e `@playdrop/server`; includi nel file qualsiasi altro codice.
- Fino a 2 tipi di stanza, 8 giocatori per stanza, 4 ore per stanza, 30 messaggi al secondo per giocatore e 512 KiB per messaggio.
- Nessun accesso a internet dal server: sono raggiungibili solo MongoDB e i servizi di PlayDrop.
- I giocatori devono aver effettuato l’accesso. PlayDrop verifica ogni giocatore quando entra; non implementare `onAuth`.
- Un database MongoDB per gioco, conservato tra le versioni e conteggiato nella tua quota di spazio. Non inviare mai le sue credenziali al browser.

## Collega il browser e prova

Nel browser, `sdk.multiplayer.getConnection()` dell’[SDK client](https://www.playdrop.ai/it/create/learn/sdk) restituisce l’indirizzo del server e il token del giocatore; entra con il client Colyseus (`@colyseus/sdk` 0.17). Durante lo sviluppo, esegui in locale Colyseus 0.17 e MongoDB 8 e collegati direttamente al tuo server locale. Per provare il server ospitato, carica una versione privata, poi apri `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` e lo stesso link con `player=2` in una seconda finestra: ogni finestra gioca come un account di prova separato. Rendi pubblica la versione dalla pagina del gioco quando funziona.

## SDK server facoltativo: amici e IA

`@playdrop/server` aggiunge `playdrop.social` (gli amici che giocano a questo gioco e le carte di gioco nella Chat di PlayDrop) e `playdrop.ai` (generazione di testo, immagini, 3D, video, suoni, voce e musica pagata dal creator). Queste chiamate funzionano solo sui giochi caricati, non nello sviluppo locale. Scarica sul server i contenuti multimediali privati generati con `playdrop.ai.tasks.downloadFile` e invia i byte solo al giocatore interessato; le richieste di voce accettano al massimo 40 parole.

## Gruppo e voce della stanza

`await playdrop.social.getParty(client.auth)` legge i membri del gruppo attualmente autorizzati. Non espone la chat del gruppo né l’attività in altri giochi e non concede la gestione del gruppo. Le API social esistenti mantengono il loro comportamento.

Un catalogo che dichiara `roomVoice: true` parte con una politica per tutta la stanza; per questa impostazione predefinita non serve alcuna chiamata al server. Per personalizzarla, associa `const platform = playdrop.multiplayer.forRoom(this)` alla vera stanza Colyseus. Usa `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` e `updatePositions([{ player: client.auth, position: { x, y, z } }])`. Passa null per cancellare un override di squadra o di giocatore. La prossimità richiede posizioni autorevoli aggiornate.

Il runtime affidabile unisce le modifiche di idoneità, riserva i seguaci del gruppo accettati dopo l’ingresso ordinario del leader e ripulisce i permessi. I giochi non inviano mai audio, credenziali del provider o richieste di microfono. Mantieni la stessa stanza tra un round e l’altro. Usa i giocatori di prova privati già esistenti con un creator idoneo per provare l’integrazione prima di pubblicare; la sola pubblicazione non attiva il rollout.
