package net.minecraft.world.level.block; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockGetter; 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.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; public class MushroomBlock extends VegetationBlock implements BonemealableBlock { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( p_360440_ -> p_360440_.group(ResourceKey.codec(Registries.CONFIGURED_FEATURE).fieldOf("feature").forGetter(p_310622_ -> p_310622_.feature), propertiesCodec()) .apply(p_360440_, MushroomBlock::new) ); private static final VoxelShape SHAPE = Block.column(6.0, 0.0, 6.0); private final ResourceKey> feature; @Override public MapCodec codec() { return CODEC; } public MushroomBlock(ResourceKey> p_256049_, BlockBehaviour.Properties p_256027_) { super(p_256027_); this.feature = p_256049_; } @Override protected VoxelShape getShape(BlockState p_54889_, BlockGetter p_54890_, BlockPos p_54891_, CollisionContext p_54892_) { return SHAPE; } @Override protected void randomTick(BlockState p_221784_, ServerLevel p_221785_, BlockPos p_221786_, RandomSource p_221787_) { if (p_221787_.nextInt(25) == 0) { int i = 5; int j = 4; for (BlockPos blockpos : BlockPos.betweenClosed(p_221786_.offset(-4, -1, -4), p_221786_.offset(4, 1, 4))) { if (p_221785_.getBlockState(blockpos).is(this)) { if (--i <= 0) { return; } } } BlockPos blockpos1 = p_221786_.offset(p_221787_.nextInt(3) - 1, p_221787_.nextInt(2) - p_221787_.nextInt(2), p_221787_.nextInt(3) - 1); for (int k = 0; k < 4; k++) { if (p_221785_.isEmptyBlock(blockpos1) && p_221784_.canSurvive(p_221785_, blockpos1)) { p_221786_ = blockpos1; } blockpos1 = p_221786_.offset(p_221787_.nextInt(3) - 1, p_221787_.nextInt(2) - p_221787_.nextInt(2), p_221787_.nextInt(3) - 1); } if (p_221785_.isEmptyBlock(blockpos1) && p_221784_.canSurvive(p_221785_, blockpos1)) { p_221785_.setBlock(blockpos1, p_221784_, 2); } } } @Override protected boolean mayPlaceOn(BlockState p_54894_, BlockGetter p_54895_, BlockPos p_54896_) { return p_54894_.isSolidRender(); } @Override protected boolean canSurvive(BlockState p_54880_, LevelReader p_54881_, BlockPos p_54882_) { BlockPos blockpos = p_54882_.below(); BlockState blockstate = p_54881_.getBlockState(blockpos); return blockstate.is(BlockTags.MUSHROOM_GROW_BLOCK) ? true : p_54881_.getRawBrightness(p_54882_, 0) < 13 && this.mayPlaceOn(blockstate, p_54881_, blockpos); } public boolean growMushroom(ServerLevel p_221774_, BlockPos p_221775_, BlockState p_221776_, RandomSource p_221777_) { Optional>> optional = p_221774_.registryAccess().lookupOrThrow(Registries.CONFIGURED_FEATURE).get(this.feature); if (optional.isEmpty()) { return false; } else { p_221774_.removeBlock(p_221775_, false); if (optional.get().value().place(p_221774_, p_221774_.getChunkSource().getGenerator(), p_221777_, p_221775_)) { return true; } else { p_221774_.setBlock(p_221775_, p_221776_, 3); return false; } } } @Override public boolean isValidBonemealTarget(LevelReader p_255904_, BlockPos p_54871_, BlockState p_54872_) { return true; } @Override public boolean isBonemealSuccess(Level p_221779_, RandomSource p_221780_, BlockPos p_221781_, BlockState p_221782_) { return p_221780_.nextFloat() < 0.4; } @Override public void performBonemeal(ServerLevel p_221769_, RandomSource p_221770_, BlockPos p_221771_, BlockState p_221772_) { this.growMushroom(p_221769_, p_221771_, p_221772_, p_221770_); } }