マイクラのプラグインをコード不要で作る
マインクラフトのサーバーでは、基本ゲームの範囲を超えることは全てプラグインを通して行われ、プラグインはJavaで書きます。 これはサーバーを運営するほとんどの人がぶつかる壁です。やりたいことははっきりしているのに、唯一の道が言語とコンパイル が必要なプロジェクト、そして覚えるべきAPIを通っているからです。このページではJavaなしでできること、 そして何より限界がどこにあるかを説明します。
プラグイン作りの壁と、これまでの3つの回避策
NimBlock以前、プログラミングをしない人には3つの選択肢があり、それぞれに手を出す前に知っておくべきはっきりした 限界があります。
- コマンドブロック。 ワールド内の決まった場所に置かれ、レッドストーンや時計回路で発動します。 サーバーのイベントに反応することはできず、ましてそれを防ぐこともできません。
- データパック。 バニラの枠内にとどまります。ファンクション、進捗、ルートテーブルなどです。 本物のコマンドはなく、チャットの横取りもなく、行動の取り消しもできません。その代わり、Paperなしのバニラ サーバーで動きます。
- Skript。 先の2つよりもずっと強力で、NimBlockよりも強力です。本物の言語であり、覚えるべき 構文と読み解くべきエラーがあります。
この3つはどれも長く使われてきたもので、時代遅れというわけではありません。足りなかったのは、コマンドブロックと 言語の間の段階です。
ルールはたった一文で表せる
NimBlockの文法はすべて一文に収まります。これが起きたとき、これらの条件が満たされていれば、これを行う 。プラグインとはルールのリストであり、ルールとはトリガーといくつかの条件、いくつかのアクションです。 それ以外に覚えることはなく、これは意図的な設計です。一文に収まる文法は、頭の中にも収まります。
エディター上ではこれらはブロックとして組み合わさります。本来そこに置けないブロックはそこにははまりません。 そしてエディターを通り抜けたものも、バリデーターが引き継ぎます。スペックはまるごと受理される か拒否されるかのどちらかで、半分だけということはありません。保護ルールを欠いた保護プラグインはゲーム内で機能 せず、それこそが避けたい種類の不具合です。
今つくれること
トリガー9種類、条件8種類、アクション14種類。各パラメータまで 含めた正確な最新のリストは文法ページにあります。カタログから自動生成 されているので、嘘をつきません。できることを要約すると:
- 起きたことに反応する: 接続、切断、チャットのメッセージ、死亡、ブロックの破壊や設置、自分で 作るコマンド、あるいは単にN秒ごと。
- 絞り込む: 権限、OP状態、ワールド、体力、テキストの内容、数値の比較、確率など。
- 実行する: メッセージ、大きなタイトル表示、音、アイテム、エフェクト、回復、テレポート、 サーバー全体への告知、コンソールコマンドの実行、そして直前に起きたイベントの取り消し。 この最後の機能があるからこそ、このリストは本物の保護機能になります。
できないこと
何でもできると謳うページは誰の役にも立ちません。NimBlockができないこと:
- 新しいゲームの仕組みは作れません。 新しいブロックの種類、これまでにないエンティティ、 独自のインベントリ画面などはJavaの領域で、これからもそうです。
- 変数もループもありません。 ルールは反応するだけで、計算はしません。2つのイベントの間で 複雑な状態を保持する必要があるアイデアなら、この文法の範囲を超えています。
- 外部プラグインは使えません。 NimBlockが実行するのは自分のスペックだけで、どこかから ダウンロードした.jarを読み込むことはありません。
- 新しいコマンドは次回起動まで反映されません。 それ以外はサーバーを止めずにその場で反映 されますが、Minecraftはコマンドを起動時に登録します。この点はゲーム内で気づく前に、パネル上でその場で 伝えられます。
プラグインはどこで動くのか
どこにもJavaが生成されコンパイルされる場面はありません。サーバーは全員共通で一度だけ書かれたランタイムを 読み込み、そのランタイムがスペックを読むだけです。だからこそ、ここで組み立てたプラグインには技術的 負債がありません。Minecraftが変わったときに対応するのはランタイム側で、それも一度だけです。そのランタイムで 作られた個々のプラグインが対応する必要はありません。
NimBlockのサーバーでは、インストールはワンクリックで、プレイを止めずにプラグインが反映されます。ランタイム 自体はプラグインカタログで公開される予定で、同じスペックをここでホストされていないサーバーでも動かせるように します。
よくある質問
- プログラミングの知識がなくても、本当にマイクラのプラグインを作れる?
- できます。ただし条件があります。決められた文法の中でルールを組み立てるのであって、自由にプログラムを書くわけではありません。ルールは「これが起きたとき、これらの条件が満たされていれば、これを行う」という形をとります。友達同士のサーバーで欲しいものはほとんどこの形に収まります。挨拶メッセージ、報酬、保護、告知、自作コマンドなど。収まらないのは、新しいゲームの仕組みそのものを発明する必要がある場合で、そこはJavaが必要になります。
- コマンドブロックとの違いは?
- コマンドブロックはワールド内の決まった場所に置かれ、レッドストーンや時計回路で発動します。プラグインはサーバーのイベントで発動します。プレイヤーの接続、ブロックの破壊、チャットのメッセージなどです。コマンドブロックにできないのは、起きたことに反応すること、そして何よりそれを起こらせないようにすることです。NimBlockのルールは、直前に起きたイベントを取り消すことができます。
- データパックとの違いは?
- データパックはバニラの枠内にとどまります。ファンクション、進捗、ルートテーブルなどです。本物のコマンドを追加したり、チャットを横取りしたり、行動を取り消したりはできません。Paperのプラグインはそれができます。ワールドのデータではなく、サーバー本体の中で動くからです。その代わり、データパックはバニラサーバーで動きますが、プラグインはPaperかSpigotが必要です。
- Skriptとの違いは?
- Skriptはこのジャンルの元祖であり、比べものにならないほど強力です。変数もループも巨大な拡張ライブラリも備えた、本物の言語です。ただし言語である以上、覚えるべき構文があり、読み解くエラーがあり、どこで壊れたかを教えてくれないファイルもあります。NimBlockはそれよりずっと少ないことしかできませんが、無効なルールは保存前に拒否され、問題のあるブロックの正確な場所を示してくれます。Skriptに慣れているなら、Skriptを使い続けてください。
- プラグインはどこかでJavaにコンパイルされる?
- されません。それがこの製品の中心的な選択です。スペックはJSONファイルのままで、サーバー側は全員共通で一度だけ書かれたランタイムを読み込み、それがスペックを読んで実行します。何も生成されず、何もコンパイルされません。実用上の結果として、マインクラフトの新しいバージョンへの対応コストはこのランタイム側で一度だけ発生し、そのランタイムで作られた個々のプラグインには発生しません。
- NimBlock以外のサーバーでもプラグインを使える?
- 予定されています。スペックを読み込むランタイムはプラグインカタログで公開される予定です。スペックはただのJSONファイルで、ランタイムがサーバーのpluginsフォルダから読み込みます。このページを書いている時点では、まだ公開されていません。