Code/net/minecraft/world/level/block/BigDripleafStemBlock.java

135 lines
6.0 KiB
Java

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<BigDripleafStemBlock> CODEC = simpleCodec(BigDripleafStemBlock::new);
private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
private static final Map<Direction, VoxelShape> SHAPES = Shapes.rotateHorizontal(Block.column(6.0, 0.0, 16.0).move(0.0, 0.0, 0.25).optimize());
@Override
public MapCodec<BigDripleafStemBlock> 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<Block, BlockState> 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<BlockPos> 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<BlockPos> 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);
}
}