鍋はすき焼きがすき

ちげだからってチゲ鍋が好きなわけじゃないんやで

100%バニラで MineAll 実現してみた|コマンド解説【Minecraft 1.14】

今回はマイクラのコマンドの紹介です。

MineAllはご存知?

MineAllとはマイクラのModで、鉱石の一括採掘ができるようになるものです。 MineAllがONの状態で、鉱石ブロックを採掘できるピッケルで破壊すると、その鉱石ブロックの隣にある同じ種類の鉱石ブロックを一緒に破壊してくれます。

f:id:chige12:20190430144616p:plain
石炭鉱石を発見!

f:id:chige12:20190430144645p:plain
一つ掘ると一気に破壊!

こちらは動画↓(音無しですが…)

今回はこれをなんとコマンドブロックで実現します!

つまりModを入れずバニラでMineAllが使えちゃいます。現在の最新版(1.14)で動作するだけでなく、マルチサーバーや、Modが入れられないMinecraft Realmsでも動作します!

実際にこのスクショや動画は Ver. 1.14 のRealmsワールド内です。Realmsだと処理をだいたいサーバー側がやってくれるので割と軽くておすすめです。

さらに仕組みが同じなので、MineAllだけでなく、CutAllやDigAllなども作れます。

コマンドブロックをあまり使いなれてなくてかなり悩まされましたが、調べまくって実現できました。早速作ってこ!

※注意

完全にMineAllと同じではありません。見かけ上同じような動作をするものです。コマンドブロックで記述した条件さえ揃えば一括採掘されてしまうため、当然未完全な挙動が生まれてしまいます。未完全な挙動については、この記事の最後に書いておきます。

大まか解説

ではまずは、金鉱石の採掘を例に、ざっくりどういう風に実現しているかご紹介。

まず、金鉱石ブロックを採掘します。するとアイテム化した金鉱石ブロックがドロップします。

このアイテム化した金鉱石をコマンドで検出します。アイテム化した金鉱石の上下左右前後に金鉱石ブロックが隣接していた場合、そいつを破壊します。

破壊された金鉱石ブロックはアイテム化し、それがまたコマンドによって検出されるため、連鎖的にブロックを破壊することができます!

f:id:chige12:20190430220933p:plain
アイテム化した金鉱石ブロックを検知して周りの金鉱石を破壊する

コマンド詳細解説

金鉱石の採掘を例に、コマンドで行う処理を順番に説明します。手順は全部で4つ。

1. isGoldOre という名前の Scoreboard を作成。

以下のコマンドをコマンドブロックのインパルスモードで実行します。

scoreboard objectives add isGoldOre dummy 

構文: /scoreboard objectives add <名前> <指定する条件> [表示する名前]

Scoreboard(スコアボード)とはプレイヤーやモブの行動を検知し、カウントすることができる機能です。例えば、あるプレイヤーが死亡した回数、他のプレイヤーを倒した回数などなどです。 このスコアボードを使うにはスコアを作成する必要があります。

上記のコマンドでは isGoldOre という名前のスコアを作成しています。この名前はなんでも良いですが、各ブロックでユニークにしておきましょう。

コマンドの最後に dummy という表記がありますが、この条件はスコアを変更することがコマンドでのみ可能であることを示しています。そのため、死亡やKillなどのゲームイベントによって自動的に変更されることがありません。

2. 金鉱石(Gold Ore)がアイテム化された時、そのアイテムに isGoldOre の Scoreboard をセットする。

次に、以下のコマンドをコマンドブロックのリピートモードで実行します。このコマンドで、先ほど作成した isGoldOre というスコアが、アイテム化した金鉱石ブロックに対してセットされます。

scoreboard players set @e[type=minecraft:item,name="Gold Ore"] isGoldOre 1

構文: /scoreboard players set <エンティティ> <スコア名> <値> [データタグ]

