提供: Minecraft Modding Wiki
移動先: 案内検索
(途中で一旦保存)
 
(一応完成。日本語に問題がありそうなので気づいたら訂正していってください。)
7行目: 7行目:
 
package mods.recipesample;
 
package mods.recipesample;
  
import cpw.mods.fml.common.IFuelHandler;
 
 
import cpw.mods.fml.common.Mod;
 
import cpw.mods.fml.common.Mod;
 
import cpw.mods.fml.common.event.FMLInitializationEvent;
 
import cpw.mods.fml.common.event.FMLInitializationEvent;
18行目: 17行目:
 
import net.minecraftforge.oredict.OreDictionary;
 
import net.minecraftforge.oredict.OreDictionary;
  
@Mod(modid = "kina_tt")
+
@Mod(modid = "recipe_sample")
public class Tutorial{
+
public class RecipeSample{
 
     @Mod.EventHandler
 
     @Mod.EventHandler
 
     public void preInit(FMLPreInitializationEvent event){
 
     public void preInit(FMLPreInitializationEvent event){
78行目: 77行目:
 
         );
 
         );
  
        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;
 
            }
 
        });
 
 
     }
 
     }
  
117行目: 105行目:
 
</source>
 
</source>
 
このように配置が決まっています。<br />
 
このように配置が決まっています。<br />
何も入れない部分は半角空白、素材を入れる部分は任意の文字を入れてください。同じ文字は同じパーツと判断されます。<br />
+
素材を使用する部分には任意の文字を入れてください。同じ文字は同じパーツと判断されます。<br />
 +
<source lang="java">
 +
GameRegistry.addRecipe(new ItemStack(Items.diamond),
 +
      "# #",
 +
      '#',Blocks.dirt
 +
);
 +
</source>
 +
何も入れない部分は上の例3のように半角空白を入れてください。<br />
 
空白を入れなかった場合、ワークベンチに収まればそれで作れるようになってしまいます。<br />
 
空白を入れなかった場合、ワークベンチに収まればそれで作れるようになってしまいます。<br />
"XX"とした場合、 "XX0"または"0XX"というように認識されます。指定は3段でなくても問題ありません。<br />
+
"XX"のような場合"XX0"または"0XX"というように認識されます。
 +
上の例や下の例のように指定は3段でなくても問題はなく、例2のように<br />
 +
<source lang="java">
 +
GameRegistry.addRecipe(new ItemStack(Items.diamond),
 +
        "###",
 +
        '#',Blocks.dirt
 +
);
 +
</source>
 +
とした場合、3段の内のいづれかに3つ土が横に並んでいれば作れるようになります。<br />
 
そのように指定したら、次はその文字がどんなパーツかを指定します。<br />
 
そのように指定したら、次はその文字がどんなパーツかを指定します。<br />
 
<br />
 
<br />
 
<source lang="java">
 
<source lang="java">
'X',Blocks.dirt });
+
'#',Blocks.dirt });
 
</source>
 
</source>
'X'の部分が指定したパーツの文字、その次が素材になります。<br />
+
'#'の部分が指定したパーツの文字、その次が素材になります。<br />
 
ブロックが素材の場合Blocks、置けないアイテムの場合Items、になります。<br />
 
ブロックが素材の場合Blocks、置けないアイテムの場合Items、になります。<br />
 
そのあとのアイテムの種類は、ゲームでよく呼ばれる名前とは違う場合があります。<br />
 
そのあとのアイテムの種類は、ゲームでよく呼ばれる名前とは違う場合があります。<br />
131行目: 134行目:
 
複数素材がある場合は
 
複数素材がある場合は
 
<source lang="java">
 
<source lang="java">
GameRegistry.addRecipe(new ItemStack(Items.diamond),
+
GameRegistry.addRecipe(new ItemStack(Items.ender_pearl),
         "#",
+
         "FWF",
         "#",
+
         "W W",
         "#",
+
         "FWF",
         '#', Blocks.dirt
+
         'F',Items.feather,
 +
        'W',Blocks.end_stone
 
);
 
);
 
</source>
 
</source>
145行目: 149行目:
 
というように記述します。<br />
 
というように記述します。<br />
 
<br />
 
<br />
例として、石ピッケルのレシピの形を作る場合、こうなります。<br />
+
もちろん、逆にできるアイテムのダメージ値やスタック数を決めることも可能で<br />
 
<source lang="java">
 
<source lang="java">
GameRegistry.addRecipe(new ItemStack(Item.pickaxeStone,1),
+
GameRegistry.addRecipe(new ItemStack(Blocks.wool,5),
                    new Object[]{"XXX"," Y "," Y ",
+
        "LWL",
                    'X',Block.stone,
+
        'L',Blocks.leaves,
    'Y',Item.stick});
+
        'W',Blocks.web
 +
);
 +
 
 +
GameRegistry.addRecipe(new ItemStack(Blocks.wool,5,10),
 +
        "LLL",
 +
        "LWL",
 +
        "LLL",
 +
        'L',Blocks.leaves,
 +
        'W',Blocks.web
 +
);
 
</source>
 
</source>
 
+
というようになります。
 
==不定形レシピを作る==
 
==不定形レシピを作る==
 
上記のレシピに対して配置は関係ないレシピの作り方です。
 
上記のレシピに対して配置は関係ないレシピの作り方です。
  
 
<source lang="java">
 
<source lang="java">
GameRegistry.addShapelessRecipe(new ItemStack(Item.diamond,1),
+
GameRegistry.addShapelessRecipe(new ItemStack(Items.diamond),
new Object[]{
+
      new ItemStack(Blocks.wool,1,5),
new ItemStack(Block.dirt, 1), new ItemStack(Block.sand, 1)});
+
      Items.feather,
 +
      Blocks.web
 +
);
 
</source>
 
</source>
 
ここがレシピを指定している部分です。<br />
 
ここがレシピを指定している部分です。<br />
 
GameRegistry.addShapelessRecipeで不定形レシピを作ることを宣言しています。<br />
 
GameRegistry.addShapelessRecipeで不定形レシピを作ることを宣言しています。<br />
ここでは、土ブロック(Block.dirt, 1)と砂ブロック(Block.sand, 1)でダイヤ(Item.diamond,1)ができるように書いてあります。
+
ここでは、羊毛(ダメージ値5)と羽と蜘蛛の巣でダイヤができるように書いてあります。
  
  
172行目: 187行目:
 
;例)焼き石と木の棒から石ピッケルを作成
 
;例)焼き石と木の棒から石ピッケルを作成
 
<source lang="java">
 
<source lang="java">
GameRegistry.addRecipe(new ItemStack(Item.pickaxeStone,1),
+
GameRegistry.addRecipe(new ItemStack(Item.pickaxeStone),
new Object[]{"XXX"," Y "," Y ",
+
"XXX"," Y "," Y ",
 
'X',Block.stone,
 
'X',Block.stone,
'Y',Item.stick});
+
'Y',Item.stick
 +
);
 
</source>
 
</source>
 
:*一般的な定型レシピ
 
:*一般的な定型レシピ
183行目: 199行目:
 
<source lang="java">
 
<source lang="java">
 
GameRegistry.addShapelessRecipe(new ItemStack(Block.cloth,2,12),
 
GameRegistry.addShapelessRecipe(new ItemStack(Block.cloth,2,12),
new Object[]{
+
new ItemStack(Block.cloth,1,14), new ItemStack(Block.cloth,1,15)
new ItemStack(Block.cloth,1,14), new ItemStack(Block.cloth,1,15)});
+
);
 
</source>
 
</source>
 
;例)木材1つと石炭(木炭)2個から、松明を8つ作成
 
;例)木材1つと石炭(木炭)2個から、松明を8つ作成
 
<source lang="java">
 
<source lang="java">
 
GameRegistry.addShapelessRecipe(new ItemStack(Block.torchWood,8),
 
GameRegistry.addShapelessRecipe(new ItemStack(Block.torchWood,8),
new Object[]{
+
new ItemStack(Item.coal,1,OreDictionary.WILDCARD_VALUE),  
new ItemStack(Item.coal,1,32767), new ItemStack(Item.coal,1,32767), new ItemStack(Block.planks,1,32767)});
+
                                new ItemStack(Item.coal,1,OreDictionary.WILDCARD_VALUE),
 +
                                new ItemStack(Block.planks,1,OreDictionary.WILDCARD_VALUE)
 +
);
 
</source>
 
</source>
 
:*ダメージ値を指定したレシピを作る場合、ItemStackクラスを使用する。
 
:*ダメージ値を指定したレシピを作る場合、ItemStackクラスを使用する。
 
:**ItemStack(アイテム名,個数,ダメージ値) ダメージ値は省略可能(省略時は0)、個数は材料指定時には無効。
 
:**ItemStack(アイテム名,個数,ダメージ値) ダメージ値は省略可能(省略時は0)、個数は材料指定時には無効。
 
:***不定形レシピで同じアイテムを2個以上使いたい場合、個数1で2回指定する必要がある点に注意。
 
