package crazypants.enderio.machine.power;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class ContainerCapacitorBank extends Container {
private final TileCapacitorBank tileEntity;
public ContainerCapacitorBank(final Entity player, InventoryPlayer playerInv, TileCapacitorBank te) {
tileEntity = te;
int armorOffset = 21;
addSlotToContainer(new Slot(tileEntity, 0, 59 + armorOffset, 59) {
@Override
public boolean isItemValid(ItemStack itemStack) {
return tileEntity.isItemValidForSlot(0, itemStack);
}
});
addSlotToContainer(new Slot(tileEntity, 1, 79 + armorOffset, 59) {
@Override
public boolean isItemValid(ItemStack itemStack) {
return tileEntity.isItemValidForSlot(1, itemStack);
}
});
addSlotToContainer(new Slot(tileEntity, 2, 99 + armorOffset, 59) {
@Override
public boolean isItemValid(ItemStack itemStack) {
return tileEntity.isItemValidForSlot(2, itemStack);
}
});
addSlotToContainer(new Slot(tileEntity, 3, 119 + armorOffset, 59) {
@Override
public boolean isItemValid(ItemStack itemStack) {
return tileEntity.isItemValidForSlot(3, itemStack);
}
});
// add players inventory
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 9; ++j) {
addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, +armorOffset + 8 + j * 18, 84 + i * 18));
}
}
for (int i = 0; i < 9; ++i) {
addSlotToContainer(new Slot(playerInv, i, +armorOffset + 8 + i * 18, 142));
}
//armor slots
for (int i = 0; i < 4; ++i) {
final int k = i;
addSlotToContainer(new Slot(playerInv, playerInv.getSizeInventory() - 1 - i, -15 + armorOffset, 30 + i * 18) {
@Override
public int getSlotStackLimit() {
return 1;
}
@Override
public boolean isItemValid(ItemStack par1ItemStack) {
if(par1ItemStack == null) {
return false;
}
return par1ItemStack.getItem().isValidArmor(par1ItemStack, k, player);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getBackgroundIconIndex() {
return ItemArmor.func_94602_b(k);
}
});
}
}
@Override
public boolean canInteractWith(EntityPlayer entityplayer) {
return true;
}
@Override
public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slotIndex) {
int startPlayerSlot = 4;
int endPlayerSlot = startPlayerSlot + 26;
int startHotBarSlot = endPlayerSlot + 1;
int endHotBarSlot = startHotBarSlot + 9;
ItemStack copystack = null;
Slot slot = (Slot) inventorySlots.get(slotIndex);
if(slot != null && slot.getHasStack()) {
ItemStack origStack = slot.getStack();
copystack = origStack.copy();
if(slotIndex < 4) {
// merge from machine input slots to inventory
if(!mergeItemStackIntoArmor(entityPlayer, origStack, slotIndex)) {
if(!mergeItemStack(origStack, startPlayerSlot, endHotBarSlot, false)) {
return null;
}
}
} else {
//Check from inv-> charge then inv->hotbar or hotbar->inv
if(slotIndex >= startPlayerSlot) {
if(!tileEntity.isItemValidForSlot(0, origStack) || !mergeItemStack(origStack, 0, 4, false)) {
if(slotIndex <= endPlayerSlot) {
if(!mergeItemStack(origStack, startHotBarSlot, endHotBarSlot, false)) {
return null;
}
} else if(slotIndex >= startHotBarSlot && slotIndex <= endHotBarSlot) {
if(!mergeItemStack(origStack, startPlayerSlot, endPlayerSlot, false)) {
return null;
}
}
}
}
}
if(origStack.stackSize == 0) {
slot.putStack((ItemStack) null);
} else {
slot.onSlotChanged();
}
slot.onSlotChanged();
if(origStack.stackSize == copystack.stackSize) {
return null;
}
slot.onPickupFromSlot(entityPlayer, origStack);
}
return copystack;
}
private boolean mergeItemStackIntoArmor(EntityPlayer entityPlayer, ItemStack origStack, int slotIndex) {
if(origStack == null || !(origStack.getItem() instanceof ItemArmor)) {
return false;
}
ItemArmor armor = (ItemArmor) origStack.getItem();
int index = 3 - armor.armorType;
ItemStack[] ai = entityPlayer.inventory.armorInventory;
if(ai[index] == null) {
ai[index] = origStack.copy();
origStack.stackSize = 0;
return true;
}
return false;
}
}