プログラミング初学者がminecraftのデータパック(ビヘイビアパック)を作るまで #1

Nihon University Advent Calendar 2024 16日目に公開された記事です．
Qiita初投稿なので悪しからず．
## 動機
普通にマイクラをやるの飽きたなぁ，コマンドでなんか作りたいからデータパックに手を出してみよう．
あと自分で探していて不親切な記事が多いと思ったので，自分が後で見返したりするときや，私のような書き始めたいけど何からやればいいのかわからない，PCなんもわからん人でも書けるできるようにとっかかりを作りたい．

:::note warn
注意
今回行うのはminecraft je ver 1.16.4にて行うが，最新のverには一部対応していない．
ver 1.21からfunctiiosフォルダの名前がfunctionに変わったらしい．
その他コマンドにも細かい仕様変更があるらしいので注意．今回扱ってるのは仕様変更が少ないコマンドを用いているので最新verでも動く(はず)
:::

## 環境構築
まずは環境構築から始める．
今回用いたのはminecraft 1.16.4(java)
まずは起動してインストールし，任意の名前でワールドを作成する．今回はdatapack test worldと名前を付けておく．
### ディレクトリの話
マインクラフトランチャーを開いて，起動構成→作ったバージョン(今回だと1.16.4)のファイルマークをクリックする．
そうするとエクスプローラーが開いて，以下のようなディレクトリができていることがわかる．
```
.minecraft
        └assets
        └backups
        ...
        └saves
            └新規ワールド
            └datapack test world
            ...
        └screenshots
        ...
```
となっている．作成したワールドのデータは.minecraft内のsavesにあるので，そこに移動する．作成したdatapack test worldがsaves内にあるはずなので，開いてみると，
```
datapack test world
            └advanvements
            └data
            └datapacks
            ...
```

というものがある．
これから作成するファイルやフォルダはdatapacksに入れる．
datapacksに入れるデータパックの基本的なディレクトリ構造がやや複雑なのでちゃんと書いておく．
今回作るデータパックの名前はtest datapackとしておく．
実際にデータパックの基盤を作ってみると
```
datapacks
    └test datapacks
            └data
                └minecraft
                └test
                    └functions
                        └helloworld.mcfunction
            └pack.mcmeta
```
というディレクトリ構造となる．
data内にminecraft，testとあるが，それぞれを名前空間と呼ばれるものだ．minecraftの～という言い方になるらしい．コマンドのプレビューでよく見る，minecraft: ~ の部分がこれに当たる．
.mcmetaは，minecraft側がこれをデータパックだと認識するためのファイル，
functionsフォルダにある~.mcfunctionはfunction(関数)の集合体で，minecraft内で動かせるコマンドが書かれている．詳しくは後述する．

### エディタについて
VSCodeを用いていく．メモ帳でも書けなくはないが，インデントやらが大変になる．
VSCodeに入れておくおすすめの拡張機能としては，

日本語化

https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

UUIDジェネレーター

https://marketplace.visualstudio.com/items?itemName=netcorext.uuid-generator

Blockception's Minecraft Bedrock Development

https://marketplace.visualstudio.com/items?itemName=BlockceptionLtd.blockceptionvscodeminecraftbedrockdevelopmentextension

この三つ．ぜひ入れておいた方がいい．


## 実際に作ってみる
ここからは実際にdatapackとして認識させ，簡単なコマンドを使って.mcfunctionの動作確認する．

### pack.mcmetaに書くもの
pack.mcmetaには，minecraftにdatapackとして認識させるための設定がいろいろ書かれている．

pack.mcmetaには以下のようなものを書いておく．

```:pack.mcmeta
{
  "pack": {
    "pack_format": 6,
    "description": "Tutorial Data Pack"
  }
}
```
descriptionにはデータパックの名前を，pack_formatには，対応したバージョンの数値を書く．今回は1.16.4なので6とかく．
対応表は，

