防具の追加
1.5.2以降のForge環境にて、防具の追加を行う。
ポーションエフェクトの付加などの特殊な処理は行なわない。
ソースコード
TestArmor.java
package testArmor; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.src.ModLoader; import net.minecraftforge.common.EnumHelper; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.registry.LanguageRegistry; @Mod(modid="TestArmor",name="TestArmor",version="1.0.0.001") public class TestArmor { public static Item helmetTest, plateTest, legsTest, bootsTest; public static int[] id = {1600, 1601, 1602, 1603}; public static EnumArmorMaterial armorMaterial; @Mod.Init public void init(FMLInitializationEvent par0Event) { armorMaterial = EnumHelper.addArmorMaterial("TEST", 562, new int[]{2, 6, 5, 2}, 30); int index = armorIndex = ModLoader.addArmor("test"); helmetTest = new ItemArmorTest(id[0], armorMaterial, index, 0). setUnlocalizedName("testArmor:helmetTest").setCreativeTab(CreativeTabs.tabCombat); plateTest = new ItemArmorTest(id[1], armorMaterial, index, 1). setUnlocalizedName("testArmor:chestplateTest").setCreativeTab(CreativeTabs.tabCombat); legsTest = new ItemArmorTest(id[2], armorMaterial, index, 2). setUnlocalizedName("testArmor:leggingsTest").setCreativeTab(CreativeTabs.tabCombat); bootsTest = new ItemArmorTest(id[3], armorMaterial, index, 3). setUnlocalizedName("testArmor:bootsTest").setCreativeTab(CreativeTabs.tabCombat); LanguageRegistry.addName(helmetRefGold, "Test Helmet"); LanguageRegistry.addName(plateRefGold, "Test Chestplate"); LanguageRegistry.addName(legsRefGold, "Test Leggings"); LanguageRegistry.addName(bootsRefGold, "Test Boots"); } }
ItemArmorTest.java
package testArmor; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraftforge.common.IArmorTextureProvider; public class ItemArmorTest extends ItemArmor implements IArmorTextureProvider { public ItemArmorTest(int par1, EnumArmorMaterial par2EnumArmorMaterial, int par3, int par4) { super(par1, par2EnumArmorMaterial, par3, par4); } @Override public String getArmorTextureFile(ItemStack itemstack) { if (itemstack.itemID == TestArmor.bootsTest.itemID) { return "/mods/testArmor/textures/armor/test_2.png"; } return "/mods/testArmor/textures/armor/test_1.png"; } }
解説
TestArmor.java
public static Item helmetTest, plateTest, legsTest, bootsTest;
ヘルメット、チェストプレート、レギンス、ブーツを定義する。
public static int[] id = {1600, 1601, 1602, 1603};
各防具のアイテムIDを宣言する。実際に実装する場合はコンフィグファイルを利用するといいだろう。
public static EnumArmorMaterial armorMaterial;
TestArmor専用のアーマーマテリアル(防具素材)を宣言する。
armorMaterial = EnumHelper.addArmorMaterial("TEST", 562, new int[]{2, 6, 5, 2}, 30);
アーマーマテリアルを追加する。
第一引数・・・マテリアルの名前
第二引数・・・耐久度
第三引数・・・部位別のAP値(防御力)。この例では鉄装備と同じ。詳しくはJapanWiki参照
第四引数・・・エンチャント適正。詳しくはJapanWiki参照
int index = armorIndex = ModLoader.addArmor("test");
防具のテクスチャ名を登録して、インデックス(テクスチャ番号)を取得する。この部分は適当な数値でも構わないが、各防具を定義する時の引数に困るので一応用意しておくと落ち着くかもしれない。
helmetTest = new ItemArmorTest(id[0], armorMaterial, index, 0). setUnlocalizedName("testArmor helmetTest").setCreativeTab(CreativeTabs.tabCombat);
各防具を定義する。
- new ItemArmorTest(id[0], armorMaterial, index, 0)
第一引数・・・アイテムID
第二引数・・・上部で定義したアーマーマテリアル
第三引数・・・上記で定義したテクスチャインデックス。適当でも良い
第四引数・・・ヘルメット0、チェストプレート1、レギンス2、ブーツ3。それぞれに割り当てていく。
- setUnlocalizeName("testArmor:helmetTest")
防具の非翻訳名を設定する。ここで設定した名前がアイテムアイコンのパスになる。
この例だとmcp/src/minecraft/mods/testArmor/textures/items/helmetTest.pngとなる。
- setCreativeTab(CreativeTabs.tabCombat)
クリエイティブモードでインベントリを開いた時のアイテムの分類を設定する。 この例だと戦闘アイテムタブにアイテムが入る。
LanguageRegistry.addName(helmetRefGold, "Test Helmet");
ローカライズ後の名前を設定する。この場合はどの言語でも"Test Helmet"になる。
ItemArmorTest.java
public class ItemArmorTest extends ItemArmor implements IArmorTextureProvider {
ItemArmorを継承する。
ItemArmorにはアーマーテクスチャを設定するメソッドはないので、防具のテクスチャを指定するIArmorTextureProviderを実装する必要がある。
public ItemArmorTest(int par1, EnumArmorMaterial par2EnumArmorMaterial, int par3, int par4) { super(par1, par2EnumArmorMaterial, par3, par4); }
eclipseなどでは実装されていないメソッドの追加などを選択すれば自動生成される。
スーパークラスに情報を渡す。
public String getArmorTextureFile(ItemStack itemstack) { if (itemstack.itemID == TestArmor.bootsTest.itemID) { return "/mods/testArmor/textures/armor/test_2.png"; } return "/mods/testArmor/textures/armor/test_1.png"; } }
アーマーの部位に応じて適したテクスチャのパスを渡す。
この例では、渡されたアイテムのIDがブーツのIDと同じだったらtest_2.pngを渡し、それ以外だったらtest_1.pngを渡す。
また、ファイルのパスはmcp/src/minecraft/mods/testArmor/textures/armor/test_1.pngとなる。これは自由に設定できる。
防具のテクスチャはminecraft.jarに入っているarmor/iron_1.pngなどを改変してみるといいだろう。
コンパイルするときの小ネタ
今回の例では、ファイルパスは以下のようになる。
TestArmor.zip
└testArmor
- ├TestArmor.class
- └ItemArmorTest.class
└mods
- └testArmor
- └textures
- └armor
- ├test_1.png
- └test_2.png
- ├test_1.png
- └items
- ├bootsTest.png
- ├chestplateTest.png
- ├helmetTest.png
- └leggingsTest.png
- ├bootsTest.png
- └armor
- └textures