この記事は"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を用いるとレシピ本においては正常に扱えない。
ビルド2542で修正され、Wildcardメタが正常に動作するようになった。
ちなみに、レシピの材料指定には鉱石辞書の利用も可能である。
その場合は"item"項目に代わって"type"項目で"forge:ore_dict"を指定し、"ore"項目に材料の鉱石辞書名を指定する。
"#": { "type": "forge:ore_dict", "ore": "dirt" }
従来の手法
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でラップしてあげる必要はなくなった。