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 CodexeTừng bước
1.Tạo dự án Gradle với Kotlin DSL
Một
build.gradle.ktsvới pluginkotlin("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.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.Viết lớp chính
class MyPlugin : JavaPlugin()vớioverride fun onEnable(). Đăng ký lệnh và listener y hệt như trong Java.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
librariestrongplugin.yml. Không có một trong hai cách đó, plugin sẽ lỗi vớiNoClassDefFoundError: kotlin/....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.Build và kiểm thử
./gradlew shadowJar(hoặcbuild), 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ăng | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | Cùng API Paper / Spigot |
| Build | Maven hoặc Gradle | Gradle với build.gradle.kts |
| Thành phần bổ sung lúc chạy | Không | Thư 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