目次
概要
Forge式記法のJSONを用いて進捗とルートテーブルを実装する。
ソースコード
今回新規で作成していないファイル、解説不要のファイルは上のリンクよりソースコードを御覧ください。
AluminiumMod.java
ItemAluminiumRod.java
package com.tntmodders.tutorial;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class ItemAluminiumRod extends Item {
public ItemAluminiumRod() {
super();
//レジストリに保存する名称を登録する。大文字禁止。
this.setRegistryName("aluminiummod", "aluminium_rod");
//クリエイティブタブを設定する。
this.setCreativeTab(CreativeTabs.MATERIALS);
//翻訳名を登録する。大文字非推奨。
this.setUnlocalizedName("aluminium_rod");
}
@Override
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand,
EnumFacing facing, float hitX, float hitY, float hitZ) {
worldIn.setBlockState(pos.offset(facing), Blocks.CHEST.getDefaultState());
if (worldIn.getTileEntity(pos.offset(facing)) instanceof TileEntityChest) {
((TileEntityChest) worldIn.getTileEntity(pos.offset(facing))).setLootTable(
new ResourceLocation("aluminiummod:chests/aluminium_chest"), player.getRNG().nextLong());
}
return super.onItemUse(player, worldIn, pos, hand, facing, hitX, hitY, hitZ);
}
}
アセット
解説
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
}
}
]