מדריך
איך ליצור פלאגין ל-Folia
עודכן 18 באוקטובר 2026
Folia הוא fork של Paper שמחלק את העולם לאזורים ומריץ את ה-ticks שלהם ב-threads שונים, כך ששרתים גדולים יכולים לנצל הרבה ליבות מעבד. אין יותר thread ראשי אחד, וזה שובר את ה-scheduler הרגיל של Bukkit. פלאגין ל-Folia הוא פלאגין ל-Paper שנכתב למודל הזה, והוא חייב לציין זאת ב-plugin.yml שלו.
דוגמה עם פרטי התזמון ש-Folia צריך.
צרו את זה עם Codexeשלב אחר שלב
1.בדקו שאתם באמת צריכים Folia
Folia עוזר לשרתים עם הרבה שחקנים שמפוזרים ברחבי העולם. רוב השרתים מריצים Paper; הרבה פלאגינים פופולריים לא תומכים ב-Folia, אז בדקו קודם את אלה שאתם תלויים בהם.
2.בנו מול ה-API של Folia
השתמשו בתלות
folia-apiלגרסה שלכם ממאגר PaperMC, בהיקףprovided, בפרויקט Maven או Gradle.3.החליפו את ה-scheduler של Bukkit
Bukkit.getScheduler()לא עובד ב-Folia. השתמשו ב-region scheduler לעבודה במיקום מסוים, ב-entity scheduler לעבודה על שחקן או יצור, ב-global region scheduler למשימות ברמת העולם כולו, וב-async scheduler לקלט/פלט.4.געו בדברים רק מתוך האזור שלהם
שנו בלוק או ישות רק ב-thread שמחזיק בהם. השתמשו ב-
teleportAsyncבמקוםteleport, ותזמנו לאזור של היעד לפני שאתם משנים אותו.5.הצהירו על תמיכה ב-Folia
הוסיפו
folia-supported: trueל-plugin.yml. בלעדיו Folia מסרב לטעון את הפלאגין.6.בדקו על שרת Folia
קומפילציה מוכיחה שהקוד נבנה מול ה-API של Folia, לא שהוא בטוח לעבודה עם threads. הריצו אותו על שרת בדיקה של Folia עם כמה שחקנים במקומות שונים.
ארבעת ה-schedulers
| מתזמן | איך מקבלים אותו | למה משתמשים בו |
|---|---|---|
| אזור | Bukkit.getRegionScheduler() | עבודה במיקום בעולם: הנחת בלוקים, הופעת יצורים |
| ישות | entity.getScheduler() | עבודה על שחקן או יצור אחד, הוא עוקב אחריהם בין אזורים |
| אזור גלובלי | Bukkit.getGlobalRegionScheduler() | שעת העולם, מזג האוויר, דברים שלא קשורים למיקום |
| אסינכרוני | Bukkit.getAsyncScheduler() | מסד נתונים, קבצים, בקשות רשת, אף פעם לא העולם |
מה בדרך כלל נשבר
- משימות חוזרות לכל השחקנים: לולאה אחת על כל השחקנים המחוברים כבר לא עובדת; במקום זאת תזמנו משימה ב-entity scheduler של כל שחקן.
- שיגורים וזמני המתנה: "שיגור אחרי 3 שניות" צריך את ה-entity scheduler ואת
teleportAsync. - נתונים משותפים: מפות ומונים שמשמשים מכמה אזורים חייבים להיות בטוחים לעבודה עם threads, למשל concurrent collections.
- תלויות: ספרייה שקוראת ל-scheduler של Bukkit זורקת
UnsupportedOperationExceptionב-Folia.
פלאגין אחד ל-Paper ול-Folia
ה-schedulers של אזור, ישות, גלובלי ואסינכרוני הם גם חלק מה-API של Paper בגרסאות הנוכחיות, ולכן פלאגין שמשתמש רק בהם ומצהיר folia-supported: true יכול לרוץ גם על Paper וגם על Folia. זה לרוב היעד הטוב ביותר: .jar אחד לכל שרת.
עם Codexe
בחרו בסוג Folia. הפלאגין שנוצר מתזמן עבודה עם ה-schedulers של אזור, ישות, אזור גלובלי ואסינכרוני, מצהיר folia-supported: true ונבנה מול ה-API של Folia עם Maven. הוא מקומפל ונבדק לפני שהוא מוכן.
כתבו בבקשה את פרטי התזמון ("כל דקה לכל שחקן מחובר", "שיגור אחרי 3 שניות"): כאן קוד ל-Folia שונה הכי הרבה. נסו עכשיו עדיין לא מריץ שרתי Folia, אז בדקו את ה-.jar על שרת Folia משלכם.
שאלות
האם פלאגינים ל-Paper רצים על Folia?
רק אם הם נכתבו בשבילו ומצהירים folia-supported: true. פלאגין Paper רגיל שמשתמש ב-scheduler של Bukkit נדחה או נכשל.
האם פלאגין ל-Folia רץ על Paper?
כן, כשהוא משתמש רק ב-API שקיימים גם ב-Paper, ובהם ה-schedulers של Folia בגרסאות הנוכחיות של Paper.
הפלאגין שלי ל-Folia זורק חריגה על ה-scheduler
קוד כלשהו, לרוב מספרייה, עדיין משתמש ב-scheduler של Bukkit. בקשו בצ'אט של הפרויקט להעביר אותו ל-region scheduler או ל-entity scheduler.
צרו פלאגין ל-Folia
הפרומפט הזה נפתח מוכן לשליחה:
“פלאגין ל-Folia 1.21.4 בשם RTP: /rtp משגר את השחקן למיקום בטוח אקראי בטווח 5000 בלוקים אחרי המתנה של 3 שניות שמתבטלת בתנועה, באמצעות ה-entity scheduler ו-teleportAsync, זמן המתנה של 10 דקות לכל שחקן שנשמר ב-SQLite, folia-supported: true, רדיוס, זמן המתנה והודעות ב-config.yml.”
צרו את זה עם Codexe