คู่มือ

วิธีทำปลั๊กอิน Minecraft ด้วย Kotlin

อัปเดตเมื่อ 18 ตุลาคม 2569

Kotlin รันบน JVM ปลั๊กอิน Kotlin จึงใช้ Paper หรือ Spigot API ตัวเดียวกัน plugin.yml แบบเดียวกัน และโฟลเดอร์ plugins/ เดียวกันกับปลั๊กอิน Java โค้ดสั้นกว่าและปลอดภัยจาก null สิ่งเดียวที่ปลั๊กอิน Java ไม่ต้องกังวลคือ Kotlin standard library: เซิร์ฟเวอร์ไม่ได้มีมาให้ ปลั๊กอินจึงต้องนำมาเอง

เริ่มจากตัวอย่างนี้

สร้างสิ่งนี้ด้วย Codexe

ทีละขั้นตอน

  1. 1.สร้างโปรเจกต์ Gradle ด้วย Kotlin DSL

    build.gradle.kts ที่มีปลั๊กอิน kotlin("jvm") Java toolchain ที่ตรงกับเวอร์ชัน Minecraft ของคุณ (17, 21 หรือ 25) และ repository ของ PaperMC

  2. 2.เพิ่ม API ของเซิร์ฟเวอร์

    compileOnly("io.papermc.paper:paper-api:<version>") เหมือนใน Java เซิร์ฟเวอร์จะจัดหาให้ตอนรัน จึงไม่ต้องรวมเข้าไปเลย

  3. 3.เขียนคลาสหลัก

    class MyPlugin : JavaPlugin() พร้อม override fun onEnable() ลงทะเบียนคำสั่งและ listener แบบเดียวกับใน Java ทุกประการ

  4. 4.นำ Kotlin standard library มาด้วย

    รวมเข้าไปใน .jar ด้วยปลั๊กอิน Shadow หรือให้เซิร์ฟเวอร์ดาวน์โหลดตอนเริ่มทำงานผ่านรายการ libraries ใน plugin.yml ถ้าไม่ทำอย่างใดอย่างหนึ่ง ปลั๊กอินจะล้มเหลวด้วย NoClassDefFoundError: kotlin/...

  5. 5.เขียน plugin.yml

    ไฟล์เดียวกับปลั๊กอิน Java: ชื่อ เวอร์ชัน main (คลาส Kotlin) api-version คำสั่ง และ permission

  6. 6.บิลด์และทดสอบ

    ./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?

ฟีเจอร์JavaKotlin
APIPaper / SpigotPaper / Spigot API ตัวเดียวกัน
บิลด์Maven หรือ GradleGradle กับ 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
วิธีทำปลั๊กอิน Minecraft ด้วย Kotlin (Paper) | Codexe