目次
概要
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
}
}
]