この記事は"Minecraft Forge Universal 10.12.0.xxx~"を前提MODとしています。 |
自作のアイテムに初期状態でエンチャント等を付与する方法を幾つか解説します。 1.6以前でも流用可能な方法ですが、メソッド名や登録方法の違いを検証していないので、1.7の場合として紹介します。
目次
アイテムに初期状態でエンチャント等NBTデータを付ける方法
getSubItemsメソッドを利用し、クリエイティブタブにNBTデータを付与したアイテムを登録する
ソースコード
SampleEnchantedItemクラス
package等省略 public class SampleEnchantedItem extends Item { @Override public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List itemList) { ItemStack itemStack = new ItemStack(this, 1, 0); itemStack.addEnchantment(Enchantment.sharpness, 1);//エンチャントを付ける場合 //エンチャント以外の情報を保存したい場合 //NBTTagCompound nbt = new NBTTagCompound(); /* nbtに何かを格納する*/ //itemStack.setTagCompound(nbt); itemList.add(itemStack);//クリエイティブタブのアイテムリストに追加 } }
解説
getSubItemsメソッドはクリエイティブタブにアイテムを登録するメソッドです。 通常は、Itemクラスで、damage値0、スタック数1のアイテムを登録しています。 ここで、ItemStackを登録する前に、NBTを追加してやれば、それがクリエイティブタブでの表示に反映されます。 この方法で、クリエイティブタブのアイテムについては操作できますが、クラフトの際の処理は以下の方法で行う必要があります。
onCreatedメソッドを利用し、クラフト時にNBTデータを付与する
ソースコード
SampleEnchantedItemクラス
package等省略 public class SampleEnchantedItem extends Item { @Override public void onCreated(ItemStack itemStack, World world, EntityPlayer player) { itemStack.addEnchantment(Enchantment.sharpness, 1);//エンチャントを付ける場合 NBTTagCompound nbt = new NBTTagCompound(); /* nbtに何かを格納する*/ itemStack.setTagCompound(nbt);//ItemStackにNBTTagCompoundを格納 } }
解説
onCreatedメソッドは「作業台」か「プレイヤーのインベントリ」でアイテムをクラフトした際に呼ばれるメソッドです。 ここで、ItemStackにNBTデータを追加すると、クラフト後のアイテムにそれが反映されます。 WorldやEntityPlayerに依存しないNBTデータの付与なら、以下の方法が簡単なのでオススメです。
addRecipeメソッドでのレシピ登録時にNBTデータを付与する
ソースコード
Sampleクラス
package等省略 @Mod(modid = "Sample", name = "Sample", version = "1.0.0", dependencies = "required-after:Forge@[10.12.1.1090,)", useMetadata = true) public class Sample { @EventHandler public void load(FMLInitializationEvent event) { ItemStack craftedItem = new ItemStack(Items.iron_sword); craftedItem.addEnchantment(Enchantment.sharpness, 1);//エンチャントを付ける場合 NBTTagCompound nbt = new NBTTagCompound(); /* nbtに何かを格納する*/ craftedItem.setTagCompound(nbt);//ItemStackにNBTTagCompoundを格納 GameRegistry.addShapelessRecipe(craftedItem, Items.iron_sword, Blocks.dirt);//レシピ登録 } }
解説
addRecipe(or addShapelessRecipe)はクラフト後としてItemStackを引数に取るので、上記の方法でNBTデータを登録することが出来ます。
onUpdateメソッドを利用し、常にエンチャントが付いた状態を維持する
ソースコード
SampleEnchantedItemクラス
package等省略 public class SampleEnchantedItem extends Item { @Override public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean isHeld) { if (EnchantmentHelper.getEnchantmentLevel(Enchantment.sharpness.effectId <= 0)) { itemStack.addEnchantment(Enchantment.sharpness, 1);//エンチャントが付いてなければ付け直す。 } } }
解説
onUpdateメソッドは、アイテムがインベントリに入ってる際に毎tick呼ばれます。 通常、エンチャントが外れることは有り得ないので、この方法を利用することはまず無いと思いますが、MODによってはエンチャントを強制的に外すものもあるので、そのMODへの対策として利用することもあるかもしれません。 あるいは、NBTデータを正常に保ちたい場合にも利用できます。