دليل
كيف تصنع plugin لـ Folia
حُدّث في 18 أكتوبر 2026
Folia فرع من Paper يقسّم العالم إلى مناطق ويشغّل كل منها على خيط مختلف، لتستطيع الخوادم الكبيرة استخدام أنوية معالج كثيرة. لم يعد هناك خيط رئيسي واحد، وهذا يعطّل مجدول Bukkit المعتاد. plugin الـ Folia هو plugin لـ Paper مكتوب لهذا النموذج، ويجب أن يصرّح بذلك في plugin.yml.
مثال يتضمن تفاصيل التوقيت التي يحتاجها Folia.
ولّد هذا بـ Codexeخطوة بخطوة
1.تأكد أنك تحتاج إلى Folia
يفيد Folia الخوادم ذات اللاعبين الكثيرين المنتشرين في أنحاء العالم. معظم الخوادم تعمل بـ Paper؛ وكثير من الـ plugins الشائعة لا تدعم Folia، لذا تحقق أولاً من تلك التي تعتمد عليها.
2.ابنِ على Folia API
استخدم الاعتمادية
folia-apiلإصدارك من مستودع PaperMC، بنطاقprovided، في مشروع Maven أو Gradle.3.استبدل مجدول Bukkit
لا يعمل
Bukkit.getScheduler()على Folia. استخدم مجدول المنطقة للعمل في موقع، ومجدول الكيان للعمل على لاعب أو وحش، ومجدول المنطقة العامة للمهام على مستوى العالم كله، والمجدول غير المتزامن لعمليات الإدخال والإخراج.4.لا تلمس الأشياء إلا من منطقتها
غيّر الكتلة أو الكيان فقط على الخيط الذي يملكه. استخدم
teleportAsyncبدلاً منteleport، وجدوِل العمل على منطقة الهدف قبل تغييره.5.صرّح بدعم Folia
أضف
folia-supported: trueإلىplugin.yml. وبدونه يرفض Folia تحميل الـ plugin.6.اختبر على خادم Folia
التجميع يثبت أن الكود يُبنى على Folia API، لا أنه آمن مع الخيوط. شغّله على خادم Folia تجريبي مع عدة لاعبين في أماكن مختلفة.
المجدولات الأربعة
| المجدول | تحصل عليه عبر | استخدمه لـ |
|---|---|---|
| المنطقة | Bukkit.getRegionScheduler() | العمل في موقع من العالم: وضع الكتل، وإظهار الكيانات |
| الكيان | entity.getScheduler() | العمل على لاعب أو وحش واحد، ويتبعه عبر المناطق |
| المنطقة العامة | Bukkit.getGlobalRegionScheduler() | وقت العالم، والطقس، والأشياء غير المرتبطة بموقع |
| غير متزامن | Bukkit.getAsyncScheduler() | قاعدة البيانات، والملفات، وطلبات الويب، ولا يلمس العالم أبداً |
ما الذي يتعطل عادةً
- المهام المتكررة لكل اللاعبين: لم تعد حلقة واحدة على كل اللاعبين المتصلين تعمل؛ جدوِل مهمة على مجدول الكيان لكل لاعب بدلاً من ذلك.
- الانتقالات والتمهيد: "الانتقال بعد 3 ثوانٍ" يحتاج إلى مجدول الكيان و
teleportAsync. - البيانات المشتركة: الخرائط والعدّادات المستخدمة من عدة مناطق يجب أن تكون آمنة مع الخيوط، مثل المجموعات المتزامنة.
- الاعتماديات: المكتبة التي تستدعي مجدول Bukkit ترمي
UnsupportedOperationExceptionعلى Folia.
plugin واحد لـ Paper وFolia
مجدولات المنطقة والكيان والعام وغير المتزامن جزء أيضاً من Paper API في الإصدارات الحالية، لذا فالـ plugin الذي يستخدمها وحدها ويصرّح بـ folia-supported: true يمكنه العمل على Paper وFolia معاً. وهذا غالباً أفضل هدف: ملف .jar واحد لكل خادم.
مع Codexe
اختر النوع Folia. يجدوِل الـ plugin المولَّد العمل بمجدولات المنطقة والكيان والمنطقة العامة وغير المتزامن، ويصرّح بـ folia-supported: true ويُبنى على Folia API بـ Maven. ويُجمَّع ويُفحص قبل أن يصبح Ready.
ضع تفاصيل التوقيت في الطلب ("كل دقيقة لكل لاعب متصل"، "الانتقال بعد 3 ثوانٍ"): فهنا يختلف كود Folia أكثر ما يختلف. لا تشغّل «جرّبه الآن» خوادم Folia بعد، لذا اختبر ملف .jar على خادم Folia الخاص بك.
أسئلة
هل تعمل plugins الـ Paper على Folia؟
فقط إذا كانت مكتوبة له وتصرّح بـ folia-supported: true. أما plugin الـ Paper العادي الذي يستخدم مجدول Bukkit فيُرفض أو يفشل.
هل يعمل plugin الـ Folia على Paper؟
نعم، عندما يستخدم فقط واجهات API موجودة أيضاً في Paper، ومنها مجدولات Folia في إصدارات Paper الحالية.
plugin الـ Folia الخاص بي يرمي استثناءً متعلقاً بالمجدول
ما زال بعض الكود، غالباً من مكتبة، يستخدم مجدول Bukkit. اطلب في محادثة المشروع نقله إلى مجدول المنطقة أو الكيان.
اصنع plugin لـ Folia
يُفتح هذا الوصف جاهزاً للإرسال:
“plugin لـ Folia 1.21.4 باسم RTP: الأمر /rtp ينقل اللاعب إلى موقع آمن عشوائي ضمن 5000 كتلة بعد تمهيد 3 ثوانٍ يُلغى عند الحركة، باستخدام مجدول الكيان وteleportAsync، ومهلة انتظار 10 دقائق لكل لاعب محفوظة في SQLite، وfolia-supported: true، ونصف القطر ومهلة الانتظار والرسائل في config.yml.”
ولّد هذا بـ Codexe