package joshie.harvest.tools.item; import com.google.common.collect.Multimap; import joshie.harvest.core.base.item.ItemToolChargeable; import joshie.harvest.core.helpers.EntityHelper; import joshie.harvest.core.helpers.TextHelper; import joshie.harvest.tools.ToolHelper; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import java.util.HashSet; import java.util.List; import java.util.Locale; public class ItemSickle extends ItemToolChargeable<ItemSickle> { public ItemSickle() { super("sickle", new HashSet<>()); } @Override public int getFront(ToolTier tier) { switch (tier) { case BASIC: case COPPER: return 0; case SILVER: return 1; case GOLD: return 2; case MYSTRIL: return 4; case CURSED: case BLESSED: return 8; case MYTHIC: return 14; default: return 0; } } @Override public int getSides(ToolTier tier) { switch (tier) { case BASIC: return 0; case COPPER: case SILVER: case GOLD: return 1; case MYSTRIL: return 2; case CURSED: case BLESSED: return 4; case MYTHIC: return 7; default: return 0; } } @Override public boolean canLevel(ItemStack stack, IBlockState state) { for (String type : getToolClasses(stack)) { if (state.getBlock().isToolEffective(type, state)) return true; } return state.getBlock() instanceof IPlantable; } @Override public boolean onBlockDestroyed(ItemStack stack, World worldIn, IBlockState state, BlockPos startPos, EntityLivingBase entityLiving) { if (entityLiving instanceof EntityPlayer) { EntityPlayer player = ((EntityPlayer)entityLiving); EnumFacing front = EntityHelper.getFacingFromEntity(player); ToolTier tier = getChargeTier(getCharge(stack)); //Facing North, We Want East and West to be 1, left * this.left for (int x2 = getXMinus(tier, front, startPos.getX()); x2 <= getXPlus(tier, front, startPos.getX()); x2++) { for (int z2 = getZMinus(tier, front, startPos.getZ()); z2 <= getZPlus(tier, front, startPos.getZ()); z2++) { if (canUse(stack) && canBeDamaged()) { BlockPos newPos = new BlockPos(x2, startPos.getY(), z2); state = worldIn.getBlockState(newPos); if (canLevel(stack, state)) { //Break the block and collect the drops ToolHelper.performTask(player, stack, this); if (!newPos.equals(startPos)) { if (!worldIn.isRemote) { if (state.getBlock().canHarvestBlock(worldIn, newPos, player)) { boolean flag = state.getBlock().removedByPlayer(state, worldIn, newPos, player, true); if (flag) { state.getBlock().onBlockDestroyedByPlayer(worldIn, newPos, state); state.getBlock().harvestBlock(worldIn, player, newPos, state, worldIn.getTileEntity(newPos), stack); } } } } } stack.getSubCompound("Data", true).setInteger("Damage", getDamageForDisplay(stack) + 1); } } } } return true; } @Override public float getStrVsBlock(ItemStack stack, IBlockState state) { if (canUse(stack)) { Material material = state.getMaterial(); return (state.getBlock() != Blocks.GRASS && material == Material.GRASS) || material == Material.LEAVES || material == Material.VINE ? 10F : super.getStrVsBlock(stack, state); } else return 0.05F; } @Override @Nonnull public Multimap<String, AttributeModifier> getAttributeModifiers(@Nonnull EntityEquipmentSlot slot, ItemStack stack) { Multimap<String, AttributeModifier> multimap = super.getAttributeModifiers(slot, stack); ToolTier tier = getTier(stack); if (slot == EntityEquipmentSlot.MAINHAND) { multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", 5.0D, 0)); multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", 3D + (tier.getToolLevel() - 6.0D), 0)); } return multimap; } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List<String> list, boolean flag) { super.addInformation(stack, player, list, flag); int charge = getCharge(stack); ToolTier thisTier = getTier(stack); if (thisTier != ToolTier.BASIC) { ToolTier tier = LEVEL_TO_TIER.get(charge); list.add(TextFormatting.GOLD + TextHelper.translate("sickle.tooltip.charge." + tier.name().toLowerCase(Locale.ENGLISH))); list.add("-------"); if (charge < thisTier.getToolLevel()) list.add(TextFormatting.AQUA + "" + TextFormatting.ITALIC + TextHelper.translate("sickle.tooltip.charge")); if (charge != 0) list.add(TextFormatting.RED + "" + TextFormatting.ITALIC + TextHelper.translate("sickle.tooltip.discharge")); } } @Override protected String getLevelName(ItemStack stack, int charges) { int maximum = getMaxCharge(stack); int charge = getCharge(stack); int newCharge = Math.min(maximum, charge + charges); return charge == newCharge ? null : TextHelper.translate("sickle.tooltip.charge." + LEVEL_TO_TIER.get(newCharge).name().toLowerCase(Locale.ENGLISH)); } }