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

コメント

この項目に関する質問などをどうぞ。
  • レシピ追加をすると起動途中でAL lib: (EE) alc_cleanup: 1 device not closedと出て落ちるんですけどどうすればいいですか?   - gin49 2015-12-16 22:02:17
    • moddingにより発生したエラーではないようです。 このページ 等を参考にしてみてください。 - 赤砂蛇凪浜 2015-12-17 07:40:38
      • 自分で作ったアイテムを作るレシピを追加すると起動失敗するみたいです。レシピ追加の行を消したりバニラのアイテムを作るレシピだと起動できます - gin49 2015-12-17 14:32:41
        • すみません自分の些細な書き間違えによるものでした - gin49 2015-12-17 19:56:04
          • 解決できたようで何よりです。よろしければ考えられる原因と解決法を教えてくださいませんか? - 赤砂蛇凪浜 2015-12-18 18:32:16
  • レシピを追加し、作業台でクラフトしようとすると、AL lib: (EE) alc_cleanup: 1 device not closed - koki_0710 2016-02-17 21:53:10
    • 上のgin49さんと同じエラーですかね。グラフィックのドライバー関連のエラーのようです。上のリンクの方法で解決しないようでしたら、私は解決方法がわかりません。申し訳ございません。 - 赤砂蛇凪浜 2016-02-18 17:59:00
  • 遅くなりました。どうやら、染料を使うレシピの設定が間違ってました。あと、文が途中で切れてしまい、ご迷惑をおかけしました。 - koki_0710 2016-03-10 17:16:44
  • レシピの設定で"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
名前: