package crazypants.enderio.machine.farm.farmers; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import com.enderio.core.common.util.BlockCoord; import crazypants.enderio.machine.farm.TileFarmStation; public class StemFarmer extends CustomSeedFarmer { private static final HeightCompatator COMP = new HeightCompatator(); public StemFarmer(Block plantedBlock, ItemStack seeds) { super(plantedBlock, seeds); } @Override public boolean prepareBlock(TileFarmStation farm, BlockCoord bc, Block block, int meta) { if(plantedBlock == block) { return true; } return plantFromInventory(farm, bc); } @Override public boolean canHarvest(TileFarmStation farm, BlockCoord bc, Block block, int meta) { BlockCoord up = bc.getLocation(ForgeDirection.UP); Block upBLock = farm.getBlock(up); return upBLock == plantedBlock; } @Override public boolean canPlant(ItemStack stack) { return seeds.isItemEqual(stack); } @Override public IHarvestResult harvestBlock(TileFarmStation farm, BlockCoord bc, Block block, int meta) { HarvestResult res = new HarvestResult(); BlockCoord harvestCoord = bc; boolean done = false; do{ harvestCoord = harvestCoord.getLocation(ForgeDirection.UP); boolean hasHoe = farm.hasHoe(); if(plantedBlock == farm.getBlock(harvestCoord) && hasHoe) { res.harvestedBlocks.add(harvestCoord); ArrayList<ItemStack> drops = plantedBlock.getDrops(farm.getWorldObj(), harvestCoord.x, harvestCoord.y, harvestCoord.z, meta, farm.getMaxLootingValue()); if(drops != null) { for(ItemStack drop : drops) { res.drops.add(new EntityItem(farm.getWorldObj(), bc.x + 0.5, bc.y + 0.5, bc.z + 0.5, drop.copy())); } } farm.damageHoe(1, harvestCoord); farm.actionPerformed(false); } else { if (!hasHoe) { farm.setNotification(TileFarmStation.NOTIFICATION_NO_HOE); } else { farm.clearNotification(); } done = true; } } while(!done); List<BlockCoord> toClear = new ArrayList<BlockCoord>(res.getHarvestedBlocks()); Collections.sort(toClear, COMP); for (BlockCoord coord : toClear) { farm.getWorldObj().setBlockToAir(coord.x, coord.y, coord.z); } return res; } @Override protected boolean plantFromInventory(TileFarmStation farm, BlockCoord bc) { World worldObj = farm.getWorldObj(); if(canPlant(worldObj, bc) && farm.takeSeedFromSupplies(seeds, bc) != null) { return plant(farm, worldObj, bc); } return false; } private static class HeightCompatator implements Comparator<BlockCoord> { @Override public int compare(BlockCoord o1, BlockCoord o2) { return -compare(o1.y, o2.y); } public static int compare(int x, int y) { return (x < y) ? -1 : ((x == y) ? 0 : 1); } } }