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
  • OfalenModCore.java
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";
 
/*略*/
 
	/**最初に行われる処理。アイテム・ブロックの追加などを行う*/
	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
/*略*/
		//アイテムを設定するメソッドを実行
		OfalenModItemCore.registerItem();
/*略*/
	}
 
/*略*/
 
}
 

  • OfalenModItemCore.java
package nahama.ofalenmod.core;
 
/*略*/
 
public class OfalenModItemCore {
 
	//アイテムの定義
/*略*/
	/**0: Machine Cover Plate, 1: Grade 3 Part, 2: Lump of Stone, 3: Stone Fuel, 4: Ofalen Fuel	, 5: Laser Magazine*/
	public static Item partsOfalen;
/*略*/
 
	/**アイテムを設定する*/
	public static void registerItem () {
/*略*/
		partsOfalen = new Parts(6)
		.setUnlocalizedName("partsOfalen")
		.setTextureName("ofalenmod:parts");
		GameRegistry.registerItem(partsOfalen, "partsOfalen");
/*略*/
	}
 
}
 

  • Parts.java
package nahama.ofalenmod.item;
 
import java.util.List;
 
import nahama.ofalenmod.OfalenModCore;
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 Parts extends Item {
 
	protected IIcon[] iicon;
	private final int type;
 
	public Parts (int type) {
		super ();
		this.type = type;
		this.setCreativeTab(OfalenModCore.tabOfalen);
		this.setHasSubtypes(true);
		this.setMaxDamage(0);
	}
 
	/**メタデータ違いのテクスチャを登録する*/
	@Override
	@SideOnly(Side.CLIENT)
	public void registerIcons(IIconRegister register) {
		this.iicon = new IIcon[type];
		for (int i = 0; i < type; i ++) {
			this.iicon[i] =  register.registerIcon(this.getIconString() + "-" + i);
		}
	}
 
	/**メタデータにより返すIIconを変える*/
	@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 < type; i ++) {
			list.add(new ItemStack(this, 1, i));
		}
	}
 
	/**メタデータを返す*/
	@Override
	public int getMetadata(int meta) {
		return meta;
	}
 
	/**メタデータにより内部名を変える*/
	@Override
	public String getUnlocalizedName(ItemStack itemStack) {
		return this.getUnlocalizedName() + "." + itemStack.getItemDamage();
	}
 
}
 

コメント

この項目に関する質問などをどうぞ。
  • とても参考になりました。これからもこのサイトの更新頑張ってください。 - 名無しさん 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
名前: