Posted Category ゲーム


こんにちは。ごみばこです。

半年くらい前から嫁と2人でふわーっと Minecraft をやり始め、サーバや mod をあれこれいじくり回ってきたので、ここいらでいっかいまとめておこうかと思います。

 

Minecraft の始まり

始め方や細かい情報 wiki に乗っているのでそちらを見てもらうとして。

Minecraft Japan Wiki - Minecraftトップページ

そんなこんなで Minecraft の準備が整い、ローカルでぽちぽちやっていましたが、毎回サーバ上げて、っていうのはどちらかがいないときに面倒だよね、ということになりサーバを別途用意することにしました。以前 Terraria も2人でやっていたということもあって、それ専用で使っていた CentOS7 なサーバがいるので、これをそのまま利用することにしました。

ちなみに Minecraft サーバ とかでググると「物理サーバを自宅に用意しよう!」「UPSやNASを使って~」「メモリが~」「batファイルを作成して」とかって書いてあって、なかなか激しいなって思いました。と、いうかこのせいでググっても英語情報ばっかりで(これはこれでわかりやすいものが多くてうれしいけど)、あまり参考になるような情報と出会うことも少なかったということも併記しておきます。もっと Linux やろうぜ。

 

MC 1.10 Spigotの利用

Minecraft を始めたとき、バージョンは 1.10 でした。

MOD にも魅力を感じていたところですが、クライアント側で用意するの面倒じゃんね、とか、いやいや、意外とサーバ側だけでもできるんちゃう?というところから調べていると(もとい Wiki を眺めると)、Spigot というよさそうなものがあるではありませんか。

SpigotMC - High Performance Minecraft

導入手順は wiki と公式サイトに書いてある通りで、まあ、そんなに難しいものでもなく。と投げっぱなしもあれなので簡単に説明を書いておきましょうか。

 

Spigot は Bukkit と呼ばれる Minecraft サーバをもとに作られたもので Bukkit プラグインもそのまま利用できます。Bukkit は DMCA 問題(配布するプログラムに Minecraft 公式の持っている著作権的な云々が絡んでいる)があり、Spigot も同じように影響を受けています。そのため、ソース(とビルドツール)が配布されているので、これを自分たちでビルドすることになります。

ビルドする方法は以下のページを参照してもらえばよろしくて。

BuildTools | SpigotMC - High Performance Minecraft

これまたちなみにですが、このくらいの英語なら Google 翻訳片手に戦えるはずなので、やろうと思っている人は頑張って戦おうね。投げっぱなしは鯖管としてどうなんかなーとか。(ググるとそんな人たちももりもり出てきてアレ)

 

そんなこんなで Spigot サーバが立ち上がり、常時稼働しながらちょっとずつプラグインを入れていきました。最終的には以下のようなプラグインが入っていました。

AutoSaveWorld ワールドのバックアップを定期的に取る
BlockHat 手に持っているブロックを頭に被ることができる
DTools 3x3 を処理できる強化型のつるはし、斧、シャベルを作成できる
FarmProtect 開墾した土地の上で走るジャンプするしても大丈夫にする
GlassDropper ガラスが割れずにドロップする
HealthBar Mob の頭上に体力ゲージを表示する
Multiverse-Core Multiverse プラグインの前提プラグイン
Multiverse-Portals 別ワールドに移動できるポータルが作れる
Multiverse-SignPortals 別ワールドに移動できる看板が作れる
Original-Double-Jump 空中でジャンプができる
PacketListenerAPI 前提プラグイン
PermissionsEx 権限管理。後々を考えてはいたが、まずは身内だけなのでフル許可!
PetOwner ペットの所有者を変更できる
ProperTime 時間の流れを制御できる
ProtocolLib 前提プラグイン
RampenDrills 指定の組み合わせでブロックを組み立てると走行するドリルが出来上がる
SimpleSort チェストを棒でたたくと中身をソートできる
TreeAssist 繋がっている原木を一括で刈れる
Vault 前提プラグイン
WorldBorder ワールドに境界線を設定できる
XPKeeper 経験値を貯めておける看板が作れる
dynmap Web で地図を見れる
dynmap-mobs DynMap に Mob 表示機能を追加する

 

