minecraft-source/src/net/minecraft/world/level/block/CropBlock.java

175 lines
7.2 KiB
Java

package net.minecraft.world.level.block;
import net.minecraft.world.level.block.state.AbstractStateHolder;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.entity.monster.Ravager;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.LevelReader;
import net.minecraft.util.Mth;
import net.minecraft.world.level.Level;
import java.util.Random;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
public class CropBlock extends BushBlock implements BonemealableBlock {
public static final IntegerProperty AGE;
private static final VoxelShape[] SHAPE_BY_AGE;
protected CropBlock(final Properties c) {
super(c);
this.registerDefaultState(((AbstractStateHolder<O, BlockState>)this.stateDefinition.any()).<Comparable, Integer>setValue((Property<Comparable>)this.getAgeProperty(), 0));
}
@Override
public VoxelShape getShape(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final CollisionContext cvn) {
return CropBlock.SHAPE_BY_AGE[byg.<Integer>getValue((Property<Integer>)this.getAgeProperty())];
}
@Override
protected boolean mayPlaceOn(final BlockState byg, final BlockGetter bjd, final BlockPos fk) {
return byg.getBlock() == Blocks.FARMLAND;
}
public IntegerProperty getAgeProperty() {
return CropBlock.AGE;
}
public int getMaxAge() {
return 7;
}
protected int getAge(final BlockState byg) {
return byg.<Integer>getValue((Property<Integer>)this.getAgeProperty());
}
public BlockState getStateForAge(final int integer) {
return ((AbstractStateHolder<O, BlockState>)this.defaultBlockState()).<Comparable, Integer>setValue((Property<Comparable>)this.getAgeProperty(), integer);
}
public boolean isMaxAge(final BlockState byg) {
return byg.<Integer>getValue((Property<Integer>)this.getAgeProperty()) >= this.getMaxAge();
}
@Override
public void tick(final BlockState byg, final ServerLevel xd, final BlockPos fk, final Random random) {
super.tick(byg, xd, fk, random);
if (xd.getRawBrightness(fk, 0) >= 9) {
final int integer6 = this.getAge(byg);
if (integer6 < this.getMaxAge()) {
final float float7 = getGrowthSpeed(this, xd, fk);
if (random.nextInt((int)(25.0f / float7) + 1) == 0) {
xd.setBlock(fk, this.getStateForAge(integer6 + 1), 2);
}
}
}
}
public void growCrops(final Level bjt, final BlockPos fk, final BlockState byg) {
int integer5 = this.getAge(byg) + this.getBonemealAgeIncrease(bjt);
final int integer6 = this.getMaxAge();
if (integer5 > integer6) {
integer5 = integer6;
}
bjt.setBlock(fk, this.getStateForAge(integer5), 2);
}
protected int getBonemealAgeIncrease(final Level bjt) {
return Mth.nextInt(bjt.random, 2, 5);
}
protected static float getGrowthSpeed(final Block bpe, final BlockGetter bjd, final BlockPos fk) {
float float4 = 1.0f;
final BlockPos fk2 = fk.below();
for (int integer6 = -1; integer6 <= 1; ++integer6) {
for (int integer7 = -1; integer7 <= 1; ++integer7) {
float float5 = 0.0f;
final BlockState byg9 = bjd.getBlockState(fk2.offset(integer6, 0, integer7));
if (byg9.getBlock() == Blocks.FARMLAND) {
float5 = 1.0f;
if (byg9.<Integer>getValue((Property<Integer>)FarmBlock.MOISTURE) > 0) {
float5 = 3.0f;
}
}
if (integer6 != 0 || integer7 != 0) {
float5 /= 4.0f;
}
float4 += float5;
}
}
final BlockPos fk3 = fk.north();
final BlockPos fk4 = fk.south();
final BlockPos fk5 = fk.west();
final BlockPos fk6 = fk.east();
final boolean boolean10 = bpe == bjd.getBlockState(fk5).getBlock() || bpe == bjd.getBlockState(fk6).getBlock();
final boolean boolean11 = bpe == bjd.getBlockState(fk3).getBlock() || bpe == bjd.getBlockState(fk4).getBlock();
if (boolean10 && boolean11) {
float4 /= 2.0f;
}
else {
final boolean boolean12 = bpe == bjd.getBlockState(fk5.north()).getBlock() || bpe == bjd.getBlockState(fk6.north()).getBlock() || bpe == bjd.getBlockState(fk6.south()).getBlock() || bpe == bjd.getBlockState(fk5.south()).getBlock();
if (boolean12) {
float4 /= 2.0f;
}
}
return float4;
}
@Override
public boolean canSurvive(final BlockState byg, final LevelReader bjw, final BlockPos fk) {
return (bjw.getRawBrightness(fk, 0) >= 8 || bjw.canSeeSky(fk)) && super.canSurvive(byg, bjw, fk);
}
@Override
public void entityInside(final BlockState byg, final Level bjt, final BlockPos fk, final Entity akn) {
if (akn instanceof Ravager && bjt.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
bjt.destroyBlock(fk, true, akn);
}
super.entityInside(byg, bjt, fk, akn);
}
protected ItemLike getBaseSeedId() {
return Items.WHEAT_SEEDS;
}
@Override
public ItemStack getCloneItemStack(final BlockGetter bjd, final BlockPos fk, final BlockState byg) {
return new ItemStack(this.getBaseSeedId());
}
@Override
public boolean isValidBonemealTarget(final BlockGetter bjd, final BlockPos fk, final BlockState byg, final boolean boolean4) {
return !this.isMaxAge(byg);
}
@Override
public boolean isBonemealSuccess(final Level bjt, final Random random, final BlockPos fk, final BlockState byg) {
return true;
}
@Override
public void performBonemeal(final ServerLevel xd, final Random random, final BlockPos fk, final BlockState byg) {
this.growCrops(xd, fk, byg);
}
@Override
protected void createBlockStateDefinition(final StateDefinition.Builder<Block, BlockState> a) {
a.add(CropBlock.AGE);
}
static {
AGE = BlockStateProperties.AGE_7;
SHAPE_BY_AGE = new VoxelShape[] { Block.box(0.0, 0.0, 0.0, 16.0, 2.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 4.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 6.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 8.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 10.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 12.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 14.0, 16.0), Block.box(0.0, 0.0, 0.0, 16.0, 16.0, 16.0) };
}
}