# Serwery gier PlayDrop: Colyseus, MongoDB i SDK serwera

Opcjonalny hostowany tryb wieloosobowy: prześlij Colyseus server.js z MongoDB, testuj z graczami testowymi i użyj SDK serwera dla znajomych i AI.

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

Serwer gry jest opcjonalny. Twoja gra może wywoływać dowolny serwer, który sam prowadzisz. Jeśli wolisz, PlayDrop hostuje standardowy serwer Colyseus z bazą danych MongoDB dla twojej gry: prześlij go jako `server.js` obok `index.html` przez [PlayDrop Connector](https://www.playdrop.ai/pl/create/connectors) albo poproś [PlayDrop Cloud](https://www.playdrop.ai/pl/create), by go zbudował. Pakiet `@playdrop/server` też jest opcjonalny.

## Napisz standardowy serwer Colyseus

Wyeksportuj mapę `rooms` z `server.js` i wypisz nazwy jej pokoi w [catalogue.json](https://www.playdrop.ai/pl/create/learn/catalogue-json) jako `"server": { "rooms": ["game"] }`. PlayDrop uruchamia serwer, więc nie startuj własnego. Przechowuj dane za pomocą standardowego sterownika MongoDB przez `PLAYDROP_MONGO_URL`, w cyklu życia pokoju.

```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 to zweryfikowany gracz PlayDrop, na przykład client.auth.userId.
  }
  async onDispose() { await this.mongo?.close(); }
}

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

## Zasady hostowanego serwera

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), sterownik MongoDB 7.5 i Node 22.
- Jeden samodzielny moduł ES do 2 MiB. Może importować tylko `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` i `@playdrop/server`; resztę kodu spakuj do pliku.
- Do 2 typów pokoi, 8 graczy w pokoju, 4 godziny na pokój, 30 wiadomości na sekundę na gracza i 512 KiB na wiadomość.
- Brak dostępu do internetu z serwera: osiągalne są tylko MongoDB i usługi PlayDrop.
- Gracze muszą być zalogowani. PlayDrop weryfikuje każdego gracza przy dołączaniu; nie implementuj `onAuth`.
- Jedna baza MongoDB na grę, zachowywana między wersjami i wliczana do twojego limitu miejsca. Nigdy nie wysyłaj jej danych uwierzytelniających do przeglądarki.

## Połącz przeglądarkę i testuj

W przeglądarce `sdk.multiplayer.getConnection()` z [SDK klienta](https://www.playdrop.ai/pl/create/learn/sdk) zwraca adres serwera i token gracza; dołącz za pomocą klienta Colyseus (`@colyseus/sdk` 0.17). Podczas tworzenia uruchom lokalnie Colyseus 0.17 i MongoDB 8 i łącz się bezpośrednio z lokalnym serwerem. Aby przetestować hostowany serwer, prześlij wersję prywatną, a potem otwórz `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` i ten sam link z `player=2` w drugim oknie: każde okno gra jako osobne konto testowe. Gdy wszystko działa, ustaw wersję jako publiczną na stronie gry.

## Opcjonalne SDK serwera: znajomi i AI

`@playdrop/server` dodaje `playdrop.social` (znajomi grający w tę grę i karty gier w czacie PlayDrop) oraz `playdrop.ai` (generowanie tekstu, obrazów, 3D, wideo, dźwięku, mowy i muzyki opłacane przez twórcę). Te wywołania działają tylko w przesłanych grach, nie w lokalnym środowisku deweloperskim. Pobieraj prywatne wygenerowane multimedia na serwerze przez `playdrop.ai.tasks.downloadFile` i wysyłaj bajty tylko zamierzonemu graczowi; prośby o mowę przyjmują najwyżej 40 słów.

## Głos grupy i pokoju

`await playdrop.social.getParty(client.auth)` odczytuje aktualnie autoryzowane członkostwo w grupie. Nie ujawnia czatu grupy ani aktywności w innych grach i nie daje zarządzania grupą. Istniejące API społecznościowe zachowują swoje działanie.

Katalog deklarujący `roomVoice: true` zaczyna z polityką dla całego pokoju; do tej domyślnej nie jest potrzebne żadne wywołanie serwera. Aby ją dostosować, powiąż `const platform = playdrop.multiplayer.forRoom(this)` z rzeczywistym pokojem Colyseus. Użyj `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` i `updatePositions([{ player: client.auth, position: { x, y, z } }])`. Przekaż null, aby wyczyścić nadpisanie drużyny lub gracza. Bliskość wymaga świeżych autorytatywnych pozycji.

Zaufane środowisko łączy zmiany kwalifikowalności, rezerwuje zaakceptowanych obserwujących grupy po zwykłym dołączeniu lidera i sprząta uprawnienia. Gry nigdy nie wysyłają dźwięku, danych uwierzytelniających dostawcy ani próśb o mikrofon. Zachowaj ten sam pokój między rundami. Użyj istniejących prywatnych graczy testowych z kwalifikującym się twórcą, aby przetestować integrację przed publikacją; sama publikacja nie włącza wdrożenia.
