提供: Minecraft Modding Wiki
2014年7月27日 (日) 19:17時点におけるとっぽ (トーク | 投稿記録)による版 (ソースコード)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"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 iconItemSample[par1 % iconItemSample.length];
	}

	@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();
}

各ダメージ値で別々の名前を登録するため工夫する必要がある。