[Java]MinecraftのModを作成しよう 1.14.4【7. 進捗の追加】

（この記事は一連の解説記事の一つになります）

先頭記事：[入門編](https://qiita.com/koteko/items/7afadf8261eac49bacad)
前の記事：[6. レシピの追加](https://qiita.com/koteko/items/4e6f4e25db43907770d9)
次の記事：[8. 鉱石の追加と生成](https://qiita.com/koteko/items/f17d723337ddf7d5dbd4)

# 進捗の追加
ここまでアイテム関連を広く浅く触れてきましたが、今度は少し趣向を変えて、進捗(advancements)の追加を行ってみます。
![advancement_Minecraft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256627/549f519e-13ad-8971-ce18-3e339cfb59aa.png)
このようなツリー構造のいわゆるトロフィーのようなものです。

進捗の追加は**比較的簡単**で、1.14.4ではjsonベースで管理されています。

```
\src\main\resources
   ├ assets
   └ data
      └ example_mod
         ├ advancements
         │  └ root.json
         ├ loot_tables
         └ recipes
```
`\src\main\resources\data\example_mod\advancements`フォルダを作り、この中に配置していきます。
まずツリーの根にあたる進捗が１つ必要になりますので、これを作ります。
[参考](https://w.atwiki.jp/minecraft/pages/1548.html#id_6d2dca49)ページに詳しいので、これを参考にしながら書きましょう。

```json:root.json
{
  "display": {
    "icon": {
      "item": "example_mod:example_ingot"
    },
    "title": {
      "translate": "advancements.root.title"
    },
    "description": {
      "translate": "advancements.root.description"
    },
    "frame": "task",
    "show_toast": true,
    "announce_to_chat": true,
    "hidden": false,
    "background": "minecraft:textures/block/stone.png"
  },
  "criteria": {
    "get_example_ingot": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "item": "example_mod:example_ingot"
          }
        ]
      }
    }
  }
}
```
これは`example_ingot`を入手した際に達成される進捗の例です。
重ねてになりますが、[参考](https://w.atwiki.jp/minecraft/pages/1548.html#id_6d2dca49)ページに十分な説明がありますので、詳しくはそちらを確認してください。一部かいつまんで説明します。
`frame`は進捗のタイルのフレームの指定です。challenge、goal、taskの3つから適当なものを設定しましょう。デフォルトtask。
`show_toast` `announce_to_chat`はそれぞれ「達成時に右上にメッセージを出すかどうか」「チャット欄にメッセージを出すかどうか」で、true/falseを与えます。デフォルトtrue。
`hidden`は「一つ達成されるまでタブを表示しないかどうか」…と書かれていますが、falseを指定しても**なぜか表示されない**のでよくわかりません。デフォルトfalse。
`criteria`は進捗の条件を定める項です。任意のuniqueな名前をタグ名とし(`get_example_ingot`の部分)、`trigger`に各種トリガー、`conditions`にトリガーに対応した詳細な条件を記述します。

タイトルと説明の`translate`について、langファイルに追記をします。

```json:en_us.json
{
  "advancements.root.title": "Example Title",
  "advancements.root.description": "Example description."
}
```

```json:ja_jp.json
{
  "advancements.root.title": "例タイトル",
  "advancements.root.description": "説明の例。"
}
```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256627/8cc4cefc-0652-7a40-4624-2d13961fa120.png)
このように進捗が追加できました。
___
もう一つくらい例を見てみましょう。

```json:obtail_armor.json
{
  "parent": "example_mod:root",
  "display": {
    "icon": {
      "item": "example_mod:example_chestplate"
    },
    "title": {
      "translate": "advancements.obtain_armor.title"
    },
    "description": {
      "translate": "advancements.obtain_armor.description"
    },
    "frame": "task",
    "show_toast": true,
    "announce_to_chat": true,
    "hidden": false
  },
  "criteria": {
    "example_helmet": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "item": "example_mod:example_helmet"
          }
        ]
      }
    },
    "example_chestplate": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "item": "example_mod:example_chestplate"
          }
        ]
      }
    },
    "example_leggings": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "item": "example_mod:example_leggings"
          }
        ]
      }
    },
    "example_boots": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "item": "example_mod:example_boots"
          }
        ]
      }
    }
  },
  "requirements": [
    [
      "example_helmet",
      "example_chestplate",
      "example_leggings",
      "example_boots"
    ]
  ],
  "rewards": {
    "experience": 100
  }
}
```
いずれかの防具を入手で達成される進捗の例です。
特に注目してほしいのは、前項でなかった`parent`の要素が増えていることです。ここに先ほど定義した`example_mod:root`を指定することで、子の要素とすることができます。なお、進捗では親が子の前提条件とはならない(順不同で達成可能)ですが、親を達成した場合子の子まで(つまり2段先まで)がすべて表示されるようになるようです(逆に子を達成した場合最短の経路で根までの親が表示されます)。また、1つの親に対して子は複数作ることができます。
他に異なるのは、`criteria`の要素が複数記述されていること、`requirements``rewards`が増えていることです。この例のように、`criteria`の要素は複数記述でき、`requirements`ではこれらを用いてどのように達成判定を行うか記述します。`[A,B]`はAまたはB、`[A],[B]`はAかつBを示します。`reward`には進捗達成時の報酬を設定できます。ここでは経験値を付与していますが、レシピの開放・アイテム付与・任意関数の実行が可能です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256627/c33afa60-274b-d949-c4ed-041f9fc325b2.png)
きちんと経験値が取得できています。
___
進捗は自分の作るModがどう楽しめるか伝える良い手段ですので、効果的に活用しましょう。

# 追記
1.12より前は進捗ではなく実績という異なるものが存在したので、情報を探す際に混同しないように注意が必要です。

# 参考
[進捗 - Minecraft Japan Wiki【8/4更新】 - アットウィキ](https://w.atwiki.jp/minecraft/pages/1548.html)

# 次の記事
[8. 鉱石の追加と生成](https://qiita.com/koteko/items/f17d723337ddf7d5dbd4)