MC.JE コマンド技術書 第1項.ニンジン付きの棒は最適な魔法の杖。


どうも、ReOrcaです。

今回は、ニンジン付きの棒を魔法の杖として使えるようにする方法を、以下の手順を追って解説していき、ついでにJEでコマンドを扱うにあたって欠かせない存在である、“セレクタ”や“nbtタグ”の使い方にも軽く触れておこうと思います。
1.そもそも、なぜニンジン付きの棒なのか?
2.コマンド解説
 2-A.プレイヤーの動作をカウントしてくれるスコアボードの機能
 2-B.プレイヤーの手に持っているアイテムを調べる方法
3.コマンドの順番について・まとめ
4.私が実際に使用しているコマンド実用例(有料公開)


1.そもそも、なぜニンジン付きの棒なのか?

先に結論だけ言ってしまうと、“そのままだと右クリックしても何も起こらないけど、右クリックしたことを手軽に検知できる”からです。

このことを利用し、オフハンドでニンジン付きの棒を持っており、利き手に何か右クリックに反応しない物を持っている時に右クリックすると、その利き手に持っている物に応じて好きな効果を発動させられるようにしようということです。

ちなみに利き手に右クリックに反応する物を持っているときは、オフハンドのニンジン付きの棒は右クリックを検知しません。逆に言えば、オフハンドに杖を持ったままでも気兼ねなく弓矢などを使えるということですね。
これについては、例えば両手に盾を持って右クリックすると、利き手の盾を構えます。このように両手に右クリックで反応するものを持っている場合、利き手の方を優先して使うということを意識すれば、なんとなく理解はできるかと思います。
そのため、シャベルのように特定の場面でしか右クリックに反応しないものについては、右クリックに反応する場面ではそちらを使用し、反応しない場面ではニンジン付きの棒が右クリックを検知するという微妙にややこしいことになります。


2.コマンド解説

さて、早速ですが、今回活用するのは主に以下の2つ。
A.プレイヤーの動作をカウントしてくれるスコアボードの機能
B.プレイヤーの手に持っているアイテムを調べる方法

どちらもオリジナルのワールド制作には欠かせないくらい汎用性の高いものなので、ぜひ両方とも習得していってください。


2-A.プレイヤーの動作をカウントしてくれるスコアボードの機能

まず1つ目の、“スコアボードのプレイヤーの動作をカウントしてくれる機能”の使い方。
これはスコアボードのobjectivesというものを新しく作る際、そのコマンドの最後の方に書く部分で利用することができます。

scoreboard objectives add R_Click minecraft:used.minecraft:carrot_on_a_stick

このコマンドの意味は、

“R_Click”という名前の“carrot_on_a_stick”“used”したことを検知する“scoreboard”“add”する。

言い直すと、

“R_Click”という名前の“ニンジン付きの棒”“使った”ことを検知する“スコアボード”“追加”する。

あえて“R_Click”の部分を言い直さなかったのは、自分でつける名前の部分だからです。英数字とアンダーバー限定ですが、自分の分かりやすいように好きな名前をつけてください。
一応、この文の後に文字を書くと、この名前とは別に表示名をつけることができますが、基本的にはややこしくなるだけなので、画面に表示して誰かにその名を読ませるようなことがなければ、表示名はつけないほうがいいでしょう。

そして、このusedで右クリックを検知できるものの中で右クリックしても何も起こらないのが、ニンジン付きの棒だけだったりします。
(8/15追記:ver1.16にて追加された歪んだキノコ付きの棒でも同じことができるようになりました。こちらの場合はcarrot_on_a_stickをwarped_fungus_on_a_stickに変えることで使うことができます。処理が別々になるので、2種類の杖を使い分けることができるようになりました。)
ちょうど元々の使い道も、利用価値を問われればかなり怪しいものなので、遠慮なく活用することができます。
強いて言うなれば、近くのブタ(やストライダー)たちが寄ってくるのがたまにキズ?

このコマンドを使ったあと、ニンジン付きの棒をどちらかの手に持って右クリックすると、右クリックするたびに“R_Click”のスコアが1つずつ増えていきます。ただ、今回に限らずスコアボードは追加しただけでは画面に表示されないので、スコアの変動を確認するためには

scoreboard objectives setdisplay sidebar R_Click

と書いて実行する必要があり、逆に表示を消すときは、

scoreboard objectives setdisplay sidebar

とだけ書いて実行します。簡単に説明しておくと、サイドバーにR_Clickを表示しますよ、サイドバーの表示を無くしますよ、という意味です。

これでこのR_Clickのスコアを見ることができるようになり、スコアの動きが分かりやすくなりました。
そしてこのスコアを常にリセットするようにすれば、右クリックした一瞬だけ“R_Click”が1になり、晴れて検知に使うことができるようになるというわけです。
というわけで、リセット用のコマンドはこう書きます。

scoreboard players set @a[scores={R_Click=1..}] 0

playersはプレイヤーのスコアの数値をいじる時に使うもので、@a全てのプレイヤーの中から、[]の中の条件に合うプレイヤーのスコア0setします。
今回指定した条件は、“scores”の“R_Click”が“1..”である場合。
“scores”はスコアボードの数値を条件に使いたいときに使用します。
“1..”は“1以上”という意味で、例えばこれを“..3”と書けば“3以下”になり、“2..5”と書けば“2以上5以下”という意味になります。
使用目的上、[]とその中身を書かなくても動くのですが、あえて条件を指定することで必要な時だけ動作するようになり、ワールドが重くなりにくくなります。

また、setではなくresetを使うという方法もあるのですが、resetしてしまうとスコアが“何も無い状態”になってしまうため、例えば“0のスコア”を検知したい時などに検知できなくなってしまいます。
そのためスコアをリセットする時はなるべく0にsetした方が、後々のエラーを回避する一工夫になるのです。
用途次第では、スコアボードの追加と同時にそのスコアを0にsetしておくこともあります。


2-B.プレイヤーの手に持っているアイテムを調べる方法

プレイヤーの手に持っている物は、セレクタで調べます。例としては、


@a[nbt={うんたらかんたら}]

これはつい先程も似たものが出てきました。この@から]までの一区切りをセレクタといい、例えばこの場合は“@a”の意味である“全てのプレイヤー”の中から、“うんたらかんたら”と書かれた“nbtタグ”を持つ人を指定するセレクタとなります。nbtタグとは、その物体の状態が記録されたものだと思っておいてください。プレイヤーのnbtタグはコマンドで変更することができないものの、そのほかのMOBや防具立てなどのnbtタグをコマンドで変更すると、変更した内容に応じてその物体の状態が変化します。

そしてここに、先ほどの応用で一手間加えて、
@a[scores={R_Click=1},nbt={うんたらかんたら}]

と書くことで、nbtタグを指定しながらR_Clickのスコアが1になった瞬間のみを検知できます。

そして肝心の、“うんたらかんたら”の部分。
これは正直かなりややこしく、なかなか簡単には解説できないため、今は“手に持っているアイテム”を指定する場合の書き方のみ説明します。

nbt={SelectedItem:{id:"minecraft:emerald"}}

この中のemeraldの部分がアイテム名、つまりこの場合はエメラルドを指定しています。
なので、例えばこのemeraldをboneにすれば骨を指定できますし、wooden_swordと書けば木の剣を指定できます。

さて。セレクタだけではコマンドとして成り立たないので、ちゃんとコマンドの一部として使ってやる必要があります。
ただ、コマンドにはセレクタがあるものと無いものがあるため、無いものには一工夫加える必要があります。

・セレクタがあるコマンドの例
tp @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:flint"}}] 0 80 0
=火打ち石を持って杖を使った人が、座標x0y80z0にテレポートする 

・セレクタがないコマンドの例
execute at @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:slime_ball"}}] run summon ~ ~ ~ LightningBolt
=スライムボールを持って杖を使った人に、雷を落とす

このように、tpのようにセレクタがあるものはそこに条件を書き込み、summonのように基本的にセレクタが無いものはexecuteと一緒に使い、そのexecuteの方に条件を書き込みます。一応セレクタがあるものでもexecuteを使う場合はありますが、セレクタがあるものに条件を書いてみても思うような結果が出ない場合に疑ってみる程度で大丈夫です。

これでニンジン付きの棒を杖として使って、好きなアイテムで好きな魔法を使うことができるようになりました。
ただ、このままではアイテムを消費はしません。
剣のように魔法で消費してしまったら困るものはともかく、せめてスタック可能な素材系アイテムくらいは消費して魔法を使うようにしたいですよね。なので、例えばスライムボールで雷を落とすコマンドなら、


clear @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:slime_ball"}}] slime_ball 1


でスライムボールをひとつ消費するようにしましょう。
こうして同じ条件を使ってclearコマンドを使うことで、雷を落としたときのみアイテムを消費させることができます。


3.コマンドの順番について・まとめ

これで、一通りのコマンドは出揃いました。
ただこれらのコマンドには順番があります。
その順に書いて並べていくと、


execute at @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:slime_ball"}}] run summon ~ ~ ~ LightningBolt

clear @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:slime_ball"}}] slime_ball 1

scoreboard players set @a[scores={R_Click=1..}] 0


……となります。
①先に効果が発動してから、
②アイテムをひとつ消費し、
③最後にスコアをリセットします。

データパックのコマンドは全て上から順に実行されていきますが、どんなコマンドにも組み合わせるからには順番があります。もし順番が分かりづらければ、上から順に、セレクタに使えるもの(スコアやnbtタグなど)の変化をメモしながら順番を考えると、だいぶわかりやすくなるでしょう。


・杖とスライムボールを持って右クリックする(R_Clickが1になり、スライムボールを手に持っている状態)
execute at @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:slime_ball"}}] run summon ~ ~ ~ LightningBolt
・右クリックした人に雷が落ちる。

clear @a[scores={R_Click=1},nbt={SelectedItem:{id:"minecraft:slime_ball"}}] slime_ball 1
・R_Clickは1のままで、スライムボールが1つ減る。

scoreboard players set @a[scores={R_Click=1..}] 0
・R_Clickが0にセットされる。


ちなみに2-Aで解説したコマンドは、あくまでも検知機能を持ったスコアボードを追加・表示させるためだけのものなので、常時実行させる必要はありません。


4.私が実際に使用しているコマンド実用例(有料公開)

最後に、どうしてもアイデアが浮かばなかったり、私の使い方から学びたいといった場合は、有料ですが、最後にいくつか実用性のある例を載せておきますので、参考までにどうぞ。
特に最後のは、今回解説したセレクタやnbtタグの奥深さを知らしめるとっておきを用意してみました。慣れないうちはただの呪文のようにしか見えないとは思いますが、ひとまずは「こんなことまでできるのか。」と思っていただければ。

ここから先は

1,705字

¥ 100

この記事が気に入ったらサポートをしてみませんか?