54 lines
1.8 KiB
Java
54 lines
1.8 KiB
Java
package net.minecraft.world.level.block;
|
|
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
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;
|
|
import net.minecraft.world.level.LevelReader;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
|
|
public interface BonemealableBlock {
|
|
boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state);
|
|
|
|
boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state);
|
|
|
|
void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state);
|
|
|
|
static boolean hasSpreadableNeighbourPos(LevelReader level, BlockPos pos, BlockState state) {
|
|
return getSpreadableNeighbourPos(Direction.Plane.HORIZONTAL.stream().toList(), level, pos, state).isPresent();
|
|
}
|
|
|
|
static Optional<BlockPos> findSpreadableNeighbourPos(Level level, BlockPos pos, BlockState state) {
|
|
return getSpreadableNeighbourPos(Direction.Plane.HORIZONTAL.shuffledCopy(level.random), level, pos, state);
|
|
}
|
|
|
|
private static Optional<BlockPos> getSpreadableNeighbourPos(List<Direction> directions, LevelReader level, BlockPos pos, BlockState state) {
|
|
for (Direction direction : directions) {
|
|
BlockPos blockPos = pos.relative(direction);
|
|
if (level.isEmptyBlock(blockPos) && state.canSurvive(level, blockPos)) {
|
|
return Optional.of(blockPos);
|
|
}
|
|
}
|
|
|
|
return Optional.empty();
|
|
}
|
|
|
|
default BlockPos getParticlePos(BlockPos pos) {
|
|
return switch (this.getType()) {
|
|
case NEIGHBOR_SPREADER -> pos.above();
|
|
case GROWER -> pos;
|
|
};
|
|
}
|
|
|
|
default BonemealableBlock.Type getType() {
|
|
return BonemealableBlock.Type.GROWER;
|
|
}
|
|
|
|
public static enum Type {
|
|
NEIGHBOR_SPREADER,
|
|
GROWER;
|
|
}
|
|
}
|