คู่มือ
วิธีทำปลั๊กอิน Folia
อัปเดตเมื่อ 18 ตุลาคม 2569
Folia คือ fork ของ Paper ที่แบ่งโลกเป็นภูมิภาคและ tick แต่ละภูมิภาคบนเธรดต่างกัน เซิร์ฟเวอร์ขนาดใหญ่จึงใช้ CPU หลายคอร์ได้ ไม่มีเธรดหลักเธรดเดียวอีกต่อไป และนั่นทำให้ scheduler ปกติของ Bukkit ใช้ไม่ได้ ปลั๊กอิน Folia คือปลั๊กอิน Paper ที่เขียนมาสำหรับโมเดลนั้น และต้องประกาศไว้ใน plugin.yml
ตัวอย่างที่มีรายละเอียดเรื่องจังหวะเวลาที่ Folia ต้องการ
สร้างสิ่งนี้ด้วย Codexeทีละขั้นตอน
1.เช็กว่าคุณต้องใช้ Folia จริงไหม
Folia ช่วยเซิร์ฟเวอร์ที่มีผู้เล่นจำนวนมากกระจายอยู่ทั่วโลก เซิร์ฟเวอร์ส่วนใหญ่ใช้ Paper และปลั๊กอินยอดนิยมหลายตัวไม่รองรับ Folia จึงควรเช็กปลั๊กอินที่คุณพึ่งพาอยู่ก่อน
2.บิลด์กับ Folia API
ใช้ dependency
folia-apiตามเวอร์ชันของคุณจาก repository ของ PaperMC ด้วย scopeprovidedในโปรเจกต์ Maven หรือ Gradle3.แทนที่ scheduler ของ Bukkit
Bukkit.getScheduler()ใช้ไม่ได้บน Folia ใช้ region scheduler สำหรับงานที่ตำแหน่งหนึ่ง entity scheduler สำหรับงานกับผู้เล่นหรือมอนสเตอร์ global region scheduler สำหรับงานทั้งโลก และ async scheduler สำหรับ I/O4.แตะต้องสิ่งต่างๆ จากภูมิภาคของมันเท่านั้น
เปลี่ยนบล็อกหรือเอนทิตีเฉพาะบนเธรดที่เป็นเจ้าของมันเท่านั้น ใช้
teleportAsyncแทนteleportและตั้งเวลางานไปยังภูมิภาคของเป้าหมายก่อนเปลี่ยนแปลงมัน5.ประกาศว่ารองรับ Folia
เพิ่ม
folia-supported: trueในplugin.ymlถ้าไม่มี Folia จะไม่ยอมโหลดปลั๊กอิน6.ทดสอบบนเซิร์ฟเวอร์ Folia
การคอมไพล์พิสูจน์ได้แค่ว่าโค้ดบิลด์กับ Folia API ได้ ไม่ได้พิสูจน์ว่าปลอดภัยต่อเธรด ให้รันบนเซิร์ฟเวอร์ทดสอบ Folia ที่มีผู้เล่นหลายคนอยู่คนละที่
scheduler ทั้งสี่แบบ
| ตัวจัดเวลางาน (scheduler) | เรียกใช้ด้วย | ใช้สำหรับ |
|---|---|---|
| ภูมิภาค (Region) | Bukkit.getRegionScheduler() | งานที่ตำแหน่งในโลก: วางบล็อก สปอว์น |
| เอนทิตี (Entity) | entity.getScheduler() | งานกับผู้เล่นหรือมอนสเตอร์ตัวหนึ่ง ตามไปทุกภูมิภาคที่มันเดินทางไป |
| ภูมิภาครวม (Global region) | Bukkit.getGlobalRegionScheduler() | เวลาในโลก สภาพอากาศ สิ่งที่ไม่ผูกกับตำแหน่ง |
| อะซิงโครนัส (Async) | Bukkit.getAsyncScheduler() | ฐานข้อมูล ไฟล์ คำขอเว็บ ห้ามแตะโลกเด็ดขาด |
สิ่งที่มักพัง
- งานที่ทำซ้ำสำหรับผู้เล่นทุกคน: ลูปเดียวที่วนผู้เล่นออนไลน์ทุกคนใช้ไม่ได้อีกแล้ว ให้ตั้งงานบน entity scheduler ของผู้เล่นแต่ละคนแทน
- เทเลพอร์ตและการรอ: "เทเลพอร์ตหลัง 3 วินาที" ต้องใช้ entity scheduler และ
teleportAsync - ข้อมูลที่ใช้ร่วมกัน: map และตัวนับที่ใช้จากหลายภูมิภาคต้องปลอดภัยต่อเธรด เช่น ใช้ concurrent collection
- Dependency: ไลบรารีที่เรียก scheduler ของ Bukkit จะโยน
UnsupportedOperationExceptionบน Folia
ปลั๊กอินเดียวสำหรับ Paper และ Folia
scheduler แบบ region, entity, global และ async เป็นส่วนหนึ่งของ Paper API ในเวอร์ชันปัจจุบันด้วย ปลั๊กอินที่ใช้แค่ scheduler เหล่านี้และประกาศ folia-supported: true จึงรันได้ทั้งบน Paper และ Folia ซึ่งมักเป็นเป้าหมายที่ดีที่สุด: .jar เดียวใช้ได้ทุกเซิร์ฟเวอร์
ด้วย Codexe
เลือกประเภท Folia ปลั๊กอินที่สร้างขึ้นจะตั้งเวลางานด้วย scheduler แบบ region, entity, global region และ async ประกาศ folia-supported: true และบิลด์กับ Folia API ด้วย Maven โดยคอมไพล์และตรวจสอบก่อนจะพร้อม
ใส่รายละเอียดเรื่องจังหวะเวลาในคำขอ ("ทุกนาทีสำหรับผู้เล่นออนไลน์แต่ละคน", "เทเลพอร์ตหลัง 3 วินาที"): นี่คือจุดที่โค้ด Folia ต่างมากที่สุด ลองเลย ยังไม่รองรับเซิร์ฟเวอร์ Folia จึงต้องทดสอบ .jar บนเซิร์ฟเวอร์ Folia ของคุณเอง
คำถาม
ปลั๊กอิน Paper รันบน Folia ได้ไหม?
ได้เฉพาะเมื่อเขียนมาเพื่อ Folia และประกาศ folia-supported: true ปลั๊กอิน Paper ปกติที่ใช้ scheduler ของ Bukkit จะถูกปฏิเสธหรือทำงานล้มเหลว
ปลั๊กอิน Folia รันบน Paper ได้ไหม?
ได้ เมื่อใช้เฉพาะ API ที่ Paper มีด้วย ซึ่งรวมถึง scheduler ของ Folia ใน Paper เวอร์ชันปัจจุบัน
ปลั๊กอิน Folia ของฉันโยน exception เกี่ยวกับ scheduler
ยังมีโค้ดบางส่วน ซึ่งมักมาจากไลบรารี ที่ใช้ scheduler ของ Bukkit อยู่ บอกแชตของโปรเจกต์ให้ย้ายไปใช้ region หรือ entity scheduler
สร้างปลั๊กอิน Folia
พรอมต์นี้จะเปิดขึ้นพร้อมส่งได้ทันที:
“ปลั๊กอิน Folia 1.21.4 ชื่อ RTP: /rtp เทเลพอร์ตผู้เล่นไปยังตำแหน่งสุ่มที่ปลอดภัยภายใน 5000 บล็อก หลังรอ 3 วินาทีซึ่งยกเลิกถ้าขยับตัว ใช้ entity scheduler และ teleportAsync คูลดาวน์ 10 นาทีต่อผู้เล่นบันทึกใน SQLite มี folia-supported: true รัศมี คูลดาวน์ และข้อความอยู่ใน config.yml”
สร้างสิ่งนี้ด้วย Codexe