# PlayDropin pelipalvelimet: Colyseus, MongoDB ja server SDK

Valinnainen isännöity moninpeli: lataa Colyseus-tiedosto server.js MongoDB:llä, testaa Test Players -pelaajilla ja käytä server SDK:ta ystäviin ja tekoälyyn.

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

Pelipalvelin on valinnainen. Pelisi voi kutsua mitä tahansa itse ylläpitämääsi palvelinta. Jos haluat, PlayDrop isännöi pelillesi tavallista Colyseus-palvelinta MongoDB-tietokannalla: lataa se tiedostona `server.js` tiedoston `index.html` viereen [PlayDrop Connectorin](https://www.playdrop.ai/fi/create/connectors) kautta tai pyydä [PlayDrop Cloudia](https://www.playdrop.ai/fi/create) rakentamaan se. Myös `@playdrop/server`-paketti on valinnainen.

## Kirjoita tavallinen Colyseus-palvelin

Vie `rooms`-kartta tiedostosta `server.js` ja luettele sen huoneiden nimet tiedostossa [catalogue.json](https://www.playdrop.ai/fi/create/learn/catalogue-json) muodossa `"server": { "rooms": ["game"] }`. PlayDrop ajaa palvelimen, joten älä käynnistä sitä itse. Tallenna tiedot tavallisella MongoDB-ajurilla `PLAYDROP_MONGO_URL`-osoitteen kautta huoneen elinkaaren sisällä.

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

## Isännöidyn palvelimen säännöt

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), MongoDB-ajuri 7.5 ja Node 22.
- Yksi itsenäinen ES-moduuli, enintään 2 MiB. Se saa tuoda vain `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` ja `@playdrop/server`; niputa kaikki muu koodi tiedostoon.
- Enintään 2 huonetyyppiä, 8 pelaajaa huonetta kohden, 4 tuntia huonetta kohden, 30 viestiä sekunnissa pelaajaa kohden ja 512 KiB viestiä kohden.
- Palvelimelta ei ole internet-yhteyttä: vain MongoDB ja PlayDrop-palvelut ovat tavoitettavissa.
- Pelaajien on oltava kirjautuneita. PlayDrop varmentaa jokaisen pelaajan liittyessä; älä toteuta `onAuth`-funktiota.
- Yksi MongoDB-tietokanta per peli, säilytetään versioiden yli ja lasketaan tallennuskiintiöösi. Älä koskaan lähetä sen tunnuksia selaimelle.

## Yhdistä selain ja testaa

Selaimessa `sdk.multiplayer.getConnection()` [client SDK:sta](https://www.playdrop.ai/fi/create/learn/sdk) palauttaa palvelimen osoitteen ja pelaajan tunnisteen; liity Colyseus-clientillä (`@colyseus/sdk` 0.17). Kehityksen aikana aja Colyseus 0.17 ja MongoDB 8 paikallisesti ja yhdistä suoraan paikalliseen palvelimeesi. Testataksesi isännöityä palvelinta lataa yksityinen versio ja avaa sitten `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` sekä sama linkki arvolla `player=2` toisessa ikkunassa: kukin ikkuna pelaa erillisenä testitilinä. Tee versiosta julkinen pelisivulta, kun se toimii.

## Valinnainen server SDK: ystävät ja tekoäly

`@playdrop/server` lisää `playdrop.social` (tätä peliä pelaavat ystävät ja pelikortit PlayDrop Chatissa) ja `playdrop.ai` (teksti-, kuva-, 3D-, video-, ääni-, puhe- ja musiikkigenerointi, jonka maksaa tekijä). Nämä kutsut toimivat vain ladatuissa peleissä, eivät paikallisessa kehityksessä. Lataa yksityinen luotu media palvelimella komennolla `playdrop.ai.tasks.downloadFile` ja lähetä tavut vain aiotulle pelaajalle; puhepyynnöt hyväksyvät enintään 40 sanaa.

## Ryhmä ja huoneen puhe

`await playdrop.social.getParty(client.auth)` lukee tällä hetkellä valtuutetun ryhmän jäsenyyden. Se ei paljasta ryhmächattia tai muun pelin toimintaa eikä anna ryhmän hallintaoikeutta. Olemassa olevat sosiaaliset rajapinnat säilyttävät toimintansa.

Katalogi, joka ilmoittaa `roomVoice: true`, alkaa koko huoneen käytännöllä; sitä varten ei tarvita palvelinkutsua. Mukauttaaksesi sitä sido `const platform = playdrop.multiplayer.forRoom(this)` varsinaiseen Colyseus-huoneeseen. Käytä `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` ja `updatePositions([{ player: client.auth, position: { x, y, z } }])`. Anna null tyhjentääksesi tiimin tai pelaajan ohituksen. Läheisyys vaatii tuoreet auktoritatiiviset sijainnit.

Luotettu ajoympäristö yhdistää kelpoisuusmuutokset, varaa hyväksytyt ryhmän seuraajat johtajan tavallisen liittymisen jälkeen ja siivoaa oikeudet. Pelit eivät koskaan lähetä ääntä, palveluntarjoajan tunnuksia tai mikrofonipyyntöjä. Pidä sama huone kierrosten yli. Käytä olemassa olevia yksityisiä Test Players -pelaajia kelpoisen tekijän kanssa testataksesi integraation ennen julkaisua; pelkkä julkaisu ei ota käyttöönottoa käyttöön.

