Целесообразность использовать метадату для брёвен

1,137
5
3
AlexSocol написал(а):
А какая метадата тогда у полностью обрезанного (без коры вообще) блока?
У брёвен по-другому чуть. Там метадата определяет ТОЛЬКО тип. Поворотов нет. Ну и мета, собственно, разная
 
1,976
68
220
Ну понятно, что тип. Текстуры ставятся в зависимости от неё. В зависимости от неё и вращаются
 
667
7
2
Так-с, попробовал делать как говорит Liahim и Asd73, повороты и текстура ведут себя очень странно. То они не так ставятся. Потом делаю по новому вообще блок получается со всех сторон в "коре".
Лучше сделаю также как и дерево.
 
667
7
2
Что то мне кажется что Minecraft не принимает одинаковую текстуру сзади и спереди, нашёл способ от Dragon2488, но всё сводится к тому что блок становится одной текстурой. Но те блоки которые я поставил ранее имеют разную текстуру. Я вообще в верном направлении? Думаю что нужно использовать это:
Код:
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int par1int, int par2int)
{
        return par1int == 1 ? BlockTestTop : (par1int == 0 ? BlockTestTop : (par2int == 2 && par1int == 2 ? BlockTestFront : (par2int == 3 && par1int == 5 ? BlockTestFront : (par2int == 0 && par1int == 3 ? BlockTestFront : (par2int == 1 && par1int == 4 ? BlockTestFront : BlockTestSide)))));
}
[merge_posts_bbcode]Добавлено: 08.07.2016 23:59:07[/merge_posts_bbcode]

Фу. Бр. Кажись я нашёл решение! Вот может кому пригодится: >Клик
 
398
4
7
Я предлагал сделать так же, как сделаны блоки древесины в майнкрафте, но для указания вида древесины использовать только ид, а не ид и метадату.
Ты можешь определить, в какую сторону света смотрит игрок?
player.rotationYaw и player.rotationPitch - направление взгляда игрока. Наглядно: http://4.bp.blogspot.com/-HKUiumbtFKg/VbD898CHbaI/AAAAAAAAAcA/pc30pPkRYww/s1600/HeadYawPitch.png
Обычно для всяких поршней и печек делают примерно так: Поворот разностороннего блока [1.7.2] Поворот Блока. но для бревен это напрямую не подходит.

virysD написал(а):
Думаю что нужно использовать это:
Код:
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int par1int, int par2int)
{
        return par1int == 1 ? BlockTestTop : (par1int == 0 ? BlockTestTop : (par2int == 2 && par1int == 2 ? BlockTestFront : (par2int == 3 && par1int == 5 ? BlockTestFront : (par2int == 0 && par1int == 3 ? BlockTestFront : (par2int == 1 && par1int == 4 ? BlockTestFront : BlockTestSide)))));
}
Этот код может работать правильно, но так писать не следует. Например, что такое par1int и par2int? А это всего навсего метадата блока и номер стороны. Что мешает дать понятные названия этим параметрам?Использование тернарного оператора тут неуместно, этот код был бы намного понятнее с if-ами или с switch.
В методе getIcon дается метадата и номер стороны, а требуется вернуть иконку, которая должна быть на этой стороне при данной метадате. Зачем искать для этого код, когда проще написать самому?

... видео, почти час... неужели не лень смотреть? Прочитать то же самое можно раз в 10 быстрее.
 
667
7
2
Бревно теперь с нормальной текстурой, но еще одна проблема, оно не совсем бревно. В отличии от дерева его не поставишь к верху. А если текстуру сделать для верхней и нижней стороны (как у дерева в руке) то оно всегда будет к верху. Пробовал "повертеть" "поворот", но из этого не чего не вышло. Смотрел в кварце там тоже не то.
 
4,045
63
645
Ну как же не то? Там всё как надо сделано.
При установке блока проверяется по какой стороне соседних блоков ты щёлкаешь. В зависимости от этого выбирается нужная мета, а уже от меты идёт нужная окраска бревна.
Плюс собственный рендер вертит текстуры на боковых сторонах.
 
398
4
7
Код:
    @SideOnly(Side.CLIENT)
    @Override
    public void registerBlockIcons(IIconRegister iconReg) {
        iconSide = iconReg.registerIcon("planks_oak"); // Берем какие-нибудь текстуры для примера.
        iconEnd = iconReg.registerIcon("planks_birch");
    }

    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int side, int meta) {
        // Используем ForgeDirection для избежания путаницы с номерами сторон.
        // Например, side == 1 соответствует верх, но если так написать код, то будет сложнее разобраться.
        ForgeDirection dir = ForgeDirection.getOrientation(side);
        switch (meta) {
            case 0: // блок направлен вверх или вниз
                if (dir == ForgeDirection.UP || dir == ForgeDirection.DOWN)
                    return iconEnd;
                return iconSide;
            case 4: // блок направлен на юг или север
                if (dir == ForgeDirection.WEST || dir == ForgeDirection.EAST)
                    return iconEnd;
                return iconSide;
            case 8: // блок направлен на запад или восток
                if (dir == ForgeDirection.SOUTH || dir == ForgeDirection.NORTH)
                    return iconEnd;
                return iconSide;
            default:
                return iconSide;
        }
    }

    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
        // метадата выставляется так же как и у древесины дуба.
        // Хотя entity.rotationYaw в градусах, но может менять значения от -360 до 360 (вроде бы),
        // поэтому берем повсеместно используемую строку:
        int dir = MathHelper.floor_double((entity.rotationYaw * 4 / 360) + 0.5) & 3;

        // entity.rotationPitch меняется от -180 до 180, т.е. горизонтальному направлению взгляда соответствует 0.
        if (entity.rotationPitch > 65F || entity.rotationPitch < -65F) {
            world.setBlockMetadataWithNotify(x, y, z, 0, 3); // вверх или вниз
        } else if (dir == 0 || dir == 2 /* юг или север */) {
            world.setBlockMetadataWithNotify(x, y, z, 8, 3);
        } else {
            world.setBlockMetadataWithNotify(x, y, z, 4, 3); // запад или восток
        }
    }
Что может быть проще? Ну не надо бездумно копипастить код, возьми один пример и разберись с ним, а потом несложно будет написать самому.
 
Сверху