package com.jaquadro.minecraft.gardenstuff.container; import com.jaquadro.minecraft.gardenstuff.block.tile.TileEntityBloomeryFurnace; 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 ContainerBloomeryFurnace extends Container { private static final int InventoryX = 8; private static final int InventoryY = 84; private static final int HotbarY = 142; private TileEntityBloomeryFurnace tileFurnace; private int lastCookTime; private int lastBurnTime; private int lastItemBurnTime; private Slot primarySlot; private Slot secondarySlot; private Slot fuelSlot; private Slot outputSlot; private List<Slot> playerSlots; private List<Slot> hotbarSlots; public ContainerBloomeryFurnace (InventoryPlayer inventory, TileEntityBloomeryFurnace tile) { tileFurnace = tile; primarySlot = addSlotToContainer(new Slot(tile, 0, 56, 17)); secondarySlot = addSlotToContainer(new Slot(tile, 1, 35, 17)); fuelSlot = addSlotToContainer(new Slot(tile, 2, 56, 53)); outputSlot = addSlotToContainer(new SlotBloomeryOutput(inventory.player, tile, 3, 116, 35)); 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, tileFurnace.furnaceCookTime); crafting.sendProgressBarUpdate(this, 1, tileFurnace.furnaceBurnTime); crafting.sendProgressBarUpdate(this, 2, tileFurnace.currentItemBurnTime); } @Override public void detectAndSendChanges () { super.detectAndSendChanges(); for (int i = 0; i < crafters.size(); i++) { ICrafting crafting = (ICrafting) crafters.get(i); if (lastCookTime != tileFurnace.furnaceCookTime) crafting.sendProgressBarUpdate(this, 0, tileFurnace.furnaceCookTime); if (lastBurnTime != tileFurnace.furnaceBurnTime) crafting.sendProgressBarUpdate(this, 1, tileFurnace.furnaceBurnTime); if (lastItemBurnTime != tileFurnace.currentItemBurnTime) crafting.sendProgressBarUpdate(this, 2, tileFurnace.currentItemBurnTime); } lastCookTime = tileFurnace.furnaceCookTime; lastBurnTime = tileFurnace.furnaceBurnTime; lastItemBurnTime = tileFurnace.currentItemBurnTime; } @Override @SideOnly(Side.CLIENT) public void updateProgressBar (int id, int value) { switch (id) { case 0: tileFurnace.furnaceCookTime = value; break; case 1: tileFurnace.furnaceBurnTime = value; break; case 2: tileFurnace.currentItemBurnTime = value; break; } } @Override public boolean canInteractWith (EntityPlayer player) { return tileFurnace.isUseableByPlayer(player); } @Override public ItemStack transferStackInSlot (EntityPlayer player, int slotIndex) { ItemStack itemStack = null; Slot slot = (Slot) inventorySlots.get(slotIndex); // 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); } // Try merge stacks within inventory and hotbar spaces else if (slotIndex >= inventoryStart && slotIndex < hotbarEnd) { boolean merged = false; if (TileEntityBloomeryFurnace.isItemFuel(slotStack)) merged = mergeItemStack(slotStack, fuelSlot.slotNumber, fuelSlot.slotNumber + 1, false); else if (TileEntityBloomeryFurnace.isItemPrimaryInput(slotStack)) merged = mergeItemStack(slotStack, primarySlot.slotNumber, primarySlot.slotNumber + 1, false); else if (TileEntityBloomeryFurnace.isItemSecondaryInput(slotStack)) merged = mergeItemStack(slotStack, secondarySlot.slotNumber, secondarySlot.slotNumber + 1, false); if (!merged) { 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; } }