diff --git a/src/main/java/dev/micle/firefly_bush_backport/block/FireflyBushBlock.java b/src/main/java/dev/micle/firefly_bush_backport/block/FireflyBushBlock.java index fed04a4..f378063 100644 --- a/src/main/java/dev/micle/firefly_bush_backport/block/FireflyBushBlock.java +++ b/src/main/java/dev/micle/firefly_bush_backport/block/FireflyBushBlock.java @@ -1,6 +1,7 @@ package dev.micle.firefly_bush_backport.block; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; @@ -9,6 +10,9 @@ import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.BushBlock; import net.minecraft.world.level.block.state.BlockState; +import java.util.List; +import java.util.Optional; + public class FireflyBushBlock extends BushBlock implements BonemealableBlock { private static final double FIREFLY_CHANCE_PER_TICK = 0.7; private static final double FIREFLY_HORIZONTAL_RANGE = 10.0; @@ -27,7 +31,7 @@ public class FireflyBushBlock extends BushBlock implements BonemealableBlock { @Override public boolean isValidBonemealTarget(LevelReader pLevel, BlockPos pPos, BlockState pState, boolean pIsClient) { - return false; + return hasSpreadableNeighbourPos(pLevel, pPos, pState); } @Override @@ -39,4 +43,18 @@ public class FireflyBushBlock extends BushBlock implements BonemealableBlock { public void performBonemeal(ServerLevel pLevel, RandomSource pRandom, BlockPos pPos, BlockState pState) { } + + static boolean hasSpreadableNeighbourPos(LevelReader levelReader, BlockPos blockPos, BlockState blockState) { + return getSpreadableNeighbourPos(Direction.Plane.HORIZONTAL.stream().toList(), levelReader, blockPos, blockState).isPresent(); + } + + static Optional getSpreadableNeighbourPos(List directions, LevelReader levelReader, BlockPos blockPos, BlockState blockState) { + for (Direction direction : directions) { + BlockPos blockPosDirection = blockPos.relative(direction); + if (levelReader.isEmptyBlock(blockPosDirection) && blockState.canSurvive(levelReader, blockPosDirection)) { + return Optional.of(blockPosDirection); + } + } + return Optional.empty(); + } }