お風呂に入ろう(データパック小技)

![お風呂に入ろう.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589308/f00d49f9-3422-0343-c5bc-0e4af2e68625.png)
# なんぞや
この記事では、<font color=red>**「どのように発想するのか」**</font>という点から<font color=red>**「完成した後、どうするのか」**</font>という点まで、多少の小技を含めご紹介させていただきます。

非常に低レベルな記事ですので、ミスも多いかと思いますが、どうか温かい目でご覧ください。

# 1.発想
![桶.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589308/90eb28ed-cd8a-788c-5b5d-f4d7c1592370.gif)

桶が見えてきたあなたは、まずはお風呂に入りましょう。

<font color=orange>**お風呂は何かを発想するのに最適な場所です。**</font>

湯船に浸かり、「どのようなデータパックを作りたいか？」「どのようなアイテムを追加して、それはどのような効果で...」というのを思い付かなくなるまで考えます。

考えだすことができた暁には、<font color=pink>**できるだけ早くメモしましょう。**</font>
<font color=gray>※本当はスマートフォンなどをお風呂に持ち込むのが理想なのですが、水没の恐れがあるためやめましょう。</font>
# 2.フォルダを作る
データパック制作において、<font color=red>**衝動的な勢いは非常に大切です。**</font>
勢いがあるうちにデータパックのフォルダを作り、制作を始めましょう。

#### ここで、軽くデータパックの構造をおさらいしておきましょう。
##### 1.階層
データパックは、基本的に**フォルダの中にフォルダを作り**
↓
**適切な名前のフォルダの中に.json形式などのファイルを置き**
↓
**それに構文を記入する**ことで動作させます。

このフォルダの設定すべき正しい名称や、どのようにフォルダの階層を作るべきか、ということは、「Minecraft Wiki」に掲載されているので見ることをおすすめします。

https://minecraft.fandom.com/ja/wiki/Minecraft_Wiki

<font color=red>**衝動でデータパックを作り始めた際は、**</font>
`データパック名/data/カスタム名/functions/main.mcfunction`と
`データパック名/data/カスタム名/functions/install.mcfunction`、
`データパック名/data/minecraft/advancements/tick.json`、
`データパック名/data/minecraft/advancements/load.json`、
の4つを用意しておけば良いでしょう。
これで基本的なデータパックは作成可能です。
##### 2.拡張子
「拡張子」というのは、ファイルの後ろについている「.mp4」「.json」といった、.を含む単語のことです。
Minecraftのデータパックを作る際に使うのは、
`.mcfunction`が90%、`.json`が10%と言ったところでしょう。
この`.mcfunction`と`.json`を感覚的に覚えることがデータパックを作る上で一番重要と言っても良いかもしれません。

`.mcfunction`の中には、Minecraftの中で使うような、「コマンド」の形式で記入します。
![death.mcfunction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589308/5ec95f59-1e0c-6322-b9b1-c67ea2354f53.png)

しかし、`.json`の中には「コマンド」とは別の「Jsonフォーマット」で記入します。
![tick.json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589308/da6f48f6-60dc-8901-447d-837293972e66.png)

最初は、`.json`で`.mcfunction`を呼び出す、という認識でOKです。

あとは、ひたすらにファイルを追加し、中身を書き、フォルダにまとめて...という形でひたすらコマンドを記入していきます。

ここで、ふたつおすすめの小技をご紹介します。
<font color=gold>**-tips1-**</font>
一つ目です。
この小技は上級者の方々が知らず知らずのうちに使っていたりして、すごく便利なので覚えておくと良いでしょう。

また、この小技はVisualStudioCodeのものですので、VSCodeを使用している人のみご覧ください！

長々と構文を書いていると、非常に見づらくなってしまいます。

