【JEコマンド講習会】第2回、ネコを呼び出して色を変えるイリュージョンを作ってみる。 /summon,/data と NBT の基礎 【マインクラフト】

スポンサーリンク

ようこそ、ぷっこ村へ。ししゃもですよ。

(・∀・)ノ

と、言うわけで、やってきました、コマンド講習会第2回!!まだペースや内容の濃さがとんとわかりませんが、ボチボチやっていきましょうか。

コマンドを楽しんで親しむのが目的なので、あんまり小難しくしないようにしていきたいですねー。利口ぶって、すぐ難しい言葉使おうとするからね、気を付けないとね。

ネコたんを召喚、NBTタグを弄ってイリュージョン

今回のお題

今回はエンティティ関係を、少しずつおべんきょしていきたいと思いまっす。ついでに召喚するためのコマンド、/summon もやってみます。

↑のような感じで、召喚したネコたんたちの毛色を定期的に変えてみます。毛色が変わるだけなんですが、知っておく知識が意外と多い、基本的だけど奥深い内容だと思います。召喚用コマンド1つと、仕掛けに使うコマンドは3つ

  • summon … エンティティを召喚
  • tag … ラベルを貼るコマンド
  • data … NBTタグを見たり変えたりするコマンド

NBTタグってのは、ちょっと概念的な部分を理解してないと分かりにくいかもしれないです。まずホントにざっくりとだけ触れておきましょう。

NBT タグをざっくり

NBTタグってのは、エンティティが持ってるデータのことって思ってもらえばいいかなと思います。人で言えば、身長とか体重とか年齢とか、そんなデータです。

座標や向き、ベクトル、持ち物、など共通するモノが多くありますが、種類ごとに違うタグも多くありますので、慣れがいります。

NBTタグを言い表す表現方法が人によって違うので、コマンド講習会全体を通してはNBTとだけ呼ぶようにします。NBTの~と書いてあったら、dataコマンドで見れるアレね。と思ってください。

summon コマンドをざっくり

summon 自体が召喚って意味なので、まぁその通りです、エンティティを召喚します。モンスターはもちろん、動物、額縁、アマスタもエンティティです。ブロックじゃないものはエンティティ位のノリでええよ。

基本の書き方
/summon エンティティ名 x座標 y座標 z座標 {NBT(オプション)}

指定した座標に指定したエンティティを召喚します。最後の{}内にNBTを指定することで、様々な変化を持たせることができます。

一例
/summon cat ~ ~ ~ {CatType:5}
足元に三毛猫を召喚

CatType:5 は NBT ですね。毛色を決めるのに使われていて、書いてる現在では11種類あります。ネコだと他に個別であるNBTだと、首輪の色を決める CollarColor っていうのがあったりします。面白いね。

tag コマンドをざっくり

エンティティにタグを付けるコマンドです。タグは目印として付けるラベルとか付箋とかのイメージです。それ自体は何もしませんが、他のコマンドで判定をするときに使ったりします。

シンプルで便利ですが、ゴチャゴチャ付けると管理しきれなくなり、バグの元になりがちです。自分は仮で付けて、処理後すぐ消すとかが多いです。恒常的に付けるのには向いてないんじゃないかなぁ、と思います。

基本の書き方
/tag エンティティ 処理 タグ名
処理の所は add(付ける) remove(消す) list(タグのリスト取得) の3種があります。

一例
/tag @e[type=cat,distance=..32,nbt={Sitting:1}] add Sitting
距離32マス以内のネコで NBT の Sitting が 1 (座っている時1、で立っていると0)のネコたんに Sitting というタグを付ける。

data コマンドをざっくり

NBTを見たり、書き換えたりできるコマンドです。できることの幅が広く、それゆえに覚えることも多いコマンドです。一言で語れないので、今回はエンティティのNBTを書き換える触り部分だけにしましょう。

基本の書き方1
/data 処理 entity エンティティ名 パス スケール
処理の所は get(取得) merge(統合する) modify(書き換える) remove(消す) があります。merge と modify は機能的に結構被るんで、最初はあんまり意識しないでいいかもしれません。

modify は別のエンティティからNBTをコピー出来たり、リストになってる持ち物のNBTを上手く処理出来たりするんで、そのあたりで使います。自分は、もともとあるのが分かってるNBTに対して modify 使ったりしますが、 merge でいいです。

要するに初心者のうちは merge 使とけばいいです。

一例
/data merge entity @e[type=cat,limit=1,sort=nearest] {CollarColor:6}
一番近くのネコたんの首輪をピンクにする。merge は値がなければ足し、あれば書き換えます。首輪は飼い主がいないと、表示されないよ。

本当はブロックエンティティとか、ストレージとか、他にも書ききれないほど要素があるんですが、今回はこの程度にしましょう。data コマンドは奥が相当深いでっす。

実際に仕掛けを作る

準備

では、解説読むのも飽きてきたと思うので、手を動かしましょう。まずは準備から。用意するのはコマブロ13個、レッドストーンダストとリピーター。後は協力してもらうネコたん(好きなだけ)です。

今回もちょっとだけコマブロ使ってみます。一番下をインパルス、動力が必要にしておいて、後は12個のコマブロをチェーンで積みます。今回は縦にした、コマブロタワーにしてますが、別に横でもウネウネでも、繋がってりゃいいです。

で、柵で適当な範囲を囲い、ネコたんを適量召喚しましょう。

/summon cat ~ ~ ~

ランダムに毛色が決められて召喚されましたねー。試しに毛色指定して遊んでみてもいいですね。

ここまでできたら、一番下のコマブロに、リピーターとレッドストーンダストを画像の様に繋げます。これで準備完了。

使うコマンド

今回は以下のコマンドを使っていきます。

tag @e[type=cat,distance=..32,nbt={CatType:10}] add Type_10
execute as @e[type=cat,distance=..32,nbt={CatType:9}] run data modify entity @s CatType set value 10
execute as @e[type=cat,distance=..32,nbt={CatType:8}] run data modify entity @s CatType set value 9
execute as @e[type=cat,distance=..32,nbt={CatType:7}] run data modify entity @s CatType set value 8
execute as @e[type=cat,distance=..32,nbt={CatType:6}] run data modify entity @s CatType set value 7
execute as @e[type=cat,distance=..32,nbt={CatType:5}] run data modify entity @s CatType set value 6
execute as @e[type=cat,distance=..32,nbt={CatType:4}] run data modify entity @s CatType set value 5
execute as @e[type=cat,distance=..32,nbt={CatType:3}] run data modify entity @s CatType set value 4
execute as @e[type=cat,distance=..32,nbt={CatType:2}] run data modify entity @s CatType set value 3
execute as @e[type=cat,distance=..32,nbt={CatType:1}] run data modify entity @s CatType set value 2
execute as @e[type=cat,distance=..32,nbt={CatType:0}] run data modify entity @s CatType set value 1
execute as @e[type=cat,distance=..32,tag=Type_10] run data modify entity @s CatType set value 0
tag @e[type=cat,distance=..32,tag=Type_10] remove Type_10

1行目は、CatType に 10 という値を持つネコたんに Type_10 というタグを付けます。
2~11行目は、それぞれ、CatTypeが 9 なら 10 に、8 なら 9 にと、1 足して書き換えていきます。
12行目は、Type_10 のタグを持つネコたんの CatType を 0 にし、
13行目で Type_10 のタグを消します。

modify は初心者は気にすんなと言いつつ、使っていくスタイルですね。鬼畜かな? merge でいいですからね?色々試してみましょう。merge を使うなら、

execute as @e[type=cat,distance=..32,nbt={CatType:9}] run data merge entity @s {CatType:10}

とかになります。ちょっと書き方が違いますねー。で、これらをコマブロに打ち込んだら、スイッチを押してみましょう。ポチっとな。

最初の動画みたいにコロコロ変わりましたか?変わったって!?やったね!!大成功!!天才じゃん!!

何でタグ使ったん?

1行目で CatType が 10 の子だけ、tag コマンドで管理したのはなぜなのか?何だかわざと複雑にしてるみたいで、利口ぶってない?いやいや、順を追って見ていきましょう。

コマンドって上から順に実行されていくんですが、2~11行目って現在の毛色によって値を変え、それによって毛色が変わってます。毛色の値は0~10までの11種っていうのは書きましたよね。

同じようにするなら、1行目で 10 の子を 0 にしたらいいんじゃないの?ですよね。で、同じようにしたのが以下

execute as @e[type=cat,distance=..32,nbt={CatType:10}] run data modify entity @s CatType set value 0
execute as @e[type=cat,distance=..32,nbt={CatType:9}] run data modify entity @s CatType set value 10
execute as @e[type=cat,distance=..32,nbt={CatType:8}] run data modify entity @s CatType set value 9
execute as @e[type=cat,distance=..32,nbt={CatType:7}] run data modify entity @s CatType set value 8
execute as @e[type=cat,distance=..32,nbt={CatType:6}] run data modify entity @s CatType set value 7
execute as @e[type=cat,distance=..32,nbt={CatType:5}] run data modify entity @s CatType set value 6
execute as @e[type=cat,distance=..32,nbt={CatType:4}] run data modify entity @s CatType set value 5
execute as @e[type=cat,distance=..32,nbt={CatType:3}] run data modify entity @s CatType set value 4
execute as @e[type=cat,distance=..32,nbt={CatType:2}] run data modify entity @s CatType set value 3
execute as @e[type=cat,distance=..32,nbt={CatType:1}] run data modify entity @s CatType set value 2
execute as @e[type=cat,distance=..32,nbt={CatType:0}] run data modify entity @s CatType set value 1

