# PlayDrop-gameservers: Colyseus, MongoDB en de server-SDK

Optionele gehoste multiplayer voor PlayDrop-games: upload een Colyseus-server.js met MongoDB-opslag, test met testspelers en gebruik de optionele server-SDK.

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

Een gameserver is optioneel. Je game kan elke server aanroepen die je zelf draait. Liever niet? Dan host PlayDrop een standaard Colyseus-server met een MongoDB-database voor je game: upload hem als `server.js` naast `index.html` via [PlayDrop Connector](https://www.playdrop.ai/nl/create/connectors) of vraag [PlayDrop Cloud](https://www.playdrop.ai/nl/create) hem te bouwen. Het pakket `@playdrop/server` is ook optioneel.

## Schrijf een standaard Colyseus-server

Exporteer een `rooms`-map uit `server.js` en noem de roomnamen in [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json) als `"server": { "rooms": ["game"] }`. PlayDrop draait de server, dus start er zelf geen. Sla gegevens op met de standaard MongoDB-driver via `PLAYDROP_MONGO_URL`, binnen de levenscyclus van de room.

```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) };
```

## Regels voor de gehoste server

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), de MongoDB-driver 7.5 en Node 22.
- Eén op zichzelf staande ES-module van maximaal 2 MiB. Hij mag alleen `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` en `@playdrop/server` importeren; bundel alle andere code in het bestand.
- Maximaal 2 roomtypen, 8 spelers per room, 4 uur per room, 30 berichten per seconde per speler en 512 KiB per bericht.
- Geen internettoegang vanaf de server: alleen MongoDB en PlayDrop-diensten zijn bereikbaar.
- Spelers moeten ingelogd zijn. PlayDrop verifieert elke speler bij het meedoen; implementeer `onAuth` niet.
- Eén MongoDB-database per game, bewaard over versies heen en meegeteld in je opslagquotum. Stuur de inloggegevens nooit naar de browser.

## Verbind de browser en test

In de browser geeft `sdk.multiplayer.getConnection()` uit de [client-SDK](https://www.playdrop.ai/nl/create/learn/sdk) het serveradres en het token van de speler terug; doe mee met de Colyseus-client (`@colyseus/sdk` 0.17). Draai tijdens de ontwikkeling Colyseus 0.17 en MongoDB 8 lokaal en verbind rechtstreeks met je lokale server. Om de gehoste server te testen upload je een privéversie en open je `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` en dezelfde link met `player=2` in een tweede venster: elk venster speelt als een apart testaccount. Maak de versie openbaar via de gamepagina als het werkt.

## Optionele server-SDK: vrienden en AI

`@playdrop/server` voegt `playdrop.social` toe (vrienden die deze game spelen en gamekaarten in PlayDrop Chat) en `playdrop.ai` (generatie van tekst, afbeeldingen, 3D, video, geluid, spraak en muziek, betaald door de maker). Deze aanroepen werken alleen bij geüploade games, niet in lokale ontwikkeling. Download privé gegenereerde media op de server met `playdrop.ai.tasks.downloadFile` en stuur de bytes alleen naar de beoogde speler; spraakverzoeken accepteren maximaal 40 woorden.

## Groeps- en roomspraak

`await playdrop.social.getParty(client.auth)` leest het momenteel toegestane groepslidmaatschap. Het toont geen groepschat of activiteit in andere games en geeft geen groepsbeheer. Bestaande social-API’s behouden hun gedrag.

Een catalogus met `roomVoice: true` begint met een beleid voor de hele room; voor die standaard is geen serveraanroep nodig. Om het aan te passen bind je `const platform = playdrop.multiplayer.forRoom(this)` aan de echte Colyseus-room. Gebruik `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` en `updatePositions([{ player: client.auth, position: { x, y, z } }])`. Geef null door om een team of een override van een speler te wissen. Afstand vraagt om verse, gezaghebbende posities.

De vertrouwde runtime bundelt wijzigingen in geschiktheid, reserveert geaccepteerde groepsvolgers na de gewone toetreding van de leider en ruimt rechten op. Games sturen nooit audio, inloggegevens van aanbieders of microfoonverzoeken. Houd dezelfde room aan over rondes heen. Gebruik de bestaande privétestspelers met een geschikte maker om de integratie te testen vóór het publiceren; publiceren alleen schakelt de uitrol niet in.
