94 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.world.level.block;
 | |
| 
 | |
| import com.mojang.serialization.MapCodec;
 | |
| import java.util.List;
 | |
| import java.util.Optional;
 | |
| import net.minecraft.core.BlockPos;
 | |
| import net.minecraft.core.Holder;
 | |
| import net.minecraft.core.registries.Registries;
 | |
| import net.minecraft.data.worldgen.placement.VegetationPlacements;
 | |
| 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.BlockBehaviour;
 | |
| import net.minecraft.world.level.block.state.BlockState;
 | |
| import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
 | |
| import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration;
 | |
| import net.minecraft.world.level.levelgen.placement.PlacedFeature;
 | |
| 
 | |
| public class GrassBlock extends SpreadingSnowyDirtBlock implements BonemealableBlock {
 | |
| 	public static final MapCodec<GrassBlock> CODEC = simpleCodec(GrassBlock::new);
 | |
| 
 | |
| 	@Override
 | |
| 	public MapCodec<GrassBlock> codec() {
 | |
| 		return CODEC;
 | |
| 	}
 | |
| 
 | |
| 	public GrassBlock(BlockBehaviour.Properties properties) {
 | |
| 		super(properties);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
 | |
| 		return level.getBlockState(pos.above()).isAir();
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
 | |
| 		BlockPos blockPos = pos.above();
 | |
| 		BlockState blockState = Blocks.SHORT_GRASS.defaultBlockState();
 | |
| 		Optional<Holder.Reference<PlacedFeature>> optional = level.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE).get(VegetationPlacements.GRASS_BONEMEAL);
 | |
| 
 | |
| 		label51:
 | |
| 		for (int i = 0; i < 128; i++) {
 | |
| 			BlockPos blockPos2 = blockPos;
 | |
| 
 | |
| 			for (int j = 0; j < i / 16; j++) {
 | |
| 				blockPos2 = blockPos2.offset(random.nextInt(3) - 1, (random.nextInt(3) - 1) * random.nextInt(3) / 2, random.nextInt(3) - 1);
 | |
| 				if (!level.getBlockState(blockPos2.below()).is(this) || level.getBlockState(blockPos2).isCollisionShapeFullBlock(level, blockPos2)) {
 | |
| 					continue label51;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			BlockState blockState2 = level.getBlockState(blockPos2);
 | |
| 			if (blockState2.is(blockState.getBlock()) && random.nextInt(10) == 0) {
 | |
| 				BonemealableBlock bonemealableBlock = (BonemealableBlock)blockState.getBlock();
 | |
| 				if (bonemealableBlock.isValidBonemealTarget(level, blockPos2, blockState2)) {
 | |
| 					bonemealableBlock.performBonemeal(level, random, blockPos2, blockState2);
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if (blockState2.isAir()) {
 | |
| 				Holder<PlacedFeature> holder;
 | |
| 				if (random.nextInt(8) == 0) {
 | |
| 					List<ConfiguredFeature<?, ?>> list = level.getBiome(blockPos2).value().getGenerationSettings().getFlowerFeatures();
 | |
| 					if (list.isEmpty()) {
 | |
| 						continue;
 | |
| 					}
 | |
| 
 | |
| 					int k = random.nextInt(list.size());
 | |
| 					holder = ((RandomPatchConfiguration)((ConfiguredFeature)list.get(k)).config()).feature();
 | |
| 				} else {
 | |
| 					if (!optional.isPresent()) {
 | |
| 						continue;
 | |
| 					}
 | |
| 
 | |
| 					holder = (Holder<PlacedFeature>)optional.get();
 | |
| 				}
 | |
| 
 | |
| 				holder.value().place(level, level.getChunkSource().getGenerator(), random, blockPos2);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public BonemealableBlock.Type getType() {
 | |
| 		return BonemealableBlock.Type.NEIGHBOR_SPREADER;
 | |
| 	}
 | |
| }
 |