10の子も同じチェック方法で、0に書き換えてます。でもでも、実行するとおかしいんです。順調に変わっているように見えるんですが、毛色の数を数えてみましょう。10種類しかいないよね、1種類どこいった?なんでやろか?

ポイントはさっきも言った、上から順に実行されるってところです。

答え合わせと注意点 気付きにくい所のバグが一番困る

じゃあ答えあわせ。1行目で10→0にしてるわけですが、0なので、最後の行で0→1になっちゃいます。つまり、0の毛色の子(Tabby、茶色っぽいトラネコ)がいなくなるんですねー。

これはれっきとしたバグです。0の子出ない問題を回避するために、タグを付けて、全ての判定(0でないかの判定)を済ました後に、タグ付きの子を0にして、タグを消すという一見メンドクサイ処理をしました。

こういう、よく見ないと分からないバグは、後々違うところに影響したりするので注意しましょう。

尚、このコード自体が設計としてはあまりよろしくないです。個人的にはスコアボードとか使って、半分くらいの行数でやっといた方がええんちゃうかなーと思います。あ、次回はそんなネタにする?やってる子と一緒なのに、こんなに書き方が違うよ、みたいな。

今回はこのくらいにしておきましょう。ちょっぴりコマンドの深い部分に触れましたが、今後使う頻度の高い大事な内容です。忘れないようにしておきましょうねー。

タグ?Tags?tags? どんだけタグあんねん?問題

さて、ここからは、まぁ時間余った時のコラム的な部分です。マイクラのクソ仕様の一つとして、タグと呼ばれるものが3つあります。全部全然違うものです。舐めとんのか?

慣れると話の流れで分かりますけど、理解できるまで何のこと言ってんの?ってなります。自分はかなり煮え湯を飲まされ苦しみました。少しでも苦労を減らすために、違いについて触れておきましょう

NBTタグ

NBT のデータの1つ1つを NBTタグって言うみたいで、人によってはタグとだけ呼びます。

紛らわしいので、自分はNBT全体のことでも、データの1つのことでも、NBTとだけ呼ぶようにしてます。NBTタグって名称やめろ!!

tag コマンドで付けるタグ

前述の tag コマンドで付けたラベルをタグと呼びます。まぁタグコマンドなんだからタグだよね。

ここまでは納得なんだけど、NBTタグの1つに Tags ってタグがあります。tagコマンドで付けたタグはここで管理されるんですが、タグ管理用のタグってなんだよ?タグか?

ブロックやエンティティを1つにまとめた tags ファイル

正直、これはデタパでちょっと複雑なことをしたくなった時にぶち当たります。ブロックやエンティティ、関数用の mcfunction をひとまとめにして、大量に判定が必要な時に簡単なコードで済むようにしてあるファイルです。

分かりにくいですね。例えば、土、砂、砂利が目の前にある時、破壊するってコマンドを組みたい時。

/execute at @s anchored eyes if block ^ ^ ^1 dirt run setblock ^ ^ ^1 air
/execute at @s anchored eyes if block ^ ^ ^1 sand run setblock ^ ^ ^1 air
/execute at @s anchored eyes if block ^ ^ ^1 gravel run setblock ^ ^ ^1 air

こんな感じで、書くかと思いますが、これが30種類とかやったら?全部書いて、実行し続けるん?ってなりますよね。こんな時に tags にブロックのまとまりを決めたファイルを入れておくことで、

/execute at @s anchored eyes if block ^ ^ ^1 #destroy_blocks run setblock ^ ^ ^1 air

この1行で済みます。destroy_blocks はファイル名です。仮に30種類のブロックでも、10種でもこれだけ、変えたい時は destroy_blocks を書き換えるだけです。便利ですね(・∀・)

別に全部詳細に覚える必要はないです。タグと言う曖昧な表現にキレることのないように、種類、呼称が色々あるよってことだけは覚えておくと吉ですよ。

まとめ

今回は、summon コマンドでエンティティを召喚して、data コマンドで色々弄れるってことが分かったと思います。

基本的に、データパックや、ちょっとしたRPGマップなんかを作る時は、NBTを参照したり、弄ったりする作業が必要になるので、忘れないようにしておきましょう―。忘れたらこのページを見返して、広告を見まくりましょう!!

それではこの辺で、お帰りの際はお気をつけて~(・∀・)ノシ

コメント