# خوادم الألعاب الفورية على PlayDrop: Colyseus وMongoDB

شغّل خادم Colyseus 0.17 مستضافًا مع قاعدة بيانات MongoDB للعبتك، واتصل به من المتصفح عبر SDK، واختبره بلاعبَين، واعرف حدوده.

Source: https://www.playdrop.ai/ar/create/learn/game-servers

يستطيع PlayDrop استضافة جانب الخادم من لعبتك: خادم Colyseus قياسي بقاعدة بيانات MongoDB خاصة به، ولاعبون موثّقون، ودون بنية تحتية تشغّلها بنفسك. استخدمه للمباريات الفورية والألعاب بالأدوار والعوالم المشتركة وكل ما يجب ألا يتمكن اللاعب من الغش فيه. الخادم اختياري؛ ويمكن للعبتك أيضًا استدعاء خادم تستضيفه بنفسك.

## اكتب الخادم

صدّر خريطة `rooms` من وحدة ES واحدة. يبدأ PlayDrop الخادم؛ فلا تستدعِ `listen()` ولا تعرّف `onAuth`، لأن PlayDrop يتحقق من كل لاعب قبل `onJoin`.

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  maxClients = 8;
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
    this.onMessage("move", (client, move) => this.applyMove(client.auth.userId, move));
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player: userId, username, appRole, isTestPlayer…
  }
  async onDispose() { await this.mongo?.close(); }
}

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

اتصل بـ MongoDB داخل دورة حياة الغرفة، ولا تتصل أبدًا على مستوى الوحدة: لا يوجد `PLAYDROP_MONGO_URL` إلا وقت التشغيل. وأنشئ فهارس لاستعلاماتك.

## صرّح به

اجمع الخادم في ملف واحد ووجّه الكتالوج إليه:

```json
{ "server": { "entry": "server/index.mjs", "rooms": ["game"] } }
```

ارفعه في [حزمة](https://www.playdrop.ai/ar/create/learn/packaging)؛ فمسار HTML البسيط لا يمكنه حمل خادم.

## قواعد بيئة التشغيل المستضافة

- Colyseus 0.17 (`colyseus` 0.17.10 و`@colyseus/schema` 4.0.30)، ومشغّل MongoDB 7.5، على Node.js 24.22.1.
- وحدة ES واحدة مكتفية بذاتها بحجم 2 MiB كحد أقصى. يجوز لها استيراد `colyseus` و`@colyseus/core` و`@colyseus/schema` و`mongodb` و`@playdrop/server` فقط؛ واجمع كل ما عدا ذلك داخلها.
- حتى نوعين من الغرف، و8 لاعبين في الغرفة، و4 ساعات لكل غرفة، و30 رسالة في الثانية لكل لاعب، و512 KiB للرسالة.
- لا وصول إلى الإنترنت: لا يمكن الوصول إلا إلى MongoDB وخدمات PlayDrop.
- يجب أن يكون اللاعبون مسجّلي الدخول.
- قاعدة بيانات واحدة لكل لعبة، تبقى عبر الإصدارات وتُحتسب ضمن تخزين المبدع. لا ترسل عنوانها أو بيانات اعتمادها إلى المتصفح أبدًا.

## اتصل من المتصفح

```js
const sdk = await playdrop.init();
const room = await sdk.multiplayer.join("game");
room.onStateChange((state) => render(state));
room.send("move", { x: 1 });
```

تتولى `join` مقاعد المجموعة في PlayDrop وتسجيل الدخول؛ راجع [المجموعات عبر الإنترنت](https://www.playdrop.ai/ar/create/learn/online-party). ولتحكم أدق، تعيد `sdk.multiplayer.getConnection()` القيمة `{ endpoint, token, expiresAt }` لاستخدامها مع عميل Colyseus الرسمي من `sdk.libs.colyseus.load()`.

## SDK للخادم

تضيف `@playdrop/server` استدعاءات موثوقة للمنصة: الأصدقاء وبطاقات الألعاب (`playdrop.social`)، والتحقق من المشتريات (`playdrop.shop`)، والإنشاء بالذكاء الاصطناعي على حساب المبدع (`playdrop.ai`)، وصوت الغرفة (`playdrop.multiplayer.forRoom`). وتعمل في الألعاب المرفوعة فقط. راجع [مرجع SDK للخادم](https://www.playdrop.ai/ar/create/learn/server-sdk).

## الاختبار

أثناء التطوير، شغّل Colyseus 0.17 وMongoDB محليًا واربط عميلك المحلي بخادمك المحلي. لاختبار الخادم المستضاف، ارفع إصدارًا خاصًا وافتح `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1`، ثم الرابط نفسه مع `player=2` في نافذة ثانية. تلعب كل نافذة بوصفها لاعبًا تجريبيًا منفصلًا تابعًا لحسابك. انشر الإصدار المجرّب بـ `publish_game_version` عندما يعمل.

صمّم اللعبة لتتحمل انقطاع الاتصال: تحتفظ إعادة الاتصال في Colyseus بالمقعد لوقت قصير، ويجب أن تتيح حالة الغرفة للاعب العائد أن يتابع.

## أدلة ذات صلة

- [المجموعات والصوت عبر الإنترنت](https://www.playdrop.ai/ar/create/learn/online-party): دع الأصدقاء يلعبون معًا عبر الإنترنت: صرّح بأحجام المجموعات، وافتح نافذة المجموعة، وانضم إلى الغرف المحجوزة عبر sdk.multiplayer.join، وتحكم بصوت الغرفة.
- [SDK للخادم](https://www.playdrop.ai/ar/create/learn/server-sdk): مرجع خوادم الألعاب التي يستضيفها PlayDrop: قواعد بيئة التشغيل، وPlayDropPlayer الموثّق، وواجهات الخادم social وshop وai وmultiplayer.
- [التحزيم و.play](https://www.playdrop.ai/ar/create/learn/packaging): نظّم مجلد لعبة مبنية أو ملف ZIP أو .play مع catalogue.json في جذره، وصرّح بوسائط صفحة اللعبة والخوادم، وارفعه باستخدام prepare_catalogue_upload.
