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

73 lines
2.8 KiB
Java

package net.minecraft.world.level.block;
import com.mojang.serialization.MapCodec;
import javax.annotation.Nullable;
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.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
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.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public abstract class GrowingPlantBlock extends Block {
protected final Direction growthDirection;
protected final boolean scheduleFluidTicks;
protected final VoxelShape shape;
protected GrowingPlantBlock(BlockBehaviour.Properties p_53863_, Direction p_53864_, VoxelShape p_53865_, boolean p_53866_) {
super(p_53863_);
this.growthDirection = p_53864_;
this.shape = p_53865_;
this.scheduleFluidTicks = p_53866_;
}
@Override
protected abstract MapCodec<? extends GrowingPlantBlock> codec();
@Nullable
@Override
public BlockState getStateForPlacement(BlockPlaceContext p_53868_) {
BlockState blockstate = p_53868_.getLevel().getBlockState(p_53868_.getClickedPos().relative(this.growthDirection));
return !blockstate.is(this.getHeadBlock()) && !blockstate.is(this.getBodyBlock())
? this.getStateForPlacement(p_53868_.getLevel().random)
: this.getBodyBlock().defaultBlockState();
}
public BlockState getStateForPlacement(RandomSource p_364951_) {
return this.defaultBlockState();
}
@Override
protected boolean canSurvive(BlockState p_53876_, LevelReader p_53877_, BlockPos p_53878_) {
BlockPos blockpos = p_53878_.relative(this.growthDirection.getOpposite());
BlockState blockstate = p_53877_.getBlockState(blockpos);
return !this.canAttachTo(blockstate)
? false
: blockstate.is(this.getHeadBlock()) || blockstate.is(this.getBodyBlock()) || blockstate.isFaceSturdy(p_53877_, blockpos, this.growthDirection);
}
@Override
protected void tick(BlockState p_221280_, ServerLevel p_221281_, BlockPos p_221282_, RandomSource p_221283_) {
if (!p_221280_.canSurvive(p_221281_, p_221282_)) {
p_221281_.destroyBlock(p_221282_, true);
}
}
protected boolean canAttachTo(BlockState p_153321_) {
return true;
}
@Override
protected VoxelShape getShape(BlockState p_53880_, BlockGetter p_53881_, BlockPos p_53882_, CollisionContext p_53883_) {
return this.shape;
}
protected abstract GrowingPlantHeadBlock getHeadBlock();
protected abstract Block getBodyBlock();
}