[1.7.10] Как этим управлять? Наложение текстуры на грань блока.

667
7
2
Всем привет. Не как не могу разобраться с порядком наложения текстуры на разно текстурный блок. Сами текстуры накладываются нормально. Но метод наложения текстур оставляет вопросы. Использую это:
Код:
public IIcon getIcon(int a,int b)
{
    return 
        a == 1 ? 
        top : (a == 0 ? 
        top : (b == 2 && a == 2 ? 
        front : (b == 3 && a == 5 ? 
        front : (b == 0 && a == 3 ? 
        front : (b == 1 && a == 4 ?
        front : side)))));
}
Что это понятно, но с чем это едят...
 
Сколько можно цитировать...
[merge_posts_bbcode]Добавлено: 05.06.2016 10:01:14[/merge_posts_bbcode]

А вот если-бы ты читал доки и восстанавливал названия аргументов, у тебя бы не возникало таких тупых вопросов.
 
Короче, это ив в ифе в ифе в ифе в ифе в ифе. И он проверяет что цеплять на каждую из сторон, в зависимости от метадаты. В строку это понятнее:
Код:
 a == 1 ? top : (a == 0 ? top : (b == 2 && a == 2 ? front : (b == 3 && a == 5 ? front : (b == 0 && a == 3 ? front : (b == 1 && a == 4 ? front : side)))));
А вот так это будет в привычном if-else:
Код:
        if (side == 1) {
            return topTexture;
        } else if (side == 0) {
            return topTexture;
        } else if (meta == 2 && side == 2) {
            return frontTexture;
        } else if (meta == 3 && side == 5) {
            return frontTexture;
        } else if (meta == 0 && side == 3) {
            return frontTexture;
        } else if (meta == 1 && side == 4) {
            return frontTexture;
        } else {
            return sideTexture;
        }
 
Пробовал изменить сторону 3
Код:
a == 1 ?
top : (a == 0 ?
top : (b == 2 && a == 2 ?
front : (b == 3 && a == 5 ?
back: (b == 0 && a == 3 ?
front : (b == 1 && a == 4 ?
front : side)))));
Но текстура осталась такой же что и была до этого. Нужно делать что то с метадатой еще?
 
Там сложна)) легче через массив
[merge_posts_bbcode]Добавлено: 06.06.2016 00:35:28[/merge_posts_bbcode]

Вернее, не то чтобы сложно, но и не так просто, как кажется))
 
AlexSocol написал(а):
Там сложна)) легче через массив
[merge_posts_bbcode]Добавлено: 06.06.2016 00:35:28[/merge_posts_bbcode]

Вернее, не то чтобы сложно, но и не так просто, как кажется))
C массивом намного проще но есть одно но, поворот не работает. Может надо как то по другому делать? Я делал так
Код:
public void onBlockPlacedBy(World par1World, int par2int, int par3int, int par4int, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
{
    int i = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
    par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, i, 2);
}
 
Вот Agravaine правильно говорит. Что мешает тебе переименовать эти a и b?
Метадату ты должен выставлять в зависимости от поворота блока, а в этом методе в зависимсоти от стороны и метадаты выдавать нужную иконку.
Можешь в этот же код вставить System.out.println() и посмотреть, какая у тебя устанавливается метадата.
Также стоит вручную на бумажке расписать все возможные случаи, а потом написать соответствующий код.
Код:
    public IIcon getIcon(int side, int meta) {
        ForgeDirection dir = ForgeDirection.getOrientation(side);
        ForgeDirection block_dir;
        if (meta != 0)
            block_dir = ForgeDirection.getOrientation(meta);
        else
            block_dir = ForgeDirection.WEST; // Блок в инвентаре.
        if (block_dir == dir) return blockIcon_front;
        if (block_dir.getOpposite() == dir) return blockIcon_back;
        if (dir == ForgeDirection.UP) return blockIcon_top;
        if (dir == ForgeDirection.DOWN) return blockIcon_bottom;
        return blockIcon_side;
    }

    // Метадата выставляется в сответствии с печкой.
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z,
            EntityLivingBase entity, ItemStack itemStack) {
        super.onBlockPlacedBy(world, x, y, z, entity, itemStack);
        int dir = (MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3);
        int[] r = {2, 5, 3, 4};
        world.setBlockMetadataWithNotify(x, y, z, r[dir], 3);
    }
Так заметно проще. А не кажется ли тебе, что если перименовать side и meta на твои a и b, то станет менее понятно?
 
Назад
Сверху