MOD製作チュートリアル > 防具の追加

概要

新しいヘルメット・チェストプレート・レギンス・ブーツを追加する。

ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod;
 
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;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraftforge.common.util.EnumHelper;
 
@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 aluminium;
	public static Item helmetAluminium;
	public static Item chestPlateAluminium;
	public static Item leggingsAluminium;
	public static Item bootsAluminium;
 
	public static ArmorMaterial ALUMINIUMARMOR;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		aluminium = new Item()
				.setCreativeTab(CreativeTabs.tabMaterials)
				.setUnlocalizedName("aluminium")
				.setTextureName("aluminiummod:aluminium");
		GameRegistry.registerItem(aluminium, "aluminium");
 
		ALUMINIUMARMOR = EnumHelper.addArmorMaterial("ALUMINIUMARMOR", 33, new int[] { 3, 8, 6, 3 }, 10);
		ALUMINIUMARMOR.customCraftingMaterial = aluminium;
 
		helmetAluminium = new ItemAluminiumArmor(0)
				.setUnlocalizedName("helmetAluminium")
				.setTextureName("aluminiummod:helmetAluminium");
		GameRegistry.registerItem(helmetAluminium, "helmetAluminium");
 
		chestPlateAluminium = new ItemAluminiumArmor(1)
				.setUnlocalizedName("chestPlateAluminium")
				.setTextureName("aluminiummod:chestPlateAluminium");
		GameRegistry.registerItem(chestPlateAluminium, "chestPlateAluminium");
 
		leggingsAluminium = new ItemAluminiumArmor(2)
				.setUnlocalizedName("leggingsAluminium")
				.setTextureName("aluminiummod:leggingsAluminium");
		GameRegistry.registerItem(leggingsAluminium, "leggingsAluminium");
 
		bootsAluminium = new ItemAluminiumArmor(3)
				.setUnlocalizedName("bootsAluminium")
				.setTextureName("aluminiummod:bootsAluminium");
		GameRegistry.registerItem(bootsAluminium, "bootsAluminium");
	}
 
}
 

  • ItemAluminiumArmor.java
package tutorial.aluminiummod;
 
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
 
public class ItemAluminiumArmor extends ItemArmor {
 
	public ItemAluminiumArmor(int type) {
		super(AluminiumMod.ALUMINIUMARMOR, 0, type);
		this.setCreativeTab(CreativeTabs.tabCombat);
	}
 
	@Override
	public String getArmorTexture(ItemStack itemStack, Entity entity, int slot, String type) {
		if (this.armorType == 2) {
			return "aluminiummod:textures/models/armor/aluminium_layer_2.png";
		}
		return "aluminiummod:textures/models/armor/aluminium_layer_1.png";
	}
 
}
 

解説

ArmorMaterial

防具の性質を保持するためのenum。

Item customCraftingMaterial

金床で修繕するときに使う素材。

EnumHelper

ArmorMaterial addArmorMaterial(String name, int durability, int[] reductionAmounts, int enchantability)

新しくアーマーマテリアルを追加するためのメソッド。
引数は順に、アーマーマテリアルの名前・耐久値・部位ごとの防御力・エンチャントの付きやすさ
今回はダイヤモンドと同じ数値を使用。
耐久値は、第二引数で指定された値に、部位ごとにそれぞれ11, 16, 15, 13が乗算される。
防御力は、第三引数に防御力アイコン一個=2として入れる。
例えば、ヘルメット2、チェストプレート4、レギンス2、ブーツ1の防御力にする場合は、
第三引数にnew int[]{4, 8, 4, 2}と渡す。

ItemArmor

コンストラクタ(ArmorMaterial material, int renderIndex, int armorType)

armorTypeはどの部位かを表す数値。
renderIndexはgetArmorTextureをオーバーライドしているので関係ない。

String getArmorTexture(ItemStack itemStack, Entity entity, int slot, String type)