ひとつ例を挙げましょう。
```ruby:main.mcfunction
#set
execute as @a[tag=lime_team] at @s run function spraft:weapons/set_g
execute as @a[tag=pink_team] at @s run function spraft:weapons/set_p
#start_house
execute as @e[tag=Start_house_lime] at @s run function spraft:weapons/start_house/main
execute as @e[tag=Start_house_pink] at @s run function spraft:weapons/start_house/main
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:17}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/start_house/place_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:18}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/start_house/place_p
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:19}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/start_house/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:20}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/start_house/start_p
#parasol_rocket
execute as @e[tag=Parasol_Rocket.g] at @s run function spraft:weapons/parasol_rocket/entities/rocket_g
execute as @e[tag=Parasol_Rocket.p] at @s run function spraft:weapons/parasol_rocket/entities/rocket_p
execute as @e[tag=Parasol.g] at @s run function spraft:weapons/parasol_rocket/entities/parasol_g
execute as @e[tag=Parasol.p] at @s run function spraft:weapons/parasol_rocket/entities/parasol_p
execute as @e[tag=Parasol_R_smoke.g] at @s run function spraft:weapons/parasol_rocket/entities/smoke_g
execute as @e[tag=Parasol_R_smoke.p] at @s run function spraft:weapons/parasol_rocket/entities/smoke_p
execute as @e[tag=Parasol_Rocket.particle] at @s run function spraft:weapons/parasol_rocket/particles/main
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:9}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/parasol_rocket/place_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:10}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/parasol_rocket/place_p
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:11}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/parasol_rocket/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:12}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/parasol_rocket/start_p
#azarashi_throw
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:13}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/azarashi_throw/place_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:14}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/azarashi_throw/place_p
execute as @e[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:15}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/azarashi_throw/start_g
execute as @e[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:16}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/azarashi_throw/start_p
execute as @e[tag=Azarashi.g] at @s run function spraft:weapons/azarashi_throw/bullet_g
execute as @e[tag=Azarashi.p] at @s run function spraft:weapons/azarashi_throw/bullet_p
execute as @a[tag=Azarashi_now,tag=lime_team] at @s positioned ~ ~1 ~ run function spraft:ink/rotate/azarashi_g
execute as @a[tag=Azarashi_now,tag=pink_team] at @s positioned ~ ~1 ~ run function spraft:ink/rotate/azarashi_p
#ultra_hanko
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:7}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/ultra_hanko/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:8}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/ultra_hanko/start_p
scoreboard players add @a[tag=Hanko_now] Hanko_time 1
execute as @a[scores={Hanko_time=180..}] at @s run function spraft:weapons/ultra_hanko/break
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:32,special:1}}}] at @s run function spraft:weapons/ultra_hanko/main_yasumi_p
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:33,special:1}}}] at @s run function spraft:weapons/ultra_hanko/main_yasumi_g
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:30,special:1}}}] at @s run tag @s add have_ultra_hanko.p
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:31,special:1}}}] at @s run tag @s add have_ultra_hanko.g
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:32,special:1}}}] at @s run tag @s add have_ultra_hanko.p
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:33,special:1}}}] at @s run tag @s add have_ultra_hanko.g
execute as @a[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:30,special:1}}}] at @s[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:32,special:1}}}] run tag @s remove have_ultra_hanko.p
execute as @a[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:31,special:1}}}] at @s[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:33,special:1}}}] run tag @s remove have_ultra_hanko.g
#Splash_down
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:5}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/splash_down/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:6}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/splash_down/start_p
execute as @a[tag=splash_down_g] at @s run function spraft:weapons/splash_down/main
execute as @a[tag=splash_down_p] at @s run function spraft:weapons/splash_down/main
execute as @e[tag=down_ink_g] at @s run function spraft:ink/splash_down_g
execute as @e[tag=down_ink_p] at @s run function spraft:ink/splash_down_p
execute as @e[tag=Splash_down.particle] at @s run function spraft:weapons/splash_down/particle
```
これは私が製作している「Spraft」という配布マップのデータの中から、一部を抜粋したものです。
いやぁ〜見づらいですね。

