Как сделать чтобы факел ломался от дождя?

Версия Minecraft
1.20.1
API
MCreator
Здравствуйте, попытался сделать так чтобы от дождя факелы ломались. Перепробовал все варианты которые приходили в голову, но ничего так и не сработало.
На данном фото вы видите последний мой вариант
 

Вложения

  • IMG_20231031_142440.jpg
    IMG_20231031_142440.jpg
    77.8 KB · Просмотры: 44
Здравствуйте, попытался сделать так чтобы от дождя факелы ломались. Перепробовал все варианты которые приходили в голову, но ничего так и не сработало.
На данном фото вы видите последний мой вариант
Java:
    @SubscribeEvent
    public static void onWorldTick(TickEvent.LevelTickEvent event) {
        if (event.phase == TickEvent.Phase.END) {
            execute(event, event.level);
        }
    }

    public static void execute(LevelAccessor world) {
        execute(null, world);
    }

    private static void execute(@Nullable Event event, LevelAccessor world) {
        if ((Blocks.TORCH == (world.getBlockState(new BlockPos(0, 0, 0))).getBlock()) == (world.canSeeSkyFromBelowWater(new BlockPos(0, 0, 0)) == world.getLevelData().isRaining())) {
            {
                BlockPos _pos = new BlockPos(0, 0, 0);
                Block.dropResources(world.getBlockState(_pos), world, new BlockPos(0, 0, 0), null);
                world.destroyBlock(_pos, false);
            }
        }
    }
}
 
54
3
6
Java:
    @SubscribeEvent
    public static void onWorldTick(TickEvent.LevelTickEvent event) {
        if (event.phase == TickEvent.Phase.END) {
            execute(event, event.level);
        }
    }

    public static void execute(LevelAccessor world) {
        execute(null, world);
    }

    private static void execute(@Nullable Event event, LevelAccessor world) {
        if ((Blocks.TORCH == (world.getBlockState(new BlockPos(0, 0, 0))).getBlock()) == (world.canSeeSkyFromBelowWater(new BlockPos(0, 0, 0)) == world.getLevelData().isRaining())) {
            {
                BlockPos _pos = new BlockPos(0, 0, 0);
                Block.dropResources(world.getBlockState(_pos), world, new BlockPos(0, 0, 0), null);
                world.destroyBlock(_pos, false);
            }
        }
    }
}
где BlockPos(0, 0, 0) это координаты на которых должен находится блок, у тебя они везде 0
 
где BlockPos(0, 0, 0) это координаты на которых должен находится блок, у тебя они везде 0
Да знаю, но никак не смог сделать чтобы каждый факел по отдельности ломался, может быть даже не так с самого начала и до конца не правильно писал.
В одном из вариантов вместо нулей стояли x y z.
У вас есть идеи какую структуру кода мне стоит сделать?
 
54
3
6
Да знаю, но никак не смог сделать чтобы каждый факел по отдельности ломался, может быть даже не так с самого начала и до конца не правильно писал.
В одном из вариантов вместо нулей стояли x y z.
У вас есть идеи какую структуру кода мне стоит сделать?
что то вроде такого если я ничего не напутал:
   int radius = 10;
        for (int x = -radius; x < radius; x++) {
            for (int y = -radius; y < radius; y++) {
                for (int z = -radius; z < radius; z++) {
                    int tx = x - (int) player.posX;
                    int ty = y - (int) player.posY;
                    int tz = z - (int) player.posZ;
                    double len = Math.sqrt(tx * tx + ty * ty + tz * tz);
                    if (len <= radius) {
                        BlockPos pos = new BlockPos(tx, ty, tz);
                        IBlockState state = player.world.getBlockState(pos);
                        if (state.getBlock() == Blocks.TORCH) {
                            if (isAirBlock(player.world, pos)) {  //проверка есть ли выше факела воздух

                       Block.dropResources(world.getBlockState(_pos), world, pos, null);
                world.destroyBlock(_pos, false);
                            }
                        }
      }
                }
            }
        }
 public boolean isAirBlock(World world, BlockPos pos) {
        for (int y = pos.getY() + 1; y < world.getHeight(); y++) {
            BlockPos blockPos = new BlockPos(pos.getX(), y, pos.getZ());
            if (!world.isAirBlock(blockPos)) {
                return true;
            }
        }
        return false;
    }
