提供: Minecraft Modding Wiki
2021年11月3日 (水) 19:43時点におけるVillager (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"Minecraft Forge 1.14-28.0.x~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
C none.png
Recipeに関係のあるチュートリアルです。


ここでは、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)"
}

でレシピを追加します。