package crazypants.enderio.machine.farm.farmers;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import com.enderio.core.common.util.BlockCoord;
import crazypants.enderio.machine.farm.TileFarmStation;
public class FarmersCommune implements IFarmerJoe {
public static FarmersCommune instance = new FarmersCommune();
private static List<ItemStack> disableTrees = new ArrayList<ItemStack>();
public static void joinCommune(IFarmerJoe joe) {
if (joe instanceof CustomSeedFarmer)
{
CustomSeedFarmer customSeedFarmer = (CustomSeedFarmer) joe;
if (customSeedFarmer.doesDisableTreeFarm()) disableTrees.add(customSeedFarmer.getSeeds());
}
instance.farmers.add(joe);
}
public static void leaveCommune(IFarmerJoe joe) {
throw new UnsupportedOperationException("As if this would be implemented. The commune is for life!");
}
private List<IFarmerJoe> farmers = new ArrayList<IFarmerJoe>();
private FarmersCommune() {
}
@Override
public boolean canHarvest(TileFarmStation farm, BlockCoord bc, Block block, int meta) {
for (IFarmerJoe joe : farmers) {
if(joe.canHarvest(farm, bc, block, meta)) {
return true;
}
}
return false;
}
@Override
public IHarvestResult harvestBlock(TileFarmStation farm, BlockCoord bc, Block block, int meta) {
for (IFarmerJoe joe : farmers) {
if (ignoreTreeHarvest(farm, bc, joe)) continue;
if (joe.canHarvest(farm, bc, block, meta)) {
return joe.harvestBlock(farm, bc, block, meta);
}
}
return null;
}
@Override
public boolean prepareBlock(TileFarmStation farm, BlockCoord bc, Block block, int meta) {
for (IFarmerJoe joe : farmers) {
if(joe.prepareBlock(farm, bc, block, meta)) {
return true;
}
}
return false;
}
@Override
public boolean canPlant(ItemStack stack) {
for (IFarmerJoe joe : farmers) {
if(joe.canPlant(stack)) {
return true;
}
}
return false;
}
private boolean ignoreTreeHarvest(TileFarmStation farm, BlockCoord bc, IFarmerJoe joe)
{
ItemStack stack = farm.getSeedTypeInSuppliesFor(bc);
if (!(joe instanceof TreeFarmer) || stack == null) return false;
for (ItemStack disableTreeStack : disableTrees)
{
if (disableTreeStack.isItemEqual(stack)) return true;
}
return false;
}
}