Метадата

Версия Minecraft
1.12.2
10
0
Помогите медатаду на предметы сделать, как у красителей например (123:0 , 123:1 , 123:2 )
Я еще чайник и не очень понял как сделать =(
 
1,159
38
544
Знаю как сделать это для 1.7.10. Может и на 1.12.2 это актуально. Сначала тебе нужно в конструкторе твоего итема вызвать this.setHasSubtypes(true);, чтобы пометить этот предмет, что он имеет подтипы. Далее тебе нужно в этом же конструкторе вызвать this.setMaxDamage(ЧИСЛО);, чтобы опеределить диапазон метадат от 0 до итема с последней метадатой. Это нужно чтобы ты мог сравнивать субтипы по метадате.

Потом оверрайдишь метод, который вернет субтипы:
Java:
/**
     * Создание субтипов
     * @param item TODO: Добавить Javadoc
     * @param tab TODO: Добавить Javadoc
     * @param list TODO: Добавить Javadoc
     */
    @Override
    public void getSubItems(Item item, CreativeTabs tab, List list) {
        for (int i = 0; i < this.icons.length; ++i) {
            list.add(new ItemStack(item, 1, i));
        }
}

Теперь по иконкам - Субтипы будут различаться на основе метадаты (в 1.7.10 называется Damage). Так что для разной метадаты нам нужно возвращать разную иконку (тебе ведь это нужно?)

Java:
/**
     * Регистрирует иконку для каждого подтипа статы
     * @param reg TODO: Добавить Javadoc
     */
    @Override
    public void registerIcons(IIconRegister reg) {
        for (int i = 0; i < this.icons.length; ++i) {
            this.icons[i] = reg.registerIcon(registerIconPrefix + (i + 1));
        }
    }

    /**
     * Возвращает иконку, соответствующую субтипу.
     * @param meta Порядковый номер субтипа
     * @return Икнока, соответвующая субтипу
     */
    @Override
    public IIcon getIconFromDamage(int meta) {
        if (meta > this.icons.length) {
            meta = 0;
        }
        return this.icons[meta];
}

И последнее, но не менее важное. Оверрайди этот метод, дабы не показывать полоску повреждений предмета.

Java:
@Override
    public boolean showDurabilityBar(ItemStack stack) {
        return false;
    }

Но лично для меня тут есть кое-что непонятное. Получается, что прочность и субтипы различаются на основании одного и того же числа - метадаты. Мне кажется это не совсем логичным, ведь как например тогда сделать субтипы мечей с отображением прочности, если метадата уже используется для различения субтипов? Хотя, скорее всего это я что-то делаю не так. Поправки приветствуются.
 
1,057
50
234
Пользуйся
Java:
public class ItemIngots extends Item
{
    public static String[] names =
    {
        "cobaltum",      //0       
        "magnesium",    //1
        "nickel"        //2
    };

    public ItemIngots()
    {
        super();
        this.setMaxDamage(0);
        this.setHasSubtypes(true);
        this.setMaxStackSize(64);
        this.setUnlocalizedName("ingots"); 
        this.setCreativeTab(GSCreativeTabs.GSItemsTab);
    }

    @Override
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> list)   
    {
        if (tab == GSCreativeTabs.GSItemsTab || tab == CreativeTabs.SEARCH)
        {
            for (int i = 0; i < ItemIngots.names.length; i++)
            {
                list.add(new ItemStack(this, 1, i));
            }
        }
    }

    @Override
    public String getUnlocalizedName(ItemStack par1ItemStack)
    {
        return "item." + this.names[par1ItemStack.getItemDamage()];
    }

    @Override
    public int getMetadata(int par1)
    {
        return par1;
    }

}
 
  • Like
Реакции: Bs01
10
0
А как теперь правильно это зарегистрировать?
И в самих предметах, что-то писать надо?
Код:
package ru.bs.vancraft.items.metadata.mallet;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import ru.bs.vancraft.main;

public class MalletTypes extends Item
{
    public static String[] names =
    {
        "cobaltum",      //0       
        "magnesium",    //1
        "nickel"        //2
    };

    public MalletTypes()
    {
        super();
        this.setMaxDamage(0);
        this.setHasSubtypes(true);
        this.setMaxStackSize(64);
        this.setUnlocalizedName("mallet");
        this.setCreativeTab(main.CREATIVE_TAB);
    }

    @Override
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> list)   
    {
        if (tab == main.CREATIVE_TAB || tab == CreativeTabs.SEARCH)
        {
            for (int i = 0; i < MalletTypes.names.length; i++)
            {
                list.add(new ItemStack(this, 1, i));
            }
        }
    }

    @Override
    public String getUnlocalizedName(ItemStack par1ItemStack)
    {
        return "item." + this.names[par1ItemStack.getItemDamage()];
    }

    @Override
    public int getMetadata(int par1)
    {
        return par1;
    }

}

Код:
public class InitItems
{
    
    public static final List<Item> ITEMS = new ArrayList<Item>();
    
    //Material
    public static final ToolMaterial EMERALD_DIAMOND_M = EnumHelper.addToolMaterial("emerald_diamond_m", 4, 3999, 13.0F, 4.0F, 10);
    
    //Items
    public static final Item HAMMER = new ToolHammer("tool_hammer");                                                                             
    public static final Item IRON_STICK = new ItemIronStick("iron_stick");                                                                     
    public static final Item FIRE_SWORD_B = new ItemFireSwordB("fire_sword_b");                                                                 
    public static final Item MAGIC_ESSENCE = new ItemMagicEssence("magic_essence");                                                               
    public static final Item DUST_SEED = new ItemDustSeed("dust_seed");
    public static final Item DUSTY_VERTEX = new ItemDustyVertex("dusty_vertex");
    public static final Item WOODEN_MALLET = new ItemWoodenMallet("wooden_mallet");
    public static final Item IRON_MALLET = new ItemIronMallet("iron_mallet");
    public static final Item DIAMOND_MALLET = new ItemDiamondMallet("diamond_mallet");
    public static final Item STONE_MALLET = new ItemStoneMallet("stone_mallet");
    public static final Item DAISY_PETAL = new ItemDaisyPetal("daisy_petal");
    
    //resources
    public static final Item B_EM_DIAMOND = new ItemBEmDiamond("b_em_diamond");                                                                   
    public static final Item EM_DIAMOND = new ItemEmDiamond("em_diamond");                                                                       
    public static final Item DIAMOND_NUGGET = new ItemDiamondNugget("diamond_nugget");                                                                                                         
    public static final Item GROWN_CRYSTAL = new ItemGrownCrystal("grown_crystal");
    public static final Item UNSTABLE_CRYSTAL = new ItemUnstableCrystal("unstable_crystal");


    
    //Tool
    public static final ItemPickaxe EMERALD_DIAMOND_PICKAXE = new ItemEmeraldDiamondPickaxe("emerald_diamond_pickaxe", EMERALD_DIAMOND_M);         
    public static final ItemSword FIRE_SWORD = new ItemFireSword("fire_sword", EMERALD_DIAMOND_M);                                                 
    
}

(Не знаю почему, но над метадатой я очень сильно затупил, извиняюсь за свою тупость с: )
 
1,057
50
234
ClientProxy:
Java:
//где-нить в init
int i = 0;
    for(String ingots : ItemIngots.names)     
        registerItemJson(GalaxySpace.TEXTURE_PREFIX, GSItems.INGOTS, i++, "ingots/" + ingots);

public static void registerItemJson(String texturePrefix, Item item, int meta, String name)
{
    FMLClientHandler.instance().getClient().getRenderItem().getItemModelMesher().register(item, meta, new ModelResourceLocation(texturePrefix + name, "inventory"));
}

@Override
public void registerVariants()
{
    addVariant("ingots", "ingots/", ItemIngots.names);
}
//Это где-нить в хандлере эвентов
@SubscribeEvent
public static void registerModels(ModelRegistryEvent event) {
Mod.proxy.registerVariants();
}

Java:
private static void addVariant(String name, String folder, String... variants)
    {
        Item itemBlockVariants = Item.REGISTRY.getObject(new ResourceLocation(GalaxySpace.MODID, name));
        ResourceLocation[] variants0 = new ResourceLocation[variants.length];
        for (int i = 0; i < variants.length; ++i) {
            variants0[i] = new ResourceLocation(GalaxySpace.MODID + ":" + folder + variants[i]);
        }
        ModelBakery.registerItemVariants(itemBlockVariants, variants0);       
    }
 
16
0
Господа, возникла та же проблема, но здесь решения я не вижу.

Нужно создать ряд инструментов с субтипами, но и с полосками прочности. На данный момент получается так, что текущая прочность субтипа зависит от metadata (и наоборот), а значит, инструменты создаются с разным уровнем прочности и при ее уменьшении их субтипы меняются.

Делал я примерно как у BlesseNtumble, разве что использовал Enum для перечисления субтипов.

Есть у кого решение или идеи? Я думал насчет переопределения и хранения ее в NBT, но я не уверен, что это лучший путь.
 
16
0
Материал не проблема. Для упрощения можно считать, что у всех субтипов он одинаковый.

Очень не хочется делать каждый субтип со своим ID. У меня 7 их на предмет, самих предметов около 50. Соответственно, это 350 ID.

UPD: Решил переопределить методы выставления/получения субтипов и метадаты. Совсем меня не устраивает то, что в майновском Item. Как сделаю, опубликую тут класс.
 
Последнее редактирование:
7,099
324
1,509
Можно просто сделать фабрику предметов и нарегать сколько и какие нужно
 
Сверху