Hướng dẫn

Cách làm plugin Minecraft bằng Kotlin

Cập nhật 18 tháng 10, 2026

Kotlin chạy trên JVM, nên plugin Kotlin dùng cùng API Paper hoặc Spigot, cùng plugin.yml và cùng thư mục plugins/ như plugin Java. Mã ngắn hơn và an toàn với null. Thứ duy nhất mà plugin Java không phải lo là thư viện chuẩn Kotlin: máy chủ không có sẵn nó, nên plugin phải tự mang theo.

Bắt đầu từ ví dụ này.

Tạo thứ này với Codexe

Từng bước

  1. 1.Tạo dự án Gradle với Kotlin DSL

    Một build.gradle.kts với plugin kotlin("jvm"), một Java toolchain khớp với phiên bản Minecraft của bạn (17, 21 hoặc 25) và kho PaperMC.

  2. 2.Thêm API của máy chủ

    compileOnly("io.papermc.paper:paper-api:<version>"). Giống như với Java, máy chủ cung cấp nó lúc chạy, nên nó không bao giờ được đóng gói kèm.

  3. 3.Viết lớp chính

    class MyPlugin : JavaPlugin() với override fun onEnable(). Đăng ký lệnh và listener y hệt như trong Java.

  4. 4.Mang theo thư viện chuẩn Kotlin

    Đóng gói nó vào tệp .jar bằng plugin Shadow, hoặc để máy chủ tải nó về lúc khởi động qua danh sách libraries trong plugin.yml. Không có một trong hai cách đó, plugin sẽ lỗi với NoClassDefFoundError: kotlin/....

  5. 5.Viết plugin.yml

    Cùng một tệp như plugin Java: tên, phiên bản, main (lớp Kotlin), api-version, lệnh và quyền.

  6. 6.Build và kiểm thử

    ./gradlew shadowJar (hoặc build), sao chép tệp .jar từ build/libs/ sang một máy chủ thử nghiệm và đọc console lúc khởi động.

Đưa Kotlin lên máy chủ

  • Shade nó: plugin Gradle Shadow chép thư viện chuẩn Kotlin và các thư viện runtime khác vào tệp .jar của bạn. Cách này chạy trên mọi phiên bản và là lựa chọn phổ biến nhất.
  • libraries trong plugin.yml: từ Spigot 1.16.5, plugin có thể liệt kê các thư viện Maven Central để máy chủ tải về và nạp giúp nó. Tệp .jar vẫn nhỏ, nhưng máy chủ cần có internet ở lần khởi động đầu tiên.
  • Thư viện bạn thêm vào: kotlinx-coroutines là một thư viện riêng, không thuộc thư viện chuẩn, và cũng phải được đóng gói kèm. Relocate nó vào package của riêng bạn để tránh xung đột với các plugin khác đóng gói phiên bản khác.

Coroutine và luồng chính

Coroutine là cách gọn gàng để nạp dữ liệu từ cơ sở dữ liệu mà không làm đứng máy chủ, nhưng API Bukkit (thế giới, thực thể, túi đồ) vẫn phải được dùng từ luồng chính. Hãy làm việc chậm trên một dispatcher nền, rồi chuyển về luồng máy chủ bằng scheduler trước khi tác động vào game. Gắn coroutine scope với plugin để nó bị hủy trong onDisable().

Java hay Kotlin?

Tính năngJavaKotlin
APIPaper / SpigotCùng API Paper / Spigot
BuildMaven hoặc GradleGradle với build.gradle.kts
Thành phần bổ sung lúc chạyKhôngThư viện chuẩn Kotlin, đóng gói kèm hoặc được nạp
Hướng dẫn và ví dụPhần lớnÍt hơn, nhưng ví dụ Java chuyển sang được trực tiếp

Với Codexe

Chọn Bukkit/Spigot/Paper (Kotlin). Codexe tạo một dự án Gradle với build.gradle.kts, API Paper, plugin Shadow để đóng gói những gì máy chủ không cung cấp, và coroutine được đóng gói kèm và relocate khi mã có dùng. Nó biên dịch plugin trước khi Sẵn sàng, và plugin Kotlin có thể được thử trên máy chủ thử nghiệm và được người chơi thử nghiệm kiểm tra giống như plugin Java. Xem trình tạo plugin Kotlin.

"Một plugin Paper 1.21.4 viết bằng Kotlin tên Bounties: /bounty set <player> <amount> qua Vault, người hạ gục nhận phần thưởng, /bounty top hiển thị 10 mức cao nhất, lưu trong SQLite với coroutine để truy cập cơ sở dữ liệu. Dùng data class và extension function, giữ các lệnh gọi API Bukkit trên luồng chính."

Câu hỏi

Plugin Kotlin có chậm hơn plugin Java không?

Không có khác biệt đáng kể: cả hai đều biên dịch ra bytecode JVM. Tệp .jar sẽ lớn hơn khi thư viện chuẩn được đóng gói kèm.

Tôi có thể trộn Java và Kotlin trong một plugin không?

Có, Gradle biên dịch cả hai trong cùng một dự án, và mã Kotlin gọi trực tiếp các lớp Java.

Vì sao bị NoClassDefFoundError với các lớp kotlin?

Thư viện chuẩn Kotlin không có trong tệp .jar hoặc không được nạp. Hãy build bằng shadowJar và cài tệp .jar đó, hoặc thêm thư viện vào libraries trong plugin.yml.

Làm plugin Kotlin

Prompt này mở ra sẵn sàng để gửi:

“Một plugin Paper 1.21.4 viết bằng Kotlin tên Bounties: /bounty set <player> <amount> dùng nền kinh tế Vault, người hạ gục nhận phần thưởng, /bounty top hiển thị 10 mức cao nhất, tiền truy nã lưu trong SQLite với coroutine để truy cập cơ sở dữ liệu, lệnh gọi API Bukkit trên luồng chính, tin nhắn trong config.yml.”

Tạo thứ này với Codexe
Cách làm plugin Minecraft bằng Kotlin (Paper) | Codexe