| ver | pack_format |
|:---:|:-----------:|
| 1.13 ~ 1.14.1  |4 |
| 1.15 ~ 1.16.1  |5 |
| 1.16.2 ~ 1.16.5|6 |
| 1.17 ~ 1.17.4  |7 |
| 1.18 ~ 1.18.1  |8 |
|   1.18.2       |9 |
| 1.19 ~ 1.19.3  |10|
| 1.19.4         |12|
| 1.20 ~ 1.20.1  |15|
| 1.20.2         |18|
|1.20.3 - 1.20.4 |26|
|1.20.5 - 1.20.6 |41|
|1.21 - 1.21.1   |48|
| 1.21           |49|
|1.21.2 |57|




となる．飛んでいるナンバーは，スナップショットなどの試遊版にて用いられているようだ．
詳しくは，[Fandom datapack](https://minecraft.fandom.com/wiki/Data_pack?so=search) に書いてある．
今回descriptionはTutorial data packと書いておく．

これでマインクラフト側が，このフォルダがデータパックだと認識してくれる．


### コマンドを書く
ここからは実際にコマンドを書いてみる．
まずはmcfunctionフォルダ内のtestディレクトリに，helloworld.mcfunctionという名前でファイルを作る．
実際に作った後のディレクトリ構造は，
```
datapacks
    └test datapacks
            └data
                └minecraft
                └test
                    └function
                        └helloworld.mcfunction
            └pack.mcmeta
```
となる．

今回は初回なので簡単なコマンドで実行ができるかを確認する．
同ファイルに，
```:helloworld.mcfunction
give @p diamond
say "Hello world"
title @a times 20 80 20
title @a title {"text":"hello world!"}
```
と書いて保存をする．
表記方法としては，minecraft内で書くコマンドを"/"を除いた形で書く．また，一行に1コマンド文の処理を書く．
今回書いたコマンドは，
`give ~`　プレイヤーにアイテムを与えるコマンド
`say ~`　チャットに文字を出力するコマンド
`title ~ `　画面上にテキストを表示させるコマンド．`set` で表示時間，`title ~ ` で出力内容を指定する．


### 実際に動かしてみる

#### minecraft起動前にやっておいた方がいいオプション

minecraft launcherの設定から，minecraft:java editionの設定に，
`minecraft:java editionの起動時に出力ログを開く`
にチェックを入れておくと，起動時に，ワールドに入ったときや何かゲーム内で不都合が起こったときにログとして出してくれるウィンドウが出てくる．
![スクリーンショット (298).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936027/596f3e68-9360-7191-8ebb-cbc96f983cc7.png)

#### 起動してインポートの確認と実行

起動してdatapack test worldの世界に入ってから，以下のコマンドを入れる．
```:command
/datapack list
```

念のためコマンドの起動方法を説明すると，`/`以降を直接打つか，`T`キーでチャットを表示させてからコマンドを打ち，Enterを押すと実行ができる．

実際に実行すると，
![スクリーンショット (299).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936027/8b739686-a2b4-35f1-0b5f-e71c20e7e008.png)

とチャットログに表示されるはずだ．
[file/test datapack(world)]が表示されていない場合，
<ul>
<li>.mcfunctionの中に無効なコマンドが存在する</li>
<li>ディレクトリ構造が間違っている</li>
</ul>
の二択なので確認すること．筆者は無効なコマンドで一度悩んでいる．

ここまでやったら，以下のコマンドを打つ．
```:command
/function test:helloworld
```
Enterを押すと，
![スクリーンショット (300).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936027/b9e5da99-3dda-31d8-ae90-e6bccce0b58c.png)
という風になるはずだ．
進捗以外は実行のログになる．
しっかりとダイヤモンドが一つ入手され，Hello worldとチャットログに出力され，画面上にhello world!と表示された．
また，別ウインドウにて表示させているログのほうも，![スクリーンショット (301).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936027/50e5b840-5e59-f4f2-0e1f-b8de0957d07d.png)

という風に表示されるはずだ．
これで実際にデータパックを認識させ，コマンドを実行できるようになった．

## まとめ
今回はデータパックを作り始めるにあたって一番苦労するディレクトリ構成と環境構築を行った．
次回は，「コマンド解説 基礎編」として，基礎的なコマンドの種類と動きを実際に確認していく．