package net.minecraft.world.level.block; import com.mojang.serialization.MapCodec; import java.util.Map; import java.util.Optional; import net.minecraft.BlockUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.util.RandomSource; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.ScheduledTickAccess; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; public class BigDripleafStemBlock extends HorizontalDirectionalBlock implements BonemealableBlock, SimpleWaterloggedBlock { public static final MapCodec CODEC = simpleCodec(BigDripleafStemBlock::new); private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; private static final Map SHAPES = Shapes.rotateHorizontal(Block.column(6.0, 0.0, 16.0).move(0.0, 0.0, 0.25).optimize()); @Override public MapCodec codec() { return CODEC; } protected BigDripleafStemBlock(BlockBehaviour.Properties p_152329_) { super(p_152329_); this.registerDefaultState(this.stateDefinition.any().setValue(WATERLOGGED, false).setValue(FACING, Direction.NORTH)); } @Override protected VoxelShape getShape(BlockState p_152360_, BlockGetter p_152361_, BlockPos p_152362_, CollisionContext p_152363_) { return SHAPES.get(p_152360_.getValue(FACING)); } @Override protected void createBlockStateDefinition(StateDefinition.Builder p_152376_) { p_152376_.add(WATERLOGGED, FACING); } @Override protected FluidState getFluidState(BlockState p_152378_) { return p_152378_.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(p_152378_); } @Override protected boolean canSurvive(BlockState p_152365_, LevelReader p_152366_, BlockPos p_152367_) { BlockPos blockpos = p_152367_.below(); BlockState blockstate = p_152366_.getBlockState(blockpos); BlockState blockstate1 = p_152366_.getBlockState(p_152367_.above()); return (blockstate.is(this) || blockstate.is(BlockTags.BIG_DRIPLEAF_PLACEABLE)) && (blockstate1.is(this) || blockstate1.is(Blocks.BIG_DRIPLEAF)); } protected static boolean place(LevelAccessor p_152350_, BlockPos p_152351_, FluidState p_152352_, Direction p_152353_) { BlockState blockstate = Blocks.BIG_DRIPLEAF_STEM.defaultBlockState().setValue(WATERLOGGED, p_152352_.isSourceOfType(Fluids.WATER)).setValue(FACING, p_152353_); return p_152350_.setBlock(p_152351_, blockstate, 3); } @Override protected BlockState updateShape( BlockState p_152369_, LevelReader p_370232_, ScheduledTickAccess p_369831_, BlockPos p_152373_, Direction p_152370_, BlockPos p_152374_, BlockState p_152371_, RandomSource p_369505_ ) { if ((p_152370_ == Direction.DOWN || p_152370_ == Direction.UP) && !p_152369_.canSurvive(p_370232_, p_152373_)) { p_369831_.scheduleTick(p_152373_, this, 1); } if (p_152369_.getValue(WATERLOGGED)) { p_369831_.scheduleTick(p_152373_, Fluids.WATER, Fluids.WATER.getTickDelay(p_370232_)); } return super.updateShape(p_152369_, p_370232_, p_369831_, p_152373_, p_152370_, p_152374_, p_152371_, p_369505_); } @Override protected void tick(BlockState p_220813_, ServerLevel p_220814_, BlockPos p_220815_, RandomSource p_220816_) { if (!p_220813_.canSurvive(p_220814_, p_220815_)) { p_220814_.destroyBlock(p_220815_, true); } } @Override public boolean isValidBonemealTarget(LevelReader p_255683_, BlockPos p_256358_, BlockState p_256408_) { Optional optional = BlockUtil.getTopConnectedBlock(p_255683_, p_256358_, p_256408_.getBlock(), Direction.UP, Blocks.BIG_DRIPLEAF); if (optional.isEmpty()) { return false; } else { BlockPos blockpos = optional.get().above(); BlockState blockstate = p_255683_.getBlockState(blockpos); return BigDripleafBlock.canPlaceAt(p_255683_, blockpos, blockstate); } } @Override public boolean isBonemealSuccess(Level p_220808_, RandomSource p_220809_, BlockPos p_220810_, BlockState p_220811_) { return true; } @Override public void performBonemeal(ServerLevel p_220803_, RandomSource p_220804_, BlockPos p_220805_, BlockState p_220806_) { Optional optional = BlockUtil.getTopConnectedBlock(p_220803_, p_220805_, p_220806_.getBlock(), Direction.UP, Blocks.BIG_DRIPLEAF); if (!optional.isEmpty()) { BlockPos blockpos = optional.get(); BlockPos blockpos1 = blockpos.above(); Direction direction = p_220806_.getValue(FACING); place(p_220803_, blockpos, p_220803_.getFluidState(blockpos), direction); BigDripleafBlock.place(p_220803_, blockpos1, p_220803_.getFluidState(blockpos1), direction); } } @Override protected ItemStack getCloneItemStack(LevelReader p_312051_, BlockPos p_152337_, BlockState p_152338_, boolean p_378221_) { return new ItemStack(Blocks.BIG_DRIPLEAF); } }