Skip to main content
مكافآت المتجر والتذكيرات المدعومة من الخادم
  • تمنح عمليات الشراء محتواها من جهة الخادم، وتخبرك الحزمة بما مُنح. تُكمل Purchase بالنوع FFlockPurchaseResult — المكافآت الممنوحة، والمحفظة بعد المنح، ومدخل المخزون إن أنشأ العنصر واحدًا. راجع المتاجر والمخزون.
  • جديد: تستهلك Consume(InventoryId) عنصرًا مملوكًا وتعيد ما منحه، بالأمان المالي نفسه الذي يحمله الشراء: يُظهر الفشلَ الملتبس بدل إعادة إرساله، فلا تُمنح المكافأة مرتين. وفي Blueprint هي عقدة Flock Consume Inventory Item.
  • يعلن Rewards في عنصر الفهرس عمّا سيمنحه قبل شرائه، ويميّز Type حزمةَ العملة عن العنصر القابل للاستهلاك أو العنصر العادي.
  • تغيير كاسر: تُكمل Purchase بالنوع FFlockPurchaseResult بدل FFlockPlayerInventory. وانتقل مدخل المخزون إلى .Inventory، ويكون فارغًا في حالة حزمة العملة التي تسلّم محتواها مباشرة ولا تنشئ ما يُملك — استخدم Has Inventory Row قبل قراءته. كما أُعيدت تسمية طرف الخرج في ماكرو Purchase المُولَّد؛ فأعد التوليد بعد الترقية.
  • جديد: عقدتا Flock Cancel All Scheduled Notifications وFlock Get Pending Schedules في Blueprint. كانتا متاحتين في C++ فقط، فلم يكن بالإمكان بناء زر «امسح تذكيراتي» في مخطط — والبديل البديهي، حلقة ForEach على Flock Cancel Scheduled Notification، يُطلق كل عمليات الإلغاء في إطار واحد فتتسابق على القائمة المخزَّنة. أما العقدة فتمشي عليها بالتتابع.
  • عقد صرفة جديدة لأنواع المكافآت — Is Currency Reward وFlock Currency Reward Type — لأن نوع المكافأة نصّ يملكه الخادم. ومقارنته بقيمة مكتوبة يدويًا تُخاطر بأن يُقرأ الخطأ المطبعي على أنه «ليست مكافأة عملة» فيتخطّى المنح بصمت.
  • تسأل GetScheduled() الخادمَ عن التذكيرات المعلّقة لدى اللاعب، فترى التذكيرات التي ضُبطت قبل إعادة التثبيت أو على جهاز آخر. رشِّح باستخدام FlockScheduledNotificationStatuses::Pending أو ::Delivered أو ::Canceled، أو عقد Flock Schedule Status في Blueprint. راجع إشعارات اللعبة.
  • تلغي CancelAllScheduled() الآن كل ما لدى اللاعب من تذكيرات معلّقة، أينما جُدولت. ولا تلجأ إلى السجل المحلي إلا عند تعذّر الوصول إلى الخادم.
  • لم تتغيّر GetPendingSchedules()، وتبقى متزامنة ولا تحتاج شبكة؛ وهي الآن البديل دون اتصال بدل أن تكون القائمة الأساسية.
قراءة تذكيرات اللاعب المجدولة
  • تسأل GetScheduledAsync() الخادمَ عن التذكيرات المعلّقة لدى اللاعب. كانت القائمة الوحيدة حتى الآن سجلَّ الحزمة الخاص بما جدولته هذه النسخة، فتضيع المرجعية بعد إعادة التثبيت أو على جهاز ثانٍ ولا يستطيع اللاعب إلغاء تذكيراته. راجع إشعارات اللعبة.
  • رشِّح حسب الحالة عبر ScheduledNotificationStatuses.Pending أو .Delivered أو .Canceled، والحالة الافتراضية هي المعلّقة.
  • تلغي CancelAllScheduledAsync() الآن كل ما لدى اللاعب من تذكيرات معلّقة أيًّا كان مكان جدولتها، لا ما تتبّعته النسخة الحالية فقط. وترجع إلى السجل المحلي إن تعذّر الوصول إلى الخادم، فيظل المستدعي دون اتصال قادرًا على إلغاء ما يعرفه.
  • أما GetPendingSchedules() فلم تتغيّر، ولا تزال متزامنة ولا تحتاج شبكة؛ وصارت البديل دون اتصال بدل أن تكون القائمة الأساسية.
عناصر متجر تمنح مكافآت
  • تمنح عمليات الشراء محتوياتها من جهة الخادم، وتخبرك الحزمة بما مُنح. تُعيد عملية الشراء PurchaseResult — المكافآت الممنوحة، والمحفظة بعدها، ومدخل المخزون إن أنشأ العنصر واحدًا — فتستطيع اللعبة عرض «‎+500 ذهب» دون استدعاء ثانٍ. راجع المتاجر والمخزون.
  • جديد: تستهلك ConsumeAsync(inventoryId) عنصرًا مملوكًا وتُعيد ما منحه. والاستهلاك ينقل عملة، فيحمل أمان المال نفسه الذي يحمله الشراء: يُظهر الفشلَ الملتبس بدل إعادة إرساله، فلا تُمنح المكافأة مرتين.
  • تُعلن ShopItem.Rewards عمّا سيمنحه العنصر قبل شرائه، ويميّز ShopItem.Type حزمةَ العملة عن العنصر القابل للاستهلاك عن العنصر القياسي.
  • تغيير كاسر: تُعيد PurchaseAsync الآن PurchaseResult بدل PlayerInventory، وانتقل مدخل المخزون إلى result.Inventory. ومواضع الاستدعاء التي كانت تستخدم القيمة المُعادة مباشرة تحتاج هذا التعديل وحده، وسيشير المُصرِّف إلى كل واحد منها.
  • ولا تكون Granted ولا Rewards قيمتها null أبدًا — فالعنصر الذي لا يمنح شيئًا يُعيد قائمة فارغة.
أخطاء تسمّي الحل
  • الأخطاء صارت تقول ماذا تفعل، لا ما الذي تعطّل فحسب. كان الاستدعاء الفاشل يظهر بصيغة Validation failed (HTTP 400)، بينما شرح الخادم نفسه مدفون في جسم الاستجابة الخام. أما الآن فتحمل FlockException.Message الاستدعاء الذي أخفق، وسبب الخادم، والمعرّف المُرمَّز، وسطر Fix: — حتى إن الدخول بجهاز غير مسجَّل يسمّي RegisterWithDeviceAsync صراحةً. راجع معالجة الأخطاء.
  • والحل خاصّ بنوع بيانات الاعتماد: فالرمز player.invalid_login_credentials نفسه يعني «سجّل هذا الجهاز أوّلًا» عند الدخول بالجهاز، و«كلمة المرور خاطئة» عند الدخول بالبريد الإلكتروني.
  • إضافات على الاستثناء: ServerMessage وHint وOperation، لتصوغ نصّك الخاص بدل تحليل الرسالة. وتُعيد FlockErrorHints.For(errorCode) صياغة الخطوة التالية نفسها لأي رمز. وابقَ متفرّعًا على ErrorCode — فالرموز ثابتة والصياغة ليست كذلك.
  • أخطاء الطلبات غير الصالحة صارت مقروءة. فالاستجابات التي تسمّي الحقل المخالف تظهر الآن بصيغة body.player_data: Input should be a valid dictionary بدل «Validation failed» المجرّدة.
  • وسيط الوصول المُولَّد الناقص صار يشرح نفسه. فاستدعاء وسيط مُولَّد قبل تشغيل Sync Schemas خطأ ترجمة، ولذلك لم يكن بوسع أي خطأ من الحزمة أن يظهر أصلًا. صارت الحزمة تراقب الترجمة وتطبع الخطوة الناقصة، ويعرض تبويب Code Generation ما إذا كانت مزامنة قد جرت. راجع اعمل مع بيانات لعبتك.
إشعارات اللعبة
  • إشعارات اللعبة. صندوق وارد لكل لاعب مع عدد غير المقروء ووضع العلامة كمقروء فرديًا أو دفعة واحدة، وتذكيرات تجدولها لعبتك وتلغيها من جهة الخادم، وكتالوج القوالب القابل للقراءة، وتسجيل رموز الأجهزة للإشعارات الفورية. ولكل استدعاء عقدة في Blueprint. راجع إشعارات اللعبة.
  • تُعنون الجدولة باسم القالب — الاسم الذي تراه في لوحة التحكم — ويُستخرج المعرّف نيابة عنك.
  • رموز الإشعارات تُسجَّل ولا تُجلَب. احصل على الرمز من إضافة الإشعارات لديك (Firebase Cloud Messaging أو OneSignal) ومرّره إلى RegisterDeviceToken. فلا يوفّر Unreal وسيلة للحصول على رمز Android بنفسه، ولذلك فإن الإضافة ضرورية هناك لا اختيارية.
  • والتسجيل على منصّة لا تدعم الإشعارات الفورية يفشل بخطأ تحقّق بدل تخمين منصّة — تحقّق من Flock Get Current Device Platform قبل عرض الخيار.
  • قراءات صندوق الوارد مخزَّنة مؤقتًا دون اتصال؛ وإيصالات القراءة لا تُصفّ أبدًا، والجدولة لا يُعاد إرسالها بعد إخفاق غامض، فلا يترك انقطاع شبكي عابر تذكيرين متطابقين.
لوحات الصدارة
  • لوحات الصدارة. اقرأ صدارة اللوحة، ورتبة اللاعب المسجَّل دخوله، ومن حوله من اللاعبين، مع التصفية حسب النافذة الزمنية والدولة. وتُعنون اللوحات بالاسم. ولا تحتاج النتائج إلى استدعاء إرسال — فهي تأتي من حقل بيانات اللاعب الذي أُعدّت اللوحة عليه. راجع لوحات الصدارة.
  • والترتيبات وإعدادات اللوحة ومواضع اللاعبين مخزَّنة مؤقتًا دون اتصال، فتعرض شاشة الصدارة آخر لوحة معروفة عند انقطاع الشبكة.
لوحات الصدارة والإشعارات وربط الحسابات
  • لوحات الصدارة. اقرأ صدارة اللوحة، ورتبة اللاعب المسجَّل دخوله، ومن حوله من اللاعبين، مع التصفية حسب النافذة الزمنية والدولة. ولا تحتاج النتائج إلى استدعاء إرسال — فهي تأتي من حقل بيانات اللاعب الذي أُعدّت اللوحة عليه. راجع لوحات الصدارة.
  • إشعارات اللعبة. صندوق وارد لكل لاعب مع أعداد غير المقروء، ووضع العناصر كمقروءة فرادى أو دفعة واحدة، وتسجيل الأجهزة للإشعارات الفورية، وتذكيرات مجدولة محليًا يمكن للعبتك إلغاؤها. وكتالوج القوالب قابل للقراءة من داخل اللعبة، ويُطلَق FlockEvents.OnNotificationReceived عند وصول عناصر جديدة. راجع إشعارات اللعبة.
  • ربط الحسابات. يمكن للاعب الواحد أن يحمل عدّة بيانات اعتماد — الجهاز، والبريد الإلكتروني، وGoogle وApple وFacebook وSteam وDiscord — وأن يربطها أو يفكّ ربطها أثناء التشغيل. وكل استدعاء يُعيد قائمة بيانات الاعتماد بعد التحديث. راجع ربط الحسابات.
  • تغيير كاسر: أصبحت Notification.ScheduleAsync تأخذ اسم القالب لا معرّفه. والوسيط ما يزال نصًّا في الموضع نفسه، ولذلك تستمر الاستدعاءات القائمة في الترجمة وتفشل عند التشغيل بدلًا من ذلك. للترحيل: مرّر الاسم الذي أعطيته للقالب في لوحة التحكم.
  • اكتمال سطح المصادقة — إعادة تعيين كلمة المرور، والتحقق من البريد الإلكتروني، وإبطال الرموز من جهة الخادم، والتحقّق المسبق من توفّر الاسم المعروض.
  • كل خطأ صار يحمل رمزًا. التقط FlockException وفرّع على ErrorCode المكتوب النوع، مثل FlockErrorCode.ShopInsufficientFunds، بدل مطابقة نص الرسالة.
  • إصلاحات: فشل Commands.UpdatePlayerDataAsync بالخطأ HTTP 422، ومسافة زائدة في عنوان الواجهة البرمجية المُعدّ كانت تعطّل كل الطلبات على WebGL.
نطاق محرّكات موثَّق من 5.5 إلى 5.8
  • حزمة Unreal متاحة — مصادقة اللاعبين، وحفظ البيانات، والاقتصاد، والتكوينات عن بُعد، والأصول القابلة للتنزيل، والتحليلات، ضمن إضافة أصلية. وتعمل كل ميزة من Blueprint كعقدة غير متزامنة قائمة بذاتها، دون الحاجة إلى توصيل طرف Target. راجع دليل حزمة Unreal.
  • توليد كود مكتوب الأنواع من مخططاتك أنت. نقرة واحدة تحوّل القوالب والإعدادات والمتاجر إلى بنى Blueprint وتعدادات مكتوبة الأنواع، وعمليات قراءة وكتابة وشراء من عقدة واحدة — بلا C++ ولا خطوة ترجمة. أما المشاريع التي تفضّل C++ فيمكنها تبديل الهدف والحصول على وحدة مولَّدة بدلًا من ذلك.
  • آمنة دون اتصال بالتصميم. تُخزَّن قراءات الإعدادات واللعبة وكتالوج المتجر والقوالب على القرص وتُقدَّم دون اتصال؛ أما عمليات الكتابة في بيانات اللاعب فتُصفّ وتُعاد لاحقًا. ومنح العملات لا يُصفّ عمدًا، حتى لا يُقيَّد مرتين.
  • دعم المحرّكات نطاق موثَّق: من UE 5.5 إلى 5.8 — كل إصدار في النطاق يُترجَم ويُختبر بمجموعة الاختبارات الكاملة قبل الإصدار. أما المحرّكات الأحدث فتُصدر تحذيرًا بدل المنع.
  • لوحات الصدارة والإشعارات وربط الحسابات مقتصرة على Unity حاليًا.
تتبّع الإنهاء وواجهة سجلات متزامنة
  • اكتشاف الإنهاء غير المتوقع. أي تشغيل ينتهي دون خروج نظيف يُبلَّغ عنه عند التشغيل التالي كحدث app_termination تلقائي، مصنَّف background_kill أو abnormal — راجع التحليلات والأحداث.
  • تغيير كاسر: أصبحت LogExceptionAsync وLogErrorAsync وLogEventAsync متزامنة تحت الأسماء LogException وLogError وLogEvent. فهي لم تكن تفعل سوى الإضافة إلى طابور محلي، أي أن await القديم كان يُحلّ عند الإضافة لا عند التسليم. للترحيل: احذف await واللاحقة Async.
  • Analytics.FlushAsync() الجديدة — انتظار حقيقي يفرّغ كل ما في الطابور إلى الخادم، للحظات النادرة التي يجب فيها تأكيد التسليم. أما التفريغ التلقائي فما يزال يعمل كما كان.
  • حزمة Unreal: تحديث مماثل قيد الإنجاز.
ميزات لوحة التحكم
  • لوحات الصدارة — رتّب اللاعبين حسب أي حقل رقمي في بيانات اللاعب، مع نوافذ أسبوعية وموسمية، ونطاقات حسب الدولة، واستثناءات للاعبين.
  • إشعارات اللعبة — قوالب، وحملات (لجميع اللاعبين أو لشريحة؛ فورية أو مجدولة أو متكرّرة)، وصندوق وارد لكل لاعب عبر التطبيق والبريد والإشعارات المدفوعة.
  • تنبيهات المطوّرين — قواعد تنبيه قائمة على عتبات السجلات، بدرجات خطورة، وفترات تهدئة، وسجل للتنبيهات في مركز التنبيهات.
  • بوابة توثيق عامة للمطوّرين، مع دليلَي حزمتَي Unity وUnreal.