鯖構築運用雑記

管理してる鯖関連とか技術とかの雑記をメモしておく。

Minecraft Server の 管理は意外と大変?

この記事は、Kogakuin Univ Advent Calender 2015 の21日目 の記事だったりします。

事の始まり

2015/11/24 にこんなツイートがきっかけでマイクラサーバを立てました。

f:id:kayo_tozaki:20170102183428j:plain

そうです、脅迫がきっかけで、マイクラサーバを立てました。

これまでも、Minecraftサーバは立てて来ました。立てたバージョンはこちら↓

  • Bukkit : MC 1.7.10
  • Vanilla : MC 1.8
  • Vanilla : MC 1.8.3 (For [Sbutatoon old edition])

で、今回は、The 工業化がしたいという要望から、必然的に Forge1.7.10 を採用することに。初めてのForgeサーバでした。

サーバ構築

細かいことを紹介し始めると、すごく長い記事になりそうなので、簡単&簡潔に書いていくつもりです。まあ、Fラン大学生でも分かる程度って感じです。後はGoogle先生に頼ってください。

構築環境

今回は、テストと本設置環境がちょっと異なります。

テスト環境

本設置環境

まあ、Javaのバージョンが同じなので、なんとかなるということで。

実際の流れ

テスト環境下

  1. Minecraft Forge をダウンロードする。
  2. ダウンロードした forge***.jarWindows 上で一度起動、必要なファイル群を作業用ディレクトリにインストール。(扱いは保存)。
  3. forge-**.jarを起動、eula.txteula=trueを記述(falseをtrueに書き換え)
  4. mods ディレクトリに必要なModを導入。world ディレクトリは削除しておくのが吉(Modで追加されたブロックを反映させるため)
  5. forge-**.jarを再度起動、ワールドを生成させる。

ここまで、正常に起動できたら、minecraft.exe(ゲーム本体)を起動して、localhostでサーバに接続してみて、問題なく動いているかを確認する。

問題がなければ、本設置環境に、作業用ディレクトリをまるごとコピーする

本設置環境下

  1. テスト環境からコピー(転送)してきたディレクトリを、本設置環境で実行したいディレクトリに移動させる。
  2. テスト環境同様、forge-***.jar実行してみる。
  3. 正常に稼働したら、minecraft.exe(ゲーム本体)から サーバIP でサーバに接続してみる。接続できれば成功。
    この時、CentOS7は25565/tcpのファイアーウォールを開放しておくこと。

ここまでで、ひとまずMinecraft Serverの構築は終了です。簡単でしょ?


Dynmap で Mod で追加されたブロックが表示されない

今回のメインのお話。

Forge のサーバを運用し始めた翌日、ある異変に気が付きました。 それは、modとして導入していたdynmapでのブロック表示です。

f:id:kayo_tozaki:20170102183620p:plain

なんと、天井がないじゃないですか。

本当はこんな感じ。

f:id:kayo_tozaki:20170102183631p:plain

ちゃんと天井はあります。屋根もね。

ですが、表示されません。なんででしょうか?

今回の登場Mod達

  • Minecraft Forge
    • mod を使うための前提。こいつが居ないと始まらない。
  • Dynmap
    • Dynamic web-based Map の略称。Webからマップが見れて、誰がいるのかが分かるし、そこからチャットが送れるすぐれもの。
  • EnderIO
    • minecraftの工業化Modの一種。今回初めて導入されたもの。とても便利(らしい)
  • RailCraft
    • minecraft の鉄道系mod。様々な鉄道系のアイテムを追加してくれる奴。面白そう。

なぜ、このようなことが起こっているのか

家の天井が無い間抜け仕様に関して

これは涙目でした。最初は仲間内から、
「なに、このセーフハウスの屋根なしはわざとなの?」
とか言われてました。違います、これはDynmapのバグです

この家の材料

せっかく、Modが入ったワールドなので、建材の一部にModで追加されたブロックを使ってもいいよね~とかいう気持ちで、
天井は RailCraft で追加されたブロックを使っています。これが、バグが見つかった原因です。

マップに点在する黒い点

当初はありました。ここには何があったのかと、当時一番ログインしていた人(かつ、脅迫してマイクラサーバを建てさせた某氏)に聞いたところ、
RailCraft の露出ブロックだよ」
なるほど、RailCraft か...

Dynmap でのテクスチャ表示

ここから、ちょっと技術的なネタ。と、言っても、私は完全に理解している訳ではないので、あくまで推測論ですが。

ソースコード探しの旅

Dynmap の ソースコードは、Githubにて公開されていました。
Wiki もありますので、詳細はそちらを参考にしてください。

ちなみに、WikiのModサポートページによると、今回導入しているRailCraftは、対応している事になっています。ナッテコッタイ

EnderIOはなぜか消滅しています。謎ですが。

f:id:kayo_tozaki:20170102183649j:plain

このソースコードを見つける前に、別のMod:豆腐Modにて、Dynmapのカスタムモデルデータがあるということを知りました。

ここで、豆腐Modのカスタムモデルデータのテキストデータを見て、パターンを記憶しつつ、Dynmapのソースコードから、同じようなテキストデータがあるかどうかを探してみると...

あっさり見つかりました。

バージョンの壁

ひとまず、RailCraftのテキストデータ、Railcraft-models.txtを眺めると...

f:id:kayo_tozaki:20170102183705j:plain (効果音:仁のテーマ、一番盛り上がるあれ)

待て待て待て、バージョンが古すぎるじゃないか。(※今回導入は9.8.0.0)

Dynmapは認識してるのに...?

そうです、起動時のログを確認すると、Forge経由でDynmapはちゃんとRailCratのバージョンを認識しているのです。

f:id:kayo_tozaki:20170102183719j:plain

ですが、テクスチャが表示されません。なぜでしょうか?

マイクラのアイテムID

そろそろオチを考えないと、永遠に書いていそう(他にも、色々と検証していて、、それも書きたいのですが...) なので、解決の方向へ。

マイクラのアイテムIDに関しては、個人的印象では、1.8 にバージョンアップしてからうるさく言われるようになった気がします。
マイクラのIDが番号から文字列に順次変更していくということです。
これにより、giveコマンドで、ブロック指定するとき、番号だったものが、minecraft : ** みたいな指定になるようです。

閑話休題

Modのバージョンのが上がっているということは、ブロックのIDも書き換わっているという可能性があるということです。

と、いう訳で調べてみることに。

ブロックIDを調べてみる

  • 使ったmod : IDChecker-1.7.10d
    • ワールド読み込み時に、ゲームディレクトリ下にCustomDISkinsというディレクトリ作られる。
      その下には、各種アイテムやブロックなどのIDが記述されたテキストデータが保管されている

比較対象

  • RailCraft
    • 9.2.1.0 : 1.7.10 で対応している最古のRailCraft。訳あってDynmapではブロックが表示されているのを確認している。
    • 9.8.0.0 : 現状導入しているMod
  • EnderIO
    • 2.1.7.254 : 同上。
    • 2.2.8.381 : 現状導入しているMod

比較結果

右が新、左が旧

RailCraftの場合
f:id:kayo_tozaki:20170102183732p:plain

EnderIOの場合
f:id:kayo_tozaki:20170102183740p:plain

EnderIOは同一ですが、RailCraftはアイテムID(ブロックID)が変わっているではありませんか。

ちなみに、Dynmap のソースでは、次のようになってました。
f:id:kayo_tozaki:20170102183753j:plain

解決策

さてはて、とてつもなく長いネタになってきた気がしますが、あと少しで解決です。

最初は馬鹿をしました。

同じ轍を踏まないように書いておきますが、 .jarに固めようなんて考えないでくださいね!!!(やらかした顔)

豆腐Modを参考に。

カスタムモデルデータを配布している豆腐Modを参考に、RailCraftのモデル・テクスチャデータを上書きしました

実際にやったこと。

新旧のモデル・テクスチャデータの相違点は、tile.railcraft.があるかないか。

なので、まずは、githubdynmap-forgeソースから、RailCraftのモデル・テクスチャデータ(RailCraft-models.txt / RailCraft-texture.txt) をコピペ保存する。

次に、今まであるモデル・テクスチャデータ(RailCraft-models.txt / RailCraft-texture.txt) の該当箇所(tile.railcraft.)を削除して、別途保存。
保存後、minecraft サーバの dynmap/renderdataに、2つのテキストデータを突っ込んで、サーバをリスタートさせます。

祝解決

再起動後、マイクラサーバ内のOP権限で、/dynmap fullrenderをかけると...

f:id:kayo_tozaki:20170102183803p:plain

なんと、上手く行きました。やったね。

総括

DynmapでのMod対応が遅れてたせいで、個人的に治すはめになりました。まあ、対処療法ですけど...
これで、快適なマイクラ生活が送れそうです。

マイクラサーバの管理は大変です。が、適当にやってるとなんとかなるもので。

でも、本当はワールドのバックアップとか、プレイヤーの行動記録とか取っておくのがいいんでしょうけどね...

すごく長くなりましたが、マイクラサーバの管理者ってこういう感じなのかなみたいなのかな?これでいいのかわし??