# خوادم ألعاب PlayDrop: Colyseus وMongoDB وSDK للخادم

لعب جماعي مستضاف اختياري: ارفع server.js بـ Colyseus مع تخزين MongoDB، وجرّبه بلاعبين تجريبيين، واستخدم SDK للخادم للأصدقاء والذكاء الاصطناعي.

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

خادم اللعبة اختياري. يمكن للعبتك استدعاء أي خادم تشغّله بنفسك. وإن فضّلت، يستضيف PlayDrop خادم Colyseus قياسيًا مع قاعدة بيانات MongoDB للعبتك: ارفعه باسم `server.js` بجوار `index.html` عبر [PlayDrop Connector](https://www.playdrop.ai/ar/create/connectors)، أو اطلب من [PlayDrop Cloud](https://www.playdrop.ai/ar/create) بناءه. والحزمة `@playdrop/server` اختيارية أيضًا.

## اكتب خادم Colyseus قياسيًا

صدّر خريطة `rooms` من `server.js` وأدرج أسماء غرفها في [catalogue.json](https://www.playdrop.ai/ar/create/learn/catalogue-json) بالشكل `"server": { "rooms": ["game"] }`. يشغّل PlayDrop الخادم، فلا تبدأ واحدًا بنفسك. خزّن البيانات بمشغّل MongoDB القياسي عبر `PLAYDROP_MONGO_URL`، داخل دورة حياة الغرفة.

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

## قواعد الخادم المستضاف

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

## اربط المتصفح وجرّب

في المتصفح، تعيد `sdk.multiplayer.getConnection()` من [SDK للعميل](https://www.playdrop.ai/ar/create/learn/sdk) عنوان الخادم ورمز اللاعب؛ انضم عبر عميل Colyseus (`@colyseus/sdk` 0.17). أثناء التطوير، شغّل Colyseus 0.17 وMongoDB 8 محليًا واتصل بخادمك المحلي مباشرة. لتجربة الخادم المستضاف، ارفع إصدارًا خاصًا، ثم افتح `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` والرابط نفسه بـ `player=2` في نافذة ثانية: تلعب كل نافذة بحساب اختبار منفصل. اجعل الإصدار عامًا من صفحة اللعبة عندما يعمل.

## SDK للخادم الاختياري: الأصدقاء والذكاء الاصطناعي

تضيف `@playdrop/server` الأداة `playdrop.social` (الأصدقاء الذين يلعبون هذه اللعبة وبطاقات الألعاب في دردشة PlayDrop) والأداة `playdrop.ai` (إنشاء النص والصور والنماذج ثلاثية الأبعاد والفيديو والصوت والكلام والموسيقى بتكلفة يتحملها المبدع). تعمل هذه الاستدعاءات في الألعاب المرفوعة فقط، لا في التطوير المحلي. نزّل الوسائط الخاصة المُنشأة على الخادم بـ `playdrop.ai.tasks.downloadFile` وأرسل البيانات إلى اللاعب المقصود فقط؛ وتقبل طلبات الكلام 40 كلمة كحد أقصى.

## صوت المجموعة والغرفة

تقرأ `await playdrop.social.getParty(client.auth)` عضوية المجموعة المصرح بها حاليًا. ولا تكشف دردشة المجموعة أو نشاط الألعاب الأخرى، ولا تمنح صلاحية إدارة المجموعة. وتحتفظ واجهات التواصل الاجتماعي الموجودة بسلوكها.

كتالوج يعلن `roomVoice: true` يبدأ بسياسة كل الغرفة؛ ولا حاجة إلى استدعاء من الخادم لهذا الافتراضي. للتخصيص، اربط `const platform = playdrop.multiplayer.forRoom(this)` بغرفة Colyseus الفعلية. استخدم `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })` و`setTeam(client.auth, teamId)` و`setAudience(client.auth, audience)` و`updatePositions([{ player: client.auth, position: { x, y, z } }])`. مرّر null لمسح تجاوز فريق أو لاعب. يحتاج القرب إلى مواقع موثوقة حديثة.

يدمج وقت التشغيل الموثوق تغييرات الأهلية، ويحجز أتباع المجموعة المقبولين بعد انضمام القائد المعتاد، وينظف الأذونات. لا ترسل الألعاب صوتًا أو بيانات اعتماد المزوّد أو طلبات ميكروفون أبدًا. أبقِ الغرفة نفسها بين الجولات. استخدم اللاعبين التجريبيين الخاصين الموجودين مع مبدع مؤهل لاختبار التكامل قبل النشر؛ فالنشر وحده لا يفعّل الإطلاق التدريجي.
