MOD製作チュートリアル > レシピの追加

概要

バニラのアイテム・ブロックや、AluminiumModで追加したアイテム・ブロックを使用した定型・不定形レシピの追加
および、製錬レシピの追加・燃料の登録

ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.IFuelHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
 
@Mod(modid = "AluminiumMod", name = "Aluminium Mod", version = "1.0.0")
public class AluminiumMod {
 
	public static Item aluminium;
 
	public static Block blockAluminium;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		aluminium = new Item()
		.setCreativeTab(CreativeTabs.tabMaterials)
		.setUnlocalizedName("aluminium")
		.setTextureName("aluminiummod:aluminium");
		GameRegistry.registerItem(aluminium, "aluminium");
 
		blockAluminium = new AluminiumBlock(Material.rock)
		.setBlockName("blockAluminium")
		.setBlockTextureName("aluminiummod:aluminium_block");
		GameRegistry.registerBlock(blockAluminium, "blockAluminium");
	}
 
	@EventHandler
	public void init(FMLInitializationEvent event) {
		//定型レシピの追加
		//鉄ブロック4個と金インゴット5個でダイヤモンド2個を作るレシピ
		GameRegistry.addRecipe(new ItemStack(Items.diamond, 2),
				"YXY", "XYX", "YXY", 'X', Blocks.iron_block, 'Y', Items.gold_ingot);
 
		//追加アイテム・ブロックの使用
		//アルミニウム9個でアルミニウムブロック1個を作るレシピ
		GameRegistry.addRecipe(new ItemStack(AluminiumMod.blockAluminium),
				"XXX", "XXX", "XXX", 'X', AluminiumMod.aluminium);
 
		//アルミニウムブロック5個と空色の染料4個でダイヤモンドブロック1個を作るレシピ
		GameRegistry.addRecipe(new ItemStack(Blocks.diamond_block),
				"XYX", "YXY", "XYX", 'X', AluminiumMod.blockAluminium, 'Y', new ItemStack(Items.dye, 1, 12));
 
		//不定形レシピの追加
		//メタデータ値3の羊毛(空色)と鉄インゴットでアルミニウム1個を作るレシピ
		GameRegistry.addShapelessRecipe(new ItemStack(AluminiumMod.aluminium),
				new ItemStack(Blocks.wool,1,3), Items.iron_ingot);
 
		//精錬レシピの追加
		//アルミニウムブロックで鉄ブロック1個を作るレシピ
		GameRegistry.addSmelting(AluminiumMod.blockAluminium, new ItemStack(Blocks.iron_block), 0.8F);
 
		//燃料の登録
		GameRegistry.registerFuelHandler(new IFuelHandler(){
			@Override
			public int getBurnTime(ItemStack fuel) {
				if (fuel.getItem() == AluminiumMod.aluminium) {
					return 200;
				}
				return 0;
			}
		});
	}
 
}
 

解説

AluminiumMod

void init(FMLInitializationEvent event)

preInitの後に呼ばれるメソッド。
レシピの追加などをする。
こちらも@EventHandlerをつける。

GameRegistry

void addRecipe(ItemStack output, Object... params)

定型レシピ(通常のレシピ)を追加するためのメソッド。
第一引数に完成品のItemStack、第二引数以降には下に示したものを順に渡す。
  • String
    レシピの形を示す文字列。1~3個渡す。配列でもよい。
  • char, ItemStack
    上で使用した文字のcharと、対応するItemStackをセットで渡す。このItemStackの部分は、ItemやBlockでもよい。
おそらくソースコードを見てもらえればわかる。使用する文字は何でもよい。

void addShapelessRecipe(ItemStack output, Object... params)

不定形レシピ(染料の混合などで使うレシピ)を追加するためのメソッド。
第一引数に完成品のItemStack、第二引数以降には材料のItemStackを渡す。(
第二引数以降のItemStackの部分は、ItemやBlockでもよい。

void addSmelting(Block input, ItemStack output, float xp)

製錬レシピを追加するためのメソッド。
第一引数に材料のBlock、第二引数に完成品のItemStack、第三引数に製錬したときに出る経験値の量を渡す。
第一引数のBlockの部分は、ItemやItemStackでもよい。

void registerFuelHandler(IFuelHandler handler)

かまどで使える燃料を登録するためのメソッド。
新しくIFuelHandlerのインスタンスを生成し、getBurnTimeメソッドをオーバーライドすればよい。
詳しくはIFuelHandlerの項を参照。

ItemStack

アイテムやブロックのスタックした状態を保持するためのクラス。
メタデータやNBTTagも扱える。

コンストラクタ(Item item, int stackSize, int meta)

Itemの部分はBlockでもよい。
また、第二引数以降は省略できる。
省略した場合は、1と0になる。
第一引数がItemの種類、第二引数がスタックされた数、第三引数がメタデータを表す。

Item getItem()

そのItemStackのItemを返す。
スタックサイズやメタデータによらない判定などに使う。

Items

バニラのアイテムのインスタンスがまとめられているクラス。
バニラのアイテムを使用したい場合に使う。

Blocks

バニラのブロックのインスタンスがまとめられているクラス。
バニラのブロックを使用したい場合に使う。

IFuelHandler

GameRegistry.registerFuelHandlerで燃料を追加登録する際に使うインターフェース。
メソッドはgetBurnTimeのみ。

int getBurnTime(ItemStack fuel)

引数で渡されたItemStackの燃焼時間を返すメソッド。
燃料を追加登録する際は、fuelが追加した燃料ならばその燃料時間を、違うならば0を返すようにすればいい。
返す燃焼時間の単位はtickで、1 tickは1/20秒。
ちなみに、200 tickで1つのアイテムが焼きあがる。

使用例

各種レシピを登録する部分。
長いので一部省略した。
また、オファレンMODではShapedOreRecipe/ShapelessOreRecipeを使用しているが、
あとのチュートリアルで出てくるので今はaddRecipe/addShapelessRecipeでやっていると思って見てほしい。
+オファレンMOD
  • OfalenModCore.java
package nahama.ofalenmod;
 
/*略*/
 
/**@author Akasata Nahama*/
@Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION)
public class OfalenModCore {
 
	public static final String MODID = "OfalenMod";
	public static final String MODNAME = "Ofalen Mod";
	public static final String VERSION = "[1.7.10]1.0.0";
 
/*略*/
 
	/**2番目に行われる処理。レシピの追加などを行う*/
	@EventHandler
	public void init (FMLInitializationEvent event) {
/*略*/
		//レシピを設定するメソッドを実行
		OfalenModRecipeCore.registerRecipe();
/*略*/
	}
 
/*略*/
 
}
 

  • OfalenModRecipeCore.java
package nahama.ofalenmod.core;
 
/*略*/
 
public class OfalenModRecipeCore {
 
	public static final OfalenModBlockCore BLOCK = new OfalenModBlockCore();
	public static final OfalenModItemCore ITEM = new OfalenModItemCore();
 
	public static final String[] gem = {"gemOfalenRed", "gemOfalenGreen", "gemOfalenBlue", "gemOfalenWhite"};
	public static final String[] frag = {"fragmentOfalenRed", "fragmentOfalenGreen", "fragmentOfalenBlue", "fragmentOfalenWhite"};
	public static final String[] core = {"coreOfalenRed", "coreOfalenGreen", "coreOfalenBlue", "coreOfalenWhite"};
	public static final String[] block = {"blockOfalenRed", "blockOfalenGreen", "blockOfalenBlue", "blockOfalenWhite"};
 
	public static final ItemStack[] crystal = {new ItemStack(ITEM.crystalEnergyLaser, 1, 0), new ItemStack(ITEM.crystalEnergyLaser, 1, 1), new ItemStack(ITEM.crystalEnergyLaser, 1, 2), new ItemStack(ITEM.crystalEnergyLaser, 1, 3)};
 
	/**レシピを設定する*/
	public static void registerRecipe () {
		String[] recipeArray = new String[]{"XXX", "XXX", "XXX"};
		String recipeType = "X X";
		switch (OfalenModConfigCore.recipeLump % 3) {
		case 0:
			recipeType = " XX";
			break;
		case 2:
			recipeType = "XX ";
		}
		recipeArray[OfalenModConfigCore.recipeLump / 3] = recipeType;
 
		//ブロック・欠片関連
		for (int i = 0; i < 4; i ++) {
			GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(BLOCK.blockOfalen, 1, i),
					"XXX", "XXX", "XXX", 'X', gem[i]));
 
			GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ITEM.ofalen, 1, i),
					"XXX", "XXX", "XXX", 'X', frag[i]));
 
			GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ITEM.ofalen, 9, i),
					"X", 'X', block[i]));
 
			GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ITEM.fragmentOfalen, 9, i),
					"X", 'X', gem[i]));
		}
 
		GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(BLOCK.blockOfalen, 3, 3),
				block[0], block[1], block[2]));
 
		GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ITEM.coreOfalen, 1, 3),
				core[0], core[1], core[2]));
 
 
		//中間素材・機械類
		//鉄の棒
		GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ITEM.partsOfalen3D, 1, 0),
				"X", "X", 'X', Items.iron_ingot));
 
/*略*/
 
		//石の塊
		GameRegistry.addRecipe(new ShapedOreRecipe(new  ItemStack(ITEM.partsOfalen, 1, 2),
				recipeArray, 'X', Blocks.cobblestone));
 
		GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ITEM.partsOfalen, 1, 2),
				recipeArray, 'X', Blocks.stone));
 
		GameRegistry.addRecipe(new ShapedOreRecipe(new  ItemStack(Blocks.cobblestone, 8),
				"X", 'X', new ItemStack(ITEM.partsOfalen, 1, 2)));
 
		//石燃料
		GameRegistry.addRecipe(new ShapedOreRecipe(new  ItemStack(ITEM.partsOfalen, 1, 3),
				" XX", "XXX", "XXX", 'X', new ItemStack(ITEM.partsOfalen, 1, 2)));
 
		//オファレン燃料
		GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ITEM.partsOfalen, 1, 4),
				"XXX", "XYX", "XXX", 'X', new ItemStack(ITEM.partsOfalen, 1, 3), 'Y', gem[0]));
 
/*略*/
 
		//燃料の登録
		GameRegistry.registerFuelHandler(new IFuelHandler(){
			public int getBurnTime(ItemStack fuel){
				if(fuel.isItemEqual(new ItemStack(ITEM.ofalen, 1, 0))){
					return 4000;
				}
				return 0;
			}
		});
	}
 
/*略*/
 
}
 

コメント

この項目に関する質問などをどうぞ。
  • レシピの設定で"YXY", "XYX", "YXY", 'X', Blocks.iron_block, 'Y', Items.gold_ingot);とかって改行した方が分かり易くないですか? - shu_hrg 2016-11-27 20:44:03
    • 見やすさに関しましては、こちらのチュートリアルはあくまでも一例ですのでご自分の見やすいように改行してください。 - Tom Kate 2016-11-27 23:27:57
  • 質問です。石炭ブロックのようにブロックを燃料にするときはどのようなコードにすればよいのでしょうか。 - 名無しさん 2017-01-06 19:48:19
    • Block.getBlockFromItemかItem.getItemFromBlockを用いて、ItemかBlockに統一してから比較すればよいです。
      "if (fuel.getItem() == AluminiumMod.aluminium) {"の部分を、
      "if (Block.getBlockFromItem(fuel.getItem) == AluminiumMod.blockAluminium) {"か、
      "if (fuel.getItem() == Item.getItemFromBlock(AluminiumMod.blockAluminium)) {"に変えればできます。 - 赤砂蛇凪浜 2017-01-07 08:38:39
      • 詳しい説明ありがとうございます!! 無事燃料にできました!! - 名無しさん 2017-01-07 13:53:48
  • 質問したいのですが、ツールをクラフトに使うと耐久値が減るレシピを作るにはどうすればいいですか? - 名無しさん 2017-02-20 06:40:19
    • 使ったツールとは別に完成品があり、ツールは作業台のインベントリに残る、というものであれば、レシピではなくItem側で設定することになると思います。
      BFOの「接着剤」は、 非公式フォーラムのページ の1.7.2版を参考にしました。
      今後、新しくチュートリアルを作成する予定です。 - 赤砂蛇凪浜 2017-02-23 17:55:21
  • ItemStackで、自作modのアイテムを使うとき、[自作modのID]wo - 名無しさん 2017-03-19 20:17:03
    • すいませんうっかり送信しちゃいました。それで、[自作ModのId]を変数に解決できませんと出てきます。modid:アイテム名ではないのでしょうか? - 名無しさん 2017-03-19 20:19:38
      • それとも、何か足りてないのでしょうか・・・ - 名無しさん 2017-03-19 20:21:09
          • すみません。自己解決しました。modidじゃなくてclass名なんですね。ごめんなさい - 名無しさん 2017-03-19 20:57:39
  • 精錬レシピの追加でModで作ったブロックからアイテムへ精錬をしようと思いましたがItemStackを指定しても精錬できません。どうすればできるのですか? - o0Sponge0o 2017-03-30 13:23:18
    • バニラのブロックやアイテムを使った精錬レシピの登録はできましたか?
      できたのならば、Modのブロックやアイテムの追加の方法が間違っている可能性があります。
      できなかったのならば、精錬レシピの追加方法が間違っている可能性があります。
      詳しい状況が分からないため具体的な解決策を示すことができません。
      Pastebinなどを利用してソースコードを送っていただけると助かります。 - 赤砂蛇凪浜 2017-04-05 19:04:54
  • すみませんハンマーなどの耐久力があるツールを使ってレシピを作ろうとしたんですけどソースがわかりません アイテムの設定とかもよくわからないので例のソースをつけてくれませんか? - 名無しさん 2017-04-11 22:26:50
    • このコメントフォームのシステム上、匿名で投稿していただきますと投稿者が同じ方か分かりませんので、それぞれについて返信させていただきます。
      上記、「ツールをクラフトに使うと耐久値が減るレシピ」の方法に関してでしたら、以前返信した通りです。
      チュートリアルの作成にはもうしばらくお時間いただけるとありがたいです。
      上記コメントと同じ方でしたら、以前のコメントに吊り下げたほうが分かりやすいと思うので、知らせていただければこちらで編集します。
      違う方でしたら、以下をお読みください。
      「ハンマー」がどのようなものを指しているのか分かりませんでしたが、単に耐久値を持つツールをクラフトで消費したい場合は、GameRegistry.addRecipeに引数として渡すItemStackのメタデータ指定をOreDictionary.WILDCARD_VALUEにすれば耐久値に関わらずレシピに登録できます。
      「アイテムの設定」についても「何がしたいのか」を教えていただければ、チュートリアルの作成などの対応ができるかと思います。 - 赤砂蛇凪浜 2017-04-13 17:49:23
  • ありがとうございました!参考にしてやってみます!これからもよろしくお願いします! - 名無しさん 2017-04-13 22:16:19
  • アイテムの設定というのは上の人と同じです。わかりにくい質問でごめんなさい これからもよろしくお願いします - 名無しさん 2017-04-13 22:17:26
  • すみません、レシピのclassを分けたらレシピが認識されなくなってしまったのですが… - 名無しさん 2017-05-05 16:14:53
    • レシピ追加の動作はinitかpostinit内で行わないと読み込まれません。目的のコードがきちんとinit内で実行できているかお確かめください。 - Tom Kate 2017-05-05 19:22:21
      • init内というのはpublic void init(FMLInitializationEvent event) { }の{}の中ということですか?なら出来ていると思うんですが… Javaの知識はないに等しいので間違っていたらすみません - 名無しさん 2017-05-06 18:29:54
  • ポーションの類をレシピで素材指定するにはどうすれば良いのですか? - 名無しさん 2017-08-01 12:03:06
    • 既存のポーション瓶を素材として作業台レシピを追加したいということでしょうか。
      ポーション瓶はメタデータによりポーション効果を指定しているため、材料登録の際にItemStackのメタデータで対象を指定できると思います。
      ポーション効果とメタデータの関係は、F3+HによりTooltipに表示される情報を調べるとよいと思います。(コードはPotionHelperにあります) - 赤砂蛇凪浜 2017-08-03 12:07:02
名前: