gt: 					ret.add(new ItemStack(this.getSeed(), 1, 0));
context: package com.stormarmory.base;
  
  import java.util.Random;
  
  import com.stormarmory.MBlocks;
  import com.stormarmory.MItems;
  import com.stormarmory.NaturesRevenge;
  import net.minecraft.block.Block;
  import net.minecraft.block.BlockBush;
  import net.minecraft.block.IGrowable;
  import net.minecraft.block.SoundType;
  import net.minecraft.block.material.Material;
  import net.minecraft.block.properties.IProperty;
  import net.minecraft.block.properties.PropertyInteger;
  import net.minecraft.block.state.BlockStateContainer;
  import net.minecraft.block.state.IBlockState;
  import net.minecraft.creativetab.CreativeTabs;
  import net.minecraft.init.Blocks;
  import net.minecraft.init.Items;
  import net.minecraft.item.Item;
  import net.minecraft.item.ItemBlock;
  import net.minecraft.item.ItemStack;
  import net.minecraft.util.EnumFacing;
  import net.minecraft.util.math.AxisAlignedBB;
  import net.minecraft.util.math.BlockPos;
  import net.minecraft.util.math.MathHelper;
  import net.minecraft.world.IBlockAccess;
  import net.minecraft.world.World;
  import net.minecraftforge.common.IPlantable;
  
  public class BasicCrop extends BlockBush implements IGrowable {
  	public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 7);
  	private static final AxisAlignedBB[] CROPS_AABB = new AxisAlignedBB[] {
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.125D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.25D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.375D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.5D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.625D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.875D, 1.0D),
  			new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D) };
  
  	protected static String name;
  
  	public BasicCrop(Material material, String name, float hardness, String tool, int level) {
  		super(material);
  		this.name = name;
  		setUnlocalizedName(name);
  		setRegistryName(name);
  		setHardness(hardness);
  		setHarvestLevel(tool, level);
  		this.setTickRandomly(true);
  		this.disableStats();
  		this.setDefaultState(this.blockState.getBaseState().withProperty(this.getAgeProperty(), Integer.valueOf(0)));
  	}
  
  	public void registerItemModel(ItemBlock itemBlock) {
  		NaturesRevenge.proxy.registerItemRenderer(itemBlock, 0, name);
  	}
  
  	@Override
  	public BasicCrop setCreativeTab(CreativeTabs tab) {
  		super.setCreativeTab(tab);
  		return this;
  	}
  
  	@Override
  	public BasicCrop setSoundType(SoundType tile) {
  		this.blockSoundType = tile;
  		return this;
  	}
  
  	protected PropertyInteger getAgeProperty() {
  		return AGE;
  	}
  
  	public int getMaxAge() {
  		return 7;
  	}
  
  	protected BlockStateContainer createBlockState() {
  		return new BlockStateContainer(this, new IProperty[] { AGE });
  	}
  
  	public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
  		return CROPS_AABB[((Integer) state.getValue(this.getAgeProperty())).intValue()];
  	}
  
  	protected boolean canSustainBush(final IBlockState ground) {
  		return ground.getBlock() == MBlocks.BARREN_SOIL || ground.getBlock() == MBlocks.CRACKED_SOIL;
  	}
  
  	protected Item getSeed() {
  		return Items.WHEAT_SEEDS;
  	}
  
  	protected Item getCrop() {
  		return Items.WHEAT;
  	}
  
  	protected int getAge(IBlockState state) {
  		return ((Integer) state.getValue(this.getAgeProperty())).intValue();
  	}
  
  	public IBlockState withAge(int age) {
  		return this.getDefaultState().withProperty(this.getAgeProperty(), Integer.valueOf(age));
  	}
  
  	public boolean isMaxAge(IBlockState state) {
  		return ((Integer) state.getValue(this.getAgeProperty())).intValue() >= this.getMaxAge();
  	}
  
  	public IBlockState getStateFromMeta(int meta) {
  		return this.withAge(meta);
  	}
  
  	public int getMetaFromState(IBlockState state) {
  		return this.getAge(state);
  	}
  
  	public boolean canGrow(World worldIn, BlockPos pos, IBlockState state, boolean isClient) {
  		return !this.isMaxAge(state);
  	}
  
  	public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) {
  		super.updateTick(worldIn, pos, state, rand);
  
  		if (worldIn.getLightFromNeighbors(pos.up()) >= 9) {
  			int i = this.getAge(state);
  
  			if (i < this.getMaxAge()) {
  				float f = getGrowthChance(this, worldIn, pos);
  
  				if (net.minecraftforge.common.ForgeHooks.onCropsGrowPre(worldIn, pos, state,
  						rand.nextInt((int) (25.0F / f) + 1) == 0)) {
  					worldIn.setBlockState(pos, this.withAge(i + 1), 2);
  					net.minecraftforge.common.ForgeHooks.onCropsGrowPost(worldIn, pos, state,
  							worldIn.getBlockState(pos));
  				}
  			}
  		}
  	}
  
  	public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos, IBlockState state) {
  		return true;
  	}
  
  	public void grow(World worldIn, BlockPos pos, IBlockState state) {
  		int i = this.getAge(state) + this.getBonemealAgeIncrease(worldIn);
  		int j = this.getMaxAge();
  
  		if (i > j) {
  			i = j;
  		}
  
  		worldIn.setBlockState(pos, this.withAge(i), 2);
  	}
  
  	protected int getBonemealAgeIncrease(World worldIn) {
  		return MathHelper.getInt(worldIn.rand, 2, 5);
  	}
  
  	protected static float getGrowthChance(Block blockIn, World worldIn, BlockPos pos) {
  		float f = 1.0F;
  		BlockPos blockpos = pos.down();
  
  		for (int i = -1; i <= 1; ++i) {
  			for (int j = -1; j <= 1; ++j) {
  				float f1 = 0.0F;
  				IBlockState iblockstate = worldIn.getBlockState(blockpos.add(i, 0, j));
  
  				if (iblockstate.getBlock().canSustainPlant(iblockstate, worldIn, blockpos.add(i, 0, j),
  						net.minecraft.util.EnumFacing.UP, (net.minecraftforge.common.IPlantable) blockIn)) {
  					f1 = 1.0F;
  
  					if (iblockstate.getBlock().isFertile(worldIn, blockpos.add(i, 0, j))) {
  						f1 = 3.0F;
  					}
  				}
  
  				if (i != 0 || j != 0) {
  					f1 /= 4.0F;
  				}
  
  				f += f1;
  			}
  		}
  
  		BlockPos blockpos1 = pos.north();
  		BlockPos blockpos2 = pos.south();
  		BlockPos blockpos3 = pos.west();
  		BlockPos blockpos4 = pos.east();
  		boolean flag = blockIn == worldIn.getBlockState(blockpos3).getBlock()
  				|| blockIn == worldIn.getBlockState(blockpos4).getBlock();
  		boolean flag1 = blockIn == worldIn.getBlockState(blockpos1).getBlock()
  				|| blockIn == worldIn.getBlockState(blockpos2).getBlock();
  
  		if (flag && flag1) {
  			f /= 2.0F;
  		} else {
  			boolean flag2 = blockIn == worldIn.getBlockState(blockpos3.north()).getBlock()
  					|| blockIn == worldIn.getBlockState(blockpos4.north()).getBlock()
  					|| blockIn == worldIn.getBlockState(blockpos4.south()).getBlock()
  					|| blockIn == worldIn.getBlockState(blockpos3.south()).getBlock();
  
  			if (flag2) {
  				f /= 2.0F;
  			}
  		}
  
  		return f;
  	}
  
  	public boolean canBlockStay(World worldIn, BlockPos pos, IBlockState state) {
  		IBlockState soil = worldIn.getBlockState(pos.down());
  		return (worldIn.getLight(pos) >= 8 || worldIn.canSeeSky(pos))
  				&& soil.getBlock().canSustainPlant(soil, worldIn, pos.down(), net.minecraft.util.EnumFacing.UP, this);
  	}
  
  	@Override
  	public java.util.List<ItemStack> getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state,
  			int fortune) {
  		java.util.List<ItemStack> ret = super.getDrops(world, pos, state, fortune);
  		int age = getAge(state);
  		Random rand = world instanceof World ? ((World) world).rand : new Random();
  
  		if (age >= getMaxAge()) {
  			int k = 3 + fortune;
  
  			for (int i = 0; i < 3 + fortune; ++i) {
  				if (rand.nextInt(2 * getMaxAge()) <= age) {
  