Blend day's Note

思い立ったことをメモする

Minecraft Serverが止まった(解決済み)

はじめに

ログインとかプレイ状況を伝えるTwitterBotにて、不穏な空気を漂わせるアナウンスが続きました。

うーん…嫌な感じだなぁ… とか思ってたら、プレイヤーから文句の連絡が。

f:id:kayo_tozaki:20170102182717p:plain

私が先日某所で学んだことだが、

お客様から言われてとかみたいな、外部から言われて気づくというのは最悪のインシデント(問題)検知です。

▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああ

って感じになってます。さて、頑張って解決していきましょう。

問題の原因

とりあえず、OP権限を付与できる(※私がプレイするとき用にOP権限はつけてない)状態で、とりあえずマイクラにログインすることに。

この段階で、なんとかログインできました。

問題発生の張本人からの証言

別に、この人が悪いわけではないが(管理者・プレイヤー共々知らなかったので)報告を聞くと、
どうもその人のやったことで問題が発生したのではないかとことが判明。 ことの顛末として、

  1. EnderIO mod の配管隠し (Conduit Facade) を作った
  2. 既にConduit Facadeに焼き石・木材(おそらく松の木材)を追加したものを使って配管をつなげていた
  3. 新たにConduit Facadeに焼き石を追加した物を、松材のところに接続しようとした
  4. 置いた瞬間に落ちた

ということ。

なので、発生場所教えてもらいその現場に行ってみると…

f:id:kayo_tozaki:20170102182731p:plain

なにこのテクスチャロードバグは。始めて見ましたよ、テクスチャ。

近くにあったアイテム( conduct switch ) を手に持つと…

f:id:kayo_tozaki:20170102182748p:plain

というわけで、周囲のブロックを壊して見ると、元に戻りました。

原因は、EnderIOのブロック隠しをする Painting Machineで作成されたブロックの設置によるテクスチャバグだということになります。

調査する

調査はまだ途中ですが、EnderIOのGithub Issueに、類似のバグがありました

一応クラッシュ時のログの一部ですが…

---- Minecraft Crash Report ----
// Shall we play a game?

Time: 16/01/16 17:34
Description: Unexpected error

java.lang.ClassCastException: crazypants.enderio.conduit.TileConduitBundle cannot be cast to crazypants.enderio.machine.tank.TileTank
    at crazypants.enderio.machine.tank.BlockTank.getLightValue(BlockTank.java:128)
    at net.minecraft.block.Block.func_149677_c(Block.java:528)
    at net.minecraft.client.renderer.RenderBlocks.func_147736_d(RenderBlocks.java:6708)
    at net.minecraft.client.renderer.RenderBlocks.func_147784_q(RenderBlocks.java:4716)
    at net.minecraft.client.renderer.RenderBlocks.func_147805_b(RenderBlocks.java:307)
    at net.minecraft.client.renderer.WorldRenderer.func_147892_a(WorldRenderer.java:320)
    at net.minecraft.client.renderer.RenderGlobal.func_72716_a(RenderGlobal.java:2232)
    at net.minecraft.client.renderer.EntityRenderer.func_78471_a(EntityRenderer.java:1514)
    at net.minecraft.client.renderer.EntityRenderer.func_78480_b(EntityRenderer.java:1301)
    at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1001)
    at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:898)
    at net.minecraft.client.main.Main.main(SourceFile:148)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)

HAHAHA...一体何がどうなっているんだ…

と、いうわけで、EnderIOのPainting Machine で生成したブロックは使用しないようにサーバ参加者には通知しましたが、 どうも、EnderIOのバグっぽいです。まあ、わからないですが。


バグの原因調査

そのまま放置ではとても気持ちが悪いので、結局調査することに。 マルチサーバーではなく、ローカルで、テクスチャのバグが起こることを目標に頑張っていきます。

検証環境を整える

バグを生じさせた友人に話を聞いて、似たような環境を用意することに。

f:id:kayo_tozaki:20170102182807p:plain

まあ、簡単な物を新規ワールド野ざらしで作成しただけです。特に意味は無いです。

必要なもの

今回のバグを再現するために、必要だったものは次のアイテムです。

  • String Generator (発電機) : 発電機ならなんでもいいです。私はこれしか知らないので。
  • lava backet (溶岩バケツ) : 燃料ならなんでもいいです。私はこれしか知らn(ry
  • Painting Machine (導管ペインター) : 今回の主役。
  • Conduit Facade (導管ファザード) : 今回の主役2。Painting Machine でペイントする先のアイテム。導管を様々なブロックのテクスチャにすることができる。
  • Fluid Tank (液体タンク) : 今回の主役3。これをPainting Machine でペイントする元に選択して、Conduit Facade をペイント先にすると、導管が透過される。
  • Wood : 木のブロックならなんでもいいです。床材として使用
  • Stone : 今回は焼石ですが、なんでもいいです。壁材として使用

配管

まずは、地面側、1ブロックでいいのですが、2ブロック分開いているので、2つ分。

f:id:kayo_tozaki:20170102182829p:plain

Painting Machine で Wood Block にペイントした Conduit Facade を設置します。

f:id:kayo_tozaki:20170102182843p:plain

石壁の方にも同様の細工をします。

f:id:kayo_tozaki:20170102182855p:plain

配管の全貌はこちら↓。(見た感じ完成前っぽいけど気にしない(大汗))

f:id:kayo_tozaki:20170102182909p:plain

バグを発生させる

今回は、Fluid Tank にペイントした Conduit Facade をいい感じに設置していこうと思います。

f:id:kayo_tozaki:20170102182920p:plain

配管時に、石壁側に設置した Stone & Conduit Facadeの隣、壁から出たところにある配管に対して、Fluid Tank & Conduit Facade を設置すると…

f:id:kayo_tozaki:20170102182933p:plain

という感じで再現できました。テクスチャのロードがバグって、!が量産されています。
同様にして、木材床の方もやってみると…

f:id:kayo_tozaki:20170102182942p:plain

というわけで、原因の特定と再現ができました。やったね。
ちなみに、導管を持つと、隠れている導管が姿を表しますが、今回のバグの場合は、合わせてテクスチャも元に戻ります。

f:id:kayo_tozaki:20170102182951p:plain


終わりに

原因の追求はできました。ワタシエイゴワカリマッセーンの人なので、きっとEnderIO の GitHub Issue には、この手のバグ報告は上がっていると信じています。 (未確認)

シングルの場合はテクスチャがバグっただけで、再ログインしても問題なくワールドをロードできましたが、
マルチの場合は容赦なく蹴られて、上記のようなエラーログとともに、Minecraftが落ちます(白目)

てなわけで、原因もはっきりしたし、再現もできたのでめでたしめでたし。