Οδηγός
Πώς να φτιάξεις ένα Folia plugin
Ενημερώθηκε 18 Οκτωβρίου 2026
Το Folia είναι ένα fork του Paper που χωρίζει τον κόσμο σε περιοχές (regions) και τις κάνει tick σε διαφορετικά threads, ώστε οι μεγάλοι servers να χρησιμοποιούν πολλούς πυρήνες CPU. Δεν υπάρχει πια ένα μοναδικό main thread, και αυτό χαλάει τον συνηθισμένο scheduler του Bukkit. Ένα Folia plugin είναι ένα Paper plugin γραμμένο για αυτό το μοντέλο και πρέπει να το δηλώνει στο plugin.yml του.
Ένα παράδειγμα με τις λεπτομέρειες χρονισμού που χρειάζεται το Folia.
Φτιάξ' το με το CodexeΒήμα βήμα
1.Έλεγξε αν χρειάζεσαι το Folia
Το Folia βοηθά servers με πολλούς παίκτες σκορπισμένους σε όλο τον κόσμο. Οι περισσότεροι servers τρέχουν Paper· πολλά δημοφιλή plugins δεν υποστηρίζουν Folia, οπότε έλεγξε πρώτα αυτά στα οποία βασίζεσαι.
2.Κάνε build με το Folia API
Χρησιμοποίησε την εξάρτηση
folia-apiγια την έκδοσή σου από το repository του PaperMC, με scopeprovided, σε ένα project Maven ή Gradle.3.Αντικατάστησε τον scheduler του Bukkit
Το
Bukkit.getScheduler()δεν λειτουργεί στο Folia. Χρησιμοποίησε τον region scheduler για εργασίες σε μια τοποθεσία, τον entity scheduler για εργασίες σε έναν παίκτη ή mob, τον global region scheduler για εργασίες σε όλο τον κόσμο και τον async scheduler για I/O.4.Άγγιζε κάθε πράγμα μόνο από τη δική του περιοχή
Άλλαζε ένα block ή μια οντότητα μόνο στο thread που την κατέχει. Χρησιμοποίησε
teleportAsyncαντί γιαteleportκαι προγραμμάτισε την εργασία στην περιοχή του στόχου πριν τον αλλάξεις.5.Δήλωσε την υποστήριξη Folia
Πρόσθεσε
folia-supported: trueστοplugin.yml. Χωρίς αυτό το Folia αρνείται να φορτώσει το plugin.6.Δοκίμασέ το σε server Folia
Το compile αποδεικνύει ότι ο κώδικας γίνεται build με το Folia API, όχι ότι είναι thread safe. Τρέξ' το σε έναν δοκιμαστικό server Folia με αρκετούς παίκτες σε διαφορετικά σημεία.
Οι τέσσερις schedulers
| Scheduler | Πώς τον παίρνεις | Για τι τον χρησιμοποιείς |
|---|---|---|
| Region | Bukkit.getRegionScheduler() | Εργασίες σε μια τοποθεσία του κόσμου: τοποθέτηση blocks, spawn |
| Entity | entity.getScheduler() | Εργασίες σε έναν παίκτη ή mob, τον ακολουθεί από περιοχή σε περιοχή |
| Global region | Bukkit.getGlobalRegionScheduler() | Ώρα του κόσμου, καιρός, ό,τι δεν δένεται με μια τοποθεσία |
| Async | Bukkit.getAsyncScheduler() | Βάση δεδομένων, αρχεία, web requests, ποτέ ο κόσμος |
Τι χαλάει συνήθως
- Επαναλαμβανόμενα tasks για όλους τους παίκτες: ένας μόνο βρόχος πάνω σε κάθε online παίκτη δεν λειτουργεί πια· αντί γι' αυτό προγραμμάτισε ένα task στον entity scheduler κάθε παίκτη.
- Teleports και αναμονές: το «teleport μετά από 3 δευτερόλεπτα» χρειάζεται τον entity scheduler και το
teleportAsync. - Κοινά δεδομένα: maps και μετρητές που χρησιμοποιούνται από πολλές περιοχές πρέπει να είναι thread safe, για παράδειγμα concurrent collections.
- Εξαρτήσεις: μια βιβλιοθήκη που καλεί τον scheduler του Bukkit πετάει
UnsupportedOperationExceptionστο Folia.
Ένα plugin για Paper και Folia
Οι schedulers region, entity, global και async είναι επίσης μέρος του Paper API στις τρέχουσες εκδόσεις, οπότε ένα plugin που χρησιμοποιεί μόνο αυτούς και δηλώνει folia-supported: true μπορεί να τρέχει και σε Paper και σε Folia. Συχνά αυτός είναι ο καλύτερος στόχος: ένα .jar για κάθε server.
Με το Codexe
Διάλεξε τον τύπο Folia. Το plugin που δημιουργείται προγραμματίζει τις εργασίες με τους schedulers region, entity, global region και async, δηλώνει folia-supported: true και γίνεται build με το Folia API μέσω Maven. Γίνεται compile και ελέγχεται πριν γίνει Έτοιμο.
Βάλε τις λεπτομέρειες χρονισμού στο αίτημα («κάθε λεπτό για κάθε online παίκτη», «teleport μετά από 3 δευτερόλεπτα»): εκεί διαφέρει περισσότερο ο κώδικας για Folia. Το Δοκίμασέ το τώρα δεν τρέχει ακόμα servers Folia, οπότε δοκίμασε το .jar στον δικό σου server Folia.
Ερωτήσεις
Τρέχουν τα Paper plugins σε Folia;
Μόνο αν είναι γραμμένα γι' αυτό και δηλώνουν folia-supported: true. Ένα κανονικό Paper plugin που χρησιμοποιεί τον scheduler του Bukkit απορρίπτεται ή αποτυγχάνει.
Τρέχει ένα Folia plugin σε Paper;
Ναι, όταν χρησιμοποιεί μόνο APIs που έχει και το Paper, όπου στις τρέχουσες εκδόσεις του Paper περιλαμβάνονται και οι schedulers του Folia.
Το Folia plugin μου πετάει exception για τον scheduler
Κάποιο κομμάτι κώδικα, συχνά από μια βιβλιοθήκη, χρησιμοποιεί ακόμα τον scheduler του Bukkit. Ζήτα στο chat του project να το μεταφέρει στον region ή στον entity scheduler.
Φτιάξε ένα Folia plugin
Αυτό το prompt ανοίγει έτοιμο για αποστολή:
“Ένα Folia plugin για 1.21.4 με το όνομα RTP: το /rtp μεταφέρει τον παίκτη σε μια τυχαία ασφαλή τοποθεσία μέσα σε 5000 blocks μετά από αναμονή 3 δευτερολέπτων που ακυρώνεται με την κίνηση, με τον entity scheduler και το teleportAsync, cooldown 10 λεπτών ανά παίκτη αποθηκευμένο σε SQLite, folia-supported: true, ακτίνα, cooldown και μηνύματα στο config.yml.”
Φτιάξ' το με το Codexe