это проверка в радиусе 10 блоков, лучше конечно не делать каждый тик (если что это на 1.12 выше не могу :( ).Проверяй через цикл каждый блок вообщем
 
это проверка в радиусе 10 блоков, лучше конечно не делать каждый тик (если что это на 1.12 выше не могу :( ).Проверяй через цикл каждый блок вообщем
спасибо что уделил мне время, даже если это не сработает на моей версии или что-то неправильно сделаю, то буду понимать в каком направлении мне стоит двигаться. Большое спасибо вам и желаю удачи вам в создании модов
 
1,369
112
241
что то вроде такого если я ничего не напутал:
   int radius = 10;
        for (int x = -radius; x < radius; x++) {
            for (int y = -radius; y < radius; y++) {
                for (int z = -radius; z < radius; z++) {
                    int tx = x - (int) player.posX;
                    int ty = y - (int) player.posY;
                    int tz = z - (int) player.posZ;
                    double len = Math.sqrt(tx * tx + ty * ty + tz * tz);
                    if (len <= radius) {
                        BlockPos pos = new BlockPos(tx, ty, tz);
                        IBlockState state = player.world.getBlockState(pos);
                        if (state.getBlock() == Blocks.TORCH) {
                            if (isAirBlock(player.world, pos)) {  //проверка есть ли выше факела воздух

                       Block.dropResources(world.getBlockState(_pos), world, pos, null);
                world.destroyBlock(_pos, false);
                            }
                        }
      }
                }
            }
        }
 public boolean isAirBlock(World world, BlockPos pos) {
        for (int y = pos.getY() + 1; y < world.getHeight(); y++) {
            BlockPos blockPos = new BlockPos(pos.getX(), y, pos.getZ());
            if (!world.isAirBlock(blockPos)) {
                return true;
            }
        }
        return false;
    }
это проверка в радиусе 10 блоков, лучше конечно не делать каждый тик (если что это на 1.12 выше не могу :( ).Проверяй через цикл каждый блок вообщем
Выглядит как очень плохой код.
По хорошему, следовало бы проверять в тике мира на дождь в позиции (hasRain вроде бы, нет под рукой IDE).
Брать из мира загруженные чанки и в них уже искать необходимый блок (в чанках встроенная для этого функция есть, по-моему), заносить результат поиска в коллекцию/массив. Ну и в конце проходиться по коллекции/массиву и ломать блоки в этих позициях.
Ну и сразу становится ясно, что с клиентом мы тут никак не взаимодействуем, поэтому всё ограничивается серверным миром.
 
Последнее редактирование:
54
3
6
Выглядит как очень плохой код.
По хорошему, следовало бы проверять в тике мира на дождь в позиции (hasRain вроде бы, нет под рукой IDE).
Брать из мира загруженные чанки и в них уже искать необходимый блок (в чанках встроенная для этого функция есть, по-моему), заносить результат поиска в коллекцию/массив. Ну и в конце проходиться по коллекции/массиву и ломать блоки в этих позициях.
Ну и сразу становится ясно, что с клиентом мы тут никак не взаимодействуем, поэтому всё ограничивается серверным миром.
Код как пример куда ему двигатся, проверку на дождь конечно надо, имею ввиду что циклы не надо в каждом тике делать (несколько раз чтоб исполнялись). С чанками хз, в 1.20 наверное сильно отличается от 1.12
 
1,038
57
229
У каждого блока есть RandomTick, в том числе у факелов. Пусть сам блок проверяет.
Если речь про факел в руке, тогда да, можно через событие или опять же у него тоже есть RandomTick (по крайней мере был у каждого предмета)
 
428
41
108
И как раз серверный требует реализации ITickable вроде бы. Так что для факелов он не заходит.
Прекрасно заходит, updateTick это собственный метод блока, такой же собственный как tickRate, с которым в идеале такое комбинировать
 

tox1cozZ

aka Agravaine
8,455
598
2,892
И как раз серверный требует реализации ITickable вроде бы. Так что для факелов он не заходит.
И в чем проблема? Простейший миксин сделай и реализуй что нужно.
 
Сверху