Забор под напряжением

Версия Minecraft
1.12.2
5,024
47
784
Здравствуйте. Прошу не кода, прошу идей. В общем:
Я хочу сделать забор который будет дамажить игрока если будет находится под воздействием сигнала красного камня. Основная проблема - передача сигнала между блоками без превращения источник сигнала. Уже давно ломаю голову, не знаю что придумать. Смотреть красный камень не советуйте... я ниче не понял, как оно работает, надо бы что нибудь попроще.

Пытался сделать на стейтах, но происходит рекурсия - после первичной запитки забор продолжает сам себя запитывать...
 
Попробуй создать блок, полностью идентичный какому нибудь ванильному, который может меняться в зависимости от наличия сигнала редстоуна (например - RedstoneLampBlock). Полностью скопируй всё, что с ним связано, потом попробуй поменять модель/текстуру на свой забор, без изменения логики, и потом уже меняй логику под свои нужды (полагаю, что то вроде: если entity в определённом радиусе от включённого блока, нанести ему дамаг). Это если без кода.

А если с кодом, в классе World есть метод isBlockPowered, принимающий BlockPos и проверяющий наличие сигнала редстоуна вокруг себя (возвращая true/false). Думаю его должно хватить.
 
5,024
47
784
Попробуй создать блок, полностью идентичный какому нибудь ванильному, который может меняться в зависимости от наличия сигнала редстоуна (например - RedstoneLampBlock). Полностью скопируй всё, что с ним связано, потом попробуй поменять модель/текстуру на свой забор, без изменения логики, и потом уже меняй логику под свои нужды (полагаю, что то вроде: если entity в определённом радиусе от включённого блока, нанести ему дамаг). Это если без кода.

А если с кодом, в классе World есть метод isBlockPowered, принимающий BlockPos и проверяющий наличие сигнала редстоуна вокруг себя (возвращая true/false). Думаю его должно хватить.
Все что ты написал я уже пробовал и делал.
 
5,024
47
784

GoogleTan

Картошка :3
1,354
43
310
короче можешь сделать так чтоб если законекчен к редстоуну раз в сек проверку на наличие рядом блов таких же и устанавливаешь редстоун сигнал. А вообще можешь сделать так чтоб в методе который изИсточникПитания возращать значение в зависимости от того подан ли на него красный камень.
 
5,024
47
784
человека с алмазной лигой копипастить учат)))) Вот в чем дело. Таких как ты мало
он с таким же успехом мог ответить так же и кому либо еще. Это вообще ничего не означает... как и алмазная лига, собственно говоря, кроме количества сообщений ничего не показывает.
короче можешь сделать так чтоб если законекчен к редстоуну раз в сек проверку на наличие рядом блов таких же и устанавливаешь редстоун сигнал.
Хороший способ устроить лагодром(y)
А вообще можешь сделать так чтоб в методе который изИсточникПитания возращать значение в зависимости от того подан ли на него красный камень.
Такого метода вообще не существует, который определяет, является ли блок источником питания или нет. Это делают методы getWeakPower и getStrongPower. Основная проблема заключается в том, что в них есть только интерфейс IBlockAccess, а нету полноценного World. Это и мешает сделать так, как я хочу. На крайняк я могу сделать эвент, через который буду доставать мир, но это костыль.
 
5,024
47
784
Знаю, вчера только пробовал. Почему то стейт не менялся. Блок меняется, а на новый стейт того же блока - почему то нет.
 
4,047
63
645
Думаю, что тут, как всегда, проблема совершенно не там, где ты её ищешь...
Просто опять где-то что-то не так написал/забыл/пропустил/недокопировал...
Предлагаю переписать всё заново или кропотливо искать косяк.
 
5,024
47
784
Тут проблема в том что я вообще ничего не копировал. Эту механику я пытаюсь написать с нуля
Java:
    public void checkBlocks(IBlockState state, World world, BlockPos pos) {
        if (state == RegBlocks.vibro_wire.getDefaultState().withProperty(POWERED, false)) {
              ArrayList<BlockPos> poss = new ArrayList();
              ArrayList<BlockPos> unposs = new ArrayList();

              poss.add(pos);
              for (int a = 0; a < 6; a++)
                unposs.add(pos.add(EnumFacing.VALUES[a].getDirectionVec()));

              while (unposs.size() > 0) {
                  ArrayList<BlockPos> newSet = new ArrayList();
                for (BlockPos upp : unposs) {
                  if (world.getBlockState(upp) == RegBlocks.vibro_wire.getDefaultState().withProperty(POWERED, false)) {
                    poss.add(upp);
                    for (int a = 0; a < 6; a++) {
                      BlockPos pp = upp.add(EnumFacing.VALUES[a].getDirectionVec());
                      if (!poss.contains(pp))
                          world.setBlockState(pos, state.withProperty(POWERED, true));
                        newSet.add(pp);
                    }
                  } 
                  newSet.remove(upp);
                }
                unposs = newSet;
              }

    
            }
    }
 
Сверху