Мета для блока

Версия Minecraft
1.12.2
57
2
0
Здравствуйте, форумчане! Всех с Новым 2020 Годом!
У меня есть проблема с отображением текстур блока в инвентаре, у которого есть мета (в мир всё ставится нормально, с текстурой). Всё делал по гайду @Maxik. Во время компиляции в консоли нашел это:
Note: C:\Users\sasha\OneDrive\Рабочий стол\Ultimate Technology\root\build\sources\main\java\com\sqcode\utech\blocks\StructureBlock.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details.

Мне кажется, что гайд немного устарел (слова deprecated api). И вот еще, нелокализованное имя выглядит как tile.structblock.cobblestone.name и на втором блоке tile.structblock.mossy_cobblestone.name. Хотя, по моей задумке, должно быть tile.structblock.0.name (вместо нуля 1, 2 и т.д.) Помогите, пожалуйста, с решением проблемы. Весь код прилагается.

Код метаблока:
package com.sqcode.utech.blocks;

import com.sqcode.utech.Main;
import com.sqcode.utech.items.ItemsRegister;

import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.NonNullList;

public class StructureBlock extends Block
{
    public static final PropertyEnum<StructureBlock.EnumType> VARIANT = PropertyEnum.<StructureBlock.EnumType>create("variant", StructureBlock.EnumType.class);
    
    public StructureBlock(String name, Material material, int picklvl)
    {
        super(material);
        
        setRegistryName(name);
        setUnlocalizedName(name);
        setHardness(5.5F);
        setHarvestLevel("pickaxe", picklvl);
        setCreativeTab(Main.TAB);
        setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, StructureBlock.EnumType.REFRACTORY_BRICKS));
        
        ItemBlockStructure ibs = new ItemBlockStructure(this);
        
        BlocksRegister.BLOCKS.add(this);
        ItemsRegister.ITEMS.add(ibs.setRegistryName(this.getRegistryName()));
    }
    
    public int damageDropped(IBlockState state)
    {
        return ((StructureBlock.EnumType)state.getValue(VARIANT)).getMetadata();
    }
    
    public void getSubBlocks(CreativeTabs itemIn, NonNullList<ItemStack> items)
    {
        for(StructureBlock.EnumType enumtype : StructureBlock.EnumType.values())
        {
            items.add(new ItemStack(this, 1, enumtype.getMetadata()));
        }
    }
    
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(VARIANT, StructureBlock.EnumType.byMetadata(meta));
    }
    
    public int getMetaFromState(IBlockState state)
    {
        return ((StructureBlock.EnumType)state.getValue(VARIANT)).getMetadata();
    }
    
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[]{VARIANT});
    }
    
    public static enum EnumType implements IStringSerializable
    {
        REFRACTORY_BRICKS(0, MapColor.BROWN, "0", false),
        BRONZE(1, MapColor.ORANGE_STAINED_HARDENED_CLAY, "1", false);
        
        private static final StructureBlock.EnumType[] META_LOOKUP = new StructureBlock.EnumType[values().length];
        private final int meta;
        private final String name;
        private final String unlocalizedName;
        private final MapColor mapColor;
        private final boolean isNatural;
        
        private EnumType(int meta, MapColor mapColor, String name, boolean isNatural)
        {
            this(meta, mapColor, name, name, isNatural);
        }
        
        private EnumType(int meta, MapColor mapColor, String name, String uname, boolean isNatural)
        {
            this.meta = meta;
            this.name = name;
            this.unlocalizedName = uname;
            this.mapColor = mapColor;
            this.isNatural = isNatural;
        }
        
        public int getMetadata()
        {
            return this.meta;
        }
        
        public MapColor getMapColor()
        {
            return this.mapColor;
        }
        
        public String toString()
        {
            return this.name;
        }
        
        public static StructureBlock.EnumType byMetadata(int meta)
        {
            if(meta < 0 || meta >= META_LOOKUP.length)
            {
                meta = 0;
            }
            
            return META_LOOKUP[meta];
        }
        
        public String getName()
        {
            return this.name;
        }
        
        public String getUnlocalizedName()
        {
            return this.unlocalizedName;
        }
        
        public boolean isNatural()
        {
            return this.isNatural;
        }
        
        static
        {
            for(StructureBlock.EnumType enumtype : values())
            {
                META_LOOKUP[enumtype.getMetadata()] = enumtype;
            }
        }
    }
}

ItemBlock метаблока:
package com.sqcode.utech.blocks;

import net.minecraft.block.Block;
import net.minecraft.block.BlockWall.EnumType;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemMultiTexture;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;

public class ItemBlockStructure extends ItemMultiTexture
{
    public ItemBlockStructure(Block block)
    {
        super(block, block, new String[] {"refractory_bricks", "bronze"});
        
        setHasSubtypes(true);
    }

    @Override
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items)
    {
        if(this.isInCreativeTab(tab))
        {
            this.block.getSubBlocks(tab, items);
        }
    }
    
    @Override
    public String getUnlocalizedName(ItemStack stack)
    {
        return super.getUnlocalizedName() + "." + EnumType.byMetadata(stack.getMetadata()).getName();
    }
}

Регистрация моделей:
package com.sqcode.utech.blocks;

import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class RegMetaBlocks
{
    @SubscribeEvent
    public void registerMetaBlocks(ModelRegistryEvent event)
    {
        register(BlocksRegister.STRUCTURE_BLOCK);
    }
    
    public void register(Block block)
    {
        for(StructureBlock.EnumType type : StructureBlock.EnumType.values())
        {
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), type.getMetadata(), new ModelResourceLocation(block.getRegistryName() + "_" + type.getName(), "inventory"));
        }
    }
}

ClientProxy:
package com.sqcode.utech.proxy;

import com.sqcode.utech.blocks.RegMetaBlocks;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;

public class ClientProxy extends CommonProxy
{
    @EventHandler
    public void preInit(FMLInitializationEvent event)
    {
        MinecraftForge.EVENT_BUS.register(new RegMetaBlocks());
    }
    
    public void registerItemRenderer(Item item, int meta, String id)
    {
        ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), id));
    }
}

BlocksRegister:
package com.sqcode.utech.blocks;

import java.util.ArrayList;
import java.util.List;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;

public class BlocksRegister
{   
    public static final List<Block> BLOCKS = new ArrayList<Block>();
    
    public static final Block CHALCOPYRITE = new OreBase("chalcopyrite", Material.ROCK, 1, "CuFeS2");
    public static final Block MALACHITE = new OreBase("malachite", Material.ROCK, 2, "CuHCO4");
    public static final Block TETRAHEDRITE = new OreBase("tetrahedrite", Material.ROCK, 2, "Cu3SbS3");
    public static final Block COVELLITE = new OreBase("covellite", Material.ROCK, 1, "CuS");
    
    public static final Block STRUCTURE_BLOCK = new StructureBlock("structblock", Material.ROCK, 1);
}
 
5,018
47
783
ИтемБлок ты как раз и делаешь для того, чтобы присвоить различные нелокализованные имена своим блокам. То есть свои цифры ты должен писать в ItemBlock. Гайд не устарел, это у всех такая аннотация на 1.12.2.
 
5,018
47
783
7,099
324
1,510
Нужно имя блока в инвентаре, зависящее от меты?
Если да, то:
  • Создаешь свой ItemBlock
  • Переорпделеяешь getUnlocalizedName
  • Делаешь зависимость результата от stack.getMetadata. В самом простом случае можно if-ов проверять значение метадаты стака и выдавать соответствующее имя. В примере типы блоков задаются енумом с IStringSerializable, поэтому можно получать из енума имена.
  • Регистрируешь свой итем-блок как обычный итем. Т.е. через событие RegistryEvent.Register<Item>
 
Последнее редактирование:
Сверху