マインクラフトはじめました
6月3日からはじめたマインクラフトですが、みごとにハマっています。どれくらいハマっているかというと、
- twitterがマイクラで埋まる
- twitterのメディア欄がだいぶマイクラに
- マイクラ中のお菓子が捗る
- 土日もマイクラ
- プログラミング的進捗が消滅
- 読書進捗も消滅
…と、まあどハマりですね。
マインクラフトのサバイバルモードでは、探索要素があり、開拓要素があり、農耕・牧畜要素があり、料理要素があり、とオープンワールドなゲームみたいに遊びがいがありおもしろいです。マイクラをしていると、『ゼルダの伝説 ブレス・オブ・ザ・ワイルド』や『天穂のサクナヒメ』をやってたときにも感じた、「人間って開拓すきじゃね…? 遺伝子に刻まれた性向なのか…?」という思いがまた感じられました。
木材を集めるのがダルすぎて友人に教えてもらった木の伐採modをいれたり、ミニマップのmodをいれたり、挙句の果てには描画がきれいになるmodをいれたりして、大いに楽しんでいます。
サーバを立てたい
そうして楽しんでいるわけなのですが、マイクラではどうもサーバをてると同じワールドに複数人で入って遊べるらしいのです。いわゆるマルチプレイというやつです。なにそれやりたい。
マイクラサーバを立てて友人とマイクラ遊びたい!
そんなわけでいろいろ調べはじめました。
マインクラフトのエディション
まず、マインクラフトのゲームにはエディションというものがあるようでした。現行のエディションは、
- Javaエディション
- Bedrockエディション
の2種類があるようです。1は昔からあるJavaで実装されたエディションで、個人でサーバを立て (てmodを入れ) たりできるのはこちらのエディションのようです。ぼくのマシンで常用しているOSはUbuntuなので、マイクラのクライアントアプリもJavaエディションです。2は、Javaエディションだとスマホやゲーム機で動かせないからなのか、Javaが動かない環境でもマイクラを移植できるように作られたエディションのようです。
公式のアップデートはどちらのエディションにも同時に提供されるので (直近だと6月9日に"Caves and Cliffs"という大型アップデートがありましたね) 、PCでどちらを選ぶかはどのように遊びたいかによって決めるとよさそうです。すなわち、
- modを入れたい
- modを入れた状態でワールドを共有したい
- このためにサーバを自分で立てる必要がある
ときにはJavaエディションを、そうでないときはBedrockエディションを選べばよいというわけです。GNU/LinuxだとBedrockは選択肢外ですが。
modについて
Javaエディションでは、Javaのクラスローダをごにょごにょしてあるため、かつmod用のAPIが提供されているために、modを作成して読み込ませることができます。modによって、木の根本を斧で破壊するだけで木全体が破壊されるというユーティリティ的な変更から、ゲームの見た目をカスタムする、ゲームに新しいモードを追加するということまでができるようになっています。
modはJavaのjarファイルの形で提供され、所定の場所に置けば起動時に読み込まれるしくみです。ただ、素のmod用APIは低レベルなのか、それらをうまくラップして抽象化レイヤーを提供してくれるmodフレームワークが存在しており、わりといろんなmodがそれに依存していました。ぼくが利用している範囲だと、伐採modのCutAllや描画をカスタムするOptiFineは、Forgeというmodフレームワークに依存してた気がします。
サーバの立て方
マイクラのJavaエディションでは、サーバのプログラムもJavaのjarファイルとして提供されています。なのでもっともシンプルには、以下の手順で起動できるはずです:
- Javaの実行環境をインストールする
- ここからサーバのjarファイルをダウンロードする
java
コマンドでサーバを起動する
もしサーバにアクセスしてマルチプレイをするときにもmodを有効にしたい場合、サーバにmodを導入しておく必要があるようです。
概要は以上のような感じです。
素のサーバを立てるチャレンジ
ここまでわかった時点で、まずは自分のマシン上にサーバを立てる実験をしてみました。ちなみにこれは失敗します。
ぼくの環境はUbuntu 20.04 LTSなのでsudo snap install openjdk
でJVMをインストールし、サーバをダウンロードするページにあるようにjava -Xmx1024M -Xms1024M -jar minecraft_server.1.17.jar nogui
でサーバを起動しようとしました。
が、まずclassファイルのバージョンが新しくて実行できないと言われました。JDKの11ではだめなのか、と思ってsudo apt openjdk-16-jdk
しなおして起動しても、ソケットがつくれないといって落ちてしまいます。root権限が足りないのかと思ってsudo chmod 777 -R ./path/to/minecraft
するとサーバのjarファイルがないと言われて謎。jarファイルのownerがrootではないからが原因だったのでもういちどsudo chown root:root -R ./path/to/minecraft
して実行してもソケットがつくれないエラー。なにもわからない。
ちなみにサーバとクライアントのバージョンが合っていなければ起動できても接続ができないので (手元の家までつくったワールドは1.16.5
)、じつはそもそもサーバのjarファイルのダウンロードの時点で失敗していたのでした。
Dockerでサーバを立てるチャレンジ
ハマりどころがいろいろ多くてしゃらくさいので、Dockerで立ててみることにしました。有志の手によってDockerイメージが公開されているとのことだったので、以下のようにdocker-compose.yml
を書いて、
version: "3.8"
services:
mc:
image: itzg/minecraft-server:java8
ports:
- 25565:25565
environment:
EULA: "TRUE"
VERSION: 1.16.5
TYPE: FORGE
FORGEVERSION: 36.1.0
volumes:
- ./minecraft-data:/data
ディレクトリminecraft-data
も用意しておいて、mod等の準備もした上でsudo docker-compose up
すると、立ち上がる立ち上がる! しかも接続もでき、ワールドデータも手元のをそのまま持っていけました。
ちょっと解説すると、このイメージでは/data
にマインクラフトのデータを持ちます。volumes
で外のディレクトリをマウントしてやると、既にあるデータを使ってサーバを起動できます。このイメージは起動時/data
内に必要なディレクトリがなければ作成します。またForgeも自動でインストールしてくれます。なので、こちらでやることはmodのjarファイルを所定の場所 (Forgeのmodなら/data/mods
) に置いておくだけです。もしワールドを引き継ぎたかったら、外から持ってきたworld
ディレクトリをそのまま/data
に置けば、起動時に読み込まれます。
イメージのタグとしてJava 8を利用するタグを指定していますが、どうもmodのほうがJava 8に依存していることがあるからのようです。実際指定なしにしたらmodの初期化で落ちて起動しませんでした。
もし入れるユーザを指定したい場合はenvironment
にWHITELIST: user1,user2
を追加してやるといいです。user1
などはマインクラフトのアカウント名です。
クラウドにサーバを立てるチャレンジ
さて、ここまででサーバ上でマイクラを走らせてログインするところまでできました。ただ、ローカルのサーバだと2つ問題がありました。
- スペックがあまり高くないIntel NUCでサーバを立てたため、処理落ちする
- 友人にサーバを共有できない (LAN内なので)
1は単に性能が足りていない問題ですが、クラウドではどうなるんでしょう。2は、自分でグローバルIPを取得してうんぬんとしてもいいのですがめんどくさいので、クラウドにサーバを立ててみる実験をしてみることにしました。
GCPにアカウントをつくったりしたあと、GCEインスタンスのスペックを選びたいですがどのインスタンスタイプにしたらいいのかが謎でした。インスタンスタイプ選びの参考にこの記事GCP初心者がGCEでマイクラサーバを建ててみた話 - Qiitaを読んでn1-standard-2
ならいけるかも、と思い、無料期間を利用してちょっと試してみました。
まずe2-standard-4
にしてみると (あ、n1じゃないこれ) 一人でサーバに入ってもハチさんがカクカクします。つぎにe2-standard-8
にすると、一人のときはハチさんが滑らかでしたが二人入るとハチさんがカクカクします。がーん。ちなみに手元のNUC (Celeron 4スレッド, 2018年くらい購入) だとハチさんがカクカクしました。
これけっこういいスペックでいいお値段だと思うんですよね、ウェブアプリ動かす分には。このあたりで怖くなったので一旦インスタンスを落としました。
まとめ
というわけで、クラウドだとe2-standard-*
ではかなり上げないとだめそうでした。いったん普段遊びとしてはローカルで立てつつクラウドのほうも実験していきます。
というかそうかぁ。n2-standard-2
ならいけたのかもしれないなあ。常に利用したときお金がどうなるかちょっと予想できないので、どうしたものか。