ガイド

Foliaプラグインの作り方

2026年10月18日に更新

FoliaはPaperのフォークで、ワールドをリージョンに分け、それぞれを別のスレッドでティック処理します。そのため、大規模なサーバーで多くのCPUコアを使えます。単一のメインスレッドはもう存在せず、通常のBukkitスケジューラーは使えなくなります。Foliaプラグインは、このモデルに合わせて書かれたPaperプラグインで、そのことをplugin.ymlで宣言する必要があります。

Foliaに必要なタイミングの詳細を含めた例です。

Codexeでこれを生成

手順

  1. 1.本当にFoliaが必要か確認する

    Foliaが役に立つのは、プレイヤーが多く、ワールド中に散らばっているサーバーです。ほとんどのサーバーはPaperで動いていて、人気のプラグインの多くはFoliaに対応していません。まず、頼りにしているプラグインを確認してください。

  2. 2.Folia APIに対してビルドする

    MavenまたはGradleのプロジェクトで、PaperMCのリポジトリから、バージョンに合ったfolia-apiの依存関係をprovidedスコープで使います。

  3. 3.Bukkitスケジューラーを置き換える

    Bukkit.getScheduler()はFoliaでは動きません。特定の場所での処理にはリージョンスケジューラー、プレイヤーやモブに対する処理にはエンティティスケジューラー、ワールド全体のタスクにはグローバルリージョンスケジューラー、I/Oには非同期スケジューラーを使います。

  4. 4.対象には、そのリージョンからだけ触れる

    ブロックやエンティティは、それを持っているスレッドでだけ変更します。teleportの代わりにteleportAsyncを使い、変更する前に対象のリージョンにタスクをスケジュールします。

  5. 5.Folia対応を宣言する

    plugin.ymlにfolia-supported: trueを追加します。これがないと、Foliaはプラグインの読み込みを拒否します。

  6. 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でこれを生成
Foliaプラグインの作り方(リージョンスケジューラー) | Codexe