:***不定形レシピで同じアイテムを2個以上使いたい場合、個数1で2回指定する必要がある点に注意。
:**ダメージ値に関わらずレシピに使用する(例えば全ての木材で作成可能にする)には、ダメージ値に「32767」を指定する。
+
:**ダメージ値に関わらずレシピに使用する(例えば全ての木材で作成可能にする)には、ダメージ値に「OreDictionary.WILDCARD_VALUE」を指定する。
 
:*ダメージ値は、ブロックは0~15、アイテムは0-32000まで設定可能。
 
:*ダメージ値は、ブロックは0~15、アイテムは0-32000まで設定可能。
 
:**耐久力のあるアイテムの場合、ダメージ値は最大で耐久値までとなる。
 
:**耐久力のあるアイテムの場合、ダメージ値は最大で耐久値までとなる。
212行目: 230行目:
 
;例)耐久値の減った石ピッケルと丸石から、新品の石ピッケルを作成
 
;例)耐久値の減った石ピッケルと丸石から、新品の石ピッケルを作成
 
<source lang="java">
 
<source lang="java">
GameRegistry.addShapelessRecipe(new ItemStack(Item.pickaxeStone,1),
+
GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe),
new Object[]{
+
      "HD",
new ItemStack(Block.cobblestone,1), new ItemStack(Item.pickaxeStone,1,32767)});
+
        'H',new ItemStack(Items.diamond_hoe,1, OreDictionary.WILDCARD_VALUE),
 +
        'D',Items.diamond
 +
);
 
</source>
 
</source>
:*レシピに耐久値の減ったツール類を指定可能にする場合、ダメージを32767に設定する。
+
:*レシピに耐久値の減ったツール類を指定可能にする場合、ダメージをOreDictionary.WILDCARD_VALUEに設定する(値の中身はShortの最大値であり32767である)。
 
:**ダメージに1などを指定すると、1回だけ使ったツール、のように耐久値を指定することが可能(意味の有無は別として)。
 
:**ダメージに1などを指定すると、1回だけ使ったツール、のように耐久値を指定することが可能(意味の有無は別として)。
  
  
 
*このソースファイル内で定義しているアイテムやブロックを作成、使用する場合、ttrPickaxe のようにプリフィクス無しで記述する。
 
*このソースファイル内で定義しているアイテムやブロックを作成、使用する場合、ttrPickaxe のようにプリフィクス無しで記述する。
*既存のアイテムや他のファイルで定義されているアイテムやブロックを作成、使用する場合、Item.stick、Block.stone のように、定義しているファイル名(ItemやBlock)をプリフィクスとしてつける(クラスのスコープを正しく指定する)。
+
*既存のアイテムや他のファイルで定義されているアイテムやブロックを作成、使用する場合、Items.stick、Blocks.stone のように、定義しているファイル名(ItemsやBlocks)をプリフィクスとしてつける(クラスのスコープを正しく指定する)。
 +
*その他、Block.getBlockFromName()などでブロックやアイテムを指定できる。(詳しい説明はここでは割愛させていただく)
  
 
==Tips==
 
==Tips==
231行目: 252行目:
 
     setContainerItem(Item.bucketEmpty); //戻ってくるアイテムを指定
 
     setContainerItem(Item.bucketEmpty); //戻ってくるアイテムを指定
 
</source>
 
</source>
 
+
*こちら側からsetContainerItemで変更することもできるが詳しい方法は割愛させていただく。
 
[[category:その他]]
 
[[category:その他]]

2014年10月6日 (月) 21:17時点における版

この記事は"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」を指定する。
  • ダメージ値は、ブロックは0~15、アイテムは0-32000まで設定可能。
    • 耐久力のあるアイテムの場合、ダメージ値は最大で耐久値までとなる。


例)木の棒のみで、壊れかけの(耐久値の減った)木ピッケルを作成
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回だけ使ったツール、のように耐久値を指定することが可能(意味の有無は別として)。


  • このソースファイル内で定義しているアイテムやブロックを作成、使用する場合、ttrPickaxe のようにプリフィクス無しで記述する。
  • 既存のアイテムや他のファイルで定義されているアイテムやブロックを作成、使用する場合、Items.stick、Blocks.stone のように、定義しているファイル名(ItemsやBlocks)をプリフィクスとしてつける(クラスのスコープを正しく指定する)。
  • その他、Block.getBlockFromName()などでブロックやアイテムを指定できる。(詳しい説明はここでは割愛させていただく)

Tips

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