この記事は"Minecraft Forge Universal 14.21.0.xxx~"を前提MODとしています。 |
このチュートリアルでは、基本的なレシピの追加方法について解説する。
1.12からは以前の手法に加えて、Jsonによってレシピを記述できるようになった。
また、その影響によって従来の方法にも少し変更が加えられている。
バニラのクラスや書式を使う利点はないのでOreRecipeを用いる。
Jsonによる手法
1.12ではバニラのレシピカスタマイズ機能が不完全なため、Modのエントリクラス(@Modアノテーションがついたクラス)は不可欠。
ここではエントリクラスが存在するという前提で、Jsonのみについて解説する。
なお、古いバージョン(1.12~1.12.2初期頃)のForgeではJsonレシピの一部機能が未実装であり未修正のバグも存在したため、それらのバージョンで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項目に同一文字列を入れるとレシピ本において同じ括りで表示されるようになる。
data項目で材料のメタ値(ダメージ値)を指定することが可能。
メタ値(ダメージ値)が0の場合はdata項目を省略することができる。
ただしメタ値を利用して同一IDに複数種類が登録されているアイテムやブロックを材料にする場合は0でもdata項目を省略することができない。(上の例ではminecraft:dirt
やminecraft:wool
が該当する)
data項目に32767
を指定するとWildcardとなりメタ値(ダメージ値)に関わらず材料として使用できるようになる。(ただしビルド2542より前ではWildcardメタが正常に動作しないので注意)
ちなみに、レシピの材料指定には鉱石辞書の利用も可能である。
その場合はitem項目に代わってtype項目で"forge:ore_dict"
を指定し、ore項目に材料の鉱石辞書名を指定する。
"key": { "#": { "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でラップしてあげる必要はなくなった。