ガイド
Foliaプラグインの作り方
2026年10月18日に更新
FoliaはPaperのフォークで、ワールドをリージョンに分け、それぞれを別のスレッドでティック処理します。そのため、大規模なサーバーで多くのCPUコアを使えます。単一のメインスレッドはもう存在せず、通常のBukkitスケジューラーは使えなくなります。Foliaプラグインは、このモデルに合わせて書かれたPaperプラグインで、そのことをplugin.ymlで宣言する必要があります。
Foliaに必要なタイミングの詳細を含めた例です。
Codexeでこれを生成手順
1.本当にFoliaが必要か確認する
Foliaが役に立つのは、プレイヤーが多く、ワールド中に散らばっているサーバーです。ほとんどのサーバーはPaperで動いていて、人気のプラグインの多くはFoliaに対応していません。まず、頼りにしているプラグインを確認してください。
2.Folia APIに対してビルドする
MavenまたはGradleのプロジェクトで、PaperMCのリポジトリから、バージョンに合った
folia-apiの依存関係をprovidedスコープで使います。3.Bukkitスケジューラーを置き換える
Bukkit.getScheduler()はFoliaでは動きません。特定の場所での処理にはリージョンスケジューラー、プレイヤーやモブに対する処理にはエンティティスケジューラー、ワールド全体のタスクにはグローバルリージョンスケジューラー、I/Oには非同期スケジューラーを使います。4.対象には、そのリージョンからだけ触れる
ブロックやエンティティは、それを持っているスレッドでだけ変更します。
teleportの代わりにteleportAsyncを使い、変更する前に対象のリージョンにタスクをスケジュールします。5.Folia対応を宣言する
plugin.ymlにfolia-supported: trueを追加します。これがないと、Foliaはプラグインの読み込みを拒否します。6.Foliaサーバーでテストする
コンパイルできても、Folia APIに対してビルドできることがわかるだけで、スレッドセーフであることの証明にはなりません。複数のプレイヤーが別々の場所にいる状態で、Foliaのテストサーバーで動かしてください。
4つのスケジューラー
| スケジューラー | 取得方法 | 用途 |
|---|---|---|
| リージョン | Bukkit.getRegionScheduler() | ワールドの特定の場所での処理: ブロックの設置、スポーン |
| エンティティ | entity.getScheduler() | 1人のプレイヤーや1体のモブに対する処理。リージョンをまたいでも追従する |
| グローバルリージョン | Bukkit.getGlobalRegionScheduler() | ワールドの時間、天気など、場所に結び付かないもの |
| 非同期 | Bukkit.getAsyncScheduler() | データベース、ファイル、Webリクエスト。ワールドには決して触れない |
よく壊れるところ
- 全プレイヤー向けの繰り返しタスク: オンラインの全プレイヤーを1つのループで回す方法はもう使えません。代わりに、各プレイヤーのエンティティスケジューラーにタスクをスケジュールします。
- テレポートと待機時間: 「3秒後にテレポート」には、エンティティスケジューラーと
teleportAsyncが必要です。 - 共有データ: 複数のリージョンから使うマップやカウンターは、並行コレクションなど、スレッドセーフでなければなりません。
- 依存関係: Bukkitスケジューラーを呼び出すライブラリは、Foliaでは
UnsupportedOperationExceptionを投げます。
PaperとFoliaに1つのプラグインで対応する
リージョン、エンティティ、グローバル、非同期の各スケジューラーは、現在のバージョンではPaper APIにも含まれています。そのため、これらだけを使い、folia-supported: trueを宣言したプラグインは、PaperでもFoliaでも動きます。多くの場合、これが最適な対象です。1つの.jarでどのサーバーにも対応できます。
Codexeで
Foliaタイプを選びます。生成されるプラグインは、リージョン、エンティティ、グローバルリージョン、非同期の各スケジューラーで処理をスケジュールし、folia-supported: trueを宣言し、MavenでFolia APIに対してビルドされます。準備完了になる前に、コンパイルとチェックが行われます。
タイミングの詳細(「オンラインの各プレイヤーに1分ごと」「3秒後にテレポート」)をリクエストに書いてください。Foliaのコードが最も違ってくるのはそこです。「今すぐ試す」はまだFoliaサーバーに対応していないので、.jarは自分のFoliaサーバーでテストしてください。
よくある質問
PaperプラグインはFoliaで動きますか?
Folia向けに書かれていて、folia-supported: trueを宣言している場合だけです。Bukkitスケジューラーを使う普通のPaperプラグインは、拒否されるか失敗します。
FoliaプラグインはPaperで動きますか?
はい。PaperにもあるAPIだけを使っていれば動きます。現在のPaperのバージョンには、Foliaのスケジューラーも含まれています。
Foliaプラグインがスケジューラーに関する例外を投げる
一部のコード(多くはライブラリ由来)が、まだBukkitスケジューラーを使っています。プロジェクトのチャットで、リージョンスケジューラーかエンティティスケジューラーに移すよう頼んでください。
Foliaプラグインを作る
このプロンプトは、そのまま送信できる状態で開きます:
“RTPという名前のFolia 1.21.4プラグイン: /rtpで、動くとキャンセルされる3秒の待機後に、5000ブロック以内のランダムな安全な場所へプレイヤーをテレポート。エンティティスケジューラーとteleportAsyncを使用、プレイヤーごとに10分のクールダウンをSQLiteに保存、folia-supported: true、半径、クールダウン、メッセージはconfig.yml。”
Codexeでこれを生成