الانتقال إلى المحتوى الرئيسي
حين يتشارك اللاعبون جلسة، تصل حزمة التطوير بينهم عبر شبكة لعبتك: Netcode for GameObjects في Unity، وشبكة المحرّك نفسه في Unreal. لعبة المضيف هي الخادم. يتصل اللاعبون على شبكة المضيف به مباشرة، ويمرّ الآخرون عبر وسيط Flock، فلا يحتاج أحد إلى فتح منفذ في الموجّه. ولا يُدخل المضيف إلا لاعبي الجلسة، وحين يتغيّر المضيف تبدأ كل لعبة شبكتها من جديد لدورها الجديد.
النطاق: يُفعَّل الوسيط أو يُوقَف لكل لعبة، من إعدادات اللعب الجماعي.
يعمل وسيط Flock على شبكة Cloudflare، وهو مفعّل لكل لعبة ما لم يُوقَف من إعدادات اللعب الجماعي. وحين يكون موقوفًا، أو ما دام وسيط الاستوديو معلّقًا حتى تُسدَّد فاتورته، يتصل اللاعبون على شبكة المضيف أو عبر منفذ مُوجَّه إلى المضيف، ويحصل اللاعب على شبكة أخرى على RelayFailed (في Unreal: relay_failed) مع relay_not_offered أو relay_paused.

بدء الشبكة

استدعاء واحد يتولّى المصافحة كلها، للمضيف ولكل لاعب. فعلى المضيف يبدأ Netcode for GameObjects مضيفًا ويعلن مكانه. وعلى اللاعب ينتظر ذلك (حتى 60 ثانية)، ثم يتصل، ويثبت مقعد اللاعب.
البدء الذي لا يستضيف ولا يتصل يُبقي مقعد اللاعب؛ فاستدعِ session.LeaveAsync() إن لم يكن اللاعب قادرًا على اللعب.
نتيجة البدء هي ما انتهى إليه. في Unity تكون قيمة من FlockNetcodeStartOutcome؛ أما في Unreal فهي نصّ يُقارَن بثوابت FlockTravelToSessionOutcomes، وهي بالأسماء نفسها (فـ FlockTravelToSessionOutcomes::StartedAsHost هو started_as_host). وقد تأتي نتائج جديدة، فاحتفظ بحالة افتراضية.

عبر الوسيط، أو مباشرة

يختار FlockNetcodeOptions.Relay في Unity، وFFlockTravelToSessionOptions::Relay في Unreal، من يمرّ عبر الوسيط. واضبطه بالقيمة نفسها في لعبة كل لاعب.

المسارات المباشرة

مع WhenNeeded، وبعد أن يُدخل المضيف لاعبًا يمرّ عبر الوسيط، يحاول الطرفان الوصول أحدهما إلى الآخر مباشرة: يسأل كلٌّ منهما الوسيط، أو خادم STUN يُدرجه Flock، عن العنوان الذي يراه منه، ويتبادلان هذين العنوانين عبر الوسيط، ثم يرسل كلٌّ منهما حزمًا صغيرة إلى الآخر. وحين تصل في الاتجاهين، تمرّ حزم اللعبة مباشرة، وهو مسار أقصر في العادة من مسار الوسيط، ولا يبقى للوسيط ما يحمله. ويبقى الوسيط جاهزًا: فإذا سكت المسار المباشر 4 ثوانٍ عادت الحزم إليه. ولا تفعل اللعبة شيئًا في الحالتين. تسمح معظم أجهزة التوجيه المنزلية بذلك؛ أمّا حين يكون الطرفان كلاهما خلف أجهزة توجيه تمنح كل وجهة منفذًا خاصًا بها (كما تفعل بعض شبكات الجوّال)، فتبقى الحزم على الوسيط. منذ الإصدار 1.83.0 من Unity SDK والإصدار 1.38.0 من Unreal SDK. وفي Unreal يستمرّ اتصال المحرّك عبر كل انتقال: يسمع مُشغّل الشبكة لدى المضيف اللاعبَ من المنفذ نفسه طوال الوقت. ويُذكَر كل انتقال مرة واحدة في السجلّ، بمستوى Info. وإن كانت اللعبة في أيّ من الطرفين على Unreal SDK أقدم من 1.38.0 بقي الطرفان على الوسيط، إذ يُعلن كل طرف أولًا أنه يفهم رسائل المسار المباشر من الطرف الآخر. المقابل: مع WhenNeeded يعرف المضيف واللاعب المارّ عبر الوسيط عنوان IP أحدهما للآخر بعد إدخال اللاعب. وفي Unreal ينشر المضيف عناوينه الخاصة إلى جانب عنوانه على الوسيط، فيستطيع اللاعبون قراءة عنوانه. استخدم Always لإبقائهما مخفيّين. حين يتعذّر استخدام الوسيط، يكون RelayFailureReason واحدًا مما يلي، وهو نفسه في المحرّكين ما لم يذكر السطر غير ذلك: وقد يضيف الخادم أسبابًا جديدة، فاحتفظ بحالة افتراضية.

من ينضم

لا يُدخل المضيف إلا اللاعبين الذين يؤكّد Flock مقاعدهم، باتصال واحد لكل لاعب. سمِّ اللاعبين باتصالهم، لا بما ترسله لعبة اللاعب. ويُحتسب تحقّق المضيف من كل لاعب ينضم استدعاءً مدفوعًا واحدًا.
يتحقّق المضيف الذي بدأه StartNetcodeAsync بنفسه من كل لاعب ينضم. واعرف من صاحب الاتصال:
أضف تحقّقك الخاص بعد تحقّق Flock، مثل قائمة حظر أو حدّ لعدد الفريق:
يكون RefusedReason للاعب المرفوض واحدًا من no_join_token وjoin_token_invalid وalready_connected وflock_unreachable وsession_ended وnot_host وrefused_by_the_game وgame_check_failed.
يجب أن يعمل طرفا اللعبة على Flock SDK بالإصدار 1.77.0 أو أحدث، وبالإصدار الرئيسي نفسه من Netcode for GameObjects: فالمضيف يرفض اللاعبين على Flock SDK أقدم، أو على إصدار رئيسي آخر من Netcode.

حين يتغيّر المضيف

حين يغادر المضيف أو تتوقف لعبته، يجعل Flock اللاعب الأقدم جلوسًا مضيفًا ويطلق حدث تغيّر المضيف في الجلسة على كل لعبة (HostChanged في Unity، وOnHostChanged في Unreal). ولا يستطيع Netcode for GameObjects ولا شبكة Unreal نقل لعبة جارية إلى مضيف جديد، فتبدأ كل لعبة شبكتها من جديد: يستضيف المضيف الجديد، وينضم إليه الآخرون. وافعل الشيء نفسه حين يتوقف وسيط هذا الجهاز عن العمل (RelayLost في Unity، وOnRelayLost في Unreal).
أغلق الشبكة وابدأها من جديد:
يعود اللاعبون إلى اللعب بعد نحو 20 ثانية من مغادرة المضيف، وبعد نحو دقيقة من تعطّل لعبته (مهلة المضيف). ويضيع كل ما كان يحمله المضيف القديم: كائناته المُنشأة، ومتغيّراته الشبكية، وحالة مشهده. فاحفظ ما يحتاجه المضيف الجديد لدى كل لاعب، مثل لقطة من حالة اللعبة يرسلها المضيف كل بضع ثوانٍ، وأعد البناء منها. وأثناء انتظار استبدال مضيف متعطّل، يفقد اللاعبون اتصال الشبكة أولًا؛ فأبقِ الجلسة وانتظر HostChanged.

شبكات أخرى

الألعاب التي تستخدم Steam أو Epic Online Services أو شبكتها الخاصة تستفيد كذلك من فرق Flock ومطابقته وجلساته وتحقّق الانضمام. وهي تنشر الاتصال وتقرؤه بنفسها.
ينشر PublishDirectConnectionAsync(port) عنوان هذا الجهاز نفسه، ويختار connection.FindDirectAddressAsync() لدى اللاعب العنوان المناسب: العنوان المحلي للمضيف على شبكة مشتركة، وعنوانه العام فيما عدا ذلك. وخارج الشبكة المحلية لا يصل اللاعبون إلى ذلك العنوان إلا عبر منفذ مُوجَّه إلى المضيف.