提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 9.10.0.xxx~"を前提MODとしています。 |
メタデータを持つアイテム・ブロックの追加
アイテム・ブロックにメタデータを持たせる
それにより、一つのIDで複数のアイテム・ブロックを表現できる
ソースコード
- SampleMetadataCore.java
package mods.metadata; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; 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; import cpw.mods.fml.common.registry.LanguageRegistry; @Mod(modid="MetadataSampleMod", name="MetadataSampleMod", version="1.0") public class SampleMetadataCore { public static Item sampleItemWithMetadata; public static int sampleItemWithMetadataID = 28520; public static Block blockSampleWithMetadata; public static int blockSampleWithMetadataID = 4087; @EventHandler public void init(FMLInitializationEvent event) { //表示名の登録 //アイテム名の登録 //LanguageRegistry.addName(new ItemStack(sampleItem, 1, <メタデータ>), "<名前>"); //LanguageRegistry.instance().addNameForObject(new ItemStack(sampleItem, 1, <メタデータ>), "<言語>", "<名前>"); LanguageRegistry.addName(new ItemStack(sampleItemWithMetadata, 1, 0), "Sample Item1"); LanguageRegistry.instance().addNameForObject(new ItemStack(sampleItemWithMetadata, 1, 0), "ja_JP", "サンプル アイテム"); LanguageRegistry.addName(new ItemStack(sampleItemWithMetadata, 1, 1), "Sample Item2"); LanguageRegistry.instance().addNameForObject(new ItemStack(sampleItemWithMetadata, 1, 1), "ja_JP", "サンプル アイテム"); LanguageRegistry.addName(new ItemStack(sampleItemWithMetadata, 1, 2), "Sample Item3"); LanguageRegistry.instance().addNameForObject(new ItemStack(sampleItemWithMetadata, 1, 2), "ja_JP", "サンプル アイテム"); //ブロック名の登録 //LanguageRegistry.addName(new ItemStack(blockSample, 1, <メタデータ>), "<名前>"); //LanguageRegistry.instance().addNameForObject(new ItemStack(blockSample, 1, <メタデータ>), "<言語>", "<名前>"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 0), "Sample Block1"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 0), "ja_JP", "サンプル ブロック1"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 1), "Sample Block2"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 1), "ja_JP", "サンプル ブロック2"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 2), "Sample Block3"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 2), "ja_JP", "サンプル ブロック3"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 3), "Sample Block4"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 3), "ja_JP", "サンプル ブロック4"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 4), "Sample Block5"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 4), "ja_JP", "サンプル ブロック5"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 5), "Sample Block6"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 5), "ja_JP", "サンプル ブロック6"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 6), "Sample Block7"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 6), "ja_JP", "サンプル ブロック7"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 7), "Sample Block8"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 7), "ja_JP", "サンプル ブロック8"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 8), "Sample Block9"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 8), "ja_JP", "サンプル ブロック9"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 9), "Sample Block10"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 9), "ja_JP", "サンプル ブロック10"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 10), "Sample Block11"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 10), "ja_JP", "サンプル ブロック11"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 11), "Sample Block12"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 11), "ja_JP", "サンプル ブロック12"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 12), "Sample Block13"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 12), "ja_JP", "サンプル ブロック13"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 13), "Sample Block14"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 13), "ja_JP", "サンプル ブロック14"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 14), "Sample Block15"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 14), "ja_JP", "サンプル ブロック15"); LanguageRegistry.addName(new ItemStack(blockSampleWithMetadata, 1, 15), "Sample Block16"); LanguageRegistry.instance().addNameForObject(new ItemStack(blockSampleWithMetadata, 1, 15), "ja_JP", "サンプル ブロック16"); } @EventHandler public void preInit(FMLPreInitializationEvent event) { //アイテムの登録 sampleItemWithMetadata= new ItemSample(sampleItemWithMetadataID).setUnlocalizedName("ItemSample").setCreativeTab(CreativeTabs.tabMaterials); GameRegistry.registerItem(sampleItemWithMetadata, "sampleItem"); //ブロックの登録 blockSampleWithMetadata = new BlockSample(blockSampleWithMetadataID, Material.rock).setUnlocalizedName("BlockSample").setCreativeTab(CreativeTabs.tabBlock); //GameRegistry.registerBlock(blockSample, <ItemBlock>.class, "blockSample"); GameRegistry.registerBlock(blockSampleWithMetadata, ItemBlockSample.class, "blockSample"); } }
- ItemSample.java
package mods.metadata; import java.util.List; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.item.ItemDye; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.util.MathHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemSample extends Item { @SideOnly(Side.CLIENT) private Icon[] iconItemSample; public ItemSample(int par1) { super(par1); this.setMaxDamage(0); this.setHasSubtypes(true); } @Override @SideOnly(Side.CLIENT) public Icon getIconFromDamage(int par1) { return super.getIconFromDamage(par1); } @Override public int getMetadata(int par1) { return par1; } @Override public String getUnlocalizedName(ItemStack par1ItemStack) { //名前の登録 return this.getUnlocalizedName() + "_" + par1ItemStack.getItemDamage(); } @Override @SideOnly(Side.CLIENT) public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) { //メタデータでアイテムを追加する //par3List.add(new ItemStack(this, 1, <メタデータ>)); par3List.add(new ItemStack(this, 1, 0)); par3List.add(new ItemStack(this, 1, 1)); par3List.add(new ItemStack(this, 1, 2)); } @Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { //テクスチャのパス指定。 //メタデータは0から2でつまり3未満 //src/minecraft/assets/samplemod/items/itemsample_(メタデータ).png this.iconItemSample = new Icon[3]; for (int i = 0; i < this.iconItemSample.length; ++i) { this.iconItemSample[i] = par1IconRegister.registerIcon("samplemod:itemsample_" + i); } } }
- BlockSample.java
package mods.metadata; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockSample extends Block { public BlockSample(int par1, Material par2Material) { super(par1, par2Material); } @Override @SideOnly(Side.CLIENT) public Icon getIcon(int par1, int par2) { return super.getIcon(par1, par2); } @Override public int damageDropped(int par1) { return par1; } @Override @SideOnly(Side.CLIENT) public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) { // メタデータでブロックを追加する // par3List.add(new ItemStack(par1, 1, <メタデータ>)); for (int i = 0; i < 16; i++) { par3List.add(new ItemStack(par1, 1, i)); } } }
- ItemBlockSample.java
package mods.metadata; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; public class ItemBlockSample extends ItemBlock { public ItemBlockSample(int par1) { super(par1); this.setMaxDamage(0); this.setHasSubtypes(true); } @Override public int getMetadata(int par1) { return par1; } @Override public String getUnlocalizedName(ItemStack par1ItemStack) { return super.getUnlocalizedName() + "_" + par1ItemStack.getItemDamage(); } }
解説
this.setMaxDamage(0); this.setHasSubtypes(true);
メタデータを追加するためにダメージ値とメタデータを持つことを証明する必要がある。
@Override public int getMetadata(int par1) { return par1; }
Blockクラス内では0を返してしまうため、オーバーライドして書き換える必要がある。
@SideOnly(Side.CLIENT) public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) { //メタデータでアイテムを追加する //par3List.add(new ItemStack(this, 1, <メタデータ>)); par3List.add(new ItemStack(this, 1, 0)); par3List.add(new ItemStack(this, 1, 1)); par3List.add(new ItemStack(this, 1, 2)); } @SideOnly(Side.CLIENT) public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) { // メタデータでブロックを追加する // par3List.add(new ItemStack(par1, 1, <メタデータ>)); for (int i = 0; i < 16; i++) { par3List.add(new ItemStack(par1, 1, i)); } }
各クラス内のgetSubXX(int, CreativeTabs, List)メソッドでメタデータを持つアイテム・ブロックの設定ができる。 アイテムはIntegerの最大値まで設定ができる(要検討)
@Override public String getUnlocalizedName(ItemStack par1ItemStack) { return super.getUnlocalizedName() + "_" + par1ItemStack.getItemDamage(); }
各ダメージ値で別々の名前を登録するため工夫する必要がある。