1.7.10の開発講座を修正中です。このページには誤りや古い情報が含まれる可能性があります。
バニラのアイテム・ブロックや、AluminiumModで追加したアイテム・ブロックを使用した定型・不定形レシピの追加。および、製錬レシピの追加・燃料の登録。
目次
ソースコード
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でやっていると思って見てほしい。
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();
/*略*/
}
/*略*/
}
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;
}
});
}
/*略*/
}
過去の質問
- 石炭ブロックのようにブロックを燃料にするときはどのようなコードにすればよいのでしょうか。
- 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)) {"に変えればできます。
- Block.getBlockFromItemかItem.getItemFromBlockを用いて、ItemかBlockに統一してから比較すればよいです。
- ツールをクラフトに使うと耐久値が減るレシピを作るにはどうすればいいですか?
- 使ったツールとは別に完成品があり、ツールは作業台のインベントリに残る、というものであれば、レシピではなくItem側で設定することになると思います。
BFOの「接着剤」は、非公式フォーラムのページの1.7.2版を参考にしました。
- 使ったツールとは別に完成品があり、ツールは作業台のインベントリに残る、というものであれば、レシピではなくItem側で設定することになると思います。
- ポーションをレシピで素材指定するにはどうすれば良いのですか?
- ポーション瓶はメタデータによりポーション効果を指定しているため、材料登録の際にItemStackのメタデータで対象を指定できると思います。
ポーション効果とメタデータの関係は、F3+HによりTooltipに表示される情報を調べるとよいと思います。(コードはPotionHelperにあります)
- ポーション瓶はメタデータによりポーション効果を指定しているため、材料登録の際にItemStackのメタデータで対象を指定できると思います。