package com.demoxin.minecraft.fortuneores;
import java.util.ArrayList;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.oredict.OreDictionary;
public class OreSwapper
{
@SubscribeEvent(priority=EventPriority.LOWEST)
public void SwapOres(HarvestDropsEvent event)
{
if(event.isSilkTouching())
return;
if(event.getDrops().isEmpty())
return;
if(event.getState().getBlock().hasTileEntity(event.getState()))
{
TileEntity te = event.getWorld().getTileEntity(event.getPos());
if(te instanceof ISidedInventory) return;
if(te instanceof IInventory) return;
IItemHandler handler = null;
handler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
for(EnumFacing side : EnumFacing.VALUES)
{
if(handler != null)
return;
handler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side);
}
if(handler != null) return;
}
ArrayList<ItemStack> newDrops = new ArrayList<ItemStack>();
int xp = 0;
boolean modifiedDrops = false;
for(int i = 0; i < event.getDrops().size(); ++i)
{
if(event.getDrops().get(i) == null)
continue;
ItemStack currentDrop = event.getDrops().get(i);
if(currentDrop.getItem() == null)
continue;
if(event.getDropChance() < 1.0f)
{
if(event.getWorld().rand.nextFloat() > event.getDropChance())
continue;
}
boolean dropHandled = false;
for(ItemStack stack : OreDictionaryMagic.preservedOreDicting.keySet())
{
if(OreDictionary.itemMatches(stack, currentDrop, true))
{
Ore ore = OreDictionaryMagic.preservedOreDicting.get(stack);
int randomCount = this.randomCount(ore.dropCount * currentDrop.stackSize, event.getFortuneLevel(), event.getWorld());
for(int j = 0; j < randomCount; ++j)
{
newDrops.add(new ItemStack(FortuneOres.itemChunk, 1, ore.meta));
}
xp += event.getWorld().rand.nextInt(ore.xpMax - ore.xpMin) + ore.xpMin;
dropHandled = true;
modifiedDrops = true;
break;
}
}
if(!dropHandled)
newDrops.add(currentDrop);
}
if(!modifiedDrops)
return;
event.getDrops().clear();
event.getDrops().addAll(newDrops);
event.setDropChance(1.0f);
if(xp <= 0)
return;
while(xp > 0)
{
int i = EntityXPOrb.getXPSplit(xp);
xp -= i;
event.getWorld().spawnEntityInWorld(new EntityXPOrb(event.getWorld(), (double)event.getPos().getX() + 0.5D, (double)event.getPos().getY() + 0.5D, (double)event.getPos().getZ() + 0.5D, i));
}
}
private int randomCount(int baseCount, int fortuneLevel, World world)
{
if(fortuneLevel <= 0)
return baseCount;
int j = world.rand.nextInt(fortuneLevel + 2) - 1;
if (j < 0)
j = 0;
return baseCount * (j + 1);
}
}