MOD製作チュートリアル > 他MODのアイテムの取得

他Modからアイテムを取得する。
自分のMODがある程度できてきて、他MODとも連携したい!と思ったときにどうぞ。
このテクニックを応用すると、あるMODが導入されているときに特別なことがおこる等もできる。
簡単なアドオンもこれで作れる。

  • AlminiumMod.java
package alminiummod.common;
 
import java.util.ArrayList;
 
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
import cpw.mods.fml.common.Loader;
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.FMLPostInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
 
//MODの登録
/*@Mod(modid = String, name = String)
 *modid・・・MODの識別名
 *name・・・MOD一覧で表示されるMODの名前*/
@Mod(modid = "AluminiumMod", name = "AluminiumMod")
public class AlminiumMod
{
 
	//ロガー生成
	/*ロガーとは、コンソールにメッセージを生成させるものである。*/
	public static Logger logger = LogManager.getLogger("AluminiumMod");
 
	//追加するアイテムの定義
	/*「無機能アイテム追加」を参照のこと*/
	public static Item alminium;
 
	//導入するブロックの定義
	/*「無機能ブロック追加」を参照のこと*/
	public static Block CreeperBomb;
 
	//導入するアイテムの定義
	/*「無機能アイテム追加」を参照のこと*/
	public static ItemStack Ofalen;
 
	/**「無機能ブロック追加」の同様のメソッド。ただし、鉱石辞書にアイテムを追加している。**/
	@EventHandler
	public void perInit(FMLInitializationEvent e)
	{
		alminium = new Item();
 
		alminium.setCreativeTab(CreativeTabs.tabMaterials);
 
		alminium.setUnlocalizedName("alminium");
 
		alminium.setTextureName("alminiummod:alminium");
 
		GameRegistry.registerItem(alminium, "alminium");
 
		//鉱石辞書~OreDictionary~への登録
		/*OreDictionary.registerOre(String, Item);*/
		/*異なるMod間でのアイテムの競合を無くし、共有できるメソッド。登録しておくと便利。*/
		OreDictionary.registerOre("aluminium", alminium);
	}
 
	/*今回は、匠Craftから匠式高性能爆弾、オファレンMODから白いオファレンを引用し、アルミニウムとの連携レシピを作る。
	 * 匠の杖はクリエイティブ限定アイテムだが、気にしない。*/
	/**最後に行われるメソッド。他のModでアイテムの登録が終わっていないとここでアイテムを参照できないため、最後に行う。**/
	@EventHandler
	public void postInit (FMLPostInitializationEvent event)
	{
		//まずは、そのModが実装されていることを確認。安全を期すのがModderの心得。
		/*Modが導入されているかの確認メソッド
		 * Loader.isModLoaded(String modname)
		 * modnameには連携したいModのIDを打ち込む。*/
		if(Loader.isModLoaded("TakumiMod"))
		{
			//次に、失敗したときにゲームが落ちないようにtry-catchで囲む。安全を期すのがModder(ry
			try
			{
				//まず、GameRegistryを用いた方法を紹介する。
				/*GameRegistry.findItem(String , String)
				 * Block版はfindBlock(String , String)
				 * 第一引数にはModIDを、第二引数にはGameRegistryで登録している名称を渡す。*/
				this.CreeperBomb = GameRegistry.findBlock("TakumiMod", "CreeperBomb");
 
 
				//レシピ追加。「レシピ追加」参照。
				/*匠式高性能爆弾一個でアルミニウム六四個を作る。*/
				GameRegistry.addShapelessRecipe(new ItemStack(AlminiumMod.alminium , 64),
						new ItemStack(this.CreeperBomb));
 
 
			}
			/**失敗した場合、ここで処理をする。引数は基本的にTrowable型でおk。安全を期す(ry**/
			catch (Throwable t)
			{
				//ロガーにエラーメッセージを出力させる。安全(ry
				/*warn(String)
				 * 引数にはメッセージを渡す。*/
				logger.warn("Failed to get items of TakumiCraft.");
			}
			/**最後にはここで処理をする。今回は使わない。**/
			finally{}
		}
 
		//もう一度
		if (Loader.isModLoaded("OfalenMod"))
		{
			try
			{
			/*次に、OreDictionaryを用いた方法を紹介する。まず、ArrayList<ItemStack>に、鉱石辞書に登録されているアイテムを書き出す。
			 *OreDictionary.getOres(String)
			 * 引数には鉱石辞書に登録している名称を渡す。*/
			ArrayList<ItemStack> ofa = OreDictionary.getOres("gemOfalenWhite");
			if (ofa.size() > 0)
			{
				this.Ofalen = ofa.get(0);
			}
 
			//白いオファレン一個と鉄インゴットとでアルミニウム六四個を作る。
		     GameRegistry.addShapelessRecipe(new ItemStack(AlminiumMod.alminium , 64),
			   this.Ofalen , Items.iron_ingot);
			}
			catch (Throwable t)
			{
				logger.warn("Failed to get items of OfalenMod.");
			}
			finally{}
		}
	}
 
 

メインの説明はソース内に。

鉱石辞書取得とGameRegistry取得を比較すると、
鉱石辞書……ItemStackで取得。メタデータを持つものに便利。
GameRegistry……ItemまたはBlockで取得。簡易的。

となる。使い分けられるようにしておこう。

コメント

この項目に関する質問などをどうぞ。
  • バニラのアイテムやブロックに干渉する方法はありますか? - あるふぁ 2017-05-19 21:13:05
    • 「干渉する」とは、どのようなことを実装されようとしているのでしょうか?もしよろしければ実装したい動作をお教えください。 - Tom Kate 2017-05-19 23:37:10
      • 炎に関するアイテムを導入するMODを作っているのですが、バニラの「火」ブロックをクリエイティブタブに入れたいです。 - あるふぁ 2017-05-20 14:09:42
        • 以下をpreInit内に記載すれば、火ブロックをクリエイティブタブ(「その他」タブ)に追加できます。
          :    Blocks.fire.setCreativeTab(CreativeTabs.tabMisc); - 赤砂蛇凪浜 2017-05-22 19:17:18
        • 追記:このコードだと、他のMODが同様のことをしようとした場合、後に読み込まれた方の設定のみが適用されます。
          目指す動作にもよりますが、右クリック時に火ブロックを設置するなどの機能を持たせた独自アイテムを追加する方がよいかもしれません。 - 赤砂蛇凪浜 2017-05-24 12:09:35
名前: