防具の追加(1.7.10)

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

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

ソースコード

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

}
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”として保存する。
バニラのものを参考にするとよい。

使用例

オファレンの防具を追加している部分。

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 {

/*略*/

	//アーマーの定義
	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");

/*略*/
	}

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

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

/*略*/

}

過去の質問

  • 装備しているとポーション効果が付く装備はどうやって作れば良いですか?
    • Item.onArmorTick(World, EntityPlayer, ItemStack)メソッドはプレイヤーが装備している時に毎tick呼ばれますので、ここでプレイヤーにポーション効果を付けられます。
  • 全ての防具スロットに着けているのを確認するにはどうすればよいですか?
    • Item.onArmorTick(World, EntityPlayer, ItemStack)の第二引数であるEntityPlayerからgetCurrentArmor(int)を呼び出すと、プレイヤーが装備している防具をItemStackとして取得できます。引数は、3が頭、2が胴、1が脚、0が足になっていますので、ご注意ください。
Share this...

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

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

[最終更新日]2017/11/21 20:00