دليل

كيف تصنع plugin لـ Minecraft بلغة Kotlin

حُدّث في 18 أكتوبر 2026

تعمل Kotlin على JVM، لذا يستخدم plugin الـ Kotlin واجهة Paper أو Spigot API نفسها، وplugin.yml نفسه، ومجلد plugins/ نفسه كما في plugin الـ Java. الكود أقصر وآمن من القيم الفارغة (null). والشيء الوحيد الذي لا تقلق بشأنه plugins الـ Java هو مكتبة Kotlin القياسية: الخادم لا يأتي بها، فعلى الـ plugin أن يجلبها معه.

ابدأ من هذا المثال.

ولّد هذا بـ Codexe

خطوة بخطوة

  1. 1.أنشئ مشروع Gradle بـ Kotlin DSL

    ملف build.gradle.kts مع plugin kotlin("jvm")، وسلسلة أدوات Java تطابق إصدار Minecraft لديك (17 أو 21 أو 25)، ومستودع PaperMC.

  2. 2.أضف API الخادم

    compileOnly("io.papermc.paper:paper-api:<version>"). كما في Java، يوفّرها الخادم أثناء التشغيل، فلا تُضمَّن أبداً.

  3. 3.اكتب الفئة الرئيسية

    class MyPlugin : JavaPlugin() مع override fun onEnable(). سجّل الأوامر والمستمعين تماماً كما في Java.

  4. 4.أحضر مكتبة Kotlin القياسية

    ضمّنها في ملف .jar بـ plugin الـ Shadow، أو دع الخادم ينزّلها عند الإقلاع عبر قائمة libraries في plugin.yml. وبدون أحدهما يفشل الـ plugin مع NoClassDefFoundError: kotlin/....

  5. 5.اكتب plugin.yml

    الملف نفسه كما في plugin الـ Java: الاسم، والإصدار، وmain (فئة Kotlin)، وapi-version، والأوامر والصلاحيات.

  6. 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؟

الميزةJavaKotlin
APIPaper / Spigotواجهة Paper / Spigot API نفسها
بناءMaven أو GradleGradle مع 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
كيف تصنع plugin لـ Minecraft بلغة Kotlin (Paper) | Codexe