【高みを目指して】マインオールの作り方(簡易版)

 そもそもマインオールとは、別名「鉱脈掘り(ヴェインマイナー)」と呼ばれ、いわゆる鉱石の一括破壊のことです。イマドキ「マインオール」とは呼ばれなかったりするんでしょうか?
 ほとんどの鉱石は面で隣り合ったものがいくつか連なって生成されます。そしてそのカタマリのうち一つを破壊すると面で繋がった鉱石も壊されていくといった機能になります。

 先に但し書きをしておきます。「簡易版」とあるように、まだいくつか改善点が残ります。単なる研究不足によるものにあわせて、現在のBEの仕様により改善不可能なものもありますが、ご了承ください。

■基本の発想

 まずはシステムの構成を考える必要があります。「隣り合うブロックを壊す」というのは何を検知してどんなことを実行すれば実現できるでしょうか。コンポーネントやイベントファンクションでできることではないので、コマンドでやることになります
 考えの過程を示すので方法だけが知りたかったら適宜読み飛ばしてください。

1. 「破壊」のためのコマンド

 システム側からブロックを破壊することができるのは/fillコマンドのdestroyメソッドしかありません。destroyメソッドならちゃんとアイテムと経験値を落とします
 カスタムブロックのイベントファンクションにkillがありますが、ブロック側から実行するのはややこしかったり、そもそも鉱石はバニラのブロックなのでなしにします。

2. 「破壊」の実行元

 条件はブロックが隣り合っていることですが、ブロック側から「隣り合っているかどうか」を比較する方法はありません。もう一つ、当たり前で影が薄い条件があります:「はじめにカタマリのうち一つが壊される」です。
 ブロックが壊れたのを検知する必要もありますが「ワールド内の座標(x,y,z)でブロックminecraft:○○が壊された」と検知できる万能な関数やコンポーネント、コマンドは存在しません。
 ある動作を検知するとき、その動作をする前と後での違いがわかればいいので、その違いのなかで検知する方法があるものを検知して間接的に目的の動作を検知することになります。
 要するにたとえば、「ブロックの破壊」を検知したいならばブロックが壊れる前と後の周囲の違い、今回ではアイテムがドロップしたかどうかを検知します。これではじめのブロックが壊されたことを検知できました。
 アイテムはエンティティで、コマンドはエンティティに対して何かを実行するのが得意です。ここで、エンティティならば特定の座標のブロックが何であるかを検知する方法があります。
 /executeコマンドのdetectメソッドです。アイテムの隣──すなわち上下左右前後の六面に対して6つの/executeコマンドを実行します。

/execute @e[type=item,name="(アイテムの名前)"] ~~~ detect (隣の座標) (隣の鉱石) 0 fill (隣の座標) (隣の座標) air 0 destroy

 「隣の座標」は当然相対座標です。「アイテムの名前」を使っているので、日本語のみで指定すると言語設定が日本語じゃないときにこのコマンドが動作しなくなるので注意が必要です。他言語に対応させるためには言語の数だけコマンドを増やす必要があります。また、リソースパックで名前を変えていてもダメです。

※「(隣の座標)」と書いてあるところはすべて同じ座標です

◇ おおまかなシステムはできあがり

 あとはアニコンでプレイヤーからこのコマンドを常時実行させます。tick.jsonは重いのでオススメしません。

■アドオンにしていく

1. コマンドはファンクションにする

 鉱石自体たくさん種類があるので、それかける6面分ですから、膨大なコマンド数になります。アニコンに書き並べてもいいですが、そこは個人の自由で。
 上面の隣、石炭で例を書いてみます。

/execute @e[type=item,name="石炭"] ~~~ detect ~~1~ coal_ore 0 fill ~~1~ ~~1~ air 0 destroy

 対応させるアイテム、ブロックには注意してください。

(鉱石) → (アイテム)
石炭 → 石炭
鉄 → 鉄鉱石(×鉄インゴット)
レッドストーン → レッドストーンパウダー
光るレッドストーン(lit_redstone_ore) → レッドストーンパウダー
ラピスラズリ → ラピスラズリ
金 → 金鉱石(×金インゴット)
ダイヤ → ダイヤモンド
エメラルド → エメラルド
ネザー金 → 金塊
金ブラックストーン → 金塊 & 金入りブラックストーン
ネザライト → 古代のがれき

 あとは自由に追加してください。砂利や黒曜石、花崗岩/閃緑岩/安山岩などはお好みです。逆に、エメラルドとネザライトはブロックが隣り合わないのでいらなかったら作らなくてもいいと思います。
 鉱石ごとに別のファンクションにすることを個人的におすすめします。

2. アニコンを作る

 transitionの条件は「(1.0)」(=trueの意)にすることにより無条件で常時実行することができます。二つのトランジションを行き来させて無限ループさせます。
 作り終わったらアニコンのIDをコピーしてから保存します(手際よく作るコツ)。

3. プレイヤーの定義ファイルを編集する

 プレイヤーのjsonにアニコンを紐付けます(idを先にコピーしておくと手間が減りますね)。

4. 完成

 あとはマニフェストなどを拵(こしら)えておしまいです。

■ 改善点

・精度が悪い

 ブロックを壊したとき、アイテムはその場にストンと落ちずに飛び散ります。それによってうまく連鎖してくれないことがあります。石炭のようにぎっしりたくさんのブロックが集まっているとほとんど失敗しないんですが、木の幹のように「支え」がないと失敗が目立つようになります。もう少し考えたり研究や実験を繰り返せばいい方法は見つかると思いますが、わたしは隣だけでなく斜め方向も検知範囲にすることによって雑にパッチしています。──それでも木の幹はキツいんですが。

・次世代ピッケル「石炭ドリル」

 コマンドを常時実行しているあたり、想像ついたひともいるでしょう。"いつでも"ドロップアイテムは隣の鉱石を壊そうとするのでクリーパーが鉱石を破壊しても、プレイヤーがその辺に鉱石を捨ててもマインオールが動作してしまいます。だから、一つでも石炭が手に入れば石炭が掘り放題に、一つでも検知用のドロップアイテムが手に入ればその鉱石が掘り放題になります。金塊なんて最強ですよ。

・エンチャント問題

 プレイヤーが手に持っているアイテムはどんなエンチャントがなされているかを検知する方法が全くもって存在しないので、幸運エンチャントを反映することができません。これは仕様によって行く手を阻まれました。革命を待ちましょう。
 シルクタッチは検知アイテムを拡張すれば検知はできますが、fill-destroyで壊したときにシルクタッチを反映できません。こちらも仕様の壁です。革命を(ry

・葉っぱはできない

 カットオール(マインオールの樹木版)も、原木をマインオールしてさらに葉っぱもマインオールすれば実現できますが、葉っぱは「必ずドロップするアイテム」がないので連鎖しません。別の方法でカットオールは作る必要がありそうです。

MinecraftBEアドオン-ヒント倉庫

MimecraftBEのアドオン作りで困ったときにここで解決できるようにと個人によって作られたものです

0コメント

  • 1000 / 1000