Príručka
Ako vytvoriť plugin pre Folia
Aktualizované 18. októbra 2026
Folia je fork Paperu, ktorý rozdelí svet na regióny a tickuje ich na rôznych vláknach, takže veľké servery môžu využiť veľa jadier CPU. Jedno hlavné vlákno už neexistuje, a to rozbíja bežný plánovač Bukkitu. Plugin pre Folia je plugin pre Paper napísaný pre tento model a musí to uviesť vo svojom plugin.yml.
Príklad s detailmi časovania, ktoré Folia potrebuje.
Vygeneruj to v CodexeKrok za krokom
1.Over si, že Folia potrebuješ
Folia pomáha serverom s veľa hráčmi rozptýlenými po svete. Väčšina serverov beží na Paper; mnohé populárne pluginy Folia nepodporujú, preto najprv skontroluj tie, na ktorých závisíš.
2.Zostavuj proti Folia API
Použi závislosť
folia-apipre svoju verziu z repozitára PaperMC so scopeprovidedv projekte Maven alebo Gradle.3.Nahraď plánovač Bukkitu
Bukkit.getScheduler()na Folia nefunguje. Na prácu na určitom mieste použi plánovač regiónu, na prácu s hráčom alebo mobom plánovač entity, na úlohy pre celý svet globálny plánovač regiónu a na I/O asynchrónny plánovač.4.Veci meň iba z ich vlastného regiónu
Blok alebo entitu meň iba na vlákne, ktoré ich vlastní. Namiesto
teleportpoužiteleportAsynca pred zmenou cieľa naplánuj prácu do jeho regiónu.5.Deklaruj podporu Folia
Pridaj do
plugin.ymlfolia-supported: true. Bez toho Folia odmietne plugin načítať.6.Otestuj na serveri Folia
Kompilácia dokazuje, že sa kód zostaví proti Folia API, nie že je bezpečný pre vlákna. Spusti ho na testovacom serveri Folia s niekoľkými hráčmi na rôznych miestach.
Štyri plánovače
| Plánovač | Získaš ho cez | Použi ho na |
|---|---|---|
| Región | Bukkit.getRegionScheduler() | Práca na mieste vo svete: kladenie blokov, spawnovanie |
| Entita | entity.getScheduler() | Práca s jedným hráčom alebo mobom, nasleduje ho naprieč regiónmi |
| Globálny región | Bukkit.getGlobalRegionScheduler() | Čas vo svete, počasie, veci neviazané na miesto |
| Asynchrónny | Bukkit.getAsyncScheduler() | Databáza, súbory, webové požiadavky, nikdy svet |
Čo sa zvyčajne pokazí
- Opakované úlohy pre všetkých hráčov: jeden cyklus cez všetkých hráčov online už nefunguje; namiesto toho naplánuj úlohu do plánovača entity každého hráča.
- Teleporty a čakania: „teleport po 3 sekundách“ potrebuje plánovač entity a
teleportAsync. - Zdieľané dáta: mapy a počítadlá používané z viacerých regiónov musia byť bezpečné pre vlákna, napríklad konkurentné kolekcie.
- Závislosti: knižnica, ktorá volá plánovač Bukkitu, na Folia vyhodí
UnsupportedOperationException.
Jeden plugin pre Paper aj Folia
Plánovače regiónu, entity, globálny a asynchrónny sú v aktuálnych verziách aj súčasťou Paper API, takže plugin, ktorý používa iba ich a deklaruje folia-supported: true, môže bežať na Paper aj na Folia. Často je to najlepší cieľ: jeden .jar pre každý server.
S Codexe
Vyber typ Folia. Vygenerovaný plugin plánuje prácu cez plánovače regiónu, entity, globálneho regiónu a asynchrónny, deklaruje folia-supported: true a zostavuje sa proti Folia API cez Maven. Skompiluje sa a skontroluje skôr, než je v stave Pripravené.
Detaily časovania uveď v zadaní („každú minútu pre každého hráča online“, „teleport po 3 sekundách“): práve tam sa kód pre Folia líši najviac. Vyskúšaj teraz zatiaľ nespúšťa servery Folia, preto .jar otestuj na vlastnom serveri Folia.
Otázky
Bežia pluginy pre Paper na Folia?
Iba ak sú pre ňu napísané a deklarujú folia-supported: true. Bežný plugin pre Paper, ktorý používa plánovač Bukkitu, sa odmietne alebo zlyhá.
Beží plugin pre Folia na Paper?
Áno, ak používa iba API, ktoré má aj Paper, a to v aktuálnych verziách Paper zahŕňa aj plánovače z Folia.
Môj plugin pre Folia vyhadzuje výnimku o plánovači
Nejaký kód, často z knižnice, stále používa plánovač Bukkitu. Požiadaj v chate projektu, aby ho presunul do plánovača regiónu alebo entity.
Vytvor plugin pre Folia
Toto zadanie sa otvorí pripravené na odoslanie:
“Plugin pre Folia 1.21.4 s názvom RTP: /rtp teleportuje hráča na náhodné bezpečné miesto do 5000 blokov po 3-sekundovom čakaní, ktoré sa pohybom zruší, pomocou plánovača entity a teleportAsync, 10-minútový cooldown pre každého hráča uložený v SQLite, folia-supported: true, polomer, cooldown a správy v config.yml.”
Vygeneruj to v Codexe