Цикличность при использовании предмета.

Версия Minecraft
1.16.5
API
Forge
Приветствую форумчан.

Имеется такая проблема, при использовании предмета в руке у меня выполняется метод, но я бы хотел что бы он выполнялся циклично, пока буллеановая переменная не станет false, там максимум 10 циклов. Но, при использовании любого цикла(while, for и т.д.) игра крашится. Я бы хотел спросить, можно ли как-то реализовать данный метод с помощью тиков? Пытался накопать сам информации на разных форумах, но адекватного ответа не нашёл.
 
Решение
Нужно еще обновлять значение BlockPos posBelow = player.getPosition().down(); в каждой итерации цикла.
Я бы написал как-то так:
Java:
BlockPos pos = player.getPosition().down().mutable();
BlockState blockState = player.world.getBlockState(pos);
while(blockState.getBlock().isAir(blockState, world, pos)){
    pos.move(0, -1, 0);
    blockState = player.world.getBlockState(pos);
}
player.setPositionAndUpdate(pos.getX(), pos.getY(), pos.getZ());

А вообще, в World должен быть метод аля getTopBlock(), который возвращает самый высокий блок на указанных координатах.
Я хотел сделать метод, который бы проверял какой блок под игроком, и телепортировал игрока вниз на 1 блок если под тобой воздух.
При цикле игра вылетает.

Java:
public void tick (PlayerEntity player, double x, double y, double z) {
            boolean onAir;
            BlockPos posBelow = player.getPosition().down();
            BlockState blockStateBelow = player.world.getBlockState(posBelow);
            Block below = blockStateBelow.getBlock();
            if (below.equals(Blocks.AIR)) {
                onAir = true;
            } else {
                onAir = false;
            }
            if (onAir) {
                StringTextComponent message2 = new StringTextComponent("m2");
                player.sendMessage(message2, Util.DUMMY_UUID);
                double Y = y;
                double X = x;
                double Z = z;

                Y--;

                StringTextComponent YCoord = new StringTextComponent(String.valueOf(Y));
                player.sendMessage(YCoord, Util.DUMMY_UUID);

                player.setPositionAndUpdate(X, Y, Z);
                }
            }
        }

Единственное что я придумал чтобы при телепортации игрока телепортировало на землю, а не в воздух.
Прости если говнокод)
 
Я его вырезал, сейчас покажу как было
Java:
public void tick (PlayerEntity player, double x, double y, double z) {
            boolean onAir;
            BlockPos posBelow = player.getPosition().down();
            BlockState blockStateBelow = player.world.getBlockState(posBelow);
            Block below = blockStateBelow.getBlock();
    while (onAir) {
            if (below.equals(Blocks.AIR)) {
                StringTextComponent message2 = new StringTextComponent("m2");
                player.sendMessage(message2, Util.DUMMY_UUID);
                double Y = y;
                double X = x;
                double Z = z;

                Y--;

                StringTextComponent YCoord = new StringTextComponent(String.valueOf(Y));
                player.sendMessage(YCoord, Util.DUMMY_UUID);

                player.setPositionAndUpdate(X, Y, Z);
                onAir = true;
            }
            else {
                onAir = false;
            }
        }
         }
      }
   }
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Нужно еще обновлять значение BlockPos posBelow = player.getPosition().down(); в каждой итерации цикла.
Я бы написал как-то так:
Java:
BlockPos pos = player.getPosition().down().mutable();
BlockState blockState = player.world.getBlockState(pos);
while(blockState.getBlock().isAir(blockState, world, pos)){
    pos.move(0, -1, 0);
    blockState = player.world.getBlockState(pos);
}
player.setPositionAndUpdate(pos.getX(), pos.getY(), pos.getZ());

А вообще, в World должен быть метод аля getTopBlock(), который возвращает самый высокий блок на указанных координатах.
 
Сверху