คู่มือ
วิธีทำปลั๊กอิน Minecraft ด้วย Kotlin
อัปเดตเมื่อ 18 ตุลาคม 2569
Kotlin รันบน JVM ปลั๊กอิน Kotlin จึงใช้ Paper หรือ Spigot API ตัวเดียวกัน plugin.yml แบบเดียวกัน และโฟลเดอร์ plugins/ เดียวกันกับปลั๊กอิน Java โค้ดสั้นกว่าและปลอดภัยจาก null สิ่งเดียวที่ปลั๊กอิน Java ไม่ต้องกังวลคือ Kotlin standard library: เซิร์ฟเวอร์ไม่ได้มีมาให้ ปลั๊กอินจึงต้องนำมาเอง
เริ่มจากตัวอย่างนี้
สร้างสิ่งนี้ด้วย Codexeทีละขั้นตอน
1.สร้างโปรเจกต์ Gradle ด้วย Kotlin DSL
build.gradle.ktsที่มีปลั๊กอินkotlin("jvm")Java toolchain ที่ตรงกับเวอร์ชัน Minecraft ของคุณ (17, 21 หรือ 25) และ repository ของ PaperMC2.เพิ่ม API ของเซิร์ฟเวอร์
compileOnly("io.papermc.paper:paper-api:<version>")เหมือนใน Java เซิร์ฟเวอร์จะจัดหาให้ตอนรัน จึงไม่ต้องรวมเข้าไปเลย3.เขียนคลาสหลัก
class MyPlugin : JavaPlugin()พร้อมoverride fun onEnable()ลงทะเบียนคำสั่งและ listener แบบเดียวกับใน Java ทุกประการ4.นำ Kotlin standard library มาด้วย
รวมเข้าไปใน .jar ด้วยปลั๊กอิน Shadow หรือให้เซิร์ฟเวอร์ดาวน์โหลดตอนเริ่มทำงานผ่านรายการ
librariesในplugin.ymlถ้าไม่ทำอย่างใดอย่างหนึ่ง ปลั๊กอินจะล้มเหลวด้วยNoClassDefFoundError: kotlin/...5.เขียน plugin.yml
ไฟล์เดียวกับปลั๊กอิน Java: ชื่อ เวอร์ชัน main (คลาส Kotlin)
api-versionคำสั่ง และ permission6.บิลด์และทดสอบ
./gradlew shadowJar(หรือbuild) คัดลอก .jar จากbuild/libs/ไปยังเซิร์ฟเวอร์ทดสอบ แล้วอ่านคอนโซลตอนเริ่มทำงาน
การนำ Kotlin ขึ้นเซิร์ฟเวอร์
- Shade: ปลั๊กอิน Shadow ของ Gradle จะคัดลอก Kotlin standard library และไลบรารีที่ใช้ตอนรันอื่นๆ เข้าไปใน .jar ของคุณ ใช้ได้ทุกเวอร์ชันและเป็นตัวเลือกที่นิยมที่สุด
- libraries ใน plugin.yml: ตั้งแต่ Spigot 1.16.5 ปลั๊กอินระบุไลบรารีจาก Maven Central ที่เซิร์ฟเวอร์จะดาวน์โหลดและโหลดให้ได้ .jar จะเล็ก แต่เซิร์ฟเวอร์ต้องเชื่อมต่ออินเทอร์เน็ตได้ตอนเริ่มครั้งแรก
- ไลบรารีที่คุณเพิ่มเอง: kotlinx-coroutines เป็นไลบรารีแยก ไม่ได้อยู่ใน standard library และต้องรวมเข้าไปด้วย การ relocate ไปไว้ใน package ของคุณเองช่วยกันการชนกับปลั๊กอินอื่นที่รวมเวอร์ชันอื่นไว้
Coroutine กับเธรดหลัก
Coroutine เป็นวิธีที่เรียบร้อยในการโหลดข้อมูลจากฐานข้อมูลโดยไม่ทำให้เซิร์ฟเวอร์ค้าง แต่ Bukkit API (โลก เอนทิตี อินเวนทอรี) ยังต้องเรียกจากเธรดหลัก ทำงานที่ช้าบน dispatcher เบื้องหลัง แล้วสลับกลับมาที่เธรดของเซิร์ฟเวอร์ด้วย scheduler ก่อนแตะต้องเกม ผูก coroutine scope ไว้กับปลั๊กอิน เพื่อให้ถูกยกเลิกใน onDisable()
Java หรือ Kotlin?
| ฟีเจอร์ | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | Paper / Spigot API ตัวเดียวกัน |
| บิลด์ | Maven หรือ Gradle | Gradle กับ build.gradle.kts |
| ส่วนเพิ่มตอนรัน | ไม่มี | Kotlin standard library แบบรวมไว้หรือโหลดตอนรัน |
| บทเรียนและตัวอย่าง | ส่วนใหญ่ | น้อยกว่า แต่ตัวอย่าง Java แปลงมาใช้ได้ตรงๆ |
ด้วย Codexe
เลือก Bukkit/Spigot/Paper (Kotlin) Codexe จะสร้างโปรเจกต์ Gradle ที่มี build.gradle.kts, Paper API, ปลั๊กอิน Shadow สำหรับรวมสิ่งที่เซิร์ฟเวอร์ไม่มีให้ และ coroutine ที่รวมและ relocate ไว้เมื่อโค้ดใช้ มันคอมไพล์ปลั๊กอินก่อนจะพร้อม และปลั๊กอิน Kotlin ลองบนเซิร์ฟเวอร์ทดสอบและให้ผู้เล่นทดสอบเช็กได้เหมือนปลั๊กอิน Java ดู ตัวสร้างปลั๊กอิน Kotlin
"ปลั๊กอิน Paper 1.21.4 ด้วย Kotlin ชื่อ Bounties: /bounty set <player> <amount> ผ่าน Vault คนที่ฆ่าได้รางวัล /bounty top แสดง 10 อันดับสูงสุด เก็บใน SQLite โดยใช้ coroutine สำหรับเข้าถึงฐานข้อมูล ใช้ data class และ extension function และเรียก Bukkit API บนเธรดหลัก"
คำถาม
ปลั๊กอิน Kotlin ช้ากว่าปลั๊กอิน Java ไหม?
ไม่ต่างกันอย่างมีนัยสำคัญ: ทั้งคู่คอมไพล์เป็น JVM bytecode .jar จะใหญ่กว่าเมื่อรวม standard library ไว้
ผสม Java กับ Kotlin ในปลั๊กอินเดียวได้ไหม?
ได้ Gradle คอมไพล์ทั้งสองภาษาในโปรเจกต์เดียวกัน และโค้ด Kotlin เรียกคลาส Java ได้โดยตรง
ทำไมถึงเจอ NoClassDefFoundError ของคลาส kotlin?
Kotlin standard library ไม่ได้อยู่ใน .jar หรือไม่ได้ถูกโหลด บิลด์ด้วย shadowJar แล้วติดตั้ง .jar นั้น หรือเพิ่มไลบรารีลงใน libraries ใน plugin.yml
สร้างปลั๊กอิน Kotlin
พรอมต์นี้จะเปิดขึ้นพร้อมส่งได้ทันที:
“ปลั๊กอิน Paper 1.21.4 ด้วย Kotlin ชื่อ Bounties: /bounty set <player> <amount> ใช้ระบบเศรษฐกิจของ Vault คนที่ฆ่าได้รางวัล /bounty top แสดง 10 อันดับสูงสุด ค่าหัวเก็บใน SQLite โดยใช้ coroutine สำหรับเข้าถึงฐานข้อมูล เรียก Bukkit API บนเธรดหลัก ข้อความอยู่ใน config.yml”
สร้างสิ่งนี้ด้วย Codexe