Minecraftサーバーを動かす知識

Spigot 1.17 リリース

投稿:  更新:  By: HimaJyun

Spigot 1.17がリリースされました!!このリリースに関する情報を解説します。

Minecraft 1.17そのものに関する解説は行いませんので、それに関しては巷のWikiサイトなどを参考にしてください。

スポンサーリンク

Spigot 1.17

1.17はシステム面の変更を多数含む巨大なアップデートになる予定だったのですが、開発が間に合わないと判断され多くの機能が1.18へ見送りになりました。

その関係から1.17ではブロックやMOBや地形の追加がメインとなる、中規模程度のアップデートになっています。

APIの大幅な変更などはありませんが、Minecraft本体がJava 8から16へ更新された関係もあり、一部のプラグインは動かなくなる可能性があります。

Spigot 1.17の入手

--rev1.17を指定するだけです。

java -jar BuildTools.jar --rev 1.17

後述しますがMinecraftがJava 16以上必須となった事で、SpigotにもJava 16が必要になっています。そしてSpigotのビルドにもJava 16が要求されます。

Spigotをビルドしている端末にJava 16が入っていない場合は先にJava 16をインストールする必要があります。

毎度のお知らせですが、Spigotは自分でビルドして利用しましょう。Spigotの開発コミュニティでは配布サイトなどから古いSpigotをダウンロードして利用する(そしてすでに修正されているバグを報告してくる)ユーザーが以前から問題になっています。(今回のお知らせでも、「配布するならせめて最新バージョンを配布してくれ」というmd_5氏の悲痛な叫びが掲載されています)

アップグレード

毎度の事ですが、Spigot開発者のmd_5氏は1.16.xから1.17へアップグレードする事を推奨しています。

つまり、サーバーが1.16未満の場合は最初に1.16.5のjarを用意して--forceUpgradeし全データを1.16にアップグレード、そのあとで1.17にしましょう。という意味です。

すでに1.16.xなら1.17のjarに入れ替えて--forceUpgradeするだけで十分です。

(各バージョンで「前のバージョンからのアップグレード」が推奨されているため、1.14->1.15->1.16->1.17のように順に--forceUpgradeしていく方が安全でしょう。)

用語解説: --forceUpgrade

起動時の引数に--forceUpgradeを追加して起動すると全データをアップグレードする処理が実行されます。

java -jar server.jar --forceUpgrade

この処理はマップのサイズに比例して時間が掛かります。そこそこ時間が掛かる処理なので十分な準備をしたうえで時間に余裕のある時に行いましょう。

1.17からそれ以前のバージョンへのダウングレードはできません。バックアップはお忘れなく。

その他注意点

1.18で実装予定の機能やブロックの中には実験的なデータパックやコマンドなどで1.17から使用できる物もあり、Spigotもそれらに対応したAPIを提供しています。

しかし、これらの機能には実験的扱い/無効化されている理由があります。これらに関しては将来的に互換性のない変更が行われる可能性もあります。

もしそのようなデータを使用したワールドがある場合、将来的に1.18にアップグレードできない、いわば「壊れた」データになってしまう可能性があります。

実運用環境ではそのような要素は使わない/使わせないようにしましょう。強力な機能を持つコマンドをユーザーに解放している場合にはとくに注意です。

Javaバージョンが16に

Minecraft本体の最小Javaバージョンが16以上になりました。それに伴いSpigotの動作にもJava 16以上が必要になります。

これに関しては要注意ポイントです。サーバーにインストールされているJREが古いと「Unsupported Java detected (55.0). This version of Minecraft requires at least Java 16. Check your Java version with the command 'java -version'.」というエラーが出て起動しなくなります。

Java 16は2021年3月17日にリリースされたバージョンです。かなり新しいバージョンのため、おそらくほぼすべてのサーバーでJavaのアップデート作業が必要になるでしょう。ディストリビューションによってはそもそもJava 16のパッケージが提供されていない可能性すらあります。

Ubuntu 20.04では次のようにすればOpenJDK 16をインストールできます。

sudo apt install openjdk-16-jre

8から16へ

8から16まで一気に駆け上がるため、今までJava 8縛りでSpigotプラグインを開発していた方は8から16の間で追加された機能に目を通しておくと良いでしょう。

varの追加やswitchinstanceofの機能強化だけでも覚えておくと開発がはかどるでしょう。

リフレクションの使用

Java 9以降はsetAccessible(true)を使用して特定の(主にJava内部の)パッケージが持つ非publicなメンバーにアクセスすると「WARNING: An illegal reflective access operation has occurred」の警告が出るようになりました。これに関してはすでに気付いている人も居るかもしれません。

Java 16ではこの挙動がさらに厳しくなり、デフォルトでロードに失敗するように変更されました。(--illegal-accessオプションのデフォルトがpermitからdenyになりました)

この変更により一部のプラグインは動作しなくなる可能性があります。これは--illegal-access=permitオプションを使用することで回避できます。

java --illegal-access=permit -jar ./server.jar -nogui

ただし、この回避策はその場しのぎでしかなく、--illegal-accessオプションは将来的に削除される予定です。

プラグイン開発者はこのようなエラーが出る強引なリフレクションは行わないようにしましょう。(大抵の場合は同じ事を実現するためのより安全なAPIが用意されています)

サーバー管理者は極力--illegal-access=permitを使わないようにし、プラグイン開発者がこの問題に対処する意思を見せない場合はプラグインの入れ替えを検討しましょう。

将来的に使えなくなってから「代わりになるプラグインは?!」と混乱するよりも、今の内から心構えして準備しておく方が良いでしょう。

関連情報:

個人的な見解

個人的に何よりも嬉しいのはJava 16以上が必須になった事です。

以前までのバージョンはJava 8以上があれば十分だった。つまりプラグインを配布する場合はJava 8で動作するように作る必要があり、後のバージョンで便利なAPIが多数追加されているにもかかわらず、それを指を咥えて眺めなければならない状況でした。

今回の更新により16以上必須となったことで、以前から使いたいと思っていたさまざまなAPIが使用可能になりました。

旧バージョン向けのサポートも続けるプラグインでは依然としてJava 8で動作するように作り続ける必要が生じてしまうので、これを機にプラグインのサポートバージョンを1.17以上とするのもひとつの選択肢ではないでしょうか?

playersSleepingPercentage

個人的に「これいいな」と思った機能はplayersSleepingPercentageです。

数字を設定します。主に0~100の範囲で設定します。(デフォルトは100)

ここで指定した割合のユーザーが寝れば夜をスキップできます。たとえば50に設定したのであれば、50%の人が寝れば朝が訪れます。

0に設定すれば1人でも寝た時点で朝が訪れます。101以上に設定すると夜のスキップができなくなります。

より"民主的"な睡眠が可能になるため、特別な理由がないのであれば50に設定して夜をスキップするかどうかを多数決で決めるようにすると良いと思います。

参考

公式情報も読んでみてください。