防具の追加
1.5.2以降のForge環境にて、防具の追加を行う。
ポーションエフェクトの付加などの特殊な処理は行なわない。
2013/06/24 19h:防具耐久度・エンチャント適性についての記述を修正して、それについての解説を追記しました。これ以前に解説をご覧になった方にお詫び申し上げます。
ソースコード
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", 15, new int[]{2, 6, 5, 2}, 25); 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", 15, new int[]{2, 6, 5, 2}, 25);
アーマーマテリアルを追加する。
第一引数・・・マテリアルの名前
第二引数・・・マテリアルの耐久度。実際の防具の耐久度は、この値に部位ごとに11,16,15,13のいずれかを掛けて1を加算したものとなる。この例では鉄装備と同じ。
第三引数・・・部位別のAP値(防御力)。この例では鉄装備と同じ。
第四引数・・・エンチャント適正。この例では金装備と同じ。詳しくは下記の実際の挙動か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などを改変してみるといいだろう。バニラのテクスチャでは、(アーマー名)_1.pngが頭、胴、足で(アーマー名)_2.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
実際の挙動
戦闘アイテムタブに防具4種が追加される。
AP上昇値はすべて装備した場合2+6+5+2=15AP(アイコン7.5個分)。
耐久度はマテリアルの耐久度15に部位別耐久度をかけて
ヘルメット=15*11+1=166,チェストプレート:15*16+1=241,レギンス:15*15+1=226,ブーツ:15*13+1=196となる。
エンチャント適性について
簡易説明。詳しい説明はJapanWikiを参照してほしい。
エンチャントはLv1~30まであり、計算式によって1~30のどの範囲のエンチャントが出るかが決まる。
今回の例だと、マテリアル"TEST"のエンチャント適性は25。金素材と同じである。
詳しい計算式は長くなるので[1]を参照してもらうとして、今回のマテリアルが設定された防具をLv30エンチャントすると
最小値:30+25/2+{(0)+1}*(0.75)=43.25
最大値:30+25/2{(25)+1}*(1.25)=85.625
エンチャント出現範囲:
ダメージ軽減=3~4, 火炎耐性=4, 飛び道具耐性:4, 落下耐性4, 水中呼吸2~4, 水中採掘1
ここから確率で実際に付与されるエンチャントが決まる。