提供: Minecraft Modding Wiki
2014年10月6日 (月) 09:17時点におけるModderKina (トーク | 投稿記録)による版 (途中で一旦保存)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"Minecraft Forge Universal 10.12.0.xxx~"を前提MODとしています。

作成するソース
RecipeSample.java

全体の完成形

package mods.recipesample;

import cpw.mods.fml.common.IFuelHandler;
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 = "kina_tt")
public class Tutorial{
    @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
        );

        GameRegistry.addSmelting(Items.carrot,new ItemStack(Items.coal),0.1f);

        GameRegistry.registerFuelHandler(new IFuelHandler(){
            @Override
            public int getBurnTime(ItemStack fuel){
                if(fuel.getItem().equals(Items.apple)){
                    return 500;
                }
                return 0;
            }
        });
    }

    @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"

このように配置が決まっています。
何も入れない部分は半角空白、素材を入れる部分は任意の文字を入れてください。同じ文字は同じパーツと判断されます。
空白を入れなかった場合、ワークベンチに収まればそれで作れるようになってしまいます。
"XX"とした場合、 "XX0"または"0XX"というように認識されます。指定は3段でなくても問題ありません。
そのように指定したら、次はその文字がどんなパーツかを指定します。

'X',Blocks.dirt });

'X'の部分が指定したパーツの文字、その次が素材になります。
ブロックが素材の場合Blocks、置けないアイテムの場合Items、になります。
そのあとのアイテムの種類は、ゲームでよく呼ばれる名前とは違う場合があります。
Items.javaやBlocks.javaにアイテム/ブロックのリストがありますので、利用してください。
複数素材がある場合は

GameRegistry.addRecipe(new ItemStack(Items.diamond),
        "#",
        "#",
        "#",
        '#', Blocks.dirt
);

1つ指定した後に , で区切って次のパーツを指定してください。
また、ダメージ値(炭、羊毛など)を指定したい場合、

'X',new ItemStack(Item.coal, 1, 0) });

というように記述します。

例として、石ピッケルのレシピの形を作る場合、こうなります。

GameRegistry.addRecipe(new ItemStack(Item.pickaxeStone,1),
                     new Object[]{"XXX"," Y "," Y ",
                     'X',Block.stone,
		     'Y',Item.stick});

不定形レシピを作る

上記のレシピに対して配置は関係ないレシピの作り方です。

GameRegistry.addShapelessRecipe(new ItemStack(Item.diamond,1),
				new Object[]{
				new ItemStack(Block.dirt, 1), new ItemStack(Block.sand, 1)});

ここがレシピを指定している部分です。
GameRegistry.addShapelessRecipeで不定形レシピを作ることを宣言しています。
ここでは、土ブロック(Block.dirt, 1)と砂ブロック(Block.sand, 1)でダイヤ(Item.diamond,1)ができるように書いてあります。


レシピはこれで終わりです。
追加アイテムがあればそれを作るレシピも作れます。詳しくは無機能のアイテムを追加するをご覧ください。

API例と解説

例)焼き石と木の棒から石ピッケルを作成
GameRegistry.addRecipe(new ItemStack(Item.pickaxeStone,1),
		new Object[]{"XXX"," Y "," Y ",
		'X',Block.stone,
		'Y',Item.stick});
  • 一般的な定型レシピ


例)赤羊毛と黒羊毛から、茶色羊毛を2個作成
GameRegistry.addShapelessRecipe(new ItemStack(Block.cloth,2,12),
				new Object[]{
				new ItemStack(Block.cloth,1,14), new ItemStack(Block.cloth,1,15)});
例)木材1つと石炭(木炭)2個から、松明を8つ作成
GameRegistry.addShapelessRecipe(new ItemStack(Block.torchWood,8),
				new Object[]{
				new ItemStack(Item.coal,1,32767), new ItemStack(Item.coal,1,32767), new ItemStack(Block.planks,1,32767)});
  • ダメージ値を指定したレシピを作る場合、ItemStackクラスを使用する。
    • ItemStack(アイテム名,個数,ダメージ値) ダメージ値は省略可能(省略時は0)、個数は材料指定時には無効。
      • 不定形レシピで同じアイテムを2個以上使いたい場合、個数1で2回指定する必要がある点に注意。
    • ダメージ値に関わらずレシピに使用する(例えば全ての木材で作成可能にする)には、ダメージ値に「32767」を指定する。
  • ダメージ値は、ブロックは0~15、アイテムは0-32000まで設定可能。
    • 耐久力のあるアイテムの場合、ダメージ値は最大で耐久値までとなる。


例)木の棒のみで、壊れかけの(耐久値の減った)木ピッケルを作成
GameRegistry.addRecipe(new ItemStack(Item.pickaxeWood,1,32),
		new Object[]{"YYY"," Y "," Y ",
		'Y',Item.stick});
  • 耐久値のあるアイテムは、ダメージを指定すると、その分耐久力が減少して作成される。
  • 耐久値と同じダメージを指定すれば、1回で壊れるアイテムも作成可能
    • これを応用して、木材から「数回で壊れるハサミ」なども作成することができる
例)耐久値の減った石ピッケルと丸石から、新品の石ピッケルを作成
GameRegistry.addShapelessRecipe(new ItemStack(Item.pickaxeStone,1),
				new Object[]{
				new ItemStack(Block.cobblestone,1), new ItemStack(Item.pickaxeStone,1,32767)});
  • レシピに耐久値の減ったツール類を指定可能にする場合、ダメージを32767に設定する。
    • ダメージに1などを指定すると、1回だけ使ったツール、のように耐久値を指定することが可能(意味の有無は別として)。


  • このソースファイル内で定義しているアイテムやブロックを作成、使用する場合、ttrPickaxe のようにプリフィクス無しで記述する。
  • 既存のアイテムや他のファイルで定義されているアイテムやブロックを作成、使用する場合、Item.stick、Block.stone のように、定義しているファイル名(ItemやBlock)をプリフィクスとしてつける(クラスのスコープを正しく指定する)。

Tips

牛乳入りバケツのように、クラフト後に別アイテムとして残るレシピ
  • これはレシピで指定しているのではなく、アイテム側の設定となる。
  • 例えば液体入りバケツをクラフトすると空バケツが戻るようにするなら、液体入りバケツのコンストラクタで以下のように指定する。
maxStackSize = 1;                   //液体入りバケツのスタックサイズは1でなければならない
    setContainerItem(Item.bucketEmpty); //戻ってくるアイテムを指定