他MODのアイテムの取得(1.7.10)

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

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

ソースコード


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で取得。簡易的。

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

1件のコメント

  1. 他MODとの連携をぜひやりたいと思っているのですが。
    他MODを追加しただけで、
    Exception in thread "main" [19:12:11] [main/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: java.lang.NoClassDefFoundError: net/minecraftforge/fml/relauncher/IFMLLoadingPlugin
    Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future releaseというエラーが出てしまいます。
    このエラーの意味と解決法を教えていただけないでしょうか。
    他MODの導入にはlibフォルダーに入れてから、FORGEのフォルダ>ビルドパスの構成>外部JARの追加という方法をとっています。
    Java8を使っていて、今のところは匠クラフトと連携しようと思っています。
    他にもMODにおいてのAPIとは、どのようなものなのか教えていただきたいです。

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

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