package com.jaquadro.minecraft.gardencore.inventory;
import com.jaquadro.minecraft.gardencore.block.BlockCompostBin;
import com.jaquadro.minecraft.gardencore.block.tile.TileEntityCompostBin;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
public class ContainerCompostBin extends Container
{
private static final int InventoryX = 8;
private static final int InventoryY = 84;
private static final int HotbarY = 142;
private TileEntityCompostBin tileCompost;
private int lastDecompTime;
private int lastItemDecompTime;
private int lastDecompCount;
private Slot outputSlot;
private List<Slot> compostSlots;
private List<Slot> playerSlots;
private List<Slot> hotbarSlots;
public ContainerCompostBin (InventoryPlayer inventory, TileEntityCompostBin tileEntity) {
tileCompost = tileEntity;
compostSlots = new ArrayList<Slot>();
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++)
compostSlots.add(addSlotToContainer(new SlotCompost(tileEntity, x + y * 3, 30 + x * 18, 17 + y * 18)));
}
outputSlot = addSlotToContainer(new SlotCompostOutput(inventory.player, tileEntity, 9, 123, 34));
playerSlots = new ArrayList<Slot>();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++)
playerSlots.add(addSlotToContainer(new Slot(inventory, j + i * 9 + 9, InventoryX + j * 18, InventoryY + i * 18)));
}
hotbarSlots = new ArrayList<Slot>();
for (int i = 0; i < 9; i++)
hotbarSlots.add(addSlotToContainer(new Slot(inventory, i, InventoryX + i * 18, HotbarY)));
}
@Override
public void addCraftingToCrafters (ICrafting crafting) {
super.addCraftingToCrafters(crafting);
crafting.sendProgressBarUpdate(this, 0, tileCompost.getDecompTime());
crafting.sendProgressBarUpdate(this, 1, tileCompost.getCurrentItemDecompTime());
crafting.sendProgressBarUpdate(this, 2, tileCompost.itemDecomposeCount);
}
@Override
public void detectAndSendChanges () {
super.detectAndSendChanges();
for (int i = 0; i < crafters.size(); i++) {
ICrafting crafting = (ICrafting) crafters.get(i);
if (lastDecompTime != tileCompost.getDecompTime())
crafting.sendProgressBarUpdate(this, 0, tileCompost.getDecompTime());
if (lastItemDecompTime != tileCompost.getCurrentItemDecompTime())
crafting.sendProgressBarUpdate(this, 1, tileCompost.getCurrentItemDecompTime());
if (lastDecompCount != tileCompost.itemDecomposeCount)
crafting.sendProgressBarUpdate(this, 2, tileCompost.itemDecomposeCount);
}
lastDecompTime = tileCompost.getDecompTime();
lastItemDecompTime = tileCompost.getCurrentItemDecompTime();
lastDecompCount = tileCompost.itemDecomposeCount;
}
@SideOnly(Side.CLIENT)
@Override
public void updateProgressBar (int id, int value) {
if (id == 0)
tileCompost.binDecomposeTime = value;
if (id == 1)
tileCompost.currentItemDecomposeTime = value;
if (id == 2)
tileCompost.itemDecomposeCount = value;
}
@Override
public boolean canInteractWith (EntityPlayer player) {
return tileCompost.isUseableByPlayer(player);
}
@Override
public ItemStack transferStackInSlot (EntityPlayer player, int slotIndex) {
ItemStack itemStack = null;
Slot slot = (Slot) inventorySlots.get(slotIndex);
int compostStart = compostSlots.get(0).slotNumber;
int compostEnd = compostSlots.get(compostSlots.size() - 1).slotNumber + 1;
// Assume inventory and hotbar slot IDs are contiguous
int inventoryStart = playerSlots.get(0).slotNumber;
int hotbarStart = hotbarSlots.get(0).slotNumber;
int hotbarEnd = hotbarSlots.get(hotbarSlots.size() - 1).slotNumber + 1;
if (slot != null && slot.getHasStack()) {
ItemStack slotStack = slot.getStack();
itemStack = slotStack.copy();
// Try merge output into inventory and signal change
if (slotIndex == outputSlot.slotNumber) {
if (!mergeItemStack(slotStack, inventoryStart, hotbarEnd, true))
return null;
slot.onSlotChange(slotStack, itemStack);
BlockCompostBin.updateBlockState(tileCompost.getWorldObj(), tileCompost.xCoord, tileCompost.yCoord, tileCompost.zCoord);
}
// Try merge stacks within inventory and hotbar spaces
else if (slotIndex >= inventoryStart && slotIndex < hotbarEnd) {
if (!TileEntityCompostBin.isItemDecomposable(slotStack) || !mergeItemStack(slotStack, compostStart, compostEnd, false)) {
if (slotIndex >= inventoryStart && slotIndex < hotbarStart) {
if (!mergeItemStack(slotStack, hotbarStart, hotbarEnd, false))
return null;
} else if (slotIndex >= hotbarStart && slotIndex < hotbarEnd && !this.mergeItemStack(slotStack, inventoryStart, hotbarStart, false))
return null;
}
}
// Try merge stack into inventory
else if (!mergeItemStack(slotStack, inventoryStart, hotbarEnd, false))
return null;
if (slotStack.stackSize == 0)
slot.putStack(null);
else
slot.onSlotChanged();
if (slotStack.stackSize == itemStack.stackSize)
return null;
slot.onPickupFromSlot(player, slotStack);
}
return itemStack;
}
}