いろいろなプラグインを見ていると、もはやそれチートだよねとかっていうものもある中で「バニラ環境(何も拡張を入れていないドノーマル状態)からは便利になるけど、チートにはならないように。ゲームバランスぶっ壊れないように」というところだけは気を付けていました。

「3x3ツール作れるけど、3倍の素材が必要で、耐久力は通常の3倍どころか、1.5倍程度」

「2段ジャンプできるけど、その分おなかが多く空いてくる」

などといった具合に、バランス調整をしていました。

 

しばらくはこんなで、ワールドを増やしてポータル作って飛んで遊んだり、なんてしていました。

 

が!!!!!

やはり、実況動画を見ていると、工業mod にも憧れをもつところです。

 

めっちゃ調べたのですが、やっぱり Spigot や Bukkit などでは追加ブロックはできないということで、なくなくあきらめて forge に移行することを決めました。

ちなみに、情報があまり多くないですが Slime Fun という Spigot で使える工業的なものもあります。こいつもいろいろ調べてみて検討はしました。結果としては、ビルド系のプラグインの RampenDrills で体感したのですが、既存ブロックを組み合わせて配置すると、何かのメカニズムが動くよ!というものがどうも難しいねっていう話になり、あきらめることにしました。

 

MC 1.8.9 Forgeの利用

Forge は Minecraft そのものを拡張していくようなタイプのものになります。原理はよくわかんないんですけど、 Minecraft の jar を読み込んでいい具合に展開して上書きしていくんですかね。マルチプレイヤー時には、サーバ側とクライアント側で基本的には同じものを入れる必要があります。その中でもサーバ側だけで動くもの、クライアント側だけで動くものがあったりします。

Minecraft Forge

 

Forge 自体は 1.10 にも対応していたのですが、「工業mod をする」という前提で調べると一番近いものではどうも 1.8.9 になるようでした。また、移行するにあたり、今まで動いていたものはなるべくそのまま使いたいなあという思いもあり、それができる Sponge というものがあるのですが、それの対応も 1.8.9 以降だったのでちょうど都合よくいけそうでした。

Sponge は Forge の上で動く mod になっており、Spigot の API をいくつかエミュレートして、同時に Spigot 側の有名なプラグインたちを Sponge 向けに移植するようなこともしているそうです。つまり Sponge を使うことで、Forge の上で Spigot プラグインが動く!(ようなもの)が出来上がります。

Sponge - Minecraft Modding API

 

ここでちょっと用語を整理すると、Spigot や Bukkit などで拡張するためのものは「プラグイン」と呼ばれていて、Forge では 「mod」と呼ばれています。ちょっとややこしいですね。

 

プラグインの移行については、ちょっと古いですが下記のスレッドを見たり。

Plugins to be ported! - Plugins / Plugin Requests - Sponge Forums

どうしてもないものもあったりしたので一部あきらめたりもしました。
結果として、以下のような プラグイン、mod になりました。

DoubleJump Sponge プラグイン。Original-Double-Jump の Sponge 版。たぶんこれ → DoubleJump Plugin - Plugins / Plugin Requests - Sponge Forums
Dynmap Web 上で地図が見れる mod
Hammerz 3x3 ピッケル mod
InventoryTweaks インベントリの整理 mod
TreeDestroyage Sponge プラグイン。 TreeAssist の Sponge 版
buildcraft 工業 mod
pex Sponge プラグイン。 PermissionsEx の Sponge 版
projectportals Sponge プラグイン。 Multiverse-Portals の Sponge 版
projectworlds Sponge プラグイン。 Multiverse-Core の Sponge 版
spongeforge Sponge 本体

だいぶ数が減りました。

Forge では利用する Forge や mod のバージョンはサーバとクライアントがすべてバージョンが揃っている必要があります。(要出典)その都合もあって、DLリンク を準備したり zip にまとめたりして、簡単に指定バージョンを集められるようなものを提供していました。

参考程度にですが Forge は forge-1.8.9-11.15.1.1890 を利用していました。

 

移行するものはプラグインだけでなく、ワールドもあります。

Spigot と Forge とでフォルダ構成が違ったりするのですが、Sponge を入れていると、Spigotの設定をみていい具合に設定ファイルやワールドをうまく移行してくれます。って、書いてあったのですが、うまくできなく、結局ワールドについては、自分のPC上で新しく作ったワールドのフォルダ構成と目比べしながら、手作業でフォルダ移動して設定を合わせていきました。

実際のサーバ上の移行については、いきなりえいやーではなく、自分のPC上で何度か確認してこれでオッケー!という状態で、実際のサーバ上の反映をしていきました。そのおかげもあり、特に大きなトラブルなく、Spigot から Forge + Sponge 環境へ移行することができました。

 

しかし、工業を楽しもうとし始めたころ、急に Minecraft サーバが重くなったり、落ちるような現象が多発するようになりました。サーバが重いながらも、プレイヤーの移動はできるので、既存ワールドの光景を見て回ると、ある村が工業で追加された「クァーリー」だらけになっていて、こいつが原因となって重くなっているようでした。

Minecraft はバージョンによって利用しているブロックの ID が異なることがあるそうで、 1.10 のあるブロックの ID が 1.8.9 の buildcraft で追加されたクァーリーの ID と被っていたために起きた現象でした。

MCEdit と呼ばれるマップ編集ソフトがあったりするので、個別に対応していくこともできたのですが、どこまで影響が出ているかわからなかったのもあり、泣く泣く既存ワールドをあきらめて、新規に始めることにしました。

 

新規ワールドでもクァーリーを動かして、もりもり掘削し始めるくらいには資源や環境が整いつつありましたが、そんなとき、これまた突然に Minecraft サーバが高負荷になり、反応が遅くなることが頻発するようになりました。

特に新しい mod を入れたわけでもなく、なんのことなしに、急に重くなったので原因もすぐにはわからず…。

Sponge で追加されるコマンドの中に /sponge timings report というものがあり、これを実行すると外部のサーバに Tick の詳細が送られ、分析レポートを見ることができます。

 

そもそも Minecraft の世界では、その世界の時間や処理を進める Tick というものがあります。これはサーバパフォーマンスに問題がなければ 20回/秒 ほどの速度で実行されていくと言われています。

サーバの動作がめっちゃ重たいということは、この Tick の中で何かしらの環境や mod が影響を及ぼしているものだと判断ができます。

例えばよくある話(要出典)を挙げると、水を高いところから大量に撒くとサーバが重いとか、大規模なトラップタワーを作ったり、レッドストーン回路を大量に作ると大変だとか。これらは、水やレッドストーンなど、プレイヤーや mob の動きに関係なく更新しなければいけない状態が多数あるために、1回の Tick でやることが増え、結果としてサーバ負荷が上がっている、というところになると思います。

 

というわけで、Tick の中で何が起こっているかの判断ができれば、原因となる mod や 環境がわかるのでは?と思い実施しました。すると以下のようなレポートが出来上がりました。

これを見ると buildcraft|core:bcresizcuboid が Tick 上で何か悪さをしていそう、ということが分かったので、実際にどこにいるのかを MCEdit で探しました。すると Buildcraft のポンプの部分にこの bcresizcuboid エンティティがくっついていることが分かりました。MCEdit 上でこのエンティティを消し、再度サーバに上げると特に問題も無さそうなほど快適な工業生活を再び迎えることができました。

が、この平穏な生活も長く続かず、やはり同じ問題が再発しまくるようになっていました。原因はポンプではなくて、そもそも Buildcraft なのでは?と思うようになり、安定版である 1.7.10 対応のことを考えるようになりました。それに合わせて、Buildcraft 以外にも Forestry for Minecraft や 豆腐Craft など、他の mod にも手を出してみたい、という話もあり、これもまたちょうどよいタイミングなので、思いきって移行していきます。

 

MC 1.7.10 Forge の利用

MC 1.7.10 では Sponge を利用することができません。代わりに Forge 上で動く mod ですべて行っていく必要があります。
まずは使いそうな mod だけ選んでいってみて、こんな感じです。

BedrockLayer 岩盤を平らに整地してくれる
CodeChickenCore NotEnoughItems で必要な mod
CraftingEX 複数の mod で重なるレシピについて選んで実行できる
CutAll 木こり
Hammerz 3x3 ピッケル
InventoryTweaks インベントリ整理
MoSkeletons スケルトン追加
NotEnoughItems レシピ確認(チート無効)
SmashBatsMod 敵を吹き飛ばすバット
TofuCraft 豆腐もぐもぐ
buildcraft 工業
coroutil MovePlus で必要な mod
forestry 工業 + 農業 + 養蜂
moveplus ダッジ、二段ジャンプ

ポータルや地図はなくなりました。まあいいかなと。そんな頻繁にポータル作るようなわけでもないので。そのうちでいいので、資源ワールドとかあったら便利だなーと思う程度なので、その時にまた調べて導入したらいいかなあと思っています。

 

さすがに移行も2回目になると、ワールドがだめだろうな、という予想もついています。実際にそのまま持っていくと、パイプが謎の液体に代わっていたり、木の柵が何かの工作機械になっていたりと、完全に使い物にならなくなっていました。というわけで、このワールドもポイして、新規ワールドです。逆に mod も入れ替わったりしているので、そっちのほうが資源を探しやすかったりして、都合がいいのです。

いまのところ、まだ鉱石があまり掘れていなくて、がっつり工業!とか豆腐!とかってほどじゃないのですが、順調に資源が集まりつつあり、これからの光景が楽しみです。1.7.10 でやっている人も多いようなので、きっと大丈夫だろうと思ってます!

 

おわりに

Minecraft を初めて半年くらい経ちました。これまで 1.10 → 1.8.9 → 1.7.10 とバージョンを変更してきて、それに合わせてサーバ環境も Spigot → Forge + Sponge → Forge と移り変わりました。不具合的なこともありましたが、やりたいことをベースに移ってきて、実際にやりたいことができていて、とても満足している状態です。

結果、Forge やるなら 1.7.10 にしておこう!という気持ちです。

 

最近はいろんな人の mod を見てたりして、自分も何かやってみたいなーと思っていたりします。mod 作るのは Java かーと思いつつ Scala や Kotolin が使えるとの情報もあって、どんな mod を作ろうかなーとワクワクしています。出来たらどこぞにこっそりと上げていこうかなーと。

というわけで Minecraft な生活はこれからもしばらく続きそうです…!

 

おまけ

今の使っているスクリプトをくっつけておきます。
参考程度にどうぞ!


// ★start.sh
// 初回起動用スクリプト
// screen コマンドを使ってシェルスクリプトを起動する

#!/bin/sh
cd "${0%/*}"
screen -AmdS minecraft-server-forge17 ./start_forge_server.sh


// ★start_forge_server.sh
// 常時起動スクリプト
// screen コマンド内で動き続けるスクリプト。
// minecraft が落ちてもこのスクリプトが生きていれば60秒後に再起動する。
//
// java のオプションとして以下のものを設定
//   メモリ割り当て:1GB
//     -Xms1G -Xmx1G
//   よりよいGC機能の利用
//     -XX:+UseConcMarkSweepGC
//     -XX:+CMSIncrementalPacing
//     -XX:ParallelGCThreads=3
//   最適化フラグの有効
//     -XX:+AggressiveOpts

#!/bin/bash

while true; do
    echo "Starting the server"
    java -Xms1G -Xmx1G\
         -XX:+UseConcMarkSweepGC \
         -XX:+CMSIncrementalPacing \
         -XX:ParallelGCThreads=3 \
         -XX:+AggressiveOpts \
         -jar forge-1.7.10-10.13.4.1614-1.7.10-universal.jar nogui

    echo "Waiting 60 seconds before starting the server again"
    sleep 60
done


// ★attach.sh
// screen に接続するためのスクリプト
// 毎回 screen コマンドやるのも嫌なので…

#!/bin/sh
screen -r minecraft-server-forge17


// ★cron_forge_server_restart1.sh
// crontab によって毎朝09:00に起動される
// サーバを落としますよーという告知

#!/bin/bash
screen -S minecraft-server-forge17 -p 0 -X stuff "say Restarting the server in 1 minutes^M"


// ★cron_forge_server_restart2.sh
// crontab によって毎朝09:01に起動される
// なんとなくスッキリしたいので minecraft を強制終了している

#!/bin/bash
ps ax | grep java | grep -v grep | awk '{ print $1 }' | xargs kill -9