アイテム化した状態のブロックはエンティティ扱いであり、 @e[type=minecraft:item] で検知できますが、それでは全てのアイテムが対象となってしまうため、アイテム名を指定しています。

Minecraftの言語を日本語に設定しているなら、アイテム名の設定のところを name="金鉱石" にしてください。また、自分の環境で日本語に設定していても、Realmsの環境で動かしたい場合は、Realmsサーバー側の言語設定が English(US) になってるっぽい*1ため、名前を name="Gold Ore" にしてください。

セットするスコアボードの値はなんでもいいのですが、ここでは1としておきます。

3. "isGoldOre"スコアがセットされたアイテムの1ブロック上に金鉱石ブロックがあれば、その金鉱石ブロックを破壊する。

これはかなり長いです。これをリピートモードで実行します。

execute at @e[type=minecraft:item,scores={isGoldOre=1}] if block ~ ~1 ~ minecraft:gold_ore run setblock ~ ~1 ~ minecraft:air destroy

このコマンドでは、まず execute コマンドを使い、コマンドを実行する条件を設定しています。

構文: /execute <サブコマンド> <条件指定> run <起動コマンド>

<条件指定> のところで指定された条件が満たされると、<起動コマンド> の部分のコマンドが実行されます。条件指定については後述します。

鉱石の一括破壊処理はこの execute のおかげで成り立っています。この execute の処理を理解するために、まずは <起動コマンド> について解説します。

3.1 起動コマンドについて

今回起動するコマンドは setblock です。

setblock ~ ~1 ~ minecraft:air destroy

構文: /setblock <x> <y> <z> <ブロック名> [データ値|状態] [元のブロックの処理] [データタグ]

~ は相対座標を表しており、上記のコマンドでは、自分(プレイヤー)の現在位置から1ブロック上に空気ブロックを設置しています。

ちなみに、 destroy モードは [元のブロックの処理] を指定するものです。setblockで空気に置き換える時、置換前にその座標にあったブロックは破壊されることになりますが、この destroy モードでは破壊されるときに破壊音が鳴り、アイテムが落ちます。

これにより、プレイヤーの現在位置から1ブロック上のブロックが破壊されて(空気になり)、アイテムが落ちるというわけです。

しかし、これでは鉱石を破壊するたびにいちいち鉱石の座標を入力する必要があります。それを解決するのが execute コマンドです。

プレイヤーの現在位置から ではなく、破壊してアイテム化した金鉱石ブロックのエンティティから の相対座標にすればいいわけです(……!!!!!!!!)

3.2 サブコマンドについて

<サブコマンド> の部分は指定する条件の種類によって変わります。今回使用しているのは atblock という2つのサブコマンドです。二つ並べて書くことができます。

/execute at <atの条件指定> if block <blockの条件指定> run <起動コマンド>

at は、指定したエンティティの座標、方向、ディメンションの条件が揃った時にコマンドを実行します。block は、指定したブロックが存在する(またはしない)場合にコマンドを実行するものです。

要するに、サブコマンドを2つ使うことで、以上二つの条件のANDを取っています。

3.2.1. サブコマンド "at" について
execute at @e[type=minecraft:item,scores={isGoldOre=1}] run ~~~

構文: /execute at <エンティティ> run <実行コマンド>

at で指定した <エンティティ> がコマンド実行の主体となります。

このコマンドでは scores={isGoldOre=1} とある通り、 isGoldOre スコアが1であるアイテムを主体にしてコマンドが実行されることを表しています。

1.と 2.で説明した通り、isGoldOre スコアはアイテム化した金鉱石ブロックに対してセットされているので、アイテム化した金鉱石がコマンド実行の主体となります。

これによって "アイテム化した金鉱石から" の相対座標で、3.1で説明した setblock コマンドが実行されるということです。

金鉱石をピッケルで採掘し、金鉱石がアイテム化すると、アイテム化した金鉱石から1ブロック上にあるブロックが破壊されます。破壊されると、金鉱石はアイテム化するので、そのまた1ブロック上のブロックを破壊していきます。このようにすることで連鎖的にブロックを破壊するわけです。

しかし、破壊するブロックを金鉱石だけに指定してあげないと、他のブロックも破壊されてしまいます。そこで登場するのが第二のサブコマンド、 block です。

3.2.2. サブコマンド "block" について
execute if block ~ ~1 ~ minecraft:gold_ore run ~~~

構文: /execute (if | unless) block <座標> <任意のブロック> <実行コマンド>

<座標> で指定した座標に、<任意のブロック> が存在する(if)、またはしない(unless)場合にコマンドが実行されます。

この block サブコマンドによって、アイテム化した金鉱石ブロックから1ブロック上に金鉱石ブロック(minecraft:gold_ore)が存在した時のみコマンドを実行しています。

これで金鉱石以外のブロックを破壊することはなくなりました。

4. アイテムの全方向を検知対象にする。

先ほどのコマンドは、金鉱石ブロックから1ブロック上だけしか検知していませんでした。なので、同じコマンドを用いて上下左右前後の6方向を検知し、どの方向にブロックがあっても破壊されるようにしましょう。

解決方法は力技です。コマンドブロックを6つ使います。

3.で紹介したコマンドを6方向それぞれ座標を変えて記述します。こいつらですね↓

~1 ~ ~ , ~ ~1 ~ , ~ ~ ~1 , ~-1 ~ ~ , ~ ~-1 ~ , ~ ~ ~-1

これで6方向全てどの方向にブロックがあっても破壊されるようになりました!お疲れ様でした!

4.1 ついでに

CutAll(原木採取)を実現する場合は、 破壊したブロックより下側のブロックは破壊されないようにする(~ ~-1 ~ のコマンドを作らないでおく)と良いかと思います。

また、アカシヤや、でかいオークの木などは原木が斜めに配置されているので、上記6方向に加えて斜め上8方向を追加しておくと取りこぼしがないと思います。こいつらですね↓

~1 ~1 ~ , ~-1 ~1 ~ , ~ ~1 ~1 , ~ ~1 ~-1 , ~1 ~1 ~1 , ~-1 ~1 ~1 , ~1 ~1 ~-1 , ~-1 ~1 ~-1

コマンドの配置

多いけど頑張ってコマンド入力して!

  • スコアの作成にコマンドブロック(インパルスモード:橙色)が1つ!
  • スコアを落ちている特定のアイテムに付与するコマンドブロック(リピートモード:紫色)が1つ!
  • 特定のアイテムの上下左右前後に特定のブロックがあったらそいつを削除するコマンドブロック(リピートモード:紫色)が6つ!

金鉱石を自動採掘するだけで、だいたい計8つのコマンドブロックがいることになります。(原木採取ならさらにもっと……これは大変だ……)

実装するとこんな感じになります。↓↓↓

f:id:chige12:20190430193224p:plain
こんな感じになる

どうしても Realms で MineAll 使いたいんや! 多いけど頑張って入力しよう……

スポーンチャンクに作ろう!

このコマンドブロックたちを置くスペースはスポーンチャンクに作って、どこからでもコマンドが実行されるようにしましょう。スポーンチャンクの近くでは、ワールドのどこにいても常に読み込まれるようになっています。

スポーンチャンクの範囲はこちらの動画によると Ver. 1.14 で 16×16 チャンクから 21×21 チャンクに広がったようです。

うっかりスポーンチャンク外に作ってしまうと、コマンドブロックから一定距離離れた時にコマンドブロックが置いてあるチャンクが読み込まれず、コマンドが実行されなくなります。

コマンド動作を一括でON, OFFさせよう!

一括採掘の処理を簡単にON, OFFさせたいですよね。

f:id:chige12:20190430195053p:plainf:id:chige12:20190430195057p:plain
レッドストーンブロックを設置して一括でON, OFF

画像右側のチェインモードのコマンドブロックたちが、レッドストーンブロックを破壊したり設置したりを一括でやってくれてます。これも setblock コマンドに絶対座標を入れることで実現しています。

f:id:chige12:20190430204830p:plain
レッドストーンブロックの設置場所をそれぞれ絶対座標で指定

レッドストーンブロックが上につけば、上側の列のコマンドが動いて「レッドストーンブロック削除」。下につけば、下側の列のコマンドが動いて「レッドストーンブロック設置」

そして、画像右側のレッドストーンブロックを設置・削除するコマンドを看板クリックで実装しています。

f:id:chige12:20190430195544p:plainf:id:chige12:20190430195548p:plain
看板をクリックすることでレッドストーンブロックを設置・削除している

この看板はgiveコマンドで出すことができます。僕は「Minecraft custom sign generator」というWebツールを使ってコマンドを生成しました。

Minecraft custom sign generator

このツールのコマンド入力欄に以下の様なコマンドを入力して生成すれば、看板が手に入る give コマンドが生成されます。

ONにする看板用

/setblock <上側の絶対座標> minecraft:air
/setblock <下側の絶対座標> minecraft:redstone_block
/tellow @a 鉱石採掘を ON にしました!

OFFにする看板用

/setblock <上側の絶対座標> minecraft:redstone_block
/setblock <下側の絶対座標> minecraft:air
/tellow @a 鉱石採掘を OFF にしました!

このツールで生成したコマンドをコマンドブロックに貼り付けてスイッチを押せば、簡単に看板が手に入ります。この看板を植林場の入り口にでもつけておきましょう。

ちなみに、このWebツールは2019年4月30日現在、1.14に対応していないため、看板のidが minecraft:sign になっています。なのでそこは手で修正して minecraft:oak_sign などに書き換えましょう。

今回はコマンドブロックをさらに増やしたくなかったので看板を使用しましたが、 executeコマンドを使えばユーザーの様々な動作を検知することができます。そのため「特定のアイテムをオフハンドに持っているときに採掘ON!」とか「スニークしながら掘ると採掘ON!」とかもできます。

色々試してみてください!

未完全な挙動について

記事の最初の「※注意」のところで「未完全な挙動が生まれてしまいます」と書きました。実は、本記事のコマンドの処理内容を理解していただいていれば、すぐ見抜けるバグがあるんです。

本記事のコマンドは、採掘するときに金鉱石がアイテム化することを利用した一括破壊処理となっています。

しかし、採掘タイミングや手持ちの道具等関係なく、落ちている金鉱石全てにスコアボードが設定されるため、アイテムの金鉱石を金鉱石ブロックの上にドロップすれば、コマンドに記述した条件が満たされ、金鉱石ブロックは破壊されてしまいます。

また、「幸運」のエンチャントがついたピッケルだろうが何だろうが、コマンドによって破壊されるため、エンチャントの効果は付きません

したがって、採掘時に幸運の効果をもたせたい「ダイヤモンド」や「エメラルド」などの高価なブロックを採掘するときは、コマンドの動作をOFFにするか、そもそもコマンドを設定しないことをお勧めします。

僕は、石炭鉱石、鉄鉱石、金鉱石、レッドストーン鉱石の4種類のブロックにおいて一括破壊コマンドを設定しています。

マルチプレイ時の注意点

さらに、マルチプレイの場合、コマンドブロックの処理はワールド共通なので「Aさんは採掘ON、BさんはOFF」みたいなことはかなり難しいと思います。なので、僕は tellow コマンドで全員にONになったことをお知らせするというやり方でやっています。

これらの問題を解決したよ!という方はぜひ僕のTwitter@chige12_)にリプを飛ばしてきてください!!

参考

スコアボードについて

executeコマンドについて

setblockコマンドについて

*1:これは実験的にそうっぽいと判断しただけです。Realmsだと日本語設定なのに英語名で反応しました。