diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java index 4cae24eaa..cff99458a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java @@ -1,11 +1,12 @@ package com.raoulvdberge.refinedstorage.container; +import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.CraftingPattern; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeCrafterManager; import com.raoulvdberge.refinedstorage.container.slot.SlotCrafterManager; import com.raoulvdberge.refinedstorage.gui.IResizableDisplay; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; +import com.raoulvdberge.refinedstorage.item.ItemPattern; import com.raoulvdberge.refinedstorage.tile.TileCrafterManager; -import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; @@ -68,6 +69,7 @@ public class ContainerCrafterManager extends ContainerBase { private NetworkNodeCrafterManager crafterManager; private Map containerData; private Map dummyInventories = new HashMap<>(); + private Map headings = new HashMap<>(); @Override public void addListener(IContainerListener listener) { @@ -112,21 +114,20 @@ public class ContainerCrafterManager extends ContainerBase { this.inventorySlots.clear(); this.inventoryItemStacks.clear(); + this.headings.clear(); addPlayerInventory(8, display.getYPlayerInventory()); int y = 19 + 18 - display.getCurrentOffset() * 18; int x = 8; - for (Map.Entry entry : containerData.entrySet()) { - boolean visible = I18n.format(entry.getKey()).toLowerCase().contains(display.getSearchFieldText().toLowerCase()); - + for (Map.Entry category : containerData.entrySet()) { IItemHandlerModifiable dummy; if (newContainerData == null) { // We're only resizing, get the previous inventory... - dummy = dummyInventories.get(entry.getKey()); + dummy = dummyInventories.get(category.getKey()); } else { - dummyInventories.put(entry.getKey(), dummy = new ItemHandlerBase(entry.getValue()) { + dummyInventories.put(category.getKey(), dummy = new ItemHandlerBase(category.getValue()) { @Override public int getSlotLimit(int slot) { return 1; @@ -134,27 +135,60 @@ public class ContainerCrafterManager extends ContainerBase { }); } - for (int slot = 0; slot < entry.getValue(); ++slot) { + boolean foundItemsInCategory = false; + + int yHeading = y - 19; + + for (int slot = 0; slot < category.getValue(); ++slot) { + boolean visible = true; + + if (!display.getSearchFieldText().trim().isEmpty()) { + ItemStack stack = dummy.getStackInSlot(slot); + + if (stack.isEmpty()) { + visible = false; + } else { + CraftingPattern pattern = ItemPattern.getPatternFromCache(crafterManager.getWorld(), stack); + + visible = false; + + for (ItemStack output : pattern.getOutputs()) { + if (output.getDisplayName().toLowerCase().contains(display.getSearchFieldText().toLowerCase())) { + visible = true; + break; + } + } + } + } + addSlotToContainer(new SlotCrafterManager(dummy, slot, x, y, visible, display, crafterManager)); if (visible) { + foundItemsInCategory = true; + x += 18; // Don't increase y level if we are on our last slot row (otherwise we do y += 18 * 3) - if ((slot + 1) % 9 == 0 && slot + 1 < entry.getValue()) { + if ((slot + 1) % 9 == 0 && slot + 1 < category.getValue()) { x = 8; y += 18; } } } - if (visible) { + if (foundItemsInCategory) { + headings.put(category.getKey(), yHeading); + x = 8; y += 18 * 2; } } } + public Map getHeadings() { + return headings; + } + public Map getContainerData() { return containerData; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java index 7aca89110..7f890c9ce 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java @@ -197,24 +197,19 @@ public class GuiCrafterManager extends GuiBase implements IResizableDisplay { drawString(7, 7, t("gui.refinedstorage:crafter_manager")); drawString(7, getYPlayerInventory() - 12, t("container.inventory")); - if (container != null && container.getContainerData() != null && crafterManager.isActive()) { - int x = 7; - int y = 18 - getCurrentOffset() * 18; + if (container != null && crafterManager.isActive()) { + for (Map.Entry heading : container.getHeadings().entrySet()) { + int y = heading.getValue(); - for (Map.Entry entry : container.getContainerData().entrySet()) { - if (t(entry.getKey()).toLowerCase().contains(getSearchFieldText().toLowerCase())) { - if (y >= getTopHeight() - 1 && y < getTopHeight() + getVisibleRows() * 18 - 1) { - GlStateManager.disableLighting(); - GlStateManager.color(1, 1, 1); + if (y >= getTopHeight() - 1 && y < getTopHeight() + getVisibleRows() * 18 - 1) { + GlStateManager.disableLighting(); + GlStateManager.color(1, 1, 1); - bindTexture("gui/crafter_manager.png"); + bindTexture("gui/crafter_manager.png"); - drawTexturedModalRect(x, y, 0, 174, 18 * 9, 18); + drawTexturedModalRect(7, y, 0, 174, 18 * 9, 18); - drawString(x + 4, y + 6, RenderUtils.shorten(I18n.format(entry.getKey()), 25)); - } - - y += (Math.ceil((double) Math.max(9, entry.getValue()) / 9D) + 1) * 18; + drawString(7 + 4, y + 6, RenderUtils.shorten(I18n.format(heading.getKey()), 25)); } } }