提供: Minecraft Modding Wiki
2012年10月24日 (水) 17:32時点におけるReginn666 (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"Minecraft Forge4.3x"を前提MODとしています。

無機能アイテムの追加

何の機能も無いアイテムを追加する. これはアイテムを追加するための基礎であり, ここで使われるメソッドはこれ以降のチュートリアルにも頻出する.

ソースコード

  • ItemSampleCore.java
package mods.itemsample;

import net.minecraft.src.*;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.network.NetworkMod;

import cpw.mods.fml.common.event.FMLInitializationEvent;

import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(
	modid = "ItemSampleMod",
	name  = "Item Sample Mod",
	version = "1.0.0"
)
@NetworkMod(
	clientSideRequired = true,
	serverSideRequired = false
)
public class ItemSampleCore
{
	public static Item itemSample;
	
	@Mod.Init
	public void init(FMLInitializationEvent event)
	{
		itemSample = (new ItemSample(4000 - 256)).setIconCoord(11, 0).setItemName("itemSample").setCreativeTab(CreativeTabs.tabMaterials);
		
		LanguageRegistry.addName(itemSample, "Sample Item");
		LanguageRegistry.instance().addNameForObject(itemSample, "ja_JP", "サンプルアイテム");
		
		GameRegistry.addShapelessRecipe(
			new ItemStack(itemSample, 1),
				new Object[]
				{
					Block.dirt
				});
	}
	
}
  • ItemSample.java
package mods.itemsample;

import net.minecraft.src.*;

public class ItemSample extends Item
{
	public ItemSample(int itemId)
	{
		super(itemId);
	}
}

解説

ItemSampleCoreクラス

package mods.itemsample;

このModのパッケージを指定する. このパッケージは実際のフォルダ階層と同じでなければならない. したがってこのファイルはmcroot/src/common/mods/itemsampleフォルダに置かなければならない.


import net.minecraft.src.*;

net.minecraft.src以下を全てインポートする. ItemやBlockなど既存のクラスを利用するのに必要.


import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.network.NetworkMod;

2つのアノテーションを使うためにインポートする. 2つのアノテーションについては新しいコーディング記法とUniversal_Moddingを参照.


import cpw.mods.fml.common.event.FMLInitializationEvent;

FMLInitializationEventというクラスを利用するためにインポートする. ModLoaderにおけるloadメソッドに相当する.


import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

FMLのAPIを利用するためにインポートする.

@Mod, @NetworkMod

@Mod(
	modid = "ItemSampleMod",
	name  = "Item Sample Mod",
	version = "1.0.0"
)
@NetworkMod(
	clientSideRequired = true,
	serverSideRequired = false
)

@Modで他のMODと重複しない文字列のmodidとModの名前, バージョンを明記する. @NetworkModでクライアントとサーバーに関する設定を行う. 今回は2つだけ.

ItemSampleCoreクラス

public class ItemSampleCore
{
	public static Item itemSample;
	
	@Mod.Init
	public void init(FMLInitializationEvent event)
	{
		itemSample = (new ItemSample(4000 - 256)).setIconCoord(11, 0).setItemName("itemSample").setCreativeTab(CreativeTabs.tabMaterials);
		
		LanguageRegistry.addName(itemSample, "Sample Item");
		LanguageRegistry.instance().addNameForObject(itemSample, "ja_JP", "サンプルアイテム");
		
		GameRegistry.addShapelessRecipe(
			new ItemStack(itemSample, 1),
				new Object[]
				{
					Block.dirt
				});
	}
	
}

クラス名はItemSampleCore. ModLoaderと異なりどんなクラス名でもよいが, ファイル名と同じでなければならない.


public static Item itemSample;

新しいアイテムの宣言. public staticとはこのインスタンスがどこからでも, いつでも参照できるということ. ここらへんはJavaの参考書なりサイトなりで確認.


@Mod.Init

@Modの内部アノテーション, Initを利用する. このアノテーションが付与され, 引数にFMLInitialzaitonEventを持つメソッドはFMLによって読み込まれるメソッドになる. この時メソッド名は自由. ModLoader Moddingにおけるload()に相当する.


itemSample = (new ItemSample(4000 - 256)).setIconCoord(11, 0).setItemName("itemSample").setCreativeTab(CreativeTabs.tabMaterials);

Itemを継承したItemSampleクラスのインスタンスを生成する. ItemSampleの引数はアイテムIDで, -256しているのはMinecraft側の仕様の都合. new以外はItemSampleのコンストラクタでやってもよいが, 今回はこちら側で利用.

  • setIconCoord
アイテムのアイコンを指定するメソッド. この場合gui/items.pngの右上から横方向に11, 縦方向に0番目のアイコンを使う, という意味
  • setItemName
アイテムの内部名を明記するメソッド. これを行わないと表示名が適用できない.
  • setCreativeTab
クリエイティブモードでのインベントリタブのどこに追加するかを決めるメソッド. CreativeTabs.tabMaterialsは右下の素材タブに追加.
LanguageRegistry.addName(itemSample, "Sample Item");
LanguageRegistry.instance().addNameForObject(itemSample, "ja_JP", "サンプルアイテム");

アイテムに名前をつけるメソッド. addNameは英語名をつけるメソッド. addNameForObjectは二番目の引数で指定した言語の名前をつけるメソッド, 今回は日本語. 前者と違い後者にはinstance()というメソッドが使われているが, これはaddNameがstaticなメソッドであるのに対し, addNameForObjectがそうでないからである. :LanguageRegistryのコードを読むと違いがわかるだろう.


GameRegistry.addShapelessRecipe(
	new ItemStack(itemSample, 1),
		new Object[]
		{
			Block.dirt
		});

レシピを追加するメソッドである. shapelessRecipe, すなわち形のないレシピである. 作業台などでクラフトする際, 特定の形にしなくも, 素材さえ揃っていれば作成できる場合はこのメソッドを使う. 今回は土ブロックから新しく追加したアイテムを作成できるようにする. このメソッドの引数は(作成したいアイテム, 素材)である.

ItemSampleクラス

public class ItemSample extends Item
{
	public ItemSample(int itemId)
	{
		super(itemId);
	}
}

Itemクラスを継承したItemSampleクラスを作る. コンストラクタではsuperクラス(=Itemクラス)のコンストラクタに引数itemIdを渡しているだけ. このようにsuperクラス(親クラスとも)のメソッドを派生クラス(子クラス)で利用することは多々ある.

実際の挙動

上記のコードをコンパイルし, 実行するとクリエイティブの素材タブの最後にアイテムが追加される. しかし右クリックしても食べられないし, 左クリックしても素手と同じ扱いである.