Panduan
Cara membuat plugin Folia
Diperbarui 18 Oktober 2026
Folia adalah fork Paper yang membagi world menjadi region dan menjalankan tick-nya di thread yang berbeda, sehingga server besar bisa memakai banyak core CPU. Tidak ada lagi satu main thread, dan itu merusak scheduler Bukkit yang biasa. Plugin Folia adalah plugin Paper yang ditulis untuk model tersebut, dan harus menyatakannya di plugin.yml.
Contoh dengan detail waktu yang dibutuhkan Folia.
Buat ini dengan CodexeLangkah demi langkah
1.Pastikan kamu memang butuh Folia
Folia membantu server dengan banyak pemain yang tersebar di seluruh world. Kebanyakan server memakai Paper; banyak plugin populer tidak mendukung Folia, jadi periksa dulu plugin yang kamu andalkan.
2.Build dengan Folia API
Gunakan dependensi
folia-apiuntuk versimu dari repository PaperMC, dengan scopeprovided, di proyek Maven atau Gradle.3.Ganti scheduler Bukkit
Bukkit.getScheduler()tidak berfungsi di Folia. Gunakan region scheduler untuk pekerjaan di suatu lokasi, entity scheduler untuk pekerjaan pada pemain atau mob, global region scheduler untuk tugas di seluruh world, dan async scheduler untuk I/O.4.Sentuh sesuatu hanya dari region-nya sendiri
Ubah blok atau entity hanya di thread yang memilikinya. Gunakan
teleportAsyncalih-alihteleport, dan jadwalkan ke region target sebelum mengubahnya.5.Nyatakan dukungan Folia
Tambahkan
folia-supported: truekeplugin.yml. Tanpa itu Folia menolak memuat plugin.6.Uji di server Folia
Kompilasi membuktikan kodenya bisa di-build dengan Folia API, bukan bahwa kodenya aman untuk thread. Jalankan di server uji Folia dengan beberapa pemain di tempat yang berbeda.
Empat scheduler
| Scheduler | Didapat dengan | Dipakai untuk |
|---|---|---|
| Region | Bukkit.getRegionScheduler() | Pekerjaan di lokasi world: memasang blok, spawn |
| Entity | entity.getScheduler() | Pekerjaan pada satu pemain atau mob, ikut berpindah antar region |
| Global region | Bukkit.getGlobalRegionScheduler() | Waktu world, cuaca, hal yang tidak terikat lokasi |
| Async | Bukkit.getAsyncScheduler() | Database, file, permintaan web, tidak pernah world |
Yang biasanya rusak
- Tugas berulang untuk semua pemain: satu loop atas setiap pemain online tidak lagi berfungsi; jadwalkan tugas di entity scheduler setiap pemain sebagai gantinya.
- Teleport dan warmup: "teleport setelah 3 detik" butuh entity scheduler dan
teleportAsync. - Data bersama: map dan counter yang dipakai dari beberapa region harus aman untuk thread, misalnya concurrent collection.
- Dependensi: library yang memanggil scheduler Bukkit melempar
UnsupportedOperationExceptiondi Folia.
Satu plugin untuk Paper dan Folia
Scheduler region, entity, global, dan async juga merupakan bagian dari Paper API di versi terbaru, jadi plugin yang hanya memakai scheduler itu dan menyatakan folia-supported: true bisa berjalan di Paper maupun Folia. Itu sering menjadi target terbaik: satu .jar untuk setiap server.
Dengan Codexe
Pilih tipe Folia. Plugin yang dihasilkan menjadwalkan pekerjaan dengan scheduler region, entity, global region, dan async, menyatakan folia-supported: true, dan di-build dengan Folia API memakai Maven. Plugin dikompilasi dan diperiksa sebelum Ready.
Tulis detail waktu di permintaan ("setiap menit untuk setiap pemain online", "teleport setelah 3 detik"): di situlah kode Folia paling berbeda. Coba sekarang belum menjalankan server Folia, jadi uji .jar-nya di server Folia milikmu sendiri.
Pertanyaan
Apakah plugin Paper berjalan di Folia?
Hanya jika ditulis untuk Folia dan menyatakan folia-supported: true. Plugin Paper biasa yang memakai scheduler Bukkit akan ditolak atau gagal.
Apakah plugin Folia berjalan di Paper?
Ya, jika hanya memakai API yang juga dimiliki Paper, termasuk scheduler Folia di versi Paper terbaru.
Plugin Folia-ku melempar exception tentang scheduler
Sebagian kode, sering dari library, masih memakai scheduler Bukkit. Minta di chat proyek agar dipindahkan ke region atau entity scheduler.
Buat plugin Folia
Prompt ini terbuka dan siap dikirim:
“Plugin Folia 1.21.4 bernama RTP: /rtp meneleportasi pemain ke lokasi acak yang aman dalam radius 5000 blok setelah warmup 3 detik yang batal jika bergerak, memakai entity scheduler dan teleportAsync, cooldown 10 menit per pemain disimpan di SQLite, folia-supported: true, radius, cooldown, dan pesan di config.yml.”
Buat ini dengan Codexe