[MC1.12]MOD製作チュートリアル > メタデータを持つアイテムの追加

概要

メタデータを付与したアイテムを追加する。

ソースコード

  • AluminiumMod.java
package com.tntmodders.tutorial;
 
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLConstructionEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
 
@Mod(modid = "aluminiummod", version = "1.0", name = "AluminiumMod")
public class AluminiumMod {
    @Mod.Instance("aluminiummod")
    public static AluminiumMod aluminiumInstance;
 
    public static final Item COLOR_ALUMINIUM = new ItemColorAluminium();
 
 
    @Mod.EventHandler
    public void construct(FMLConstructionEvent event) {
        MinecraftForge.EVENT_BUS.register(this);
    }
 
    @SubscribeEvent
    public void registerItems(RegistryEvent.Register<Item> event) {
        event.getRegistry().register(COLOR_ALUMINIUM);
    }
 
    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public void registerModels(ModelRegistryEvent event) {
        //メタデータの分だけモデルを登録する。
        for(int i = 0; i < 16; i++){
            ModelLoader.setCustomModelResourceLocation(COLOR_ALUMINIUM, i, new ModelResourceLocation(new ResourceLocation("aluminiummod", "color_aluminium_" + i), "inventory"));
        }
    }
 

  • ItemColorAluminium.java
package com.tntmodders.tutorial;
 
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
 
public class ItemColorAluminium extends Item {
 
    public ItemColorAluminium() {
        super();
        this.setRegistryName("aluminiummod", "color_aluminium");
        this.setCreativeTab(CreativeTabs.MATERIALS);
        this.setUnlocalizedName("color_aluminium");
        //メタデータありのアイテムとして登録する。
        this.setHasSubtypes(true);
        this.setMaxDamage(0);
    }
 
    //翻訳名を変更する。後ろに.nameが着くためその前まで。
    public String getUnlocalizedName(ItemStack stack) {
        int i = stack.getMetadata();
        return "item.color_aluminium." + i;
    }
 
    //クリエイティブタブに複数のアイテムを登録する。
    @SideOnly(Side.CLIENT)
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
        if (this.isInCreativeTab(tab)) {
            for (int i = 0; i < 16; ++i) {
                items.add(new ItemStack(this, 1, i));
            }
        }
    }
}
 

アセット

  • color_aluminium_0.json
メタデータ0のもののみサンプルとして示す。今回はテクスチャはアルミニウムと同じものを使う。
メタデータを変更したモデルも作る必要があり、これは最後の数字をメタデータに対応させれば良い。
src/main/resources/assets/aluminiummod/models/item/に配置する
{
  "parent": "item/generated",
  "textures": {
    "layer0": "aluminiummod:items/color_aluminium_0"
  }
}
 

  • en_US.lang
src/main/resources/assets/aluminiummod/lang/に配置する
#AluminiumMod English Langage File
item.color_aluminium.0.name=white colored aluminium
item.color_aluminium.1.name=orange colored aluminium
item.color_aluminium.2.name=magenta colored aluminium
item.color_aluminium.3.name=light blue colored aluminium
item.color_aluminium.4.name=yellow colored aluminium
item.color_aluminium.5.name=lime colored aluminium
item.color_aluminium.6.name=pink colored aluminium
item.color_aluminium.7.name=gray colored aluminium
item.color_aluminium.8.name=sliver colored aluminium
item.color_aluminium.9.name=cyan colored aluminium
item.color_aluminium.10.name=purple colored aluminium
item.color_aluminium.11.name=blue colored aluminium
item.color_aluminium.12.name=brown colored aluminium
item.color_aluminium.13.name=green colored aluminium
item.color_aluminium.14.name=red colored aluminium
item.color_aluminium.15.name=black colored aluminium
 

  • ja_JP.lang
src/main/resources/assets/aluminiummod/lang/に配置する
#アルミニウムMOD 日本語言語ファイル
item.color_aluminium.0.name=白色アルミニウム
item.color_aluminium.1.name=橙色アルミニウム
item.color_aluminium.2.name=紅紫色アルミニウム
item.color_aluminium.3.name=空色アルミニウム
item.color_aluminium.4.name=黄色アルミニウム
item.color_aluminium.5.name=黄緑色アルミニウム
item.color_aluminium.6.name=桃色アルミニウム
item.color_aluminium.7.name=灰色アルミニウム
item.color_aluminium.8.name=銀色アルミニウム
item.color_aluminium.9.name=青緑色アルミニウム
item.color_aluminium.10.name=紫色アルミニウム
item.color_aluminium.11.name=青色アルミニウム
item.color_aluminium.12.name=茶色アルミニウム
item.color_aluminium.13.name=緑色アルミニウム
item.color_aluminium.14.name=赤色アルミニウム
item.color_aluminium.15.name=黒色アルミニウム
 

解説

AluminiumMod.java

ここはだいたいアイテム追加と一緒。モデルの登録だけメタデータ分やろう。

ItemColorAluminium.java

setHasSubtypes(boolean hasSubTypes)

メタデータを持つアイテムということを登録する。デフォルトでfalseになっているため、コンストラクターでtrueにしてやる。

public String getUnlocalizedName(ItemStack stack)

翻訳名を指定するメソッド。
ここでは"item.<翻訳名>.name"の中の".name"を除いた文字列を返す。
その為、翻訳名をメタデータに依存するものにする場合はItemStackから取ったメタデータを使って末尾に数値をつける。

public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items)

アイテムをクリエイティブに登録する。ここでメタデータを含むアイテムスタックを登録することが出来る。
因みに、ここでアイテムスタックに対してエンチャントやデータを付与できる。
+ ここではシルクタッチのエンチャントを付与し、更にクリエイティブタブで64個スタックされた状態にしている。
@SideOnly(Side.CLIENT)
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
        if (this.isInCreativeTab(tab)) {
            for (int i = 0; i < 16; ++i) {
                ItemStack itemStack = new ItemStack(this, 1, i);
                itemStack.addEnchantment(Enchantments.SILK_TOUCH,1);
                itemStack.setCount(64);
                items.add(itemStack);
            }
        }
    }
 

color_aluminium_<メタデータ>.json

各メタデータごとにテクスチャを指定するモデルを作る。

コメント

この項目に関する質問などをどうぞ。
最終更新:2017年08月07日 22:47