Návod
Jak vytvořit plugin pro Minecraft v Kotlinu
Aktualizováno 18. října 2026
Kotlin běží na JVM, takže plugin v Kotlinu používá stejné API Paperu nebo Spigotu, stejný plugin.yml a stejnou složku plugins/ jako plugin v Javě. Kód je kratší a bezpečný vůči null. Jediná věc, kterou pluginy v Javě řešit nemusí, je standardní knihovna Kotlinu: server ji nedodává, takže si ji plugin musí přinést.
Začni tímto příkladem.
Vygeneruj to s CodexeKrok za krokem
1.Vytvoř projekt Gradle s Kotlin DSL
build.gradle.ktss pluginemkotlin("jvm"), Java toolchainem odpovídajícím tvé verzi Minecraftu (17, 21 nebo 25) a repozitářem PaperMC.2.Přidej API serveru
compileOnly("io.papermc.paper:paper-api:<version>"). Stejně jako v Javě ho za běhu dodá server, takže se nikdy nebalí do pluginu.3.Napiš hlavní třídu
class MyPlugin : JavaPlugin()soverride fun onEnable(). Příkazy a posluchače registruj úplně stejně jako v Javě.4.Přibal standardní knihovnu Kotlinu
Zabal ji do .jar pluginem Shadow, nebo ji nech server stáhnout při startu přes seznam
librariesvplugin.yml. Bez jednoho z nich plugin spadne sNoClassDefFoundError: kotlin/....5.Napiš plugin.yml
Stejný soubor jako u pluginu v Javě: name, version, main (třída v Kotlinu),
api-version, příkazy a oprávnění.6.Sestav a otestuj
./gradlew shadowJar(nebobuild), zkopíruj .jar zbuild/libs/na testovací server a při startu si přečti konzoli.
Jak dostat Kotlin na server
- Zabalit ho: Gradle plugin Shadow zkopíruje standardní knihovnu Kotlinu a další knihovny pro běh do tvého .jar. Funguje na každé verzi a je to nejčastější volba.
- libraries v plugin.yml: od Spigotu 1.16.5 může plugin uvést knihovny z Maven Central, které mu server stáhne a načte. .jar zůstane malý, ale server při prvním startu potřebuje přístup k internetu.
- Knihovny, které přidáš: kotlinx-coroutines je samostatná knihovna, ne součást standardní knihovny, a musí se zabalit taky. Když ji přesuneš (relocate) do vlastního balíčku, předejdeš konfliktům s jinými pluginy, které přibalují jinou verzi.
Korutiny a hlavní vlákno
Korutiny jsou čistý způsob, jak načíst data z databáze, aniž by server zamrzl, ale API Bukkitu (světy, entity, inventáře) se pořád musí používat z hlavního vlákna. Pomalou práci dělej na dispatcheru na pozadí a před sáhnutím na hru se plánovačem přepni zpátky do vlákna serveru. Scope korutin svaž s pluginem, aby se v onDisable() zrušil.
Java, nebo Kotlin?
| Funkce | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | Stejné API Paperu / Spigotu |
| Sestavit | Maven nebo Gradle | Gradle s build.gradle.kts |
| Navíc za běhu | Žádné | Standardní knihovna Kotlinu, přibalená nebo načtená |
| Návody a příklady | Většina z nich | Méně, ale příklady v Javě jdou přímo převést |
S Codexe
Vyber Bukkit/Spigot/Paper (Kotlin). Codexe vygeneruje projekt Gradle s build.gradle.kts, API Paperu, pluginem Shadow, který zabalí to, co server nedodává, a korutinami přibalenými a přesunutými, pokud je kód používá. Plugin zkompiluje, než je Ready, a pluginy v Kotlinu jde stejně jako ty v Javě vyzkoušet na testovacím serveru a nechat zkontrolovat testovacími hráči. Viz generátor pluginů v Kotlinu.
„Plugin pro Paper 1.21.4 v Kotlinu jménem Bounties: /bounty set <player> <amount> přes Vault, odměnu dostane ten, kdo hráče zabije, /bounty top ukáže 10 nejvyšších, uložené v SQLite s korutinami pro přístup k databázi. Použij data classes a extension functions, volání API Bukkitu nech na hlavním vlákně.“
Otázky
Je plugin v Kotlinu pomalejší než plugin v Javě?
Žádný podstatný rozdíl: obojí se kompiluje do bajtkódu JVM. .jar je větší, když je v něm přibalená standardní knihovna.
Můžu v jednom pluginu míchat Javu a Kotlin?
Ano, Gradle zkompiluje obojí v jednom projektu a kód v Kotlinu volá třídy v Javě přímo.
Proč NoClassDefFoundError u tříd kotlin?
Standardní knihovna Kotlinu není v .jar nebo se nenačetla. Sestav přes shadowJar a nainstaluj ten .jar, nebo přidej knihovnu do libraries v plugin.yml.
Vytvoř plugin v Kotlinu
Toto zadání se otevře připravené k odeslání:
“Plugin pro Paper 1.21.4 v Kotlinu jménem Bounties: /bounty set <player> <amount> s ekonomikou Vault, odměnu dostane ten, kdo hráče zabije, /bounty top ukáže 10 nejvyšších, odměny uložené v SQLite s korutinami pro přístup k databázi, volání API Bukkitu na hlavním vlákně, zprávy v config.yml.”
Vygeneruj to s Codexe