植物系ブロックであるサボテンについて解説します。
なおバージョン1.1.0のソースを参考にしているので、1.2.3のソースとは少し違います(引数が特に)。
※重要ではないところは解説しないので、自分で調べてください。
成長に関するメソッドについて[編集]
基本的に植物系のブロックは成長するのにupdateTickというメソッドを使用しています。
updateTickは、プレイヤーのいるチャンクを中心とした19*19チャンクでtick毎におよそ0.2%の確率で発生し、
各チャンクから80ブロックが選ばれsetTickOnLoadがtrueなら発生します。
(http://forum.minecraftuser.jp/viewtopic.php?f=21&t=76 引用)
では見ていきましょう。
まず、world.isAirBlock(i, j + 1, k)でブロック上に何もないか確認しています。
もし上に何もないならば、次のforに移ります。このforでサボテンの高さを計測しています。
for (l = 1; world.getBlockId(i, j - l, k) == blockID; l++) { }なので、
どんどんと下のブロックがサボテンかどうかみていき、サボテンでないなら計測を終了します。
そして l が計測した値となります。
その後、if(l < 3)で成長させるかどうか判断しています。
つまり3ブロック以上サボテンが成長している時は成長しないようになります。
そして、if(l < 3)の中が成長させる処理です。メタデータを使用しているのは、おそらく成長を遅らせるためと思われます。
特定のブロックにしか置けない・近くにブロックがあるとアイテム化する等の処理について[編集]
<砂にしか置けない>
<近くにブロックがあるとアイテム化する>
<地面が砂でなくなるとアイテム化する>
という処理は、canPlaceBlockAt、onNeighborBlockChange、canBlockStayが関係します。
canPlaceBlockAtはそのままの意味で、ブロックが置けるかどうかを判定しています。
あとででてくるcanBlockStayが関わってきます。
onNeighborBlockChangeは近隣のブロックに何かしらの変化があった場合に動くメソッドです。
サボテンの場合、あとで出てくるcanBlockStayでそのままブロックとして残るか、アイテム化するか決めています。
dropBlockAsItemはアイテム化する処理です。
canBlockStayはブロックとしてそのまま残るか、プレイヤーが置けるかに関する判定を行うメソッドです。
world.getBlockMaterial(i - 1, j, k).isSolid()で横にあるブロックが固体かどうか確認しており、固体ならばfalseを返します。
横にブロックがなかった場合、最後の
return l == Block.cactus.blockID || l == Block.sand.blockID; に行きます。
ここで下のブロックがサボテンか砂ならtrueを、それ以外ならfalseを返しています。
その他[編集]
onEntityCollidedWithBlockはプレイヤーなどがブロックに触れた時に発生するメソッドで、サボテンの場合、ダメージを与える処理がされます。