【Java版】ディスペンサーの中身を検知してコマンドを作動させる方法【解説】

【Java版】ディスペンサーの中身を検知してコマンドを作動させる方法【解説】

この記事では、Minecraft Java Edition(バージョン1.17.1)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。

コマンド初心者なマインクラフター
「ディスペンサーにアイテムが入ったことを検知したいんだけど、どうやればいいの? 赤石回路でアイテム分別機作らないといけないのかな? 同じアイテムでも名前が変わっている場合で使用できるかどうかも変更したいな」

こんな疑問を解決します!

本記事の内容
  • executeコマンドで感知する
  • タグを駆使して、ディスペンサーの中にアイテムが入ったことを検知する
  • 同じアイテムでも名前が変わっている場合

こんにちは! マインクラフターのなつめ(@natsume_717b)です。

なつめ

マイクラ歴は5年程で、最近は脱出マップを配布・制作しています!
配布マップ・ダウンロードページ

今回はディスペンサーに特定のアイテムがあることで作動するコマンドについて解説していきます。

このコマンドが使われるものとして、「鍵を入れたら鉄の扉が開く」といったギミックですね。

もちろん赤石回路でもアイテム仕分けの機構などを利用して同様のことができますが、コマンドの強みとして回路を組めない場所でも反応させることができる点があります。

なので、覚えておいて損はありませんよ。
さっそくどんなコマンドを使うのか、見ていきましょう!



executeコマンドで感知する

ディスペンサーの中身を感知するのに使うコマンドは、executeコマンドになります。
これはexecuteコマンドのifを使って「どこそこに○○のブロックがあるとき~」という条件を使うためです。

executeコマンドは非常に奥深いのですが、今回はifの使い方だけ覚えておけば問題ありません。

例えば

/execute if block 10 10 10 minecraft:dirt run effect give @a haste

というコマンドをコマンドブロックに打ち込んだとします。

このコマンドは座標X=10、Y=10、Z=10の位置に土ブロック(dirt)があるときに採掘速度上昇のエフェクトをプレイヤー全員に付与するものになります。

コマンドブロックはリピート、常時実行に変更しておいたものとします。
こうしておかないと、土がX=10、Y=10、Z=10の位置にあるのかどうかを常に監視してくれません。

このコマンドをもとに、検知するブロックの指定を土ではなくディスペンサーに変更すればよいのだということは、なんとなく察しが付くかと思います。

ただ、その場合ディスペンサーの中身をどうやって判別するのか。
そのことについては次の項目で詳しく見ていきます。

タグを駆使して、ディスペンサーの中にアイテムが入ったことを検知する

ディスペンサーの中身を感知にするには、ブロックエンティティのタグを利用します。
「ブロックエンティティのタグって何? 聞いたことない」なんて方も多いかと思いますが、簡単に言ってしまえばそのアイテムの持つ性質です。

つまり、「このディスペンサーにはアイテムが入っていますよー」といったことをコマンドとして入力していくわけですね。

このブロックエンティティのタグを使えるようになれば、「どこそこにあるディスペンサーの中にアイテムが入っている時に~」というコマンドを使えるようになります。

エンティティと名前がついていますが、防具立てなどを示すエンティティとは無関係です。

例えば以下のようなコマンドがあったとしましょう。

/execute if block 10 10 10 minecraft:dispenser{Items:[{Slot:4b,id:"minecraft:brick",Count:1b}]} run effect give @a minecraft:haste

なんだか長くて嫌気が差しますね。
でも、1つ1つ見ていけば問題ありません。

それによくよく見てみると、先ほど紹介したコマンドのminecraft:dispenserの後ろに
{Items:[{Slot:4b,id:”minecraft:brick”,Count:1b}]}がくっついただけ
です。

このくっついた部分こそがブロックエンティティのタグですね。

これが何の役割を果たしているのか。
簡単に言い表すと以下のようになります。

  • Items→ディスペンサーに入っているアイテムの事を入力しますよという合図
  • Slot→ディスペンサーの9個のスロットの内どこにアイテムがあるのか
  • id→何のアイテムが入っているのか
  • Count→入っているアイテムの個数

もう少し噛み砕いて見ていきましょう。
Itemsの部分に関しては入力することがないので、Slotからです。

Slot

Slotではディスペンサーのどこにアイテムが入っているのかを示します。
その際

Slot:〇b

となります。
〇の部分に数字が入り、これがどの位置かを示しています。

左上から右下に向かうにつれて数字が大きくなっていきます。

そして、要注意なのが0から始まるということ。
1から始まるわけではないので、気をつけましょう。

id

idではアイテムのIDを入力します。

この点に関して気をつけることはないですね。
気をつけるとしてもスペルミス程度でしょうか。

確実に入力したいのならば、giveコマンドなどアイテムのIDが候補として現れたものをコピペするのが良いですよ。

id:"アイテムのID"

Count

Countでは、そのアイテムが幾つ入っているのかを指定します。

基本的には1bと入力して、1個のアイテムが入ったことを感知します。

もちろん謎解き次第では、複数個のアイテムを入れさせることを強要させても面白いと思います。

コマンドの書き方しては

Count:〇b

となります。

入れて欲しい数を〇に入れるだけなので、難しくはないですね。


最後にコピペ用のコマンドを置いておきます。
上述した内容と見比べながら使えば、問題なく感知できるようなると思います。

/execute if block ディスペンサーの座標 minecraft:dispenser{Items:[{Slot:〇b,id:"入れるアイテムのID",Count:〇b}]} run 作動させたいコマンド

余談ですが、ドロッパーの場合はminecraft:dispenserをminecraft:dropperに変更するだけで同じように運用できます。




同じアイテムでも名前が変わっている場合

さて、ディスペンサーにアイテムが入ったことを感知する方法について一通りの説明はしてきたのですが、配布マップ等ではアイテムの名前や説明文を変更することは珍しくありません。

その場合、「上述のコマンドで上手く機能するのか」という疑問が浮かぶかと思いますが、アイテムIDや入れる個数、位置さえ間違えなければ機能します。

なので、「○○という名前の特定のアイテムを入れた時~」とわざわざ設定する必要はありません

しかしながら、これらを設定する必要があるときもあります。
それは同種類のアイテムを幾つも入手できる場合です。

例えるなら、トリップワイヤーフックを鍵に見立てたものを複数個入手できるものの、ディスペンサーはトリップワイヤーフックが入ったことを感知してしまうので別の鍵も使用できてしまうといった感じです。

そういった場合はそれぞれ正しい鍵でしか反応しないよう、コマンドを入力する必要があります。

なので、ブロックエンティティのタグの部分にtagを追加しましょう。

追加する内容例としては以下の通り。
(寝室に入る鍵だと仮定しています)

tag:{display:{Name:'[{"text":"寝室の鍵"}]',Lore:['[{"text":"2階にある寝室の鍵だ"}]']}}

tagには、アイテムの名前や説明文やエンチャントされているかどうかなどを書き込めます。

アイテムの名前や説明文の付け方は【Java版】名前や説明文のついたアイテムの出し方【1から始める配布マップ作り】で解説しています。

コマンドをすべて書いてみると以下のようになります。

/execute if block 10 10 10 minecraft:dispenser{Items:[{Slot:4b,id:"minecraft:tripwire_hook",Count:1b,tag:{display:{Name:'[{"text":"寝室の鍵"}]',Lore:['[{"text":"2階にある寝室の鍵だ"}]']}}}]} run effect give @a minecraft:haste

上記のコマンドでは、コマンド例を統一するためにエフェクトを付与するコマンドになっています。

ですが、その部分をレッドストーントーチを設置するコマンドに変えれば、鉄の扉を開くようにすることもできます。

その際、鍵を入れたディスペンサーを他のブロックに置き変えるなどして鍵を回収できないようにするとGoodです。

というわけで、基本的にアイテムの名前や説明文までも設定する必要はありませんが、脱出マップ等の進行のさせ方次第では設定しておく必要があるということになります。

コピペ用のコマンド

/execute if block ディスペンサーの座標 minecraft:dispenser{Items:[{Slot:〇b,id:"アイテムのID
",Count:〇b,tag:{display:{Name:'[{"text":"アイテムの名前"}]',Lore:['[{"text":"アイテムの説明文"}]']}}}]} run 起動させたいコマンド

まとめ

というわけで、今回のまとめです。

今回使ったコマンドはこちら。

今回使ったコマンド
  • ディスペンサーに特定の位置に指定したアイテムが入ったことを検知するコマンド
/execute if block ディスペンサーの座標 minecraft:dispenser{Items:[{Slot:〇b,id:"入れるアイテムのID",Count:〇b}]} run 作動させたいコマンド
  • ディスペンサーに特定の位置に指定したアイテムが入ったことを検知するコマンド
    (名前や説明文を指定した場合)
/execute if block ディスペンサーの座標 minecraft:dispenser{Items:[{Slot:〇b,id:"アイテムのID
",Count:〇b,tag:{display:{Name:'[{"text":"アイテムの名前"}]',Lore:['[{"text":"アイテムの説明文"}]']}}}]} run 起動させたいコマンド
ポイント
  • 基本的にはアイテムの名前や説明文までも指定する必要はないものの、マップ次第では指定する必要がある。

この記事は以上になります。







この記事を共有!