【やや初心者向け？】文字修飾やnbt、データパックを使った色々なコマンド

この記事は、[Minecraft Command Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mccmd) 21日目の記事です。


# 0.ご挨拶
初めましての方は初めまして。〆切めちゃくちゃ遅れてすみません！！！年越してしまいました・・・・・！！！
12日に同じくAdvent Calender向けの記事として、[【初心者向け】いろいろなコマンドを使ってみよう](https://qiita.com/shiryu248/items/d9d962b330786da696b5)を書かせていただきました。

今回の記事では、前回の記事の発展版として、少し複雑になったコマンドの解説や、配布マップで見たことあるかもしれない仕様について私なりに考えたコマンドの仕組みをデータパック、もしくはコマンドブロックを使って複数のコマンドを使いながら解説をしていきたいと思います。

コマンドをあんまりわからない人向けに、こういうことができるんだよってのを紹介していくのが主です。
何か創作物や、他の人のマイクラカレンダー記事の理解の助けに慣れれば幸いです。

# 1.説明はどんな人向け？
・コマンドの基礎は理解できているけど実際どう使うん？って方
・なんか名前付きのアイテムとかコマンドでどう出すの？って方
・コマンドでなんか作ってみたいって方
・mcfunctionについてさわりだけ知りたい方

また、**コマンド作成には**[MCStacker](https://mcstacker.net/) **を使用しています**。めっちゃくちゃ便利なのでぜひ使ってください。

:::note warn

※書いている人はmcfunctionのことくらいしかわからないです。カスタム進捗、storage、predicateとかは勉強中なので、わかる人達には周りくどい方法がいくつかあるかもしれません。「この方法がいいよ！より軽いよ！」って人は教えてください。
※**JAVA版**の**ver1.21.4**を前提に説明します。アップデート入りましたね。
ただ私自身1.19,1.20くらいに一番コマンドに触れていたので**古い情報の可能性があります**。
自分自身コンポーネントを勉強するついでにこの記事を書くくらいなので・・・

:::


では、これからいろいろなコマンドを紹介していきましょう。


# 2. 色付きだったり、リンクをクリックできる文字を表示

**基本**
チャット欄に表示する場合はtellrawコマンドを使います。本に記入する際も同じようなかんじでできます。(とってもややこしくなるのでMCStackerに頼るのがおすすめ。)

```
/tellraw @a "aaa"
プレイヤー全員のチャット欄に「aaa」と表示する。（誰が発言したかは表示されない。）
```
そして、色を付けるなどいろいろしたい場合は「JSONテキスト」というものを使用します。構文があるのですが、基本的に{"〇〇":"△△"}という形です。試しに以下のものを入れてください。上のコマンドと同じ意味です
```![2024-12-27_12.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/69fe3ed0-d6b5-5728-fca7-5065fe8a691f.png)

/tellraw @a {"text":"aaa"}
プレイヤー全員のチャット欄に次の条件で表示する→{テキストは「aaa」を出力してね}
```
次に色を付けたい場合は、"color"というのを使います。すべてに「""」を入れるのを忘れずに。
(後で出てくる「true」,「false」以外はだいたい「""」で囲います)

```
/tellraw @a {"text":"赤色だよ","color":"red"}
プレイヤー全員のチャット欄に次の条件で表示する→{テキストは「赤色だよ」、色は「red」にしてね}
```
マイクラの標準設定として、<font color="red">red <font color="black">や<font color="aqua">aqua <font color="black">や<font color="dark_purple">dark_purple<font color="black">などいろいろあります。
（記事書きながら思ったけどQiitaのも一緒？？？）

また、カラーコードで指定もできます。
（[私がよく見てるカラーコード表を紹介します。クリックで飛べます。参考までに。](http://www5.plala.or.jp/vaio0630/hp/c_code.htm)）

```
/tellraw @a {"text":"このカラーはSalmonっていうんだって。サーモン食べたい。","color":"#FA8072"}
```

もし一文で複数の色を使いたい場合は、[{一つ目},{二つ目},...]のように全体を[]で囲んで一個ずつ{}で記入する、というかんじでやります。（マイクラではこの形の記述が非常に多いです。nbtとかもそうなので慣れてるととてもいい。）

```
/tellraw @a [{"color":"white","text":"カ"},{"color":"red","text":"ラ"},{"color":"#FFAC30","text":"フ"},{"color":"yellow","text":"ル"},{"color":"green","text":"な"},{"color":"aqua","text":"文"},{"color":"blue","text":"字"},{"color":"light_purple","text":"！"}]
```

また、テキストをクリックしてURLに飛ばしたりコマンドを実行したい場合は"clickEvent"、カーソルを合わせた際に文字を表示するのは、"hoverEvent"をします。"action"で何をするのかを指定、"value"でURLやコマンド、表示するテキストをを指定する感じです。

```
/tellraw @a {"clickEvent":{"action":"open_url","value":"https://qiita.com/advent-calendar/2024/mccmd"},"hoverEvent":{"action":"show_text","value":[{"text":"カーソルを合わせたね？"}]},"text":"ここをクリックして他の人の記事を見に行こう！","underlined":true}
```

その他、いろいろな効果を出すことができます。書いときます
```

/tellraw @a {"text":"青色太字だよ","color":"blue","bold":true}
/tellraw @a {"text":"ぐちゃぐちゃだ！waaaaaaaa!","color":"aqua","obfuscated":true}
/tellraw @a {"text":"enchant no mozi ni naruyo　nihongo ha muri","color":"yellow","font":"alt"}

```

紹介したコマンドを順に打つとこうなります。
![2024-12-27_12.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/4a7704b2-47a9-3ba7-6afa-702579bf226f.png)





# 3. nbtを使用してMobを掌握しよう

マイクラコマンド初心者～中級者の最重要ワード（勝手に名付けた）の**nbt**というものを使用します。
マイクラでいうnbtっていうのは、自分なりに簡単に言うとMobやブロックのもっている細かい情報のことです。例えばそのMobの体力(Health)、今いる座標(Pos)、など・・・・・
コマンドを使うことでこれらを変えることができます。めっちゃ自由度広がるよ。
試しにクリーパーのnbtを見てみましょう。**data**コマンドを使います。
一体召喚した後に下のコマンドを打ってみましょう。

```
/data get entity @e[type=minecraft:creeper,limit=1,sort=nearest]
エンティティのデータを見る→クリーパー、上限１体、近い順
```
![2024-12-27_18.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/c18452f4-4527-b0ad-b404-645c96c322b0.png)
・・・・なんかずらーーーっと出てきましたね。こいつらがnbtです。多いね。
まあ全部は理解する必要はないです。大丈夫。
コンマ区切りでひとつずつクリーパーが持っている情報を表示してくれます。
例えばHealthは「Health:20.0f」となってます。これは今のHealth（体力）が20.0ですよ～ってはなしです。
(fとかbとかdとかはいったんそのまま書いてください。数値の種類みたいなものを表すものですがややこしいです。fだったら小数とか）
わかりやすいものや使用頻度高いやつをちらっと載せときます。[一覧はこちら。](https://minecraftjapan.miraheze.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BF%E3%82%B0/%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3)

| nbt | 説明 |　数値の説明 |
|:-:|:-:|:-:|
|Invulnerable|無敵かどうか。| 1b:無敵,0b:無敵じゃない |
|Health|現在の体力| 1f:ハート半分 |
|OnGround |地面に着地しているか| 1b:着地している,0b:着地してない |
|Pos|現在の座標。| [x座標、y座標、z座標] |
|Motion	 |働いている加速度。重力とかも含める。| [x座標方向、y座標方向、z座標方向] |
|NoAI	 |そのMobが動いたり攻撃したりするか。| 1b:動かない,0b:通常 |
| CustomName| 名前。名札と同じように表示される。tellrawコマンドで使うようなJSONを使用可能。''JSONをで囲む。| '{"text":"名前"}' のような書き方|
| Isbaby| ゾンビやヒツジなど、子供がいるMob限定。子供かどうか。| 1b:子供、0b,大人|
| Silent| そのMobが音を出すかどうか。| 1b:音を出さない、0b,音を出すｄｄ|

:::note info
1b,0bなどの〇か×かみたいなものは、1bは「true」、0bは「false」でもできます。
:::

これらをいじった状態でモブを召喚することができます。召喚するのはsummonコマンドです。
/summon Mob名 座標 {nbt}
というかんじです。
```
/summon minecraft:villager ~ ~ ~ {NoAI:true}
/summon minecraft:villager ~ ~ ~ {NoAI:1b}
現在の座標に村人を召喚｛AIなしかどうか：OK｝
（どちらも同じ意味です）

/summon minecraft:zombie ~ ~ ~ {Health:1.0f}
現在の座標にゾンビを召喚　{現在体力は：1}

/summon minecraft:zombie ~ ~ ~ {IsBaby:true,Motion:[1d,1d,1d]}
現在の座標にゾンビを召喚｛子供かどうか：OK、召喚した瞬間の加速度:xに1,yに1,zに1｝
（召喚した瞬間ゾンビが吹っ飛びます）

/summon minecraft:chicken ~ ~ ~ {CustomName:'田中'}
現在の座標にニワトリを召喚｛名前：田中｝

/summon minecraft:slime ~ ~ ~ {CustomName:'{"text":"僕は悪いスライムじゃないよ！","color":"aqua"}'}
現在の座標にスライムを召喚｛名前：｛「僕は悪いスライムじゃないよ！」,水色｝｝
```
こんなかんじでnbtを指定したmobを召喚することができます。

## 3-A ニセ宝箱に爆破されたの死亡ログ
これらnbtをうまいこと応用すれば、トラップチェストを開けた瞬間に爆発する、ということができます。
名札でも同様なのですが、名前付きのMobに殺害されると死亡ログにつけた名前が出ますね。
![2024-12-28_20.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/a1d0a996-0516-17aa-50d6-1114f6a8361a.png)

これを利用して、「宝箱」という名前のクリーパーを召喚して即爆破すれば宝箱に爆破された感じになりますね。

特定のMob限定のnbtもあり、クリーパーは帯電や爆発関係もnbtで制御されています。
クリーパーのnbtの説明を載せておきます。

| nbt | 説明 |　数値の説明 |
|:-:|:-:|:-:|
| powered | クリーパー限定。帯電しているか。| 1b:帯電している 0b:普通の状態 |
| ExplosionRadius| クリーパー限定。爆発の範囲。| 0b~126b、デフォルトは3b |
| Fuse| クリーパー限定。着火から爆発までの時間。| tick、デフォルトは30s |
| ignited| クリーパー限定。着火しているか。| 1b:着火している,0b:着火していない。 

これを利用して、一瞬で爆発するようにしましょう。
（クリエイティブモード推奨＆以下のコマンドを実行してください。）
```
/gamerule mobGriefing false
Mobのブロック破壊をなしにする。
（ブロックごと破壊したい場合はfalseじゃなくてtrueにしましょう。）

/summon minecraft:creeper ~ ~ ~ {ignited:true,Fuse:0s,Silent:1b,CustomName:'宝箱'}
クリーパーを召喚、{着火済み:〇,爆発までの時間:0tick}
```

これで速攻で爆破するようになりましたね。
あとはこのクリーパーに名前を付けて、宝箱を開けたプレイヤーの後ろに出せばいいです。
場所を指定するのはexecuteコマンドの出番です。
executeについて復習＋若干新しいことになります。
rotated asで向き、atで場所ですね。@pは実行位置から最も近いプレイヤーですね。

```
/execute rotated as @p at @p run summon minecraft:creeper ^ ^ ^-1 {ignited:true,Fuse:0s,Silent:1b,CustomName:'宝箱'}
```

これをコマンドブロックに入れて、トラップチェストのに置けば完成ですね。


![2025-01-0611-47-17-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/84d5045c-bef6-2102-9016-3b9c06865b11.gif)


:::note info
クリーパーを目立たせないように今回は爆破したプレイヤーの後ろに召喚するようにしています。
透明化をつけようとして、nbtのひとつでポーション効果もつけられるのですが、クリーパーの仕様上ポーション効果がついている状態で爆発するとそのパーティクルをまき散らすのでむしろ目立ってしまいます。
:::

## 3-B nbtを直接いじってMobを飛ばそう
summonコマンドで特定のnbtを持つmobを召喚することはできます。では、既にいるmobのnbtを変えるにはどうすればいいのでしょう？
これにはdataコマンドのmodifyというのを使います。


```
/data modify entity @e[type=minecraft:villager,limit=1,sort=nearest] NoAI set value 1b
エンティティのデータをいじるよ→一番近い村人を→NoAIをある値にするよ→1b(true)にするよ
```
村人を出してこれを打つと、村人が急に動かなくなるはずです。こういうことができます。
さて、Mobを吹っ飛ばしましょう。今回はブタを真上に飛ばしましょう。
Motionというものを使います。これはブタにかかっている加速度です。常についているので見てみましょう。
見るには、data getを使います。
```
/data get entity @e[type=pig,limit=1,sort=nearest] Motion
一番近くのブタのMotionを見る
```
これを打つと、[]で囲まれた、3つの値が出てくると思います。これはリストといって、加速度はx方向、y方向,z方向のそれぞれのものを足し合わせたものになるので、３つでMotionとなります。

（数学B?のベクトルの話になるのですが、x+方向に1,z+方向に+1の加速度（ベクトルの矢印）がある場合、それはすなわち足すと斜め45°に+√2の矢印ができる、というイメージです。わかりにくかったらすまん・・・）

もっとわかりやすい例として、Posを挙げておきます。これはそのままMobがいる座標のことです。

```
/data get entity @e[type=pig,limit=1,sort=nearest] Pos
一番近くのブタのPosを見る
```
これで座標が出てきます。マイクラの座標はx,y,zとあって３つ数字がいるのはどこかで知っていると思います。


さて、書き換えて真上に飛ばしたい場合、Motionのy座標の部分、即ち３つある数字の2つ目を+3くらいに書き換えればよいです。それの指定をする場合は、Motion[何番目]という風にすることで指定できます。
ただし、**この何番目というのは、0番目から始まります。**  （プログラミング界隈ではlist型で御用達ですかね）
要するに以下の通りです。
Pos[0]：x座標
Pos[1]：y座標
Pos[2]：z座標
Motion[0]：x軸方向の加速度　
Motion[1]：y軸方向の加速度（重力含む）
Motion[2]：z軸方向の加速度

ここまで分かればあとはいけます。NoAIの例と同じように書き換えてやりましょう。

```
/data modify entity @e[type=minecraft:pig,limit=1,sort=nearest] Motion[1] set value 2d
nbtをいじるよ→エンティティで、一番近くのブタを→Motionの1のところ(前から2番目、y座標)を→値にするよ→2dに
```

これで真上に吹っ飛ばせます。

:::note info
/data系のコマンドは、１体にしか使用することができません。しかし、execute asとセレクターの@s（実行者）を併用すれば複数のエンティティに対して使用することができます。

例：ワールドに存在するすべてのブタを真上に飛ばしたい場合
/execute as @e[type=pig] run data modify entity @s Motion[1] set value 2d

本筋とはずれますが、execute のasやatコマンドは、複数あればその位置や実行者１つにつきコマンドを１つ実行できる、即ち１行のコマンドで同じコマンドを同時に複数回実行できるということを覚えておくと後に役に立つかもです。今回の場合だと、ワールドにいるブタの数だけrunの後のdataコマンドを実行しています。


:::

:::note warn
このdataの数値を変える系のコマンドですが、マイクラの仕様上プレイヤーには使えないようになっています。
（世のコマンダーたちをとても悩ませています。）

:::


# 4.ディスペンサーに暗号を入れると開く扉

nbtですが、エンティティだけでなくブロックにもあります。
チェストの中身のアイテムが何だとか、向きはどっちを向いているかや、水没しているか、レバーがonかoffかもnbtとしてあります。つまりそれをいじることもできるし、条件にすることもできます。

```
execute if block (ディスペンサーの座標) minecraft:dispenser{Items:[{Slot:4b,id:"minecraft:paper",count:1,components:{"minecraft:custom_name":'"鍵だよ！"'}}]} run fill （開けたい範囲） air destroy

(ディスペンサーの座標)に中身のスロット4番（中央）が「鍵だよ！」という名前の紙が入ったディスペンサーが存在する場合にfillコマンドを実行
```
これをリピートコマンドブロックor常に実行するようなfunctionで実行しておきましょう。






# 5. 持つと足が速くなる棒
attribute(属性)というのを使用します。これもnbtの一種です。エンチャントとは別。
いろいろな効果を付与します。

```
/give @p stick[attribute_modifiers=[{id:"movement_speed",type:"movement_speed",amount:10,operation:"add_value",slot:"mainhand"}]] 1
利き手に持った時に移動速度+10になる棒を得る

```
属性については詳しくは[Minecraft wiki](https://ja.minecraft.wiki/w/%E5%B1%9E%E6%80%A7)を参照。


また、/attributeコマンドというものもあり、これはプレイヤー自身に属性を付与できる。大きさを変えることもできます。
```
/attribute @p minecraft:scale base set 10
プレイヤーの大きさを10倍にする。
```

# 6  パーティクルで直線を引こう

これが言いたかったからこの記事を書いているまである。かなり複雑になるかもですけどついてきてください。

## 6-A executeを多用して、直線を引こう。

**初心者には理解がとても難しい内容になっていますので、わからなかったら飛ばしてください。**

※@komaramune(こま)　様執筆の　[executeテクニック集【execute幾何学など】
](https://qiita.com/komaramune/items/2d0532c44455b0e8ab15#%E5%A4%9A%E7%82%B9%E5%AE%9F%E8%A1%8C%E9%96%A2%E9%80%A3)のうちの、多点実行の欄を大いに参考にさせていただいてます。私も内容を完全に理解しきれていないですが紹介をさせてください。

パーティクルで直線を描くということに挑戦してみます。例えばビームを飛ばす魔法や、四角形のエリアを表示するなど。
ただ単に真横、真上に雑に線を引く場合は、particleコマンドだけでもできます。

```
/particle minecraft:wax_on ~ ~ ~ 10 0 0 0 1000 force
wax_on（錆止めしたときに出てくるもの）のパーティクルを現在の座標に、xの範囲10マスに1000個表示、遠くからでも強制的に表示

/particle minecraft:wax_on ~ ~ ~ 0 10 0 0 1000 force
同じものをyの範囲10マスに表示
```

![2025-01-06_13.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/eb6f5a06-6866-f370-6811-124d6307cae0.png)


### 前提知識　rotated as とpositioned について

rotated as　(エンティティ名)は　指定したエンティティの向きにコマンド実行の向きを合わせて実行します。**実行する位置は変わりません。** 向きだけ。
試しに、村人を5体くらい召喚して以下のコマンドを打ってみてください。
```
/execute rotated as @e[type=minecraft:villager] run particle minecraft:firework ^ ^ ^3 0 0 0 0 10 force
村人の向きに併せて実行→花火のパーティクルを3マス前に10個表示
```

すると、コマンド一つしか打ってないのに複数の場所にパーティクルが出てくると思います。
![2025-01-06_12.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/39abf617-defb-fca6-4fcd-88c4ddc39e0d.png)
これは村人の向きが5人いれば5人バラバラな方向を向いていると思うのですが、その5人の向きすべてに対して3マス前にコマンドを実行することができる、ということです。

次に、positionedについて。positioned (座標)　とやることでその座標でコマンドを実行することができます。~や^での座標指定もOK。rotatedと組み合わせることもできます。

```
/execute rotated as @e[type=minecraft:villager] positioned ^ ^ ^3 run particle minecraft:firework ~ ~2 ~ 0 0 0 0 10 force
村人の向きに併せて実行→3マス前の座標で実行→2マス上に花火のパーティクルを表示

```
executeを何回も組み合わせる場合は、runの前に条件をつなげることでできます。適用される順番は前からです。
さあ、これらを踏まえて直線を描いていきましょう。

### 多点実行で、線を引こう。
まず、rotatedで向きを指定するのに必要なアーマースタンドを用意しましょう。nbtのRotationというのが向きを表せるので、summonで召喚する際に指定してあげましょう。また、tagをつけて、ワールド内にある他のアーマースタンドと区別させてあげましょう。のちのコマンドで一度に両方指定する必要があるため同じ名前のtagをつけてください。

```
/summon minecraft:armor_stand ~ ~ ~ {Rotation:[0f,0f],Tags:[test]}
アーマースタンドを召喚　{向き：0,0 「test」というタグをもっている}
/summon minecraft:armor_stand ~ ~ ~ {Rotation:[180f,0f],Tags:[test]}
アーマースタンドを召喚　{向き：180,0 「test」というタグをもっている}
```

向きを表すRotationの一つ目の数字は水平方向で-180~180の値で一周しており（丸い分度器のイメージ）
0でz+方向
90でx-方向
180(=-180)でz-方向
-90（=270）でx+方向
になります。
（360で一周するので0と360と-360は同じ向きを表します。）

二つ目の数字は鉛直方向、上下方向で-90~90の値で上～下となり
-90：真上
0：水平
90：真下
です。

で、そのアマスタ（アーマースタンドの略称）を召喚したら、以下のコマンドを打ってみましょう。

```
/execute rotated as @e[tag=test] positioned ^ ^ ^2 run particle minecraft:firework ~ ~ ~ 0 0 0 0 1 force
testタグを持っているエンティティの向きで→前に２マスで実行→実行位置に花火のパーティクルを表示
```

![2025-01-06_13.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/1d5fcb39-9e99-1992-b8bb-cd552169799e.png)

これで横に二つの花火ができたと思います。ただまだ直線とは言えませんね。そこでこれを繰り返します。以下のコマンドを打ってみてください。

```
/execute rotated as @e[tag=test] positioned ^ ^ ^2 rotated as @e[tag=test] positioned ^ ^ ^1 run particle minecraft:firework ~ ~ ~ 0 0 0 0 1 force
testタグを持っているエンティティの向きで→前に２マスで実行→再びtestタグを持っているエンティティの向きで→前に1マスで実行→実行位置に花火のパーティクルを表示

/execute rotated as @e[tag=test] positioned ^ ^ ^2 rotated as @e[tag=test] positioned ^ ^ ^1 rotated as @e[tag=test] positioned ^ ^ ^0.5 run particle minecraft:firework ~ ~ ~ 0 0 0 0 1 force
（同じように2,1,0.5として実行）
```
これで直線を描くことができました。
![2025-01-06_13.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/d62e1e30-db43-6cd9-e8ab-e65c2b31f729.png)

どういう仕組みやねん？というのを動画で解説したのでどうぞ。
文字でも説明すると、最初の位置から2マス左右に進んで2点をとる、その2点からそれぞれ１マス左右に進んで計4点をとる、さらにそれぞれ0.5マス左右に進んで計8点をとる・・・ということをしています。繰り返すほど、細かくなります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/tR7hgNP5AtI?si=ji_p6dBHFNCjl0MS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


その他これを使っていろいろ遊べます。

https://x.com/shiryu248/status/1876215220085104716

<details><summary><font color="red">　やり方(クリックで開く)　</font>　</summary>

基本的に先ほど紹介した方法と大筋は変わりません。
1.まわりをぐるぐるするやつ。
２つあるtestタグを持つアマスタのうち、片方のアマスタにタグ「a」、もう片方にタグ「b」をつけます。

```
/summon minecraft:armor_stand ~ ~ ~ {Rotation:[0f,0f],Tags:[test,a]}
アーマースタンドを召喚　{向き：0,0 「test」「a」というタグをもっている}
/summon minecraft:armor_stand ~ ~ ~ {Rotation:[180f,0f],Tags:[test,b]}
アーマースタンドを召喚　{向き：180,0 「test」「b」というタグをもっている}
```
そして、常時実行するリピートコマンドブロックを３つ用意し、それぞれ入れます。

```
１つ目
/execute at @a rotated as @e[tag=test] positioned ^ ^ ^2 rotated as @e[tag=test] positioned ^ ^ ^1 rotated as @e[tag=test] positioned ^ ^ ^0.5 run particle minecraft:wax_off ~ ~ ~ 0 0 0 0 1 force
(wax_offのパーティクルを表示するコマンド。コマンドブロックから実行場所を移すためexecute at @aだけ追加し、表示するパーティクル以外先ほどと一緒)

２つ目
/execute as @e[tag=b] at @s rotated as @e[tag=a] run tp @s ~ ~ ~ ~180 ~
「b」のタグを持っているものを実行者として実行→実行者の位置（bのタグを持っているものの位置）で実行→「a」のタグを持っている者の向きで実行
→その場にtpする、向きは実行時の向き（今は「a」の向き）から水平方向＋180°
（これにより、aのアマスタとbのアマスタは常に180°反対方向を向く）

３つ目

execute as @e[tag=a] at @s run tp @s ~ ~ ~ ~5 0
aのタグをもっているものとして→実行者の位置で実行→実行者を現在の座標のまま、向きを水平方向角度+5°、上下は0のままでtp
（要するに回転させる）

```

２，自分の向きに合わせるやつ

１つ目と２つ目のコマンドは一緒。３つ目だけ変える。

```
３つ目
execute as @e[tag=a] at @s rotated as @a run tp @s ~ ~ ~ ~ 0
「a」のタグをもっているもので実行、場所は実行者、向きはプレイヤー全員にして、実行者を実行座標（向きだけプレイヤーに合わせ、座標はそのままのところ）にtp
```

</details>

以上、長くなりましたが多点実行で直線を引くお話でした。

## 6-B データパックでコマンドを実行して視線に沿って線を引く＆簡易的な魔法

データパックでしかできないかも（多分）の方法で線を引きます。ついでに着弾したら爆発させちゃいましょう。

**データパックは使わない人やまだわからないひと、
サーバーの１参加者としてコマンドを使用するからデータパックを導入できない！って人は飛ばしてかまいません。**


ただデータパックが使えるようになるとめちゃくちゃできることが増えるし、なによりコマンドブロックをいたるところに置くより**コマンドの整理がしやすくとっっても見やすい**のでデータパックが使える環境なら推奨します。

データパックを使えるようになる分にはめちゃくちゃいいので！紹介させてください！


<details><summary><font color="red">　データパックの最低限な作り方　</font>　</summary>




(windowsPCでの説明をしてますが、基本的にどのＰＣでも変わらないはず・・・)
・.minecraft/saves/（ワールド名）/datapack　のフォルダーまでエクスプローラーで移動する。
手っ取り早い方法は、minecraftを開いて、ワールドデータを選択する画面に行き、導入したいワールドの「編集」を押して、続いて「ワールドフォルダーを開く」を押すと、ワールド名のフォルダーが出てくるので、「datapack」という名前のフォルダーを開けばOK

datapackフォルダーの中にファイルを作る。名前は自分がわかればいい。（今回はmydatapackとする）
・その中に、dataという名前のフォルダーと、pack.mcmetaというファイルを作る。（新規ファイル作成でメモ帳を選んで、.txtごと全部書き換えると良し。）
pack.mcmetaをメモ帳などで開き、以下をコピペでいいのでやる。

``` pack.mcmeta
{
    "pack":  {
        "pack_format":61,
        "description":"データパックの説明文はここに書いてね"
    }
}
```
pack_formatはバージョンごとに違う。[バージョンはここを参照。リソースパック（サイトの上側）と混同しないように。](https://ja.minecraft.wiki/w/%E3%83%91%E3%83%83%E3%82%AF%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)

これらを終えたら、一度マイクラでワールドに入ってみて、以下の二つのコマンドを実行しよう。
```
/reload
（データパックなどを再読み込みする。
再読み込み中...と出てくるが、終了のアナウンスはないので、1~2秒後に次のコマンドを打ってよい。）

/datapack list
今ワールドで使用中/使用可能なデータパックを表示する
```
/datapack list を打ってマウスカーソルを合わせて下のように表示されていたらとりあえずOK!次へ進もう。

![スクリーンショット 2024-12-13 120906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/d0297fda-2899-086b-434b-85e19fa7f7d0.png)

では続き。
dataフォルダーの中に、好きな名前のフォルダー(ここではtest)をつくる。
そのフォルダーの中に「function」という名前のフォルダーを作る。

:::note warn
「function」は以前のバージョンだと"s"がついてて「functions」になっています。動かない場合はsをつけたり外したりしてみてください。
:::


その中に「test.mcfunction」（testは好きな英数字の名前にしてOK）というファイルを作る。
それをメモ帳やVSCodeなどで開く。

そこにマイクラのコマンドをそのままかく。「/」を省略してもOK
例として、
```
say ファンクション実行！
say ２行目も実行！
```
をtest.mcfunctionの中に書く。

そして以下のコマンドをマイクラのチャットで入力して実行出来たらOK！
```
/function test:test
```
一回のコマンドで２個のsayコマンドができたはず！
これでfunctionフォルダー内にmcfunctionでマイクラのコマンドを書いていくことでコマンドをまとめて実行できたりすることができるぞ！

というわけで、場合によって使ってもいいデータパックの紹介でした。


</details>


さて、直線を引いてみましょう。これまでとはだいぶ違ったやり方になります。

:::note
今回折りたたんでいた部分で紹介したデータパックを作った想定で行きます。functionフォルダーはtestというフォルダーに入っているものとします。

:::


新しく、lineというmcfunctionファイルを作ります。以下の２つのコマンドを記入します。
```line.mcfunction
particle minecraft:wax_on ~ ~ ~ 0 0 0 0 1 force
execute if entity @s[distance=..50] positioned ^ ^ ^0.5 run function test:line


```
１行目のパーティクルコマンドはその場にパーティクルを表示するだけ。
２行目のコマンドは何をしているかというと、
if entity @s[distance=..50] 実行者が50m以内にいる場合（射程的なもの）
positioned ^ ^ ^0.5 run function test:line　0.5マス前に進んだところでlineのファンクション（これを描いているコマンドと同じもの）を実行

lineというファンクションの中にlineファンクションを実行するコマンドを入れています。マイクラ君は素早いので、こうすると一瞬の間にファンクションを沢山（たしか65535個まで？）実行してくれます。

つまり、lineファンクションを実行→0.5マス前に移動してまた実行→また0.5マス前に移動して実行→・・・を繰り返して、ifの条件「距離50m以内に実行者がいる」が達成できなくなるまで実行されていきます。


これで、ファンクションを実行すればいいのですが、このままだと最初の実行位置がプレイヤーの足元になるので、最初に実行する際に位置を目の高さまで調整してあげましょう。そんなニッチな需要にこたえるものが、executeの中にあります。anchoredというものです。
```
/execute anchored eyes run function test:line
（実行者の）目の高さで実行→testフォルダーのlineというファンクションを実行
```
これで視線上に線を引くことができました。
（最初に足元に出るのはご愛嬌・・・・・・）
![2025-01-06_21.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924873/b34e9aeb-8aea-c31f-ea68-ce979429d7c8.png)

応用で視線上に何かあればコマンドを作動させることができます。ここでは、床や壁に着弾した場合に爆発させましょう。爆発させるのは先述した即爆破するクリーパーを召喚するのでやりましょう。

lineファイルを変えていきます。
```line.mcfunction
particle minecraft:wax_on ~ ~ ~ 0 0 0 0 1 force
execute unless block ~ ~ ~ minecraft:air run summon minecraft:creeper ~ ~ ~ {ignited:true,Fuse:0s,Silent:1b,}
execute if entity @s[distance=..50] if block ~ ~ ~ air positioned ^ ^ ^0.5 run function test:line
```

コマンドを一つ追加しました。実行位置が空気じゃない場合、クリーパーを召喚します。
また、３行目のコマンドも、空気の場合のみ繰り返しの処理を実行するようにしました。これで簡易的ですが着弾地点に爆発を起こせます。

その他、functionをscheduleコマンドに変えて弾速を調整したり、スコアボードと連携させて一回実行するごとにスコアと角度を1ずつ増やして円を作ったり、それを上下にも拡張して球を作ったりもできます。いろいろできます。

# 7.まとめ
コマンド使っていろいろなことができます！！！調べてみるといろいろなことができると思うので沢山試してみましょう！！！


最後に、参考になりそうなwikiや資料をいくつかおいておきます。

[MCStacker](https://mcstacker.net/)
とりあえずこれを知っておこう。コマンドを生成できるツール。

[コマンド/データタグ(Minecraft Japan wiki)](https://minecraftjapan.miraheze.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BF%E3%82%B0)
nbt（データタグ）の一覧がある。ちょっと古い。

・Advent Calenderの他の記事

@awapyoi様 2024年
[変数と関数ってなんだろう?/コマンド初心者に知ってほしい基礎概念](https://qiita.com/awapyoi/items/a891ebe7aa66903d2c26)
ちょっと省略したnbtの中のfとかPos[0]の詳しい話

@komaramune(こま)　様執筆 2024年
[executeテクニック集【execute幾何学など】
](https://qiita.com/komaramune/items/2d0532c44455b0e8ab15#%E5%A4%9A%E7%82%B9%E5%AE%9F%E8%A1%8C%E9%96%A2%E9%80%A3)
多点実行の部分しかここの記事では取り上げませんでしたが、色々なテクニックを書いてくれています。発想が広がる。

(前回の記事と被りますが、こちらも参考になるので紹介しておきます)
・2023年@Rusk_Eocssar様の記事
[コマンドで遊ぼう](https://qiita.com/Rusk_Eocssar/items/899064b3a30a3a877875)
ここで解説しきれなかったnbtやattributeなどを使っていろいろ遊んでいる記事です。
ここの記事で紹介していることと私の記事の内容を両方理解出来たら、もう初心者は卒業だ。
~~某鯖の足早棒もattributeだと思う~~

・2023年@ella24coat様の記事
[Minecraft Command ひっかけクイズ](https://qiita.com/ella24coat/items/22a6212e692a29677511)
初心者向けって書いている奴がちょうどいいかも。相対座標とexecuteの復習にどうぞ。中級者向けは現時点ではむずい。

・2024年@firgde様の記事
[マイクラのコマンドで作る「最強」について考える【前編】](https://qiita.com/firgde/items/dcb7d2fd75b5ec61ba46#0-%E5%89%8D%E6%8F%90)
attributeコマンドについてめっちゃくちゃ詳しく説明してます。これもわかると〇



では、良きコマンドライフを！！！