MOD製作チュートリアル > メタデータを持つアイテムの追加

概要

メタデータを使用し、一つのIDで複数のアイテムを追加したり、色違いのアイテムを追加したりする。

ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod;
 
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
 
@Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION)
public class AluminiumMod {
 
	public static final String MODID = "AluminiumMod";
	public static final String MODNAME = "Aluminium Mod";
	public static final String VERSION = "1.0.0";
 
	public static Item aluminiumColored;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		//ここは通常のアイテムと同様。
		aluminiumColored = new ColoredAluminium()
		.setUnlocalizedName("auminiumColored")
		.setTextureName("aluminiummod:colored_aluminium");
		GameRegistry.registerItem(aluminiumColored, "auminiumColored");
	}
 
}
 

  • ColoredAluminium.java
package tutorial.aluminiummod;
 
import java.util.List;
 
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
 
public class ColoredAluminium extends Item {
 
	private IIcon[] iicon = new IIcon[16];
 
	public ColoredAluminium () {
		super ();
		this.setCreativeTab(CreativeTabs.tabMaterials);
		this.setMaxDamage(0);
		this.setHasSubtypes(true);
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public void registerIcons(IIconRegister iicon) {
		for (int i = 0; i < 16; i ++) {
			this.iicon[i] = iicon.registerIcon(this.getIconString() + "." + i);
		}
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public IIcon getIconFromDamage(int meta) {
		return iicon[meta];
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public void getSubItems(Item item, CreativeTabs creativeTab, List list) {
		for (int i = 0; i < 16; i ++) {
			list.add(new ItemStack(this, 1, i));
		}
	}
 
	@Override
	public int getMetadata(int meta) {
		return meta;
	}
 
	@Override
	public String getUnlocalizedName(ItemStack itemStack) {
		return super.getUnlocalizedName() + "." + itemStack.getItemDamage();
	}
 
}
 

解説

Item

Item setMaxDamage(int meta)

メタデータの最高値を設定する。

Item setHasSubtypes(boolean flag)

メタデータの使い方によって引数を変える。
ツールなどのようにダメージ値として使うときはfalseを、
このチュートリアルのように複数のアイテムのようにして使うときはtrueを渡す。

void registerIcons(IIconRegister register)

アイテムのテクスチャを指定するメソッド。
引数のIIconRegisterを使用し、registerIconで初期化する。

IIcon getIconFromDamage(int meta)

引数のメタデータを基にIIconを返す。
描画時に呼ばれる。

void getSubItems(Item item, CreativeTabs creativeTab, List list)

クリエイティブタブにアイテムを登録するメソッド。
第三引数のListにアイテムスタックを追加する。

int getMetadata(int meta)

メタデータを返す。
引数をそのまま返せばいい。

String getUnlocalizedName(ItemStack itemStack)

アイテムのlangファイルに指定するための文字列を返すメソッド。
引数のItemStackからダメージ値を取得し、反映すればよい。

IIcon

アイテム・ブロックのアイコンを保持しておくインターフェース。

IIconRegister

IIconを設定するためのインターフェース。

IIcon registerIcon(String name)

IIconRegisterの唯一のメソッド。
テクスチャ名を渡せば対応したIIconが得られる。

SideOnly

Side value
メソッド・フィールド・クラスなどにつけられるアノテーション。
クライアント/サーバーの指定した側のみで認識されるようになる。
フィールドにつけるとマルチではクラッシュすることがある。
そのため、メソッドにつけるのみにしておいた方がよい。

Side

SideOnlyで使用するenum。
CLIENTとSERVERが定義されている。

使用例

各種中間素材を追加している部分。
+ オファレンMOD

コメント

この項目に関する質問などをどうぞ。
  • とても参考になりました。これからもこのサイトの更新頑張ってください。 - 名無しさん 2016-04-23 14:00:54
    • ありがとうございます。チュートリアルの更新があまりできていなくて申し訳ないです。
      できる限り頑張りますので、今後もよろしくお願いします。 - 赤砂蛇凪浜 2016-04-24 20:19:29
  • この会話はコメント/MOD製作チュートリアル/メタデータを持つブロックの追加に移動しました。
  • このページのソースの大半が読めなくなっていますが、何かあったのでしょうか? - 名無しさん 2017-08-02 18:42:25
    • ご迷惑をおかけしております。@wikiのプラグインの不具合と思われます。トップページのお知らせを更新しましたので、ご覧ください。 - 赤砂蛇凪浜 2017-08-03 11:57:26
名前: