過去のIC2に存在したバグで、特定の条件下においてサーバーがクラッシュするというものである。

2.0.122-experimental 問題の個所にidの値をチェックするコードが追加され、解決されたことを確認。

2.0.122-experimental ネザーワートの成長ブースト仕様の穴により、依然としてこのバグが発生する可能性を発見。

全貌

TileEntityCrop#tick()内の後半部分、成長した雑草が周囲に雑草を伝搬させるか否かの判定時にcrop().isWeed()を呼び出しているが、このcrop()の実態が現在TileEntityCropが持っているidの値をそのままCrop種類を格納している配列に入れるというものであった。そのため、idが配列の範囲外にある状態でcrop()を呼び出すと例外落ちしてしまう。この条件を満たすidの値は-1で、それはCropに植えられた作物が「空」であることを示している。

今回、TileEntityCrop#tick()内の問題の部分では、直前にidを-1にする(calcGrowthRate()内のreset())記述を含んだコードがあるにもかかわらず、雑草を伝搬させるか否かの判定に直接crop()を呼んでしまっていたためバグが発生した。

発生条件

TileEntityCrop#calcGrowthRate()内でreset()が呼び出された場合、必ず発生する。

このreset()は「Cropの成長に必要な肥沃・保水・通気の値が極端に低かった場合、そのCropを確率で崩壊する」仕様の実装であり、環境値haveが必要値needよりも25を超えて下回っている状況下で、256minecraft tick(13秒程度)に1回、(31-Resist)/32の確率で発生する。

目安としては、Tier2のアシをGGR=31,31,4以上にすると肥沃3保水2通気4の農地で13秒ごとに1/8の確率で発生する。

影響

(マルチサーバー含めて)サーバーが異常停止する。

筆者の環境では巻き戻りなどは観測されず、問題のCropが空の支柱に戻った状態で再開することができた。

回避方法

  • そもそもhave値がneed値よりも25以上下回っている場合成長速度はゼロになるので、実用段階の農地では起こらない。
  • Resist値を31にすると、必ず崩壊判定が阻止されるため回避できる。
  • GregTechアドオンなどの追加作物はTier値が高く、GGR値が初期値であってもこれを砂漠に植えただけでバグが発生してしまう。Tier値が高い作物をうかつに発生させないことで防ぐことができる。
  • 保水状態では、環境値がおよそ10上昇する。これは約50のhave値に匹敵する値である。
  • 耕土の下の土・直射日光・通気・高度・バイオームにより環境値を大幅に下駄をはかせることができる。
  • 完全に成長しきった作物は成長判定が出ない(CropCard#canGrow)ので、回避できる。

プラグイン

ネザーワートでの潜在的な発生もPluginCropによって修正される。

ネザーワートでの発生

2.0.122-experimental現在、ネザーワートCropの耕土の下に特定のブロックが存在すると、成長ブーストが発生してこのバグを引き起こす可能性が存在する

TileEntityCrop#tick()にある crop().tick(this); の行の直後に if (crop().canGrow(this)) という記述が存在していることが原因であり、これが if (this.id > -1 && crop().canGrow(this)) であれば解決される。

最終更新:2014年08月08日 07:50