メタデータを持つアイテムの追加(1.7.10)

1.7.10の開発講座を修正中です。このページには誤りや古い情報が含まれる可能性があります。

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

ソースコード


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"); }

}


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が定義されている。

使用例

各種中間素材を追加している部分。


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(); /*略*/ }

/*略*/

}


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"); /*略*/ }

}


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

}

コメントはこちらです。(スパム対策の為コメントは手動承認になっています。未承認のコメントは表示されないので連投はお控え下さい。)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください