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

Статус
В этой теме нельзя размещать новые ответы.
1,308
83
556
В общем, я захотел сделать несколько одинаковых блоков с одним ID, но с разной metadata. С выводом во вкладке креатива проблему решил.

Возникла проблема с установкой и разрушением блоков - метадата попросту не учитывается.

p.s. Очень не хватает гайда по работе с metadata, использовать много ID не хочу, ибо много строк в конфиге пилить нужно и т.д.
 
Посмотреть ItemColored вполне достаточно.
Код:
   /**
     * Determines the damage on the item the block drops. Used in cloth and wood.
     */
    public int damageDropped(int par1)
    {
        return par1;
    }
Этот метод назначает нужную метадату итему при дропе с блока. В данном случае свою.
Во вкладку креатива добавлял все блоки через
Код:
public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)

?
 
Смотрел это. Ещё есть проблема с установкой и определением блока в творческом режиме (когда кликаю колесом мыши). - решено с помощью damageDropped()

Установку сделал так:
Код:
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemstack) {
        world.setBlockMetadataWithNotify(x, y, z, itemstack.getItemDamage(), 4);
    }
Правильно ли это? Будет ли работать, если блоку установит не игрок, а какой-нибудь механизм?
 
LwV5iTV.png

Вырезка из ItemBlock. При установке блока через итемстак достается метадата предмета, дальше вызывается метод onBlockPlaced, который по дефолту возвращает последний аргумент (выдержка из класса Block):

Код:
 /**
     * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata
     */
    public int onBlockPlaced(World par1World, int par2, int par3, int par4, int par5, float par6, float par7, float par8, int par9)
    {
        return par9;
    }
И в конце через условие устанавливается блок с нужной метадатой. Так что всё должно работать без дополнительных методов, если ты конечно используешь примерно следующее для создания предметов для каждой метадаты у блока:

Код:
    public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
    {
        par3List.add(new ItemStack(par1, 1, 0));
        par3List.add(new ItemStack(par1, 1, 1));
        par3List.add(new ItemStack(par1, 1, 2));
        par3List.add(new ItemStack(par1, 1, 3));
    }

Кстати, если что, я беру данные из версии 1.6.4.

Загляни в тот же BlockWood, там нигде не устанавливается вручную метадата при событии постановки блока. Это автоматически должен делать предмет блока при использовании.
 
Не могу понять в чём дело. Версия как раз 1.6.4.
Код:
public class BlockElevator extends Block {

    private Icon textureTop;
    private final Icon[] textureSide;

    private final static int METADATA_COUNT = 4;

    public BlockElevator(int id) {

        super(id, Material.glass);
        this.setHardness(2.0F);
        this.setResistance(10.0F);
        this.setCreativeTab(RedServerMod.creativeTab);
        this.setStepSound(soundGlassFootstep);

        textureSide = new Icon[METADATA_COUNT];
        
        this.setUnlocalizedName("blockElevator");

    }
    
    @Override
    public int damageDropped(int meta){
        return meta;
    }

    @Override
    public void getSubBlocks(int id, CreativeTabs tab, List list) {
        list.add(new ItemStack(id, 1, 0));
        list.add(new ItemStack(id, 1, 1));
        list.add(new ItemStack(id, 1, 2));
        list.add(new ItemStack(id, 1, 3));
    }

    @Override
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
        //world.getBlockMetadata(x, y, z);
        return null;
    }

    @Override
    public Icon getIcon(int side, int metadata) {
        if (metadata >= METADATA_COUNT) {
            metadata = METADATA_COUNT - 1;
        }
        return (side == 0 || side == 1) ? textureTop : textureSide[metadata];
    }

    @Override
    public void registerIcons(IconRegister register) {
        textureTop = register.registerIcon("elevator_top");
        textureSide[0] = register.registerIcon("elevator_up_side");
        textureSide[1] = register.registerIcon("elevator_down_side");
        textureSide[2] = register.registerIcon("elevator_hspeed_up_side");
        textureSide[3] = register.registerIcon("elevator_hspeed_down_side");
    }

    @Override
    public boolean isOpaqueCube() {
        return false;
    }

    @Override
    public boolean renderAsNormalBlock() {
        return false;
    }

}
 
Таак, нашел кое-что:

Код:
Item.itemsList[planks.blockID] = (new ItemMultiTextureTile(planks.blockID - 256, planks, BlockWood.woodType)).setUnlocalizedName("wood");
Значит тебе нужен ItemMultiTextureTile, туда надо передавать ID предмета (т.е. ID блока-256), сам класс блока и массив с unlocalized именами.

По сути это подмена предмета твоего блока. Ну, у каждого блока есть свой предмет - ItemBlock, ты его подменяешь на вот такой. Либо попробуй ItemColored.
 
Спасибо! Решил проблему. В моём ItemBlock не хватало метода getMetadata()
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху