Οδηγός
Πώς να φτιάξεις ένα Minecraft plugin σε Kotlin
Ενημερώθηκε 18 Οκτωβρίου 2026
Η Kotlin τρέχει στο JVM, οπότε ένα plugin σε Kotlin χρησιμοποιεί το ίδιο Paper ή Spigot API, το ίδιο plugin.yml και τον ίδιο φάκελο plugins/ με ένα plugin σε Java. Ο κώδικας είναι πιο σύντομος και null-safe. Το μόνο που δεν απασχολεί τα plugins σε Java είναι η standard library της Kotlin: ο server δεν την περιέχει, οπότε πρέπει να τη φέρει το plugin.
Ξεκίνα από αυτό το παράδειγμα.
Φτιάξ' το με το CodexeΒήμα βήμα
1.Δημιούργησε ένα project Gradle με Kotlin DSL
Ένα
build.gradle.ktsμε το pluginkotlin("jvm"), ένα Java toolchain που ταιριάζει με την έκδοση του Minecraft σου (17, 21 ή 25) και το repository του PaperMC.2.Πρόσθεσε το API του server
compileOnly("io.papermc.paper:paper-api:<version>"). Όπως και στη Java, ο server το παρέχει κατά την εκτέλεση, οπότε δεν μπαίνει ποτέ μέσα στο .jar.3.Γράψε την κύρια κλάση
class MyPlugin : JavaPlugin()μεoverride fun onEnable(). Κατάχωρισε εντολές και listeners ακριβώς όπως στη Java.4.Φέρε τη standard library της Kotlin
Βάλ' τη μέσα στο .jar με το plugin Shadow ή άφησε τον server να την κατεβάσει στην εκκίνηση μέσω της λίστας
librariesστοplugin.yml. Χωρίς ένα από τα δύο το plugin αποτυγχάνει μεNoClassDefFoundError: kotlin/....5.Γράψε το plugin.yml
Το ίδιο αρχείο με ένα plugin σε Java: όνομα, έκδοση, main (η κλάση Kotlin),
api-version, εντολές και permissions.6.Build και δοκιμή
./gradlew shadowJar(ήbuild), αντίγραψε το .jar από τοbuild/libs/σε έναν δοκιμαστικό server και διάβασε την κονσόλα στην εκκίνηση.
Πώς φτάνει η Kotlin στον server
- Κάνε τη shade: το Gradle plugin Shadow αντιγράφει τη standard library της Kotlin και άλλες βιβλιοθήκες εκτέλεσης μέσα στο .jar σου. Λειτουργεί σε κάθε έκδοση και είναι η πιο συνηθισμένη επιλογή.
- libraries στο plugin.yml: από το Spigot 1.16.5, ένα plugin μπορεί να δηλώνει βιβλιοθήκες του Maven Central που ο server κατεβάζει και φορτώνει γι' αυτό. Το .jar μένει μικρό, αλλά ο server χρειάζεται πρόσβαση στο internet στην πρώτη εκκίνηση.
- Βιβλιοθήκες που προσθέτεις: το kotlinx-coroutines είναι ξεχωριστή βιβλιοθήκη, όχι μέρος της standard library, και πρέπει κι αυτό να μπει στο .jar. Αν το κάνεις relocate στο δικό σου package, αποφεύγεις συγκρούσεις με άλλα plugins που περιέχουν άλλη έκδοση.
Coroutines και main thread
Οι coroutines είναι ένας καθαρός τρόπος να φορτώνεις δεδομένα από μια βάση χωρίς να παγώνει ο server, αλλά το Bukkit API (κόσμοι, οντότητες, inventories) πρέπει να χρησιμοποιείται πάντα από το main thread. Κάνε την αργή δουλειά σε έναν background dispatcher και μετά γύρνα στο thread του server με τον scheduler πριν αγγίξεις το παιχνίδι. Δέσε το coroutine scope με το plugin, ώστε να ακυρώνεται στο onDisable().
Java ή Kotlin;
| Λειτουργία | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | Το ίδιο Paper / Spigot API |
| Build | Maven ή Gradle | Gradle με build.gradle.kts |
| Επιπλέον στην εκτέλεση | Κανένα | Standard library της Kotlin, μέσα στο .jar ή φορτωμένη |
| Tutorials και παραδείγματα | Τα περισσότερα | Λιγότερα, αλλά τα παραδείγματα σε Java μεταφέρονται κατευθείαν |
Με το Codexe
Διάλεξε Bukkit/Spigot/Paper (Kotlin). Το Codexe δημιουργεί ένα project Gradle με build.gradle.kts, το Paper API, το plugin Shadow για να μπει στο .jar ό,τι δεν παρέχει ο server, και coroutines μέσα στο .jar και με relocate όταν τις χρησιμοποιεί ο κώδικας. Κάνει compile το plugin πριν γίνει Έτοιμο, και τα plugins σε Kotlin δοκιμάζονται σε δοκιμαστικό server και ελέγχονται από δοκιμαστικούς παίκτες όπως και αυτά σε Java. Δες τον generator για plugins σε Kotlin.
«Ένα plugin για Paper 1.21.4 σε Kotlin με το όνομα Bounties: /bounty set <player> <amount> μέσω Vault, ο δολοφόνος παίρνει την ανταμοιβή, το /bounty top δείχνει τα 10 υψηλότερα, αποθήκευση σε SQLite με coroutines για την πρόσβαση στη βάση. Χρησιμοποίησε data classes και extension functions, κράτα τις κλήσεις του Bukkit API στο main thread.»
Ερωτήσεις
Είναι ένα plugin σε Kotlin πιο αργό από ένα plugin σε Java;
Καμία ουσιαστική διαφορά: και τα δύο γίνονται compile σε JVM bytecode. Το .jar είναι μεγαλύτερο όταν περιέχει τη standard library.
Μπορώ να συνδυάσω Java και Kotlin σε ένα plugin;
Ναι, το Gradle κάνει compile και τα δύο στο ίδιο project και ο κώδικας Kotlin καλεί απευθείας κλάσεις Java.
Γιατί NoClassDefFoundError για κλάσεις kotlin;
Η standard library της Kotlin δεν είναι μέσα στο .jar ή δεν φορτώνεται. Κάνε build με shadowJar και εγκατάστησε εκείνο το .jar ή πρόσθεσε τη βιβλιοθήκη στο libraries του plugin.yml.
Φτιάξε ένα plugin σε Kotlin
Αυτό το prompt ανοίγει έτοιμο για αποστολή:
“Ένα plugin για Paper 1.21.4 σε Kotlin με το όνομα Bounties: /bounty set <player> <amount> με την οικονομία του Vault, ο δολοφόνος παίρνει την ανταμοιβή, το /bounty top δείχνει τα 10 υψηλότερα, bounties αποθηκευμένα σε SQLite με coroutines για την πρόσβαση στη βάση, κλήσεις του Bukkit API στο main thread, μηνύματα στο config.yml.”
Φτιάξ' το με το Codexe