package joshie.harvest.core.base.item;
import joshie.harvest.api.gathering.ISmashable;
import joshie.harvest.api.gathering.ISmashable.ToolType;
import joshie.harvest.core.helpers.EntityHelper;
import joshie.harvest.tools.ToolHelper;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.Set;
public abstract class ItemToolSmashing<I extends ItemToolSmashing> extends ItemTool<I> {
public ItemToolSmashing(String toolClass, Set<Block> effective) {
super(toolClass, effective);
}
@Override
@Nonnull
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.NONE;
}
@Override
public float getExhaustionRate(ItemStack stack) {
ToolTier tier = getTier(stack);
switch (tier) {
case BASIC:
return 3F;
case COPPER:
return 1.25F;
case SILVER:
return 0.333F;
case GOLD:
return 0.222F;
case MYSTRIL:
return 0.055F;
case CURSED:
return 25F;
case BLESSED:
return 0.02F;
case MYTHIC:
return 0.005F;
default:
return 1F;
}
}
@Override
public int getFront(ToolTier tier) {
switch (tier) {
case BASIC:
return 0;
case COPPER:
return 1;
case SILVER:
return 2;
case GOLD:
return 3;
case MYSTRIL:
return 5;
case CURSED:
case BLESSED:
return 7;
case MYTHIC:
return 15;
default:
return 0;
}
}
@Override
protected int getXMinus(ToolTier tier, EnumFacing facing, int x) {
return x - getFront(tier);
}
@Override
protected int getXPlus(ToolTier tier, EnumFacing facing, int x) {
return x + getFront(tier);
}
@Override
protected int getZMinus(ToolTier tier, EnumFacing facing, int z) {
return z - getFront(tier);
}
@Override
protected int getZPlus(ToolTier tier, EnumFacing facing, int z) {
return z + getFront(tier);
}
public abstract ToolType getToolType();
public abstract void playSound(World world, BlockPos pos);
public boolean onSmashed(EntityPlayer player, ItemStack stack, ToolTier tier, int harvestLevel, World world, BlockPos pos, IBlockState state) {
if (canUse(stack)) {
if (state.getBlock() instanceof ISmashable) {
int requiredLevel = state.getBlock().getHarvestLevel(state);
if (harvestLevel >= requiredLevel) {
ISmashable smashable = ((ISmashable) state.getBlock());
if (smashable.getToolType() == getToolType()) {
if (smashable.smashBlock(player, world, pos, state, tier)) {
ToolHelper.performTask(player, stack, this);
if (!world.isRemote) {
onBlockDestroyed(stack, world, state, pos, player);
}
return true;
}
}
}
}
}
return false;
}
public void smashBlock(World world, EntityPlayer player, BlockPos position, ItemStack stack, boolean jump) {
ToolTier tier = jump ? getTier(stack) : ToolTier.BASIC;
int harvestLevel = getHarvestLevel(stack, toolClass);
boolean smashed = false;
EnumFacing front = EntityHelper.getFacingFromEntity(player);
for (int x = getXMinus(tier, front, position.getX()); x <= getXPlus(tier, front, position.getX()); x++) {
for (int z = getZMinus(tier, front, position.getZ()); z <= getZPlus(tier, front, position.getZ()); z++) {
BlockPos pos = new BlockPos(x, position.getY(), z);
IBlockState state = world.getBlockState(pos);
if (onSmashed(player, stack, tier, harvestLevel, world, pos, state)) {
smashed = true;
}
}
}
if (smashed && jump) {
world.spawnParticle(EnumParticleTypes.EXPLOSION_NORMAL, position.getX() + 0.5D, position.getY() + 0.5D, position.getZ() + 0.5D, 0, 0, 0);
playSound(world, position);
}
}
}