かろうじて`#`でタイトルをつけているとはいえ、構文が多すぎて見づらいです。

そこで、`#`の後に半角の空白を加えることで、その`#`から下をフォルダのように畳むことができます。
![tatamu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589308/0d33eae3-166b-af46-d2b5-7e52515045f8.gif)

見やすくなりましたね！
たくさんのコマンドを扱う際はご活用ください...！！
<font color=gold>**-tips2-**</font>
さて、ふたつ目です。
特殊なアイテムを追加するデータパックを作っていると、どうしても**nbt**が長くなってしまいます。
```ruby:/giveコマンドにnbtを直接記入した場合
give @s armor_stand{display:{Name:'{"text":"アイテム名","color":"gold","italic":true}',Lore:['{"text":"説明","color":"gray","italic":false}']},Enchantments:[{}],EntityTag:{Silent:1b,Marker:1b,ShowArms:true,NoBasePlate:true,Tags:["tags"]}} 1
```
これだと、非常に見づらいですし、書き直したくなった際に手間と時間がかかってしまいます。
そこで、`.json`形式の「ルートテーブル(loot_table)」を使うことで、時短と形式化、効率化を測ることができます。
フォルダの階層は`データパック名/data/カスタム名/loot_tables/アイテム名.json`です。

`アイテム名.json`に記入する内容は以下の通りです。
```ruby:loot_tableに変えた場合
{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:armor_stand",
                    "functions": [
                        {
                            "function": "set_name",
                            "name": [
                                {
                                    "text": "アイテム名",
                                    "color": "gold",
                                    "italic": false
                                }
                            ]
                        },
                        {
                            "function": "set_lore",
                            "lore": [
                                {
                                    "text": "説明",
                                    "color": "gray",
                                    "italic": false
                                }
                            ]
                        },
                        {
                            "function": "set_nbt",
                            "tag": "{Enchantments:[{}],EntityTag:{Silent:1b,Marker:1b,ShowArms:true,NoBasePlate:true,Tags:[\"tags\"]}}"
                        }
                    ]
                }
            ]
        }
    ]
}

```
この方がスッキリしていて見やすいですよね。

ルートテーブルに置き換えれば、デバッグの際にコマンドで入手しやすかったり、アイテムを簡単にエンティティで出現させることができたり...と良いことばかりです。

ルートテーブルで管理しているアイテムは`/loot`コマンドで管理します。

```ruby:アイテムをプレイヤー(自分)に渡したい時
/loot give @s loot カスタム名:アイテム名
```
```ruby:アイテムをその場に落としたい時
/loot spawn ~ ~ ~ loot カスタム名:アイテム名
```
便利なルートテーブルですが、一つ注意しなければならないことがあります。それは、**アイテムのnbt**のこの部分です。
```
EntityTag:{Tags:["tags"]}
```
giveコマンドに直接記入する際は、
```
/give @s armor_stand{EntityTag:{Tags:["tags"]}}
```
で良いのですが、ルートテーブルの構文にて、nbtの欄に既に`""`が使われているため、重複することになり、`["tags"]`の部分がエラーとなってしまいます。

なので、nbtを設定する際に`""`が入ってしまうときは、`""`の直前に`\(バックスラッシュ)`を入れましょう。こうしてルートテーブルの形になったnbtがこちらです。
```ruby:(nbtの部分だけ抜粋)
{
    "function": "set_nbt",
    "tag": "{EntityTag:{Tags:[\"tags\"]}}"
}
```
脱線しすぎました。話を戻します。
# 3.寝る
さて、制作を初めてかなり時間が経過したと思います。
アイデアも薄まってきて、さぞ疲れたことでしょう。

そういうときは、無理やり作業を続行しても<font color=purple>**効率が悪い**</font>ので、<font color=red>**いっそ寝てしまいましょう！**</font>

おやすみなさいー

