この記事は"Minecraft Forge Universal 10.12.0.xxx~"を前提MODとしています。 |
作成するソース
RecipeSample.java
全体の完成形
package mods.recipesample; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @Mod(modid = "recipe_sample") public class RecipeSample{ @Mod.EventHandler public void preInit(FMLPreInitializationEvent event){ } @Mod.EventHandler public void init(FMLInitializationEvent event){ GameRegistry.addRecipe(new ItemStack(Items.diamond), "#", "#", "#", '#', Blocks.dirt ); GameRegistry.addRecipe(new ItemStack(Items.diamond), "###", '#',Blocks.dirt ); GameRegistry.addRecipe(new ItemStack(Items.diamond), "# #", '#',Blocks.dirt ); GameRegistry.addRecipe(new ItemStack(Items.ender_pearl), "FWF", "W W", "FWF", 'F',Items.feather, 'W',Blocks.end_stone ); GameRegistry.addRecipe(new ItemStack(Blocks.wool,5), "LWL", 'L',Blocks.leaves, 'W',Blocks.web ); GameRegistry.addRecipe(new ItemStack(Blocks.wool,5,10), "LLL", "LWL", "LLL", 'L',Blocks.leaves, 'W',Blocks.web ); GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe), "HD", 'H',new ItemStack(Items.diamond_hoe,1, OreDictionary.WILDCARD_VALUE), 'D',Items.diamond ); GameRegistry.addShapelessRecipe(new ItemStack(Items.diamond), new ItemStack(Blocks.wool,1,5), Items.feather, Blocks.web ); } @Mod.EventHandler public void postInit(FMLPostInitializationEvent event){ } }
レシピを作る
GameRegistry.addRecipe(new ItemStack(Items.diamond), "#", "#", "#", '#', Blocks.dirt );
レシピを指定してる部分はこの部分です。
GameRegistry.addRecipeで形が決まったレシピでこれを作りますよ!というのを決めています。
今回の場合 土を縦に3つ並べるとダイヤモンドというアイテムを1個出すというプログラムになっています。
(new itemStack(作れるアイテム))となっています。
2行目からの文がレシピの形を決めています。分かりやすく見せると、
"000" "000" "000"
このように配置が決まっています。
素材を使用する部分には任意の文字を入れてください。同じ文字は同じパーツと判断されます。
GameRegistry.addRecipe(new ItemStack(Items.diamond), "# #", '#',Blocks.dirt );
何も入れない部分は上の例3のように半角空白を入れてください。
空白を入れなかった場合、ワークベンチに収まればそれで作れるようになってしまいます。
"XX"のような場合"XX0"または"0XX"というように認識されます。
上の例や下の例のように指定は3段でなくても問題はなく、例2のように
GameRegistry.addRecipe(new ItemStack(Items.diamond), "###", '#',Blocks.dirt );
とした場合、3段の内のいづれかに3つ土が横に並んでいれば作れるようになります。
そのように指定したら、次はその文字がどんなパーツかを指定します。
'#',Blocks.dirt });
'#'の部分が指定したパーツの文字、その次が素材になります。
ブロックが素材の場合Blocks、置けないアイテムの場合Items、になります。
そのあとのアイテムの種類は、ゲームでよく呼ばれる名前とは違う場合があります。
Items.javaやBlocks.javaにアイテム/ブロックのリストがありますので、利用してください。
複数素材がある場合は
GameRegistry.addRecipe(new ItemStack(Items.ender_pearl), "FWF", "W W", "FWF", 'F',Items.feather, 'W',Blocks.end_stone );
1つ指定した後に , で区切って次のパーツを指定してください。
また、ダメージ値(炭、羊毛など)を指定したい場合、
'X',new ItemStack(Item.coal, 1, 0) });
というように記述します。
もちろん、逆にできるアイテムのダメージ値やスタック数を決めることも可能で
GameRegistry.addRecipe(new ItemStack(Blocks.wool,5), "LWL", 'L',Blocks.leaves, 'W',Blocks.web ); GameRegistry.addRecipe(new ItemStack(Blocks.wool,5,10), "LLL", "LWL", "LLL", 'L',Blocks.leaves, 'W',Blocks.web );
というようになります。
不定形レシピを作る
上記のレシピに対して配置は関係ないレシピの作り方です。
GameRegistry.addShapelessRecipe(new ItemStack(Items.diamond), new ItemStack(Blocks.wool,1,5), Items.feather, Blocks.web );
ここがレシピを指定している部分です。
GameRegistry.addShapelessRecipeで不定形レシピを作ることを宣言しています。
ここでは、羊毛(ダメージ値5)と羽と蜘蛛の巣でダイヤができるように書いてあります。
レシピはこれで終わりです。
追加アイテムがあればそれを作るレシピも作れます。詳しくは無機能のアイテムを追加するをご覧ください。
API例と解説
- 例)焼き石と木の棒から石ピッケルを作成
GameRegistry.addRecipe(new ItemStack(Item.pickaxeStone), "XXX"," Y "," Y ", 'X',Block.stone, 'Y',Item.stick );
- 一般的な定型レシピ
- 例)赤羊毛と黒羊毛から、茶色羊毛を2個作成
GameRegistry.addShapelessRecipe(new ItemStack(Block.cloth,2,12), new ItemStack(Block.cloth,1,14), new ItemStack(Block.cloth,1,15) );
- 例)木材1つと石炭(木炭)2個から、松明を8つ作成
GameRegistry.addShapelessRecipe(new ItemStack(Block.torchWood,8), new ItemStack(Item.coal,1,OreDictionary.WILDCARD_VALUE), new ItemStack(Item.coal,1,OreDictionary.WILDCARD_VALUE), new ItemStack(Block.planks,1,OreDictionary.WILDCARD_VALUE) );
- ダメージ値を指定したレシピを作る場合、ItemStackクラスを使用する。
- ItemStack(アイテム名,個数,ダメージ値) ダメージ値は省略可能(省略時は0)、個数は材料指定時には無効。
- 不定形レシピで同じアイテムを2個以上使いたい場合、個数1で2回指定する必要がある点に注意。
- ダメージ値に関わらずレシピに使用する(例えば全ての木材で作成可能にする)には、ダメージ値に「OreDictionary.WILDCARD_VALUE」を指定する。
- ItemStack(アイテム名,個数,ダメージ値) ダメージ値は省略可能(省略時は0)、個数は材料指定時には無効。
- ダメージ値は、ブロックは0~15、アイテムは0-32000まで設定可能。
- 耐久力のあるアイテムの場合、ダメージ値は最大で耐久値までとなる。
- ダメージ値を指定したレシピを作る場合、ItemStackクラスを使用する。
- 例)木の棒のみで、壊れかけの(耐久値の減った)木ピッケルを作成
GameRegistry.addRecipe(new ItemStack(Item.pickaxeWood,1,32), new Object[]{"YYY"," Y "," Y ", 'Y',Item.stick});
- 耐久値のあるアイテムは、ダメージを指定すると、その分耐久力が減少して作成される。
- 耐久値と同じダメージを指定すれば、1回で壊れるアイテムも作成可能
- これを応用して、木材から「数回で壊れるハサミ」なども作成することができる
- 例)耐久値の減った石ピッケルと丸石から、新品の石ピッケルを作成
GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe), "HD", 'H',new ItemStack(Items.diamond_hoe,1, OreDictionary.WILDCARD_VALUE), 'D',Items.diamond );
- レシピに耐久値の減ったツール類を指定可能にする場合、ダメージをOreDictionary.WILDCARD_VALUEに設定する(値の中身はShortの最大値であり32767である)。
- ダメージに1などを指定すると、1回だけ使ったツール、のように耐久値を指定することが可能(意味の有無は別として)。
- レシピに耐久値の減ったツール類を指定可能にする場合、ダメージをOreDictionary.WILDCARD_VALUEに設定する(値の中身はShortの最大値であり32767である)。
- このソースファイル内で定義しているアイテムやブロックを作成、使用する場合、ttrPickaxe のようにプリフィクス無しで記述する。
- 既存のアイテムや他のファイルで定義されているアイテムやブロックを作成、使用する場合、Items.stick、Blocks.stone のように、定義しているファイル名(ItemsやBlocks)をプリフィクスとしてつける(クラスのスコープを正しく指定する)。
- その他、Block.getBlockFromName()などでブロックやアイテムを指定できる。(詳しい説明はここでは割愛させていただく)
Tips
- 牛乳入りバケツのように、クラフト後に別アイテムとして残るレシピ
- これはレシピで指定しているのではなく、アイテム側の設定となる。
- 例えば液体入りバケツをクラフトすると空バケツが戻るようにするなら、液体入りバケツのコンストラクタで以下のように指定する。
maxStackSize = 1; //液体入りバケツのスタックサイズは1でなければならない setContainerItem(Item.bucketEmpty); //戻ってくるアイテムを指定
- こちら側からsetContainerItemで変更することもできるが詳しい方法は割愛させていただく。