دليل
كيف تصنع plugin لـ Minecraft بلغة Kotlin
حُدّث في 18 أكتوبر 2026
تعمل Kotlin على JVM، لذا يستخدم plugin الـ Kotlin واجهة Paper أو Spigot API نفسها، وplugin.yml نفسه، ومجلد plugins/ نفسه كما في plugin الـ Java. الكود أقصر وآمن من القيم الفارغة (null). والشيء الوحيد الذي لا تقلق بشأنه plugins الـ Java هو مكتبة Kotlin القياسية: الخادم لا يأتي بها، فعلى الـ plugin أن يجلبها معه.
ابدأ من هذا المثال.
ولّد هذا بـ Codexeخطوة بخطوة
1.أنشئ مشروع Gradle بـ Kotlin DSL
ملف
build.gradle.ktsمع pluginkotlin("jvm")، وسلسلة أدوات Java تطابق إصدار Minecraft لديك (17 أو 21 أو 25)، ومستودع PaperMC.2.أضف API الخادم
compileOnly("io.papermc.paper:paper-api:<version>"). كما في Java، يوفّرها الخادم أثناء التشغيل، فلا تُضمَّن أبداً.3.اكتب الفئة الرئيسية
class MyPlugin : JavaPlugin()معoverride fun onEnable(). سجّل الأوامر والمستمعين تماماً كما في Java.4.أحضر مكتبة Kotlin القياسية
ضمّنها في ملف .jar بـ plugin الـ Shadow، أو دع الخادم ينزّلها عند الإقلاع عبر قائمة
librariesفيplugin.yml. وبدون أحدهما يفشل الـ plugin معNoClassDefFoundError: kotlin/....5.اكتب plugin.yml
الملف نفسه كما في plugin الـ Java: الاسم، والإصدار، وmain (فئة Kotlin)، و
api-version، والأوامر والصلاحيات.6.ابنِ واختبر
./gradlew shadowJar(أوbuild)، وانسخ ملف .jar منbuild/libs/إلى خادم تجريبي واقرأ وحدة التحكم عند الإقلاع.
إيصال Kotlin إلى الخادم
- ضمّنها (shade): ينسخ plugin الـ Shadow في Gradle مكتبة Kotlin القياسية ومكتبات التشغيل الأخرى إلى ملف .jar الخاص بك. يعمل على كل الإصدارات وهو الخيار الأكثر شيوعاً.
- libraries في plugin.yml: منذ Spigot 1.16.5، يمكن للـ plugin أن يذكر مكتبات من Maven Central ينزّلها الخادم ويحمّلها له. يبقى ملف .jar صغيراً، لكن الخادم يحتاج إلى اتصال بالإنترنت عند الإقلاع الأول.
- المكتبات التي تضيفها: kotlinx-coroutines مكتبة منفصلة، ليست جزءاً من المكتبة القياسية، ويجب تضمينها أيضاً. نقلها (relocate) إلى حزمتك الخاصة يتجنب التعارض مع plugins أخرى تضمّن إصداراً آخر.
الـ coroutines والخيط الرئيسي
الـ coroutines طريقة نظيفة لتحميل البيانات من قاعدة بيانات دون تجميد الخادم، لكن Bukkit API (العوالم والكيانات والمخازن) يجب أن تُستخدم من الخيط الرئيسي. نفّذ العمل البطيء على dispatcher في الخلفية، ثم عد إلى خيط الخادم بالمجدول قبل لمس اللعبة. اربط نطاق الـ coroutine بالـ plugin، ليُلغى في onDisable().
Java أم Kotlin؟
| الميزة | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | واجهة Paper / Spigot API نفسها |
| بناء | Maven أو Gradle | Gradle مع build.gradle.kts |
| إضافات وقت التشغيل | لا شيء | مكتبة Kotlin القياسية، مضمّنة أو محمّلة |
| الشروحات والأمثلة | معظمها | أقل، لكن أمثلة Java تُنقل مباشرة |
مع Codexe
اختر Bukkit/Spigot/Paper (Kotlin). يولّد Codexe مشروع Gradle مع build.gradle.kts وPaper API وplugin الـ Shadow لتضمين ما لا يوفّره الخادم، والـ coroutines مضمّنة ومنقولة عندما يستخدمها الكود. ويجمّع الـ plugin قبل أن يصبح Ready، ويمكن تجربة plugins الـ Kotlin على خادم تجريبي وفحصها باللاعبين التجريبيين مثل plugins الـ Java. راجع مولّد plugins بلغة Kotlin.
"plugin لـ Paper 1.21.4 بلغة Kotlin باسم Bounties: الأمر /bounty set <player> <amount> عبر Vault، ويحصل القاتل على المكافأة، والأمر /bounty top يعرض أعلى 10، مخزّنة في SQLite مع coroutines للوصول إلى قاعدة البيانات. استخدم data classes ودوالّ الامتداد، وأبقِ استدعاءات Bukkit API على الخيط الرئيسي."
أسئلة
هل plugin الـ Kotlin أبطأ من plugin الـ Java؟
لا فرق يُذكر: كلاهما يُجمَّع إلى bytecode لـ JVM. يكون ملف .jar أكبر عند تضمين المكتبة القياسية.
هل يمكنني خلط Java وKotlin في plugin واحد؟
نعم، يجمّع Gradle الاثنين في المشروع نفسه، ويستدعي كود Kotlin فئات Java مباشرة.
لماذا يظهر NoClassDefFoundError لفئات kotlin؟
مكتبة Kotlin القياسية ليست في ملف .jar أو لم تُحمَّل. ابنِ بـ shadowJar وثبّت ذلك الملف .jar، أو أضف المكتبة إلى libraries في plugin.yml.
اصنع plugin بلغة Kotlin
يُفتح هذا الوصف جاهزاً للإرسال:
“plugin لـ Paper 1.21.4 بلغة Kotlin باسم Bounties: الأمر /bounty set <player> <amount> باستخدام اقتصاد Vault، ويحصل القاتل على المكافأة، و/bounty top يعرض أعلى 10، والمكافآت مخزّنة في SQLite مع coroutines للوصول إلى قاعدة البيانات، واستدعاءات Bukkit API على الخيط الرئيسي، والرسائل في config.yml.”
ولّد هذا بـ Codexe