package joshie.harvest.core.gui;
import com.google.common.base.Optional;
import joshie.harvest.api.HFApi;
import joshie.harvest.core.HFCore;
import joshie.harvest.core.base.gui.ContainerBase;
import joshie.harvest.core.block.BlockStorage.Storage;
import joshie.harvest.core.entity.EntityBasket;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.SlotItemHandler;
import static joshie.harvest.core.entity.EntityBasket.ITEM;
import static joshie.harvest.core.tile.TileBasket.BASKET_INVENTORY;
public class ContainerBasket extends ContainerBase {
private final ItemStackHandler handler;
private final ItemStack basketItem;
public ContainerBasket(InventoryPlayer inventory, ItemStack basketItem, EntityBasket basketEntity) {
this.handler = basketItem != null ? new ItemStackHandler(BASKET_INVENTORY) : basketEntity.handler;
this.basketItem = basketItem;
if (basketItem != null && basketItem.getTagCompound() != null) {
this.handler.deserializeNBT(basketItem.getTagCompound().getCompoundTag("inventory"));
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++) {
addSlotToContainer(new BasketSlotItemHandler(basketEntity, handler, j + i * 9, 8 + j * 18, (i * 18) + 18));
}
}
bindPlayerInventory(inventory, 2);
}
@Override
public void onContainerClosed(EntityPlayer playerIn) {
super.onContainerClosed(playerIn);
if (basketItem != null) {
NBTTagCompound tag = basketItem.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
basketItem.setTagCompound(tag);
}
tag.setTag("inventory", handler.serializeNBT());
}
}
@Override
protected int getInventorySize() {
return handler.getSlots();
}
@Override
protected boolean isValid(ItemStack stack) {
return HFApi.shipping.getSellValue(stack) > 0;
}
@Override
protected Slot createSlot(InventoryPlayer inventory, int id, int x, int y) {
return new Slot(inventory, id, x, y) {
@Override
public boolean canTakeStack(EntityPlayer playerIn) {
return getStack() == null || getStack().getItem() != Item.getItemFromBlock(HFCore.STORAGE) || HFCore.STORAGE.getEnumFromStack(getStack()) != Storage.BASKET;
}
};
}
private class BasketSlotItemHandler extends SlotItemHandler {
private final EntityBasket basketEntity;
BasketSlotItemHandler(EntityBasket basket, IItemHandler itemHandler, int index, int xPosition, int yPosition) {
super(itemHandler, index, xPosition, yPosition);
this.basketEntity = basket;
}
@Override
public void onSlotChanged() {
super.onSlotChanged();
if (basketEntity != null && getStack() != null) {
basketEntity.getDataManager().set(ITEM, Optional.fromNullable(getStack()));
}
}
@Override
public boolean isItemValid(ItemStack stack) {
return HFApi.shipping.getSellValue(stack) > 0;
}
}
}