/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.core.list; import java.util.ArrayList; import java.util.EnumMap; import java.util.HashMap; import java.util.List; import java.util.Map; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiTextField; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import buildcraft.BuildCraftCore; import buildcraft.api.lists.ListMatchHandler; import buildcraft.core.ItemList; import buildcraft.core.lib.gui.AdvancedSlot; import buildcraft.core.lib.gui.GuiAdvancedInterface; import buildcraft.core.lib.gui.buttons.GuiImageButton; import buildcraft.core.lib.gui.buttons.IButtonClickEventListener; import buildcraft.core.lib.gui.buttons.IButtonClickEventTrigger; import buildcraft.core.lib.inventory.StackHelper; public class GuiListNew extends GuiAdvancedInterface implements IButtonClickEventListener { private static final ResourceLocation TEXTURE_BASE = new ResourceLocation( "buildcraftcore:textures/gui/list_new.png"); private static final int BUTTON_COUNT = 3; private final Map<Integer, Map<ListMatchHandler.Type, List<ItemStack>>> exampleCache = new HashMap<Integer, Map<ListMatchHandler.Type, List<ItemStack>>>(); private GuiTextField textField; private EntityPlayer player; private static class ListSlot extends AdvancedSlot { public int lineIndex; public int slotIndex; public ListSlot(GuiAdvancedInterface gui, int x, int y, int iLineIndex, int iSlotIndex) { super(gui, x, y); lineIndex = iLineIndex; slotIndex = iSlotIndex; } @Override public ItemStack getItemStack() { ContainerListNew container = (ContainerListNew) gui.getContainer(); if (slotIndex == 0 || !container.lines[lineIndex].isOneStackMode()) { return container.lines[lineIndex].getStack(slotIndex); } else { List<ItemStack> data = ((GuiListNew) gui).getExamplesList(lineIndex, container.lines[lineIndex].getSortingType()); if (data.size() >= slotIndex) { return data.get(slotIndex - 1); } else { return null; } } } @Override public void drawSprite(int cornerX, int cornerY) { if (!shouldDrawHighlight()) { Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE_BASE); gui.drawTexturedModalRect(cornerX + x, cornerY + y, 176, 0, 16, 16); } super.drawSprite(cornerX, cornerY); } @Override public boolean shouldDrawHighlight() { ContainerListNew container = (ContainerListNew) gui.getContainer(); return slotIndex == 0 || !container.lines[lineIndex].isOneStackMode(); } } public GuiListNew(EntityPlayer iPlayer) { super(new ContainerListNew(iPlayer), iPlayer.inventory, TEXTURE_BASE); xSize = 176; ySize = 191; player = iPlayer; } private void clearExamplesCache(int lineId) { Map<ListMatchHandler.Type, List<ItemStack>> exampleList = exampleCache.get(lineId); if (exampleList != null) { exampleList.clear(); } } private List<ItemStack> getExamplesList(int lineId, ListMatchHandler.Type type) { Map<ListMatchHandler.Type, List<ItemStack>> exampleList = exampleCache.get(lineId); if (exampleList == null) { exampleList = new EnumMap<ListMatchHandler.Type, List<ItemStack>>(ListMatchHandler.Type.class); exampleCache.put(lineId, exampleList); } ContainerListNew container = (ContainerListNew) getContainer(); if (!exampleList.containsKey(type)) { List<ItemStack> examples = container.lines[lineId].getExamples(); ItemStack input = container.lines[lineId].stacks[0]; if (input != null) { List<ItemStack> repetitions = new ArrayList<ItemStack>(); for (ItemStack is : examples) { if (StackHelper.isMatchingItem(input, is, true, false)) { repetitions.add(is); } } examples.removeAll(repetitions); } exampleList.put(type, examples); } return exampleList.get(type); } @Override public void initGui() { super.initGui(); exampleCache.clear(); slots.clear(); buttonList.clear(); for (int sy = 0; sy < ListHandlerNew.HEIGHT; sy++) { for (int sx = 0; sx < ListHandlerNew.WIDTH; sx++) { slots.add(new ListSlot(this, 8 + sx * 18, 32 + sy * 33, sy, sx)); } int bOff = sy * BUTTON_COUNT; int bOffX = this.guiLeft + 8 + ListHandlerNew.WIDTH * 18 - BUTTON_COUNT * 11; int bOffY = this.guiTop + 32 + sy * 33 + 18; buttonList.add(new GuiImageButton(bOff + 0, bOffX, bOffY, 11, TEXTURE_BASE, 176, 16, 176, 28)); buttonList.add(new GuiImageButton(bOff + 1, bOffX + 11, bOffY, 11, TEXTURE_BASE, 176, 16, 185, 28)); buttonList.add(new GuiImageButton(bOff + 2, bOffX + 22, bOffY, 11, TEXTURE_BASE, 176, 16, 194, 28)); } for (Object o : buttonList) { GuiImageButton b = (GuiImageButton) o; int lineId = b.id / BUTTON_COUNT; int buttonId = b.id % BUTTON_COUNT; if (((ContainerListNew) getContainer()).lines[lineId].getOption(buttonId)) { b.activate(); } b.registerListener(this); } textField = new GuiTextField(this.fontRendererObj, 10, 10, 156, 12); textField.setMaxStringLength(32); textField.setText(BuildCraftCore.listItem.getLabel(player.getCurrentEquippedItem())); textField.setFocused(false); } @Override protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { super.drawGuiContainerBackgroundLayer(f, x, y); ContainerListNew containerL = (ContainerListNew) getContainer(); for (int i = 0; i < 2; i++) { if (containerL.lines[i].isOneStackMode()) { drawTexturedModalRect(guiLeft + 6, guiTop + 30 + i * 33, 0, ySize, 20, 20); } } drawBackgroundSlots(x, y); } @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { super.drawGuiContainerForegroundLayer(par1, par2); textField.drawTextBox(); drawTooltipForSlotAt(par1, par2); } private boolean isCarryingNonEmptyList() { ItemStack stack = mc.thePlayer.inventory.getItemStack(); return stack != null && stack.getItem() instanceof ItemList && stack.getTagCompound() != null; } private boolean hasListEquipped() { return mc.thePlayer.getCurrentEquippedItem() != null && mc.thePlayer.getCurrentEquippedItem().getItem() instanceof ItemList; } @Override protected void mouseClicked(int x, int y, int b) { super.mouseClicked(x, y, b); if (isCarryingNonEmptyList() || !hasListEquipped()) { return; } AdvancedSlot slot = getSlotAtLocation(x, y); ContainerListNew container = (ContainerListNew) getContainer(); if (slot instanceof ListSlot) { container.setStack(((ListSlot) slot).lineIndex, ((ListSlot) slot).slotIndex, mc.thePlayer.inventory.getItemStack()); clearExamplesCache(((ListSlot) slot).lineIndex); } textField.mouseClicked(x - guiLeft, y - guiTop, b); } @Override public void handleButtonClick(IButtonClickEventTrigger sender, int id) { int buttonId = id % BUTTON_COUNT; int lineId = id / BUTTON_COUNT; ContainerListNew container = (ContainerListNew) getContainer(); container.switchButton(lineId, buttonId); clearExamplesCache(lineId); } @Override protected void keyTyped(char c, int i) { if (textField.isFocused()) { if (c == 13 || c == 27) { textField.setFocused(false); } else { textField.textboxKeyTyped(c, i); ((ContainerListNew) container).setLabel(textField.getText()); } } else { super.keyTyped(c, i); } } }