JSONの利用

概要

Forge式記法のJSONを用いて進捗とルートテーブルを実装する。

 

ソースコード

今回新規で作成していないファイル、解説不要のファイルは上のリンクよりソースコードを御覧ください。

AluminiumMod.java

以前の解説を参照

ItemAluminiumRod.java

アセット

長いので格納

解説

AluminiumMod.java

42行目

LootTableList.register(new ResourceLocation("aluminiummod:chests/aluminium_chest"));
ルートテーブルを登録する。assets/loot_tablesの下に入っているルートテーブルのファイルを参照する。

ItemAluminiumRod.java

32,33行目

 ((TileEntityChest) worldIn.getTileEntity(pos.offset(facing))).setLootTable(new ResourceLocation("aluminiummod:chests/aluminium_chest"), player.getRNG().nextLong());

void setLootTable(ResourceLocation, Long)

TileEntityの関数。対応するResourceLocationにあるルートテーブルを渡し、インベントリに格納する。
乱数は第二引数にlong型で渡す。
これにより、バニラと同様のシステムで宝物入りのチェストを生成できる。

進捗

構造はこちらを参照 Minecraft wiki
まず、進捗の最初を定義する。
こちらはroot.jsonという名称で登録することが推奨される。
root.jsonで定義された進捗が達成されると進捗GUIでのタブが開放される。
display/icon要素は進捗のアイコン、display/title,display/description要素でタイトルと解説(半角スペースで改行ができる)を登録する。
また、background要素で背景を指定する。(root.jsonのみ)
criteria要素は進捗解除の条件を指定するものであり、ORで解除する(どれか一つで進捗達成にする)のであれば、

"requirements": [
    [
      "get_aluminium",
      "get_aluminium_block"
    ]
  ]
のように複数のcriteriaで指定した要素をrequirements要素のリストに入れる。

進捗を達成したときにはレシピ、ルートテーブル、経験値を与えることができる。(バニラではルートテーブルは使われていない)
rewards要素内でルートテーブルを与える場合はloots(中に登録した名称)、経験値を与える場合はexperience(中に経験値量)を記載する。

ルートテーブル

name要素は名称、rolls要素はスタック数の最小最大値を指定し、entriesリストでアイテムを入れる。
アイテムはnameで名称、weightで確率、functionsでアイテム数の最小最大値を指定したり、エンチャントを追加したりできる。
enchant_with_levelsをfunctionに設定した場合、エンチャントレベルやトレジャーエンチャントを指定できる。
トレジャーエンチャントは消滅の呪いや束縛の呪いなどがあたる。
また、実際に使う機会は少ないがこういう使い方もできる。
(1.13実装予定のトライデントなどは使えるかも)


"functions": [
            {
              "function": "enchant_with_levels",
              "treasure": true,
              "levels": {
                "min": 30,
                "max": 59
              }
            },
            {
              "function": "set_count",
              "count": {
                "min": 2,
                "max": 7
              }
            }
          ]