提供: Minecraft Modding Wiki
2018年5月13日 (日) 14:16時点におけるModderKina (トーク | 投稿記録)による版 (ビルド2547の修正について追記)
移動先: 案内検索

この記事は"Minecraft Forge Universal 14.21.0.xxx~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。

このチュートリアルでは、基本的なレシピの追加方法について解説する。
1.12からは以前の手法に加えて、Jsonによってレシピを記述できるようになった。
また、その影響によって従来の方法にも少し変更が加えられている。
バニラのクラスや書式を使う利点はないのでOreRecipeを用いる。

Jsonによる手法

1.12ではバニラのレシピカスタマイズ機能が不完全なため、Modのエントリクラス(@Modアノテーションがついたクラス)は不可欠。
ここではエントリクラスが存在するという前提で、Jsonのみについて解説する。

サンプル

  • dirt_to_diamond_vertical.json
{
  "type": "forge:ore_shaped",
  "group": "recipe_sample:dirt_to_diamond",
  "pattern": [
    " # ",
    " # ",
    " # "
  ],
  "key": {
    "#": {
      "item": "minecraft:dirt",
      "data": 0
    }
  },
  "result": {
    "item": "minecraft:diamond"
  }
}
  • dirt_to_diamond_horizontal.json
{
  "type": "forge:ore_shaped",
  "group": "recipe_sample:dirt_to_diamond",
  "pattern": [
    "###"
  ],
  "key": {
    "#": {
      "item": "minecraft:dirt",
      "data": 0
    }
  },
  "result": {
    "item": "minecraft:diamond"
  }
}
  • fluffy_diamond.json
{
  "type": "forge:ore_shapeless",
  "ingredients": [
    {
      "item": "minecraft:wool",
      "data": 3
    },
    {
      "item": "minecraft:feather"
    },
    {
      "item": "minecraft:web"
    }
  ],
  "result": {
    "item": "minecraft:diamond"
  }
}

解説

レシピのJsonは"assets/<modid>/recipes/"ディレクトリ下に配置すること。
Jsonのファイル名はそのままレシピの内部名に用いられる。
内部名はアドバンスメントによるレシピ解放などに用いる。
groupに同一文字列を入れるとレシピ本において同じ括りで表示されるようになる。
現状Wildcardメタ32767を用いるとレシピ本においては正常に扱えない。 ビルド2542で修正され、Wildcardメタが正常に動作するようになった。

従来の手法

Forgeにより以前から提供されていたレシピ登録機能も引き続き利用できる。将来廃止されるかどうかは不透明である。
ちなみに、Forge側は「1.13ではServer-Client同期が実装されることが予期されるから、Jsonに移行すべきだ」としている。

サンプル

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.oredict.ShapedOreRecipe;
import net.minecraftforge.oredict.ShapelessOreRecipe;

@Mod.EventBusSubscriber
@Mod(modid = RecipeSample.MOD_ID, version = RecipeSample.MOD_VERSION)
public class RecipeSample{
    public static final String MOD_ID = "recipe_sample";
    public static final String MOD_VERSION = "1.0";

    @SubscribeEvent
    public static void registerRecipes(RegistryEvent.Register<IRecipe> event){
        event.getRegistry().registerAll(
                new ShapedOreRecipe(new ResourceLocation(MOD_ID, "dirt_to_diamond"), Items.DIAMOND,
                        " # ",
                        " # ",
                        " # ",
                        '#', new ItemStack(Blocks.DIRT)
                ).setRegistryName(MOD_ID, "dirt_to_diamond_vertical"),

                new ShapedOreRecipe(new ResourceLocation(MOD_ID, "dirt_to_diamond"), Items.DIAMOND,
                        "###",
                        '#', new ItemStack(Blocks.DIRT)
                ).setRegistryName(MOD_ID, "dirt_to_diamond_horizontal"),

                new ShapelessOreRecipe(null, Items.DIAMOND,
                        new ItemStack(Blocks.WOOL, 1, 3),
                        Items.FEATHER,
                        Blocks.WEB
                ).setRegistryName(MOD_ID, "fluffy_diamond")
        );
    }
}

解説

第一引数のnameと第二引数のgroupが新たに追加された。
現状Wildcardを用いるとレシピ本においては正常に扱えないうえに、従来のように材料に生のItem/Blockインスタンスを入れるとWildcardメタ扱いになるため注意。
ビルド2542で修正されWildcardメタが正常に動作するようになり、ItemStackでラップしてあげる必要はなくなった。