[1.6.4] Как проверить условия для блока и показать его выполнение

На сайте в уроках, взаимодействие игрока с блоком, упомянуто только через удар по нему рукой, про вариант клика как по печке или сундуку не упомянуто.
Так же накрылись все видео уроки по ГУИ, а текстового варианта нет.. А также некоторые другие уроки..

Есть два блока (называть их будем блок_А и блок_Б). И так..
Как сделать что бы при наличии (к примеру) блока воды сбоку от блока_А, блок_Б (который ставится на блок_А сверху) менял текстуру сторон (и обратно если условие для блока_А перестало выполнятся)?

Также на будущие хотелось бы узнать, как подсчитать блоком_Б количество блоков_А под собой?
Как мне кажется тут сойдет код листвы, которая проверяет какое то количество себе подобных от блока бревна. Хотя максимальное количество тогда на считываемых блоков, будет не больше чем методата.
 
:blink:  то есть по сути та же тема что и у блока портала? Хотя по правде я не понимаю как блок портала(внутри портала которые появляется) проверяет условия рамки из обсидиана будучи не в мире.

А как сделать показание при выполнения условия?
 
60
0
Записываешь в метадату выполнилось ли условие, в методе getIcon - в зависимости от метадаты возвращаешь соответствующую текстуру.
 
dimka написал(а):
Записываешь в метадату выполнилось ли условие, в методе getIcon - в зависимости от метадаты возвращаешь соответствующую текстуру.
Ну дело в том что срабатывать должен блок_Б, а определять условия блок_А.
Как получить методату блока по координатам?
 
Указываю текстуру как сделано в печке
Код:
    public void registerIcons(IconRegister register)
    {
        top = register.registerIcon(ModInfo.MODID + ":test-top");
        side = register.registerIcon(isActive ? ModInfo.MODID + ":test-side_on" : ModInfo.MODID +  ":test-side_off");
        bottom = register.registerIcon(ModInfo.MODID + ":test-bottom");
    }

И написал такую фигню
Код:
public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
    {
        if (par1World.getBlockId(par2 - 1, par3-1, par4) == Block.obsidian.blockID || par1World.getBlockId(par2 + 1, par3-1, par4) == Block.obsidian.blockID || par1World.getBlockId(par2, par3-1, par4 - 1) == Block.obsidian.blockID || par1World.getBlockId(par2, par3-1, par4 + 1) == Block.obsidian.blockID)
        {
            isActive=true;
        }else{
            isActive=false;
        }
    }
Так как проверка должна идти на соседей когда они изменяются. Но на наличие обсидиана в низу блока по сторонам блока, не приводят к смене текстуры блока.

Или что то не так написано?

Переменная isActive имеет тип boolean
 
176
0
У печки при активации меняется не текстура а сам блок. Т.е. не передавай булин а просто заменяй сразу на нужный блок.
 
оО? то есть мне придется сделать аля мета блок? один когда не робит, второй когда робит?
 
1,990
18
105
Зануда:
Обсуждали уже, не синглтоны они. Не совсем.
Синглтон - когда сущетвует всего лишь 1 объект определенного класса с общедоступным инстансом.
Объектов класса Block может быть гораздо больше. Но каждый из них - единственный в своем роде (не обязательно единственный для класса, вот что важно), это да. И все они статичные.
 
60
0
Если вдруг непонятно как метадатой делать:
(для примера проверяется наличие блока земли под блоком)
Код:
 @Override
 public void onNeighborBlockChange(World world, int x, int y, int z, int id)
 {
 world.setBlockMetadataWithNotify(x, y, z, world.getBlockId(x, y - 1, z) == Blocks.dirt.blockId ? 1 : 0, 1);
 }
 
 private Icon iconDefault, iconActive;
 
 @Override
 public Icon getIcon(int side, int meta)
 {
 return meta == 0 ? this.iconDefault : this.iconActive;
 }
 
 @Override
 public void registerBlockIcons(IconRegister register)
 {
 this.iconDefault = register.registerIcon(ModInfo.MODID + ":default");
 this.iconActive = register.registerIcon(ModInfo.MODID + ":active");
 }
 
Сверху