package com.goldenapple.coppertools.item;
import com.goldenapple.coppertools.CopperToolsCreativeTab;
import com.goldenapple.coppertools.init.EquipMaterial;
import com.goldenapple.coppertools.reference.Reference;
import com.goldenapple.coppertools.util.OreHelper;
import com.google.common.collect.Sets;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemTool;
import net.minecraft.world.World;
import java.util.Set;
//Contains a lot of "stolen" code from CoFHCore https://github.com/CoFH/CoFHCore
public class ItemSickleCommon extends ItemTool {
public static final Set<Material> effectiveMaterials = Sets.newHashSet(Material.leaves, Material.plants, Material.vine, Material.web);
private static final Set<String> toolClasses = Sets.newHashSet("sickle");
private EquipMaterial material;
public ItemSickleCommon(EquipMaterial material){
super(2.0F, material.toolMat, effectiveMaterials);
if(CopperToolsCreativeTab.tabTools != null){
setCreativeTab(CopperToolsCreativeTab.tabTools);
}else{
setCreativeTab(CreativeTabs.tabTools);
}
this.material = material;
}
@Override
public boolean canHarvestBlock(Block block, ItemStack stack) {
return block == Blocks.web || block == Blocks.vine;
}
@Override
public Set<String> getToolClasses(ItemStack stack) {
return toolClasses;
}
@Override
public float func_150893_a(ItemStack stack, Block block){ //Returns efficiency of mining given block
return effectiveMaterials.contains(block.getMaterial()) ? efficiencyOnProperMaterial : 1.0F;
}
@Override
public boolean isItemTool(ItemStack stack){
return true;
}
public void harvestBlock(World world, int x, int y, int z, EntityPlayer player){
Block block = world.getBlock(x, y, z);
if (block.getBlockHardness(world, x, y, z) < 0 || block.equals(Blocks.waterlily)) {
return;
}
int bMeta = world.getBlockMetadata(x, y, z);
if (block.canHarvestBlock(player, bMeta)) {
block.harvestBlock(world, player, x, y, z, bMeta);
}
if (!world.isRemote && block.equals(Blocks.vine)) {
block.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 1);
}
world.setBlockToAir(x, y, z);
}
public boolean harvest(World world, Block block, int x, int y, int z, EntityPlayer player){ //i'm not doing all of this in the onBlockDestroyed because of other sickles that handle damage differently
boolean used = false;
if(block.getMaterial().equals(Material.leaves)) { //Harvesting leaves in a 3x3x3 area
for (int a = x - 1; a <= x + 1; a++) {
for (int b = y - 1; b <= y + 1; b++){
for (int c = z - 1; c <= z + 1; c++) {
if (effectiveMaterials.contains(world.getBlock(a, b, c).getMaterial())) {
harvestBlock(world, a, b, c, player);
used = true;
}
}
}
}
}else{ //Harvesting grass in a 3x1x3 area
for (int a = x - 1; a <= x + 1; a++) {
for (int c = z - 1; c <= z + 1; c++) {
if (effectiveMaterials.contains(world.getBlock(a, y, c).getMaterial())) {
harvestBlock(world, a, y, c, player);
used = true;
}
}
}
}
return used;
}
@Override
public boolean onBlockDestroyed(ItemStack itemStack, World world, Block block, int x, int y, int z, EntityLivingBase entity) {
/* EntityPlayer player = (EntityPlayer) entity;
boolean used = false;
if(!block.getMaterial().equals(Material.leaves)) { //Harvesting plants in a 3x1x3 area
for (int i = x - 1; i <= x + 1; i++) {
for (int k = z - 1; k <= z + 1; k++) {
if (effectiveMaterials.contains(world.getBlock(i, y, k).getMaterial())) {
harvestBlock(world, i, y, k, player);
used = true;
}
}
}
}else{ //Harvesting leaves in a 3x3x3 area
for (int a = x - 1; a <= x + 1; a++) {
for (int b = y - 1; b <= y + 1; b++){
for (int c = z - 1; c <= z + 1; c++) {
if (effectiveMaterials.contains(world.getBlock(a, b, c).getMaterial())) {
harvestBlock(world, a, b, c, player);
used = true;
}
}
}
}
}
if (used) {
if(!player.capabilities.isCreativeMode) {
stack.damageItem(1, entity);
}
}
return used; */
if(entity instanceof EntityPlayer) {
if (!((EntityPlayer) entity).capabilities.isCreativeMode) {
itemStack.damageItem(1, entity);
}
return harvest(world, block, x, y, z, (EntityPlayer)entity);
}
return false;
}
@Override
public boolean getIsRepairable(ItemStack tool, ItemStack item){
if (material.repairMat instanceof String){
return OreHelper.isItemThisOre(item, (String)material.repairMat);
}else if(material.repairMat instanceof ItemStack){
return item.isItemEqual((ItemStack)material.repairMat);
}
return false;
}
@Override
public String getUnlocalizedName(){
return "item." + Reference.MOD_ID.toLowerCase() + ":" + material.name + "_sickle";
}
@Override
public String getUnlocalizedName(ItemStack itemStack){
return getUnlocalizedName();
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister iconRegister){
if(material.useObsidian){
itemIcon = iconRegister.registerIcon(Reference.MOD_ID.toLowerCase() + ":" + material.name + "_sickle_o");
}else {
itemIcon = iconRegister.registerIcon(Reference.MOD_ID.toLowerCase() + ":" + material.name + "_sickle");
}
}
}