# PlayDrops spelservrar: Colyseus, MongoDB och server-SDK:t

Valfritt hostat flerspelarläge för PlayDrop-spel: ladda upp en Colyseus-server.js med MongoDB, testa med testspelare och använd server-SDK:t för vänner och AI.

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

En spelserver är valfri. Ditt spel kan anropa vilken server du själv driver. Om du föredrar det hostar PlayDrop en vanlig Colyseus-server med en MongoDB-databas åt ditt spel: ladda upp den som `server.js` bredvid `index.html` via [PlayDrop Connector](https://www.playdrop.ai/sv/create/connectors) eller be [PlayDrop Cloud](https://www.playdrop.ai/sv/create) bygga den. Paketet `@playdrop/server` är också valfritt.

## Skriv en vanlig Colyseus-server

Exportera en `rooms`-karta från `server.js` och lista rummens namn i [catalogue.json](https://www.playdrop.ai/sv/create/learn/catalogue-json) som `"server": { "rooms": ["game"] }`. PlayDrop kör servern, så starta inte en själv. Lagra data med den vanliga MongoDB-drivrutinen via `PLAYDROP_MONGO_URL`, inom rummets livscykel.

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

## Regler för hostade servrar

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), MongoDB-drivrutinen 7.5 och Node 22.
- En fristående ES-modul på upp till 2 MiB. Den får bara importera `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` och `@playdrop/server`. Paketera all annan kod i filen.
- Upp till 2 rumstyper, 8 spelare per rum, 4 timmar per rum, 30 meddelanden per sekund och spelare samt 512 KiB per meddelande.
- Ingen internetåtkomst från servern: bara MongoDB och PlayDrops tjänster går att nå.
- Spelare måste vara inloggade. PlayDrop verifierar varje spelare när de går med. Implementera inte `onAuth`.
- En MongoDB-databas per spel, som behålls mellan versioner och räknas in i din lagringskvot. Skicka aldrig dess inloggningsuppgifter till webbläsaren.

## Anslut webbläsaren och testa

I webbläsaren returnerar `sdk.multiplayer.getConnection()` från [klient-SDK:t](https://www.playdrop.ai/sv/create/learn/sdk) serveradressen och spelarens token. Gå med via Colyseus-klienten (`@colyseus/sdk` 0.17). Under utvecklingen kör du Colyseus 0.17 och MongoDB 8 lokalt och ansluter direkt till din lokala server. För att testa den hostade servern laddar du upp en privat version och öppnar sedan `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` och samma länk med `player=2` i ett andra fönster: varje fönster spelar som ett separat testkonto. Gör versionen offentlig från spelsidan när den fungerar.

## Valfritt server-SDK: vänner och AI

`@playdrop/server` lägger till `playdrop.social` (vänner som spelar det här spelet och spelkort i PlayDrop Chat) och `playdrop.ai` (generering av text, bild, 3D, video, ljud, tal och musik som betalas av skaparen). De här anropen fungerar bara i uppladdade spel, inte vid lokal utveckling. Ladda ned privat genererad media på servern med `playdrop.ai.tasks.downloadFile` och skicka bytena bara till den spelare det gäller. Talförfrågningar accepterar högst 40 ord.

## Grupp och rumsröst

`await playdrop.social.getParty(client.auth)` läser det gruppmedlemskap som för tillfället är auktoriserat. Det visar inte gruppchatt eller aktivitet i andra spel och ger inte rätt att hantera gruppen. Befintliga sociala API:er behåller sitt beteende.

En katalog som deklarerar `roomVoice: true` startar med en policy för hela rummet. Inget serveranrop behövs för den standarden. För att anpassa den binder du `const platform = playdrop.multiplayer.forRoom(this)` till det faktiska Colyseus-rummet. Använd `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` och `updatePositions([{ player: client.auth, position: { x, y, z } }])`. Skicka null för att rensa en åsidosättning för lag eller spelare. Närhet kräver färska, auktoritativa positioner.

Den betrodda körmiljön slår ihop ändringar i behörighet, reserverar accepterade gruppföljare efter ledarens vanliga anslutning och städar upp behörigheter. Spel skickar aldrig ljud, leverantörsuppgifter eller mikrofonförfrågningar. Behåll samma rum mellan omgångarna. Använd de befintliga privata testspelarna med en behörig skapare för att testa integrationen före publicering. Publicering ensam aktiverar inte utrullningen.
