提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 14.21.0.xxx~"を前提MODとしています。 |
このチュートリアルでは、基本的なレシピの追加方法について解説する。
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を用いるとレシピ本においては正常に扱えない。
従来の手法
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), new ItemStack(Items.FEATHER), new ItemStack(Blocks.WEB) ).setRegistryName(MOD_ID, "fluffy_diamond") ); } }
解説
第一引数のnameと第二引数のgroupが新たに追加された。
現状Wildcardを用いるとレシピ本においては正常に扱えないうえに、従来のように材料に生のItem/Blockインスタンスを入れるとWildcardメタ扱いになるため注意。