鉱石系のブロックを一括破壊する
目次
概要
適性の採取ツールがピッケルのブロックを一括破壊するModを作ってみました。
このModでは一括破壊するピッケルを追加する方法で実装しています。既に一括破壊Modは存在しますがキーによるON/OFFだと間違えてしまうことが多々あったため持ち替えた方が良いのではと作ってみました。
主要なコード
それでは早速コードです……。
ちょっと、だいぶとんちんかんなコードを書いてしまいまして非常に分かりにくいと思います……。
新しくピッケルを追加する
ツールは一から定義するのではなく流用した方が間違いがないと思い、ItemPickaxeを継承しました。ItemPickaxeはピッケル系ツールの実装で、コンストラクタ引数に材質を渡すことで一つのクラスでダイアモンド、鉄、石、木製のピッケルとして機能します。今回はダイアモンド製のツールとして実装しています。
MagicPickaxe.java
public class MagicPickaxe extends ItemPickaxe { // 省略 }
ピッケルに一括破壊する機能を作る
今回はツールでブロックを破壊した時に呼び出されるonBlockDestroyedメソッドを上書きすることで実装しました。その中でもブロックを破壊する処理はdestroyBlocksAtOnceメソッドに書き出しています。
処理のフローイメージ
- 破壊したブロックの周辺を探索する
- 破壊したブロックと同じブロックは専用の配列に登録する
- 1-2を隣接ブロックから同じブロックがなくなるまで続ける
- 破壊予定ブロックの配列から一つ取り出す
- 配列から取り出したブロックを破壊する
- 4-5を配列が空になるまで続ける
破壊したブロックをまとめる
そうして隣接している同じブロックをすべて破壊し終えたら、ちらばっているエンティティ(モブやドロップアイテムなどの総称)から破壊したブロックと同じブロックを集め、一つのエンティティにまとめます。
この処理もonBlockDestroyedメソッドで実装していますが、作り終わってからはちょっと違和感を覚えています。
課題
- ブロック探索の実装が非常に分かり難い(きっと来月には自分も分からなくなるでしょう)
- タイミング的に破壊したブロックと一括破壊したブロックのエンティティをひとまとめに出来ない
- そもそも別途ツールを追加するよりも既存のツールに金床などで一括破壊機能を付加する方がツールを定義しなくても済む気がする
と作ってみて感じています。
Github