# PlayDrop oyun sunucuları: Colyseus, MongoDB ve sunucu SDK’sı

PlayDrop oyunları için isteğe bağlı barındırılan çok oyunculu mod: MongoDB’li bir Colyseus server.js yükle ve Test Players ile dene.

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

Oyun sunucusu isteğe bağlıdır. Oyunun kendi çalıştırdığın herhangi bir sunucuyu çağırabilir. İstersen PlayDrop, oyunun için MongoDB veritabanlı standart bir Colyseus sunucusu barındırır: `index.html` dosyasının yanına `server.js` olarak [PlayDrop Connector](https://www.playdrop.ai/tr/create/connectors) ile yükle ya da [PlayDrop Cloud](https://www.playdrop.ai/tr/create)’dan yapmasını iste. `@playdrop/server` paketi de isteğe bağlıdır.

## Standart bir Colyseus sunucusu yaz

`server.js` dosyasından bir `rooms` haritası dışa aktar ve oda adlarını [catalogue.json](https://www.playdrop.ai/tr/create/learn/catalogue-json) içinde `"server": { "rooms": ["game"] }` olarak listele. Sunucuyu PlayDrop çalıştırır, bu yüzden kendin bir tane başlatma. Verileri oda yaşam döngüsü içinde `PLAYDROP_MONGO_URL` üzerinden standart MongoDB sürücüsüyle sakla.

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

## Barındırılan sunucu kuralları

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), MongoDB sürücüsü 7.5 ve Node 22.
- 2 MiB’a kadar, kendi içinde tam tek bir ES modülü. Yalnızca `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` ve `@playdrop/server` içe aktarabilir; başka her kodu dosyanın içine paketle.
- En fazla 2 oda türü, oda başına 8 oyuncu, oda başına 4 saat, oyuncu başına saniyede 30 mesaj ve mesaj başına 512 KiB.
- Sunucudan internet erişimi yok: yalnızca MongoDB ve PlayDrop hizmetlerine erişilebilir.
- Oyuncuların giriş yapmış olması gerekir. PlayDrop her oyuncuyu katıldığında doğrular; `onAuth` yazma.
- Oyun başına bir MongoDB veritabanı; sürümler arasında korunur ve depolama kotanda sayılır. Kimlik bilgilerini asla tarayıcıya gönderme.

## Tarayıcıyı bağla ve test et

Tarayıcıda, [istemci SDK’sındaki](https://www.playdrop.ai/tr/create/learn/sdk) `sdk.multiplayer.getConnection()` sunucu adresini ve oyuncunun jetonunu döndürür; Colyseus istemcisiyle (`@colyseus/sdk` 0.17) katıl. Geliştirme sırasında Colyseus 0.17 ve MongoDB 8’i yerelde çalıştır ve doğrudan yerel sunucuna bağlan. Barındırılan sunucuyu test etmek için özel bir sürüm yükle, sonra `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` adresini ve aynı bağlantıyı ikinci bir pencerede `player=2` ile aç: her pencere ayrı bir test hesabı olarak oynar. Çalıştığında sürümü oyun sayfasından herkese açık yap.

## İsteğe bağlı sunucu SDK’sı: arkadaşlar ve yapay zeka

`@playdrop/server`, `playdrop.social` (bu oyunu oynayan arkadaşlar ve PlayDrop Sohbet’teki oyun kartları) ve `playdrop.ai` (yapımcının ödediği metin, görsel, 3D, video, ses, konuşma ve müzik üretimi) ekler. Bu çağrılar yalnızca yüklenmiş oyunlarda çalışır, yerel geliştirmede çalışmaz. Üretilen özel medyayı sunucuda `playdrop.ai.tasks.downloadFile` ile indir ve baytları yalnızca ilgili oyuncuya gönder; konuşma istekleri en fazla 40 kelime kabul eder.

## Parti ve oda sesli sohbeti

`await playdrop.social.getParty(client.auth)`, şu anda yetkili parti üyeliğini okur. Parti sohbetini ya da başka oyun etkinliğini göstermez ve parti yönetimi yetkisi vermez. Mevcut sosyal API’ler davranışını korur.

`roomVoice: true` bildiren bir katalog, tüm oda politikasıyla başlar; bu varsayılan için sunucu çağrısı gerekmez. Özelleştirmek için `const platform = playdrop.multiplayer.forRoom(this)` değerini gerçek Colyseus odasına bağla. `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` ve `updatePositions([{ player: client.auth, position: { x, y, z } }])` kullan. Bir takımı ya da oyuncu geçersiz kılmasını temizlemek için null ver. Yakınlık, güncel ve yetkili konumlar gerektirir.

Güvenilen çalışma zamanı uygunluk değişikliklerini birleştirir, kabul edilen parti takipçilerini liderin olağan katılımından sonra ayırır ve izinleri temizler. Oyunlar asla ses, sağlayıcı kimlik bilgileri ya da mikrofon istekleri göndermez. Turlar boyunca aynı odayı koru. Yayınlamadan önce entegrasyonu test etmek için uygun bir yapımcıyla mevcut özel Test Players’ı kullan; yalnızca yayınlamak kullanıma açmayı etkinleştirmez.
