Поворот текстуры сверху на блоке

210
1
19
Когда мы ставим, к примеру, печь или голову, блок встает к нам лицевой стороной.  
Как я понимаю, эта функция реализовывается чем-то вроде этого: (нагуглено)

@Override
publicvoid 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);}

Подскажите, пожалуйста, как должен выглядеть код, который будет поворачивать верхнюю текстуру блока?
 
643
6
14
Я создавал переменную blockTopText и плюсовал ее в ротейте.
 
210
1
19
Я с Forge только начинаю знакомиться, поэтому такое мне, наверное, не по зубам. Пытаюсь решить вопрос, анализируя существующие блоки.
Вот, например, наковальня - она поворачивается к игроку. В её классе нашел такое:

    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item){
   
        int var7 = MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
        int var8 = world.getBlockMetadata(x, y, z) >> 2;
        ++var7;
        var7 %= 4;


        if (var7 == 0)
        {
        world.setBlockMetadataWithNotify(x, y, z, 2 | var8 << 2, 2);
        }


        if (var7 == 1)
        {
        world.setBlockMetadataWithNotify(x, y, z, 3 | var8 << 2, 2);
        }


        if (var7 == 2)
        {
        world.setBlockMetadataWithNotify(x, y, z, 0 | var8 << 2, 2);
        }


        if (var7 == 3)
        {
        world.setBlockMetadataWithNotify(x, y, z, 1 | var8 << 2, 2);
        }
        
    }


Но всё, на что я способен - это вставить его в класс своего блока. И это не работает. Можете помочь?
 
В onBlockPlacedBy задаёшь метадату блоку(смотри печку или buildcraft). А в getIcon...(args) возвращаешь текстуры сторон основываясь на данных в аргументах стороне и метадате(смотри печку или buildcraft) и текстуру верхней стороны по такому же принципу выбираешь.
 
210
1
19
Я понял технологию. Только я не понимаю, как переписать эти блоки. Ладно, попробую разобраться.
 
210
1
19
Сложил в голове все осколки информации и сделал так:
http://pastebin.ru/EhJYHVH2

Не работает, так как процедура registerBlockIcons не запускается каждый раз, когда я ставлю блок. Поэтому dir всегда равен 0, а текстура всегда одна и та же.

Что я делаю не так? И куда мне двигаться дальше?
 

CumingSoon

Местный стендапер
1,634
12
269
Регистрируй все свои текстуры,а в методе getIcon в зависимости от стороны возвращай текстуру, которая тебе нужна(из массива, в котором регистрировал сначала). Как то так
 
210
1
19
Попробовал сделать так. Вот итоговый код:
http://pastebin.ru/fxU1mhET

Получилось следующее:

Раз:
Tyn2sHadeb.png


Два:
qNLXynPfu4.png


Три:
WNzwrb93lg.png


Четыре:
VX8tDAVcZr.png


Если непонятно, то на словах расскажу. Когда я ставлю блоки с разных ракурсов, текстура наверху заменяется. На блоке, который я ставлю. А ещё - на блоках, которые я ставил ранее, и на блоке, который я держу в руке. :lol:

А если перезайти в игру - все текстуры меняются на исходную.

Как мне решить эту задачу?
 
По тому что Block это тип блока и переменная dir у всех блоков этого типа общая. Сохраняй её в метадау и при выборе текстуры используй не dir, а meta.

И не надо забивать память этим:
Код:
icons[2] = reg.registerIcon(Main.MODID + ":" + "asphalt_side");
icons[3] = reg.registerIcon(Main.MODID + ":" + "asphalt_side");
icons[4] = reg.registerIcon(Main.MODID + ":" + "asphalt_side");
icons[5] = reg.registerIcon(Main.MODID + ":" + "asphalt_side");
Тебе нужно только 4 индекса для нижней, боковой и двух верхних текстур. просто возвращай нужную по условиям в getIcone.
 
210
1
19
Забивание памяти я исправил:
http://pastebin.ru/F73NZpqQ

Но что мне делать с meta, я не понимаю (не умею).

Кстати, переменная dir - это моя переменная, которая принимает значение от 0 до 3 в зависимости от направления, куда смотрел игрок, когда ставил блок...
 
Я вижу что она твоя. Просто любые переменные в классе блока одинаковы для всех таких блоков. Сохраняй значение не в переменную, а в метадату(par1World.setBlockMetadataWithNotify(args)) и потом в getIconе возвращаешь нужную текстуру. Метадату там в аргументах дают.
 

svk

1,185
2
Я же писал уже.
А) делаешь свой рендер
Б) ставишь на верх, предварительно заготовленную повёрнутую текстуру, в зависимости от направления
 
210
1
19
Мозг кипит уже.
Короче, я спер методы из печки и сейчас код выглядит так:
http://pastebin.ru/jGyHHqzu

Понимаю, что нужно что-то поменять в getIcon и в onBlockPlacedBy, но пока не доходит, что и на что. Помогите, пожалуйста, уже полдня сижу над этим блоком.

Я вообще не могу понять, как работает setBlockMetadataWithNotify. Что за цифры там? Что они означают?
Более того, я не до конца понимаю (а лишь местами догадываюсь), в каком порядке и при каких условиях работают процедуры в моем классе.
 

svk

1,185
2
this.side = icon.registerIcon(Main.MODID + ":" + "asphalt_side");//Пример

Регестрируешь свои 4 иконки верхней стороны (Для твоей дороги можно и 2)

Код:
@SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
//Проверяешь метадату, которую ты задал ранее, в зависимости от направления блока (У тебя вроде рабочий код) и ставишь возвращаешь нужную тебе тектуру, в зависимости от направления (которое олицетворяется метадатой)
    }
[merge_posts_bbcode]Добавлено: 25.10.2015 18:00:28[/merge_posts_bbcode]

А, ну ещё проверяешь если side=(Код верхней стороны)
 
210
1
19
Сейчас код выглядит так:
http://pastebin.ru/NdhNZsR5


У меня есть четыре текстуры: низ, бок и две текстуры верха.
Вся задача состоит в том, чтобы выбор текстуры верха происходил в зависимости от того, в какую сторону смотрит игрок, который ставит блок.
В registerBlockIcons я присвоил текстуры каждой IIcon.

getIcon присваивает каждой стороне блока нужную IIcon. При этом я присваиваю тут только текстуру top1, куда мне девать текстуру top2 - я не понимаю. Это проблема номер раз.

В процедуру onBlockPlacedBy мы определяем направление взгляда игрока и соответственным образом что-то там присваиваем с помощью setBlockMetadataWithNotify блоку перед нами. Я не понимаю, как мне настроить эту процедуру, так как мне непонятно, как работает setBlockMetadataWithNotify. Я пробовал менять цифры, но разницы не увидел. Это проблема номер два.

Что мне делать?
 

CumingSoon

Местный стендапер
1,634
12
269
Тебе 2 текстуры по теории нужны. Верхняя и все остальные
 
210
1
19
CoomingSoon написал(а):
Тебе 2 текстуры по теории нужны. Верхняя и все остальные
Не согласен. Но это неважно, так как речь идет о решении другой проблемы.
 
сетБлокМета... задаёт блоку стоящему в заданных координатах заданную метадату. в getIcon есть аргумент meta - метадата блока. В getIconе проверяешь:
Код:
Если (side == <номер верхней стороны>) и (meta == <допустим 0>), то
вернуть первую текстуру верха
elseif (side == <номер верхней стороны>) и (meta == <допустим 1>), то
вернуть вторую текстуру верха.
 
210
1
19
LeonidM/Dasperal написал(а):
сетБлокМета... задаёт блоку стоящему в заданных координатах заданную метадату. в getIcon есть аргумент meta - метадата блока. В getIconе проверяешь:
Код:
Если (side == <номер верхней стороны>) и (meta == <допустим 0>), то
вернуть первую текстуру верха
elseif (side == <номер верхней стороны>) и (meta == <допустим 1>), то
вернуть вторую текстуру верха.

Еще подумал и допёр. И сделал. Спасибо за подсказку.
 
210
1
19
Чтоб не создавать новую тему: как сделать мой блок падающим, как песок?
 
Сверху