アーマーのモデルのテクスチャファイルの場所を返す。
モデルのテクスチャは、"C:/forge/src/main/resources/assets/aluminiummod/textures/models/armor/"に、"aluminium_layer_1.png"、"aluminium_layer_2.png"として保存する。
バニラのものを参考にするとよい。

使用例

オファレンの防具を追加している部分。
+オファレン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 {
 
/*略*/
 
	//アーマーの定義
	public static Item helmetOfalen;
	public static Item chestplateOfalen;
	public static Item leggingsOfalen;
	public static Item bootsOfalen;
 
/*略*/
 
	/**アイテムを設定する*/
	public static void registerItem () {
/*略*/
 
		//アーマーの設定
		helmetOfalen = new OfalenArmor(OfalenModMaterialCore.OFALENA, 0, 1)
		.setUnlocalizedName("helmetOfalen")
		.setTextureName("ofalenmod:ofalen_helmet");
		GameRegistry.registerItem(helmetOfalen, "helmetOfalen");
 
		chestplateOfalen = new OfalenArmor(OfalenModMaterialCore.OFALENA, 1, 1)
		.setUnlocalizedName("chestplateOfalen")
		.setTextureName("ofalenmod:ofalen_chestplate");
		GameRegistry.registerItem(chestplateOfalen, "chestplateOfalen");
 
		leggingsOfalen = new OfalenArmor(OfalenModMaterialCore.OFALENA, 2, 1)
		.setUnlocalizedName("leggingsOfalen")
		.setTextureName("ofalenmod:ofalen_leggings");
		GameRegistry.registerItem(leggingsOfalen, "leggingsOfalen");
 
		bootsOfalen = new OfalenArmor(OfalenModMaterialCore.OFALENA, 3, 1)
		.setUnlocalizedName("bootsOfalen")
		.setTextureName("ofalenmod:ofalen_boots");
		GameRegistry.registerItem(bootsOfalen, "bootsOfalen");
 
/*略*/
	}
 
}
 

  • OfalenModMaterialCore.java
package nahama.ofalenmod.core;
 
import net.minecraft.item.Item.ToolMaterial;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraftforge.common.util.EnumHelper;
 
public class OfalenModMaterialCore {
 
	//ツールマテリアルの定義
	public static ToolMaterial OFALENT = EnumHelper.addToolMaterial("OFALENT", 4, 1561, 8.0F, 3.0F, 10);
	public static ToolMaterial OFALENG2T = EnumHelper.addToolMaterial("OFALENG2T", 4, 3123, 16.0F, 6.0F, 20);
	public static ToolMaterial OFALENG3T = EnumHelper.addToolMaterial("OFALENG3T", 4, 6247, 32.0F, 12.0F, 40);
	public static ToolMaterial PERFECTT = EnumHelper.addToolMaterial("PERFECTT", 5, 12495, OfalenModConfigCore.efficiencyPerfectTool, 24.0F, 80);
 
	//アーマーマテリアルの定義
	public static ArmorMaterial OFALENA = EnumHelper.addArmorMaterial("OFALENA", 33, new int[]{3, 8, 6, 3}, 10);
	public static ArmorMaterial OFALENG2A = EnumHelper.addArmorMaterial("OFALENG2A", 66, new int[] {3, 8, 6, 3}, 20);
	public static ArmorMaterial OFALENG3A = EnumHelper.addArmorMaterial("OFALENG3A", 132, new int[] {3, 8, 6, 3}, 40);
	public static ArmorMaterial PERFECTA = EnumHelper.addArmorMaterial("PERFECTA", 264, new int[] {3, 8, 6, 3}, 80);
 
}
 

  • OfalenArmor.java
package nahama.ofalenmod.item.armor;
 
import nahama.ofalenmod.OfalenModCore;
import nahama.ofalenmod.core.OfalenModItemCore;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.world.World;
 
public class OfalenArmor extends ItemArmor {
 
	private int grade = 0;
 
	public OfalenArmor(ArmorMaterial material, int type, int grade) {
		super(material, 0, type);
		this.setCreativeTab(OfalenModCore.tabOfalen);
		this.grade = grade;
	}
 
	/**テクスチャを指定する*/
	@Override
	public String getArmorTexture(ItemStack itemStack, Entity entity, int slot, String type) {
		int i = 1;
		if (this.armorType == 2) i = 2;
		if (this.grade == 4) return "ofalenmod:textures/models/armor/ofalen_P_layer_" + i + ".png";
		return "ofalenmod:textures/models/armor/ofalen_G" + grade + "_layer_" + i + ".png";
	}
 
/*略*/
 
}
 

コメント

この項目に関する質問などをどうぞ。
  • 防御力の設定は、どうやるのですか。 - 新人もっだー 2015-12-23 11:41:45
    • 訂正しました。addArmorMaterialの第三引数で、ヘルメット、チェストプレート、レギンス、ブーツの順で登録してください。 - Tom Kate 2015-12-23 14:09:17
  • 一応コメントにて。耐久値を1600に設定していざ動かしてみたら、耐久値が17600になったので、計算してみたところ耐久値は設定されている値に16かけた数値みたいですね。 - 初心者modder 2016-01-20 14:54:07
    • ご指摘ありがとうございます。コードより確認し、addArmorMaterialの説明部分に追記しておきました。 - 赤砂蛇凪浜 2016-10-10 12:27:46
  • 「ItemStack customCraftingMaterial」にブロックは指定できないのですか? - モアイさん 2016-10-04 19:14:00
    • 返信遅くなり申し訳ありません。
      記述に間違いがありました。customCraftingMaterialはItem型です。修正しておきます。
      ブロックを指定する場合、Item.getItemFromBlockメソッドを使用してItem型として代入してください。 - 赤砂蛇凪浜 2016-10-10 12:22:34
  • 「装備していると何かが起こる防具」を作る方法を教えてください。 - あるふぁ 2017-05-25 17:33:50
    • 「何か」とは、具体的にどのようなことでしょうか。
      Item.onArmorTick(World, EntityPlayer, ItemStack)は、プレイヤーが装備している時に毎tick呼ばれます。
      ある程度のことはこのメソッドを利用することで実装できると思います。 - 赤砂蛇凪浜 2017-05-26 13:31:31
      • 装備しているmob(プレイヤー)にポーション効果をつけたかったのですが、汎用性を高めるために、わかりにくくしてしまいました。すみません。ともかく、ありがとうございました。 - あるふぁ 2017-05-26 20:34:50
  • このソースコードをコピペしても金床で修理することが出来ません - 名無しさん 2017-06-11 15:31:00
    • ご指摘ありがとうございます。
      ArmorMaterial.customCraftingMaterialへの代入がaluminiumへの代入より先だったため、素材指定ができていませんでした。
      修正しておきました。ご確認ください。 - 赤砂蛇凪浜 2017-06-16 18:29:15
  • 初心者ですが二日かかっても解決できなかった部分を解決できました。ソースコードを書いてくれた方、本当に感謝しています。ありがとうございます。 - 名無しさん 2017-08-07 09:32:11
  • 上の「装備していると何かが起こる防具」を作る方法を教えてください。 - 名無しさん 2017-09-02 00:30:22
    • に被ってしまうと思いますが全ての防具スロットに着けているのを確認する方法がわかりません... - 名無しさん 2017-09-02 00:31:07
    • Item#onArmorTick(World, EntityPlayer, ItemStack)の第二引数を利用します。
      EntityPlayer#getCurrentArmor(int)を呼び出すと、プレイヤーが装備している防具をItemStackとして取得できます。
      引数は、3が頭、2が胴、1が脚、0が足になっていますので、ご注意ください。 - 赤砂蛇凪浜 2017-09-03 11:32:17
名前: