Minecraft Serverが止まった(解決済み)
はじめに
ログインとかプレイ状況を伝えるTwitterBotにて、不穏な空気を漂わせるアナウンスが続きました。
サーバー状況(mod)
[10:48:00] *** がログインしました
[10:48:35] *** はログアウトしました
[10:50:29] *** がログインしました
— naccent マイクラ鯖 (@naccent_micra) 2016, 1月 16
うーん…嫌な感じだなぁ… とか思ってたら、プレイヤーから文句の連絡が。
マイクラマルチ入ってもすぐに落ちちゃう…(´・ω・`)
— ふじひろ (@fujihiro_sn) 2016, 1月 16
私が先日某所で学んだことだが、
お客様から言われてとかみたいな、外部から言われて気づくというのは最悪のインシデント(問題)検知です。
▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああ
って感じになってます。さて、頑張って解決していきましょう。
問題の原因
とりあえず、OP権限を付与できる(※私がプレイするとき用にOP権限はつけてない)状態で、とりあえずマイクラにログインすることに。
この段階で、なんとかログインできました。
問題発生の張本人からの証言
別に、この人が悪いわけではないが(管理者・プレイヤー共々知らなかったので)報告を聞くと、
どうもその人のやったことで問題が発生したのではないかとことが判明。
ことの顛末として、
- EnderIO mod の配管隠し (
Conduit Facade
) を作った - 既に
Conduit Facade
に焼き石・木材(おそらく松の木材)を追加したものを使って配管をつなげていた - 新たに
Conduit Facade
に焼き石を追加した物を、松材のところに接続しようとした - 置いた瞬間に落ちた
ということ。
なので、発生場所教えてもらいその現場に行ってみると…
なにこのテクスチャロードバグは。始めて見ましたよ、!
テクスチャ。
近くにあったアイテム( conduct switch
) を手に持つと…
というわけで、周囲のブロックを壊して見ると、元に戻りました。
原因は、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のバグっぽいです。まあ、わからないですが。
バグの原因調査
そのまま放置ではとても気持ちが悪いので、結局調査することに。 マルチサーバーではなく、ローカルで、テクスチャのバグが起こることを目標に頑張っていきます。
検証環境を整える
バグを生じさせた友人に話を聞いて、似たような環境を用意することに。
まあ、簡単な物を新規ワールド野ざらしで作成しただけです。特に意味は無いです。
必要なもの
今回のバグを再現するために、必要だったものは次のアイテムです。
String Generator
(発電機) : 発電機ならなんでもいいです。私はこれしか知らないので。lava backet
(溶岩バケツ) : 燃料ならなんでもいいです。私はこれしか知らn(ryPainting Machine
(導管ペインター) : 今回の主役。Conduit Facade
(導管ファザード) : 今回の主役2。Painting Machine
でペイントする先のアイテム。導管を様々なブロックのテクスチャにすることができる。Fluid Tank
(液体タンク) : 今回の主役3。これをPainting Machine
でペイントする元に選択して、Conduit Facade
をペイント先にすると、導管が透過される。Wood
: 木のブロックならなんでもいいです。床材として使用Stone
: 今回は焼石ですが、なんでもいいです。壁材として使用
配管
まずは、地面側、1ブロックでいいのですが、2ブロック分開いているので、2つ分。
Painting Machine で Wood Block にペイントした Conduit Facade を設置します。
石壁の方にも同様の細工をします。
配管の全貌はこちら↓。(見た感じ完成前っぽいけど気にしない(大汗))
バグを発生させる
今回は、Fluid Tank
にペイントした Conduit Facade
をいい感じに設置していこうと思います。
配管時に、石壁側に設置した Stone & Conduit Facade
の隣、壁から出たところにある配管に対して、Fluid Tank & Conduit Facade
を設置すると…
という感じで再現できました。テクスチャのロードがバグって、!
が量産されています。
同様にして、木材床の方もやってみると…
というわけで、原因の特定と再現ができました。やったね。
ちなみに、導管を持つと、隠れている導管が姿を表しますが、今回のバグの場合は、合わせてテクスチャも元に戻ります。
終わりに
原因の追求はできました。ワタシエイゴワカリマッセーンの人なので、きっとEnderIO の GitHub Issue
には、この手のバグ報告は上がっていると信じています。
(未確認)
シングルの場合はテクスチャがバグっただけで、再ログインしても問題なくワールドをロードできましたが、
マルチの場合は容赦なく蹴られて、上記のようなエラーログとともに、Minecraftが落ちます(白目)
てなわけで、原因もはっきりしたし、再現もできたのでめでたしめでたし。