Handleiding

Een Folia-plugin maken

Bijgewerkt 18 oktober 2026

Folia is een fork van Paper die de wereld in regio's opsplitst en die op verschillende threads laat tikken, zodat grote servers veel CPU-cores kunnen gebruiken. Er is geen enkele main thread meer, en daardoor werkt de gewone Bukkit-scheduler niet meer. Een Folia-plugin is een Paper-plugin die voor dat model is geschreven, en dat moet hij in zijn plugin.yml aangeven.

Een voorbeeld met de details over timing die Folia nodig heeft.

Genereer dit met Codexe

Stap voor stap

  1. 1.Controleer of je Folia nodig hebt

    Folia helpt servers met veel spelers die verspreid over de wereld zitten. De meeste servers draaien Paper; veel populaire plugins ondersteunen Folia niet, dus controleer eerst de plugins waarop je vertrouwt.

  2. 2.Bouw tegen de Folia-API

    Gebruik de dependency folia-api voor je versie uit de PaperMC-repository, met scope provided, in een Maven- of Gradle-project.

  3. 3.Vervang de Bukkit-scheduler

    Bukkit.getScheduler() werkt niet op Folia. Gebruik de region scheduler voor werk op een locatie, de entity scheduler voor werk aan een speler of mob, de global region scheduler voor taken in de hele wereld en de async scheduler voor I/O.

  4. 4.Raak dingen alleen aan vanuit hun eigen regio

    Verander een blok of een entity alleen op de thread die er eigenaar van is. Gebruik teleportAsync in plaats van teleport en plan werk in op de regio van het doel voordat je het verandert.

  5. 5.Geef Folia-ondersteuning aan

    Voeg folia-supported: true toe aan plugin.yml. Zonder die regel weigert Folia de plugin te laden.

  6. 6.Test op een Folia-server

    Compileren bewijst dat de code tegen de Folia-API bouwt, niet dat hij thread-safe is. Draai hem op een Folia-testserver met meerdere spelers op verschillende plekken.

De vier schedulers

SchedulerOphalen metGebruiken voor
RegionBukkit.getRegionScheduler()Werk op een locatie in de wereld: blokken plaatsen, spawnen
Entityentity.getScheduler()Werk aan één speler of mob, volgt die over regio's heen
Global regionBukkit.getGlobalRegionScheduler()Wereldtijd, weer, dingen die niet aan een locatie vastzitten
AsyncBukkit.getAsyncScheduler()Database, bestanden, webverzoeken, nooit de wereld

Wat meestal stukgaat

  • Herhalende taken voor alle spelers: één lus over elke online speler werkt niet meer; plan in plaats daarvan een taak in op de entity scheduler van elke speler.
  • Teleports en warmups: "teleporteer na 3 seconden" vereist de entity scheduler en teleportAsync.
  • Gedeelde data: maps en tellers die vanuit meerdere regio's worden gebruikt, moeten thread-safe zijn, bijvoorbeeld concurrent collections.
  • Dependencies: een library die de Bukkit-scheduler aanroept, gooit op Folia een UnsupportedOperationException.

Eén plugin voor Paper en Folia

De region-, entity-, global- en async-schedulers horen op actuele versies ook bij de Paper-API, dus een plugin die alleen die gebruikt en folia-supported: true aangeeft, kan zowel op Paper als op Folia draaien. Dat is vaak het beste doel: één .jar voor elke server.

Met Codexe

Kies het type Folia. De gegenereerde plugin plant werk in met de region-, entity-, global region- en async-schedulers, geeft folia-supported: true aan en bouwt met Maven tegen de Folia-API. Hij wordt gecompileerd en gecontroleerd voordat hij Klaar is.

Zet details over timing in het verzoek ("elke minuut voor elke online speler", "teleporteer na 3 seconden"): daar verschilt Folia-code het meest. Probeer het nu draait nog geen Folia-servers, dus test de .jar op je eigen Folia-server.

Vragen

Draaien Paper-plugins op Folia?

Alleen als ze ervoor zijn geschreven en folia-supported: true aangeven. Een gewone Paper-plugin die de Bukkit-scheduler gebruikt, wordt geweigerd of faalt.

Draait een Folia-plugin op Paper?

Ja, als hij alleen API's gebruikt die Paper ook heeft, en daar horen op actuele Paper-versies de Folia-schedulers bij.

Mijn Folia-plugin gooit een exception over de scheduler

Een deel van de code, vaak uit een library, gebruikt nog de Bukkit-scheduler. Vraag in de projectchat om het naar de region of entity scheduler te verplaatsen.

Maak een Folia-plugin

Deze prompt opent klaar om te versturen:

“Een Folia 1.21.4-plugin genaamd RTP: /rtp teleporteert de speler naar een willekeurige veilige locatie binnen 5000 blokken na een warmup van 3 seconden die bij beweging wordt geannuleerd, via de entity scheduler en teleportAsync, een cooldown van 10 minuten per speler opgeslagen in SQLite, folia-supported: true, straal, cooldown en berichten in config.yml.”

Genereer dit met Codexe
Een Folia-plugin maken (regioschedulers) | Codexe