Package crazypants.enderio.machine.farm.farmers

Source Code of crazypants.enderio.machine.farm.farmers.PlantableFarmer

package crazypants.enderio.machine.farm.farmers;

import static net.minecraftforge.common.EnumPlantType.Cave;
import static net.minecraftforge.common.EnumPlantType.Crop;
import static net.minecraftforge.common.EnumPlantType.Desert;
import static net.minecraftforge.common.EnumPlantType.Nether;
import static net.minecraftforge.common.EnumPlantType.Plains;
import static net.minecraftforge.common.EnumPlantType.Water;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import net.minecraft.block.Block;
import net.minecraft.block.BlockStem;
import net.minecraft.block.IGrowable;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.EnumPlantType;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.util.ForgeDirection;
import crazypants.enderio.machine.farm.TileFarmStation;
import crazypants.util.BlockCoord;

public class PlantableFarmer implements IFarmerJoe {

  private Set<Block> harvestExcludes = new HashSet<Block>();

  public void addHarvestExlude(Block block) {
    harvestExcludes.add(block);
  }

  @Override
  public boolean canPlant(ItemStack stack) {
    if(stack == null) {
      return false;
    }
    return stack.getItem() instanceof IPlantable;
  }

  @Override
  public boolean prepareBlock(TileFarmStation farm, BlockCoord bc, Block block, int meta) {
    if(block == null) {
      return false;
    }

    ItemStack seedStack = farm.getSeedTypeInSuppliesFor(bc);
    if(seedStack == null) {
      farm.setNotification(TileFarmStation.NOTIFICATION_NO_SEEDS);
      return false;
    }

    if(!(seedStack.getItem() instanceof IPlantable)) {
      return false;
    }

    IPlantable plantable = (IPlantable) seedStack.getItem();
    EnumPlantType type = plantable.getPlantType(farm.getWorldObj(), bc.x, bc.y, bc.z);
    if(type == null) {
      return false;
    }
    Block ground = farm.getBlock(bc.getLocation(ForgeDirection.DOWN));
    if(type == EnumPlantType.Nether) {
      if(ground != Blocks.soul_sand) {
        return false;
      }
      return plantFromInventory(farm, bc, plantable);
    }

    if(type == EnumPlantType.Crop) {
      farm.tillBlock(bc);       
      return plantFromInventory(farm, bc, plantable);
    }

    return false;
  }

  //  From BlockBush, as a reference
  //  @Override
  //  public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z)
  //  {
  //      if (this == Blocks.wheat)          return Crop;
  //      if (this == Blocks.carrots)        return Crop;
  //      if (this == Blocks.potatoes)       return Crop;
  //      if (this == Blocks.melon_stem)     return Crop;
  //      if (this == Blocks.pumpkin_stem)   return Crop;
  //      if (this == Blocks.deadbush)       return Desert;
  //      if (this == Blocks.waterlily)      return Water;
  //      if (this == Blocks.red_mushroom)   return Cave;
  //      if (this == Blocks.brown_mushroom) return Cave;
  //      if (this == Blocks.nether_wart)    return Nether;
  //      if (this == Blocks.sapling)        return Plains;
  //      if (this == Blocks.tallgrass)      return Plains;
  //      if (this == Blocks.double_plant)   return Plains;
  //      if (this == Blocks.red_flower)     return Plains;
  //      if (this == Blocks.yellow_flower)  return Plains;       
  //      return Plains;
  //  }

  protected boolean plantFromInventory(TileFarmStation farm, BlockCoord bc, IPlantable plantable) {
    World worldObj = farm.getWorldObj();
    if(canPlant(worldObj, bc, plantable) && farm.takeSeedFromSupplies(bc) != null) {
      return plant(farm, worldObj, bc, plantable);
    }
    return false;
  }

  protected boolean plant(TileFarmStation farm, World worldObj, BlockCoord bc, IPlantable plantable) {
    worldObj.setBlock(bc.x, bc.y, bc.z, Blocks.air, 0, 1 | 2);
    Block target = plantable.getPlant(null, 0, 0, 0);
    int meta = plantable.getPlantMetadata(null, 0, 0, 0);
    worldObj.setBlock(bc.x, bc.y, bc.z, target, meta, 1 | 2);
    farm.actionPerformed(false);
    return true;
  }

  protected boolean canPlant(World worldObj, BlockCoord bc, IPlantable plantable) {
    Block target = plantable.getPlant(null, 0, 0, 0);
    Block ground = worldObj.getBlock(bc.x, bc.y - 1, bc.z);
    if(target != null && target.canPlaceBlockAt(worldObj, bc.x, bc.y, bc.z) &&
        target.canBlockStay(worldObj, bc.x, bc.y, bc.z) &&
        ground.canSustainPlant(worldObj, bc.x, bc.y - 1, bc.z, ForgeDirection.UP, plantable)) {
      return true;
    }
    return false;
  }

  @Override
  public boolean canHarvest(TileFarmStation farm, BlockCoord bc, Block block, int meta) {
    if(!harvestExcludes.contains(block) && block instanceof IGrowable && !(block instanceof BlockStem)) {
      return !((IGrowable) block).func_149851_a(farm.getWorldObj(), bc.x, bc.y, bc.z, true);
    }
    return false;
  }

  @Override
  public IHarvestResult harvestBlock(TileFarmStation farm, BlockCoord bc, Block block, int meta) {
    if(!canHarvest(farm, bc, block, meta)) {
      return null;
    }
    if(!farm.hasHoe()) {
      farm.setNotification(TileFarmStation.NOTIFICATION_NO_HOE);
      return null;
    }

    World worldObj = farm.getWorldObj();
    List<EntityItem> result = new ArrayList<EntityItem>();

    ItemStack removedPlantable = null;

    ArrayList<ItemStack> drops = block.getDrops(worldObj, bc.x, bc.y, bc.z, meta, farm.getMaxLootingValue());
    farm.damageHoe(1, bc);
    farm.actionPerformed(false);
    boolean removed = false;
    if(drops != null) {
      for (ItemStack stack : drops) {
        if(stack != null && !removed && isPlantableForBlock(stack, block)) {
          stack.stackSize--;
          removed = true;
          removedPlantable = stack.copy();
          if(stack.stackSize > 0) {
            result.add(new EntityItem(worldObj, bc.x + 0.5, bc.y + 0.5, bc.z + 0.5, stack.copy()));
          }
        } else {
          result.add(new EntityItem(worldObj, bc.x + 0.5, bc.y + 0.5, bc.z + 0.5, stack.copy()));
        }
      }
    }

    if(removed) {
      if(!plant(farm, worldObj, bc, (IPlantable) removedPlantable.getItem())) {
        result.add(new EntityItem(worldObj, bc.x + 0.5, bc.y + 0.5, bc.z + 0.5, removedPlantable.copy()));
        worldObj.setBlock(bc.x, bc.y, bc.z, Blocks.air, 0, 1 | 2);
      }
    } else {
      worldObj.setBlock(bc.x, bc.y, bc.z, Blocks.air, 0, 1 | 2);
    }

    return new HarvestResult(result, bc);
  }

  private boolean isPlantableForBlock(ItemStack stack, Block block) {
    if(!(stack.getItem() instanceof IPlantable)) {
      return false;
    }
    IPlantable plantable = (IPlantable) stack.getItem();
    return plantable.getPlant(null, 0, 0, 0) == block;
  }

}
TOP

Related Classes of crazypants.enderio.machine.farm.farmers.PlantableFarmer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.