<font color=gray>※ここから先は寝てから読みましょう。</font>
# 4.見た目を作る
<font color=red>**ここからはリソースパックの話になります。**</font>
やはり、見た目というのは**創造心や、やる気**を起こしてくれます。
ですから私が最近何かを作るときは必ず見た目から作り始めます。

そのくらい重要な見た目ですが、特に **「絵が得意だよ！」** というようなことがなければ、**3Dモデルを作成すること**をおすすめします。

<font color=red>データパック勢は一回は通る道と言っても過言ではないです。</font>

ソフトは「BlockBench」を使用します。Mac、Windowsどちらにも対応していて、UIもシンプルなので非常に使いやすいです。

:::note info
3Dの見た目を作りたかったらまずはBlockBenchをマスターしましょう！
:::
https://www.blockbench.net

BlockBenchの使い方や小技などは今回は割愛します。

こうして出来たモデルファイルをまたフォルダーの中でごちゃごちゃして`.json`などと組み合わせて反映していくわけですが、今回は一応**コマンドの記事**なので、そこら辺は省略させていただきます。

WikiやYouTube動画などに沢山情報がありますのでそちらを参考にしてください。

# 5.デバッグ
これはここまでの全てが完成した後に限らず、一つ一つの要素を作成した後にも必ずやるべきことです。

所詮1ゲームの追加要素、と言っても、
やはり構文のミスなどによる<font color=red>**バグ**</font>は必ず発生します。

そこで、何かを実装した際に逐一Minecraftで実際に**その要素が正常に機能しているかどうかを確認し、していなかったのであれば修正する必要があります。**

制作の途中は一人でやるのも良いと思いますが、完成した後、人を呼んでマルチプレイでデバッグを行うのも大切です。そのためにも、
#### <font color=red>*友達は作っておいた方が良いでしょう。*</font>

# 6.配布
こうして完成したデータパックは、個人で所有しているだけではあまりに勿体ないので、**インターネットで配布することをおすすめします。**

配布の方法について解説している人はあまり見かけないので、少しご紹介します。

まずは、完成したデータパック・リソースパックのフォルダを、`.zip`形式のファイルにしましょう。なぜなら、フォルダの形式では<font color=orange>**アップロード、ダウンロード**</font>を行うことが難しいからです。

Windowsをご使用の方はデフォルトの機能で`.zip`に圧縮すれば良いですが、Macは違います。
Macのデフォルトの機能で圧縮を行うと、`.zip`ファイルの中に<font color=red>余計なフォルダが混入してしまいます。</font>

ですから圧縮を行えるサイトなどで圧縮を行った方が良いでしょう。
参考程度に、私のおすすめのサイトを貼っておきます！

https://www.ezyzip.com/jp-f.html

このようにして`.zip`ファイルになったデータパック・リソースパックは、何らかの形でインターネットに<font color=orange>**アップロード**</font>する必要があります。

そこで、いくつかの方法をご紹介します。
#### 1.Google Drive
私も使用している一番おすすめの方法です。
最大15GBまで無料で使えて、**ダウンロードリンクを生成することもできる**ためとても使いやすいです。
Googleが提供しているため安心感もありますね。

https://drive.google.com/drive/u/0/home

#### 2.GitHub
コマンダーおよびプログラマーがこぞって使っています。
フォルダの中に仕込ませる`readme.text`といったテキストファイルでデータパックの説明が表示できたり、中身の構文や階層が簡単に閲覧できたりするため、より**開発者向け**で、**多機能**になっています。
専用のURLが作成され、紹介のサイトと同じ役割も果たせるため、楽で良いですね。

https://github.com

# おわりに
ここまでの閲覧ありがとうございました。

この記事を見て、データパックを作ってみたくなったあなたは、

### <font color=red>*今すぐお風呂に行きましょう*</font>

私が言えるのはそれぐらいでした。

それではみなさん、よきお風呂コマンドライフを〜！