package joshie.harvest.mining.block;
import com.google.common.collect.Lists;
import joshie.harvest.api.gathering.ISmashable;
import joshie.harvest.core.HFTab;
import joshie.harvest.core.HFTrackers;
import joshie.harvest.core.base.block.BlockHFSmashable;
import joshie.harvest.core.base.item.ItemToolSmashing;
import joshie.harvest.core.entity.EntityBasket;
import joshie.harvest.core.lib.CreativeSort;
import joshie.harvest.mining.HFMining;
import joshie.harvest.mining.MiningHelper;
import joshie.harvest.mining.block.BlockOre.Ore;
import joshie.harvest.mining.item.ItemMaterial.Material;
import joshie.harvest.tools.HFTools;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import static joshie.harvest.api.gathering.ISmashable.ToolType.HAMMER;
import static joshie.harvest.core.lib.LootStrings.MINING;
import static joshie.harvest.core.lib.LootStrings.MINING_GEMS;
import static net.minecraft.block.material.Material.ROCK;
import static net.minecraft.init.Items.DIAMOND;
public class BlockOre extends BlockHFSmashable<BlockOre, Ore> implements ISmashable {
private static final AxisAlignedBB COPPER_AABB = new AxisAlignedBB(0.1D, 0.0D, 0.1D, 0.9D, 0.8D, 0.9D);
public enum Ore implements IStringSerializable {
ROCK, COPPER, SILVER, GOLD, MYSTRIL, GEM,
EMERALD, DIAMOND, RUBY, AMETHYST, TOPAZ, JADE;
@Override
public String getName() {
return name().toLowerCase(Locale.ENGLISH);
}
}
public BlockOre() {
super(ROCK, Ore.class, HFTab.MINING);
setBlockUnbreakable();
setSoundType(SoundType.STONE);
}
//Return 0.75F if the plant isn't withered, otherwise, unbreakable!!!
@Override
@SuppressWarnings("deprecation")
public float getPlayerRelativeBlockHardness(IBlockState state, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos) {
return (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() == HFTools.HAMMER)
? ((HFTools.HAMMER.getTier(player.getHeldItemMainhand()).ordinal() + 2) - getToolLevel(getEnumFromState(state))) * 0.025F: -1F;
}
@SuppressWarnings("deprecation")
@Override
@Nonnull
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
return COPPER_AABB;
}
@Override
public ToolType getToolType() {
return HAMMER;
}
@Override
public ItemToolSmashing getTool() {
return HFTools.HAMMER;
}
@Override
protected int getToolLevel(Ore ore) {
switch (ore) {
case ROCK:
case COPPER:
case AMETHYST:
case GEM:
return 1;
case SILVER:
case TOPAZ:
return 2;
case GOLD:
case JADE:
case RUBY:
return 3;
case MYSTRIL:
case EMERALD:
case DIAMOND:
return 4;
default:
return 0;
}
}
@Override
public void dropBlockAsItemWithChance(World worldIn, BlockPos pos, IBlockState state, float chance, int fortune) {
if (!worldIn.isRemote && !worldIn.restoringBlockSnapshots) {
EntityPlayer player = harvesters.get();
if (player != null && player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() == getTool()) {
smashBlock(harvesters.get(), worldIn, pos, state, getTool().getTier(player.getHeldItemMainhand()));
}
}
}
private static List<ItemStack> getRandomStack(World world, Material material, int bonus) {
while (bonus > 0) {
if (world.rand.nextInt(bonus) == 0)
return Lists.newArrayList(HFMining.MATERIALS.getStackFromEnum(material, 1 + world.rand.nextInt(bonus)));
bonus--;
}
return Lists.newArrayList(HFMining.MATERIALS.getStackFromEnum(material, 1));
}
private static List<ItemStack> getRandomStack(World world, Item item, int bonus) {
return Lists.newArrayList(new ItemStack(item, 1 + world.rand.nextInt(bonus)));
}
@Override
public List<ItemStack> getDrops(EntityPlayer player, World world, BlockPos pos, IBlockState state, float luck) {
Ore ore = getEnumFromState(state);
if (world instanceof WorldServer) {
WorldServer server = ((WorldServer)world);
server.spawnParticle(EnumParticleTypes.BLOCK_CRACK, pos.getX(), pos.getY(), pos.getZ(), 10, 0.5D, 0.5D, 0.5D, 0.0D, Block.getStateId(Blocks.DIRT.getDefaultState()));
}
List<ItemStack> drops;
switch (ore) {
case ROCK:
drops = world.isRemote ? Lists.newArrayList(new ItemStack(this)): MiningHelper.getLoot(MINING, world, player, luck);
break;
case COPPER:
drops = getRandomStack(world, Material.COPPER, 5);
break;
case SILVER:
drops = getRandomStack(world, Material.SILVER, 4);
break;
case GOLD:
drops = getRandomStack(world, Material.GOLD, 3);
break;
case MYSTRIL:
drops = getRandomStack(world, Material.MYSTRIL, 3);
break;
case EMERALD:
drops = getRandomStack(world, Items.EMERALD, 5);
break;
case DIAMOND:
drops = world.rand.nextInt(512) == 0 ? getRandomStack(world, Material.PINK_DIAMOND, 1) : getRandomStack(world, DIAMOND, 3);
break;
case RUBY:
drops = getRandomStack(world, Material.RUBY, 4);
break;
case JADE:
drops = getRandomStack(world, Material.JADE, 5);
break;
case AMETHYST:
drops = getRandomStack(world, Material.AMETHYST, 3);
break;
case TOPAZ:
drops = getRandomStack(world, Material.TOPAZ, 4);
break;
case GEM:
drops = world.isRemote ? Lists.newArrayList(new ItemStack(this)) : MiningHelper.getLoot(MINING_GEMS, world, player, luck);
break;
default:
drops = new ArrayList<>();
}
EntityBasket.findBasketAndShip(player, drops);
if (!world.isRemote) {
for (ItemStack stack: drops) {
HFTrackers.getPlayerTrackerFromPlayer(player).getTracking().addAsObtained(stack);
}
}
return drops;
}
@Override
public int getSortValue(ItemStack stack) {
return CreativeSort.TOOLS - 20 + stack.getItemDamage();
}
}