この記事では、自作のアイテムを追加するよ!
Minecraft 1.8.9 版の記事になります。

Minecraft の Modding の全体像については、こちらのページ をご覧ください。

1.7.10 との違い

ロジックの部分に 1.8.9 と 1.7.10 との違いはありません。
インポートするパッケージが差し替えとなってます。下記の対応表を参照してくださいまし。

1.8.9 1.7.10
net.minecraftforge.fml.common.registry.GameRegistry cpw.mods.fml.common.registry.GameRegistry
net.minecraftforge.fml.common.Mod cpw.mods.fml.common.Mod
net.minecraftforge.fml.common.Mod.EventHandler cpw.mods.fml.common.Mod.EventHandler
net.minecraftforge.fml.common.event.FMLInitializationEvent cpw.mods.fml.common.event.FMLInitializationEvent
net.minecraftforge.fml.common.event.FMLPreInitializationEvent cpw.mods.fml.common.event.FMLPreInitializationEvent

ほとんど 1.7.10 の記事と同じ内容になっています。

下準備

アイテムは、クラスとして実装する。1 つのアイテムを追加するのに 1 つのクラスを作成する。

クラスをどのパッケージに含めるかは任意です。

今回は、ゴピチャンドとゴピチャンドを作る為の中間素材となるアイテムを追加するのでプロジェクトの構成は、下記のようになった。

src/main/java
    com.gopichandmod
        GopichandMod.java(MOD の全般的な内容を管理するクラス)
        Recipes.java(追加するアイテムのレシピを登録するクラス)
    com.gopichandmod.items
        GopichandItems.java(追加するアイテムを登録するクラス)
        ItemGopichand.java(アイテム“Gopichand”を実装するクラス)
        ItemGopichandBody.java(アイテム“Gopichand Body”を実装するクラス)
        ItemGopichandHead.java(アイテム“Gopichand Head”を実装するクラス)
        ItemIronString.java(アイテム“Iron String”を実装するクラス)

アイテムを実装するクラス

package com.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ItemGopichand extends Item
{
	public ItemGopichand()
	{
		String name = "gopichand";

		this.setCreativeTab( CreativeTabs.tabMisc );
		this.setUnlocalizedName( name );
		maxStackSize = 1;

		GameRegistry.registerItem( this, name );

		return;
	}
}

このクラスでゴピチャンドを実装する。

package com.gopichandmod.items;

パッケージを設定する。

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

インポートするクラスを設定する。

public class ItemGopichand extends Item

追加するアイテムのクラスを設定する。
インポートしたクラス net.minecraft.item.Item を継承している。

	public ItemGopichand()

クラスのコンストラクターです。

		String name = "gopichand";

String 型の変数 name を定義する。
初期値には、追加するアイテムのシステム上の名前 "gopichand" を設定する。

		this.setCreativeTab( CreativeTabs.tabMisc );

クリエイティブモードのインベントリにアイテムを登録する。
引数で登録先のタブを指定する。
今回は、Minecraft に元からある“その他(Miscellanuous)”に登録する。他にも下記のタブが用意されている。

Minecraft のクリエイティブモードのタブ一覧表

タブ名(日本語) タブ名(英語)
tabBlock 建築ブロック Building Blocks
tabDecorations 装飾ブロック Decoration Blocks
tabRedstone レッドストーン Redstrone
tabTransport 運送 Transportation
tabMisc その他 Miscellanuous
tabFood 食料 Foodstuffs
tabTools 道具 Tools
tabCombat 戦闘 Combat
tabBrewing 醸造 Brewing
tabMaterials 材料 Materials

MOD 独自の新しいタブを作り、そのタブにアイテムを登録することもできる。
独自のタブの追加については、別の記事で解説する。

		this.setUnlocalizedName( name );

システム上でのアイテムの名前を設定する。
Minecraft の言語設定でローカライズされていない言語が選択されている場合、ここで設定した文字列が使用される。item.gopichand.name という書式で表示される、
ローカライズについても、別の記事で解説する。

		maxStackSize = 1;

スタックできる数を指定する。
今回は、ツルハシ、シャベル等のスタックできないアイテムと同じく 1 を設定した。

		GameRegistry.registerItem( this, name );

