提供: Minecraft Modding Wiki
この記事は"Minecraft Forge 1.14-28.0.x~"を前提MODとしています。 |
ここでは、1.14.x以降のカスタムレシピの追加の方法を解説します。
(このサンプルでは、土を置いて、その土の数の5倍のダイヤモンドができるようにしています。)
ソース
SampleMod.java
/*パッケージ・インポートは省略*/ @Mod(SampleMod.MOD_ID) public class SampleMod { public static final String MOD_ID = "sample"; public static final SpecialRecipeSerializer<DiamondFromDirt> DIAMOND_FROM_DIRT = new SpecialRecipeSerializer<DiamondFromDirt>(DiamondFromDirt::new); @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public static class SampleModEventBus { @SubscribeEvent public static void registerEnchantments(final RegistryEvent.Register<IRecipeSerializer<?>> event) { DIAMOND_FROM_DIRT.setRegistryName(new ResourceLocation(SampleMod.MOD_ID, "diamond_from_dirt")); event.getRegistry().register(DIAMOND_FROM_DIRT); } } }
DiamondFromDirt.java
/*パッケージ・インポートは省略*/ public class DiamondFromDirt extends SpecialRecipe { public DiamondFromDirt(ResourceLocation idIn) { super(idIn); } public boolean matches(CraftingInventory inventory, World worldIn) { int size = inventory.getSizeInventory(); if (!(size == 4 || size == 9)) return false; int dirtcount = 0; for (int i = 0; i < size; i++) { ItemStack stack = inventory.getStackInSlot(i); if (!stack.isEmpty()) { if (Block.getBlockFromItem(stack.getItem()) == Blocks.DIRT) { ++dirtcount; } else { return false; } } } if (dirtcount == 0) return false; return true; } public ItemStack getCraftingResult(CraftingInventory inventory) { int size = inventory.getSizeInventory(); int dirtcount = 0; for (int i = 0; i < size; i++) { ItemStack stack = inventory.getStackInSlot(i); if (stack != ItemStack.EMPTY && stack.getItem() == Items.DIRT) { dirtcount++; } } return new ItemStack(Items.DIAMOND, dirtcount * 5); } public boolean canFit(int width, int height) { return width * height >= 2; } public IRecipeSerializer<?> getSerializer() { return SampleMod.DIAMOND_FROM_DIRT; } }
解説
1.13から、@ModにはMOD_IDだけ記述するようになったので注意です。
SpecialRecipeの継承クラスを作って、matchesでクラフトできるか、getCraftingResultでできるアイテム、getSerializerでそのレシピのSerializerを指定します。
public static final SpecialRecipeSerializer<DiamondFromDirt> DIAMOND_FROM_DIRT = new SpecialRecipeSerializer<DiamondFromDirt>(DiamondFromDirt::new);
で、レシピのSerializerを作って、そのあとのRegisterEventのところで、レジストリーネームを指定して、レジスターします。
あとはJsonファイルを作って、そこで
{ "type": "(モッドid):(レシピのSerializer)" }
でレシピを追加します。