今回は、Minecraft 1.7.2~1.8 / Forge に新しいアイテムを追加するよ。

SPONSERD LINK

前回の記事で、Minecraft に MOD を認識させました。

下準備

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

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

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

java
	com.watermelonheadman.gopichandmod
		GopichandMod.java(MOD の全般的な内容を管理するクラス)
		Recipes.java(追加するアイテムのレシピを Minecraft に登録するクラス)
	com.watermelonheadman.gopichandmod.items
		GopichandItems.java(追加するアイテムを Minecraft に登録するクラス)
		ItemGopichand.java(追加するアイテムを実装するクラス A)
		ItemGopichandBody.java(追加するアイテムを実装するクラス B)
		ItemGopichandHead.java(追加するアイテムを実装するクラス C)
		ItemIronString.java(追加するアイテムを実装するクラス D)

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

下記は、Minecraft 1.7.2~1.7.10 / Forge 版のコードになる。

package com.watermelonheadman.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.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;
	}
}

下記は、Minecraft 1.8 / Forge 版のコードになる。

package com.watermelonheadman.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;
	}
}

ハイライトされている部分は、Minecraft 1.7.2~1.7.10 / Forge 版と Minecraft 1.8 / Forge 版の相違点になる。

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

package com.watermelonheadman.gopichandmod.items;

パッケージを設定する。

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.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 にアイテムを登録する。

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

下記は、Minecraft 1.7.2~1.7.10 / Forge 版のコードになる。

package com.watermelonheadman.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.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;
	}
}

下記は、Minecraft 1.8 / Forge 版のコードになる。

package com.watermelonheadman.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;
	}
}

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

下記は、Minecraft 1.7.2~1.7.10 / Forge 版のコードになる。

package com.watermelonheadman.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.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;
	}
}

下記は、Minecraft 1.8 / Forge 版のコードになる。

package com.watermelonheadman.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;
	}
}

このクラスでゴピチャンドの頭を実装する。
ゴピチャンドの頭は、ゴピチャンドの胴と同じくゴピチャンドを作るために必要な中間素材です。

下記は、Minecraft 1.7.2~1.7.10 / Forge 版のコードになる。

package com.watermelonheadman.gopichandmod.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.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;
	}
}

下記は、Minecraft 1.8 / Forge 版のコードになる。

package com.watermelonheadman.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.watermelonheadman.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 にアイテムが登録される。

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

下記は、Minecraft 1.7.2~1.7.10 / Forge 版のコードになる。

package com.watermelonheadman.gopichandmod;

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.registry.GameRegistry;
import com.watermelonheadman.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;
	}
}

下記は、Minecraft 1.8 / Forge 版のコードになる。

package com.watermelonheadman.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.watermelonheadman.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 } );

Minecraft にレシピを登録する。

			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 の全般的な内容を管理するクラス

下記は、Minecraft 1.7.2~1.7.10 / Forge 版のコードになる。

package com.watermelonheadman.gopichandmod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import com.watermelonheadman.gopichandmod.Recipes;
import com.watermelonheadman.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();
	}
}

下記は、Minecraft 1.8 / Forge 版のコードになる。

package com.watermelonheadman.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.watermelonheadman.gopichandmod.Recipes;
import com.watermelonheadman.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.watermelonheadman.gopichandmod.Recipes;
import com.watermelonheadman.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 をビルドしてアイテムが追加されているかテストする。
素材を集めるのがめんどいのでクリエイティブモードでテストする。

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

Forge 導入済み Minecraft
クリエイティブモードのインベントリに追加したアイテムが表示されている
出典:Forge 導入済み Minecraft
Forge 導入済み Minecraft
テクスチャを設定していないので変な画像が表示されている
出典:Forge 導入済み Minecraft
Forge 導入済み Minecraft
変な画像のアイテムを地面に置いてみる
出典:Forge 導入済み Minecraft

お疲れ様でした!

次回予告

次回は、追加したアイテムにテクスチャを設定するよ。