コンストラクターの最後で Minecraft にアイテムを登録する。

以降のクラスは、ほとんどクラスの名前とアイテムの名前が違うだけなので説明は省略します。

package com.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ItemGopichandBody extends Item
{
	public ItemGopichandBody()
	{
		String name = "gopichandbody";

		this.setCreativeTab( CreativeTabs.tabMisc );
		this.setUnlocalizedName( name );
		maxStackSize = 1;

		GameRegistry.registerItem( this, name );

		return;
	}
}

このクラスで「ゴピチャンドのボティ」を実装する。
「ゴピチャンドのボティ」は、「ゴピチャンド」を作るために必要な中間素材です。

package com.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ItemGopichandHead extends Item
{
	public ItemGopichandHead()
	{
		String name = "gopichandhead";

		this.setCreativeTab( CreativeTabs.tabMisc );
		this.setUnlocalizedName( name );
		maxStackSize = 1;

		GameRegistry.registerItem( this, name );

		return;
	}
}

このクラスで「ゴピチャンドのヘッド」を実装する。
「ゴピチャンドのヘッド」は、「ゴピチャンドのボディ」と同じくゴピチャンドを作るために必要な中間素材です。

package com.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ItemIronString extends Item
{
	public ItemIronString()
	{
		String name = "ironstring";

		this.setCreativeTab( CreativeTabs.tabMisc );
		this.setUnlocalizedName( name );
		maxStackSize = 64;

		GameRegistry.registerItem( this, name );

		return;
	}
}

このクラスで鉄の弦を実装する。
「鉄の弦」は、「ゴピチャンド」を作るために必要な中間素材です。

		maxStackSize = 64;

このアイテムのスタックできる数は、ブロックや食料と同じく 64 と設定した。

追加するアイテムを登録するクラス

package com.gopichandmod.items;

import net.minecraft.item.Item;
import com.watermelonheadman.gopichandmod.GopichandMod;

public class GopichandItems
{
	public static Item Gopichand;
	public static Item GopichandBody;
	public static Item GopichandHead;
	public static Item IronString;

	public static void registry( GopichandMod mod )
	{
		Gopichand = new ItemGopichand();
		GopichandBody = new ItemGopichandBody();
		GopichandHead = new ItemGopichandHead();
		IronString = new ItemIronString();

		return;
	}
}

このクラスで新しいアイテムの登録を一括で行う。

	public static Item Gopichand;
	public static Item GopichandBody;
	public static Item GopichandHead;
	public static Item IronString;

メンバー変数を設定する。

	public static void registry( GopichandMod mod )
	{
		Gopichand = new ItemGopichand();
		GopichandBody = new ItemGopichandBody();
		GopichandHead = new ItemGopichandHead();
		IronString = new ItemIronString();

		return;
	}

[========]

関数 registry を設定する。
この関数を実行すると追加するアイテムを実装するクラスが作成される。各クラスのコンストラクターが実行され、Minecraft にアイテムが登録される。

追加するアイテムのレシピを登録するクラス

package com.gopichandmod;

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.registry.GameRegistry;
import com.gopichandmod.items.GopichandItems;

public class Recipes
{
	public static void registry()
	{
		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.GopichandHead, 1 ),
			new Object[] {
				" x ",
				"y y",
				'x', Blocks.planks,
				'y', Items.stick } );

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.GopichandBody, 1 ),
			new Object[] {
				"x",
				"y",
				'x', Blocks.planks,
				'y', Items.leather } );

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.IronString, 9 ),
			new Object[] {
				"x",
				"x",
				"x",
				'x', Items.iron_ingot } );

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.Gopichand, 1 ),
			new Object[] {
				"x",
				"y",
				"z",
				'x', GopichandItems.GopichandHead,
				'y', GopichandItems.IronString,
				'z', GopichandItems.GopichandBody } );

		return;
	}
}

	public static void registry()

関数 registry が実行されるとレシピが登録される。

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.GopichandHead, 1 ),
			new Object[] {
				" x ",
				"y y",
				'x', Blocks.planks,
				'y', Items.stick } );

レシピを登録する。

			new ItemStack( GopichandItems.GopichandHead, 1 ),

第1引数の GopichandItems.GopichandHead は、レシピによって作られるアイテムのクラスの名前です。
第2引数の 1 は、一度に作られるアイテムの数です。

バニラのブロック、アイテムの宣言は、"パッケージ・エクスプローラー"から参照できる。

参照ライブラリー → forgeSrc-1.7.2-10.12.2.1121-sources.jar → net.minecraft.init.Blocks
参照ライブラリー → forgeSrc-1.7.2-10.12.2.1121-sources.jar → net.minecraft.init.Items

				" x ",
				"y y",

は、レシピです。
xy は、それぞれ別々のアイテム、スペースは空欄を表している。

				'x', Blocks.planks,
				'y', Items.stick } );

前述のレシピの xBlocks.planks として設定する。Blocks.planks木材(Wood Planks) です。
レシピの yItems.stick として設定する。Items.stick棒(Stick) です。

下記のレシピを追加したことになる。

gopichandhead のレシピ
gopichandhead のレシピ

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.GopichandBody, 1 ),
			new Object[] {
				"x",
				"y",
				'x', Blocks.planks,
				'y', Items.leather } );

Items.leather革(Leather)です。

下記のレシピを追加したことになる。

gopichandboby のレシピ
gopichandboby のレシピ

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.IronString, 9 ),
			new Object[] {
				"x",
				"x",
				"x",
				'x', Items.iron_ingot } );

このアイテムは、一度のレシピで9個できる。

Items.iron_ingot鉄インゴット(Iron Ingot)です。

下記のレシピを追加したことになる。

ironstring のレシピ
ironstring のレシピ

		GameRegistry.addRecipe(
			new ItemStack( GopichandItems.Gopichand, 1 ),
			new Object[] {
				"x",
				"y",
				"z",
				'x', GopichandItems.GopichandHead,
				'y', GopichandItems.IronString,
				'z', GopichandItems.GopichandBody } );

今回新しく追加する gopichandheadironstringgopichandboby を順番で縦に並べて gopichand を1つ作るレシピを設定している。

MOD の全般的な内容を管理するクラス

package com.gopichandmod;

import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import com.gopichandmod.Recipes;
import com.gopichandmod.items.GopichandItems;

@Mod( modid = GopichandMod.MODID, version = GopichandMod.VERSION )
public class GopichandMod
{
	@Mod.Instance("GopichandMod")
	public static final String MODID = "gopichandmod";
	public static final String VERSION = "0.1";

	@EventHandler
	public void preInit( FMLPreInitializationEvent e )
	{
		GopichandItems.registry( this );
	}

	@EventHandler
	public void Init(FMLInitializationEvent e)
	{
		Recipes.registry();
	}
}

前回の記事で作ったクラスにアイテムとそのレシピを登録する処理を追加する。

import com.gopichandmod.Recipes;
import com.gopichandmod.items.GopichandItems;

今回作成したクラスをインポートする。

	@EventHandler
	public void preInit( FMLPreInitializationEvent e )
	{
		GopichandItems.registry( this );
	}

関数 preInit は、Minecraft の起動時の MOD を読み込むタイミングに実行される。

今回作成した追加するアイテムを登録するクラス GopichandItems の関数 register を実行し、この MOD で追加するアイテムを Minecraft に登録する。

	@EventHandler
	public void Init( FMLInitializationEvent e )
	{
		Recipes.registry();
	}

関数 Init は、関数 preInit が実行された後に実行される。
他の MOD が読み込まれ、それぞれの MOD の関数 preInit が実行された後に実行されるので、他の MOD の導入判定は、ここでする。

今回作成した追加するアイテムのレシピを Minecraft に登録するクラス Recipes の関数 register を実行し、この MOD で追加するレシピを Minecraft に登録する。

テストする

MOD をビルドしてアイテムが追加されているかテストする。
素材を集めるのがめんどいのでクリエイティブモードでテストする。

インベントリを開き、その他のタブを選択する。下にスクロールするとバニラのアイテムの後に登録したアイテムが増えている。
アイコンが変な画像になっているけど、カーソルを合わせると追加したアイテムの名前が表示される。
変な画像が表示されるのは、まだ、アイテムにテクスチャが設定されていないからです。