1.7のアイテムに初期状態でエンチャント等NBTデータを付ける方法

提供:Minecraft Modding Wiki
移動: 案内, 検索

この記事は"Minecraft Forge Universal 10.12.0.xxx~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
C item.png
Itemに関係のあるチュートリアルです。

自作のアイテムに初期状態でエンチャント等を付与する方法を幾つか解説します。 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データを正常に保ちたい場合にも利用できます。

チュートリアル
個人用ツール