package nl.lang2619.bagginses.event;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import nl.lang2619.bagginses.helpers.BagFinder;
import nl.lang2619.bagginses.inventory.InventoryBag;
import nl.lang2619.bagginses.items.bags.Bag;
import nl.lang2619.bagginses.items.bags.container.BagContainer;
import nl.lang2619.bagginses.references.BagMode;
import nl.lang2619.bagginses.references.BagTypes;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Stolen with love from Modular Utilities
* https://github.com/BrassGoggledCoders/ModularUtilities
*/
public class ItemDropEvent {
//TODO add bags in hotbar too
@SubscribeEvent
public void onLivingDrops(LivingDropsEvent event) {
if(event.getSource().getDamageType() == "player") {
EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
ItemStack bagStack = BagFinder.getBag(player);
if (bagStack != null) {
Bag bag = (Bag) bagStack.getItem();
//Only want pickup
if (BagMode.getMode(bagStack) != BagMode.PICKUP)
return;
//Not void for now
if (bag.getType() == BagTypes.VOID)
return;
Iterator<EntityItem> drops = event.getDrops().iterator();
ArrayList<EntityItem> toRemove = new ArrayList<EntityItem>();
if (bag.getType() == BagTypes.ENDER) {
while(drops.hasNext()) {
EntityItem stack = drops.next();
if(player.getInventoryEnderChest().addItem(stack.getEntityItem()) == null) {
toRemove.add(stack);
}
}
} else {
BagTypes type = bag.getType();
InventoryBag inv = new InventoryBag(bagStack);
BagContainer container = new BagContainer(player, inv);
while(drops.hasNext()) {
EntityItem stack = drops.next();
for (int i = 0; i < type.getColumns() * type.getRows(); i++) {
if (container.getSlot(i).isItemValid(stack.getEntityItem())) {
if (inv.getStackInSlot(i) == null) {
inv.setInventorySlotContents(i, stack.getEntityItem());
toRemove.add(stack);
break;
} else if (doStacksMatch(inv.getStackInSlot(i), stack.getEntityItem())) {
ItemStack invStack = inv.getStackInSlot(i);
Slot slot = container.getSlot(i);
int resultingStackSize = stack.getEntityItem().stackSize + invStack.stackSize;
int max = Math.min(stack.getEntityItem().getMaxStackSize(), slot.getSlotStackLimit());
if (resultingStackSize <= max) {
invStack.stackSize = resultingStackSize;
toRemove.add(stack);
break;
} else if (invStack.stackSize < max) {
stack.getEntityItem().stackSize -= (max - invStack.stackSize);
invStack.stackSize = max;
}
}
}
}
}
inv.save();
}
event.getDrops().removeAll(toRemove);
}
}
}
@SubscribeEvent
public void onBlockDrops(BlockEvent.HarvestDropsEvent event) {
if(event.getHarvester() != null) {
ItemStack bagStack = BagFinder.getBag(event.getHarvester());
if (bagStack != null) {
Bag bag = (Bag) bagStack.getItem();
//Only want pickup
if (BagMode.getMode(bagStack) != BagMode.PICKUP)
return;
//Not void for now
if (bag.getType() == BagTypes.VOID)
return;
Iterator<ItemStack> drops = event.getDrops().iterator();
ArrayList<ItemStack> toRemove = new ArrayList<ItemStack>();
if (bag.getType() == BagTypes.ENDER) {
while(drops.hasNext()) {
ItemStack stack = drops.next();
if(event.getHarvester().getInventoryEnderChest().addItem(stack) == null) {
toRemove.add(stack);
}
}
} else {
BagTypes type = bag.getType();
InventoryBag inv = new InventoryBag(bagStack);
BagContainer container = new BagContainer(event.getHarvester(), inv);
while(drops.hasNext()) {
ItemStack stack = drops.next();
for (int i = 0; i < type.getColumns() * type.getRows(); i++) {
if (container.getSlot(i).isItemValid(stack)) {
if (inv.getStackInSlot(i) == null) {
inv.setInventorySlotContents(i, stack);
toRemove.add(stack);
break;
} else if (doStacksMatch(inv.getStackInSlot(i), stack)) {
ItemStack invStack = inv.getStackInSlot(i);
Slot slot = container.getSlot(i);
int resultingStackSize = stack.stackSize + invStack.stackSize;
int max = Math.min(stack.getMaxStackSize(), slot.getSlotStackLimit());
if (resultingStackSize <= max) {
invStack.stackSize = resultingStackSize;
toRemove.add(stack);
break;
} else if (invStack.stackSize < max) {
stack.stackSize -= (max - invStack.stackSize);
invStack.stackSize = max;
}
}
}
}
}
inv.save();
}
event.getDrops().removeAll(toRemove);
}
}
}
public boolean doStacksMatch(ItemStack stackA, ItemStack stackB) {
if (stackA == null
|| stackB == null)
return false;
if (stackA.getItem() != stackB.getItem())
return false;
if (stackA.getItemDamage() != stackB.getItemDamage())
return false;
if (stackA.getTagCompound() != stackB.getTagCompound())
return false;
return true;
}
}