From 67075b38e028ce6d89d53fe99d0ee13550039044 Mon Sep 17 00:00:00 2001 From: way2muchnoise Date: Sun, 25 Sep 2016 17:16:17 +0200 Subject: [PATCH] improves preview when there is loops in the crafting task --- .../preview/CraftingPreviewData.java | 16 ++- .../gui/GuiCraftingPreview.java | 115 ++++++++++-------- .../assets/refinedstorage/lang/en_US.lang | 2 + 3 files changed, 80 insertions(+), 53 deletions(-) diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewData.java b/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewData.java index 2541a682e..31d16d9a9 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewData.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewData.java @@ -2,16 +2,21 @@ package refinedstorage.apiimpl.autocrafting.preview; import net.minecraft.item.ItemStack; import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.autocrafting.task.CraftingTask; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.storage.CompareUtils; +import refinedstorage.apiimpl.autocrafting.CraftingPattern; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; public class CraftingPreviewData { private HashMap data = new HashMap<>(); private INetworkMaster network; + private int depth = 0; + private boolean depthCheck = false; public CraftingPreviewData(INetworkMaster network) { this.network = network; @@ -24,15 +29,17 @@ public class CraftingPreviewData { private void calculate(ItemStack stack, int quantity, boolean baseStack) { quantity = -add(stack, quantity, baseStack); - if (quantity > 0) { + if (quantity > 0 && !get(stack).cantCraft()) { ICraftingPattern pattern = NetworkUtils.getPattern(network, stack); - if (pattern != null) { + if (pattern != null && depth < CraftingTask.MAX_DEPTH) { int quantityPerRequest = pattern.getQuantityPerRequest(stack); while (quantity > 0) { for (ItemStack ingredient : pattern.getInputs()) { + depth++; calculate(ingredient, ingredient.stackSize, false); + depth--; } get(stack).addExtras(quantityPerRequest); @@ -40,6 +47,9 @@ public class CraftingPreviewData { quantity -= quantityPerRequest; } } else { + if (depth >= CraftingTask.MAX_DEPTH) { + this.depthCheck = true; + } get(stack).setCantCraft(true); } } @@ -68,6 +78,6 @@ public class CraftingPreviewData { } public Collection values() { - return this.data.values(); + return this.depthCheck ? Collections.emptyList() : this.data.values(); } } diff --git a/src/main/java/refinedstorage/gui/GuiCraftingPreview.java b/src/main/java/refinedstorage/gui/GuiCraftingPreview.java index de42c0f0d..d1be5fa5c 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingPreview.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingPreview.java @@ -53,7 +53,7 @@ public class GuiCraftingPreview extends GuiBase { cancelButton = addButton(x + 16, y + 144, 50, 20, t("gui.cancel")); startButton = addButton(x + 85, y + 144, 50, 20, t("misc.refinedstorage:start")); - startButton.enabled = stacks.stream().filter(CraftingPreviewStack::cantCraft).count() == 0; + startButton.enabled = !stacks.isEmpty() && stacks.stream().filter(CraftingPreviewStack::cantCraft).count() == 0; } @Override @@ -68,28 +68,33 @@ public class GuiCraftingPreview extends GuiBase { drawTexture(x, y, 0, 0, width, height); - x += 7; - y += 20; + if (stacks.isEmpty()) { + drawRect(x + 7, y + 20, x + 142, y + 139, 0xFFDBDBDB); + } + else { + x += 7; + y += 20; - int slot = scrollbar.getOffset() * 2; + int slot = scrollbar.getOffset() * 2; - for (int i = 0; i < 8; ++i) { - if (slot < stacks.size()) { - CraftingPreviewStack stack = stacks.get(slot); + for (int i = 0; i < 8; ++i) { + if (slot < stacks.size()) { + CraftingPreviewStack stack = stacks.get(slot); - if (stack.cantCraft()) { - drawTexture(x, y, 189, 0, 67, 29); + if (stack.cantCraft()) { + drawTexture(x, y, 189, 0, 67, 29); + } } - } - if (i % 2 == 1) { - x -= 68; - y += 30; - } else { - x += 68; - } + if (i % 2 == 1) { + x -= 68; + y += 30; + } else { + x += 68; + } - slot++; + slot++; + } } } @@ -99,56 +104,66 @@ public class GuiCraftingPreview extends GuiBase { int x = 12; int y = 22; + float scale = 0.5f; - int slot = scrollbar.getOffset() * 2; + if (stacks.isEmpty()) { + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, 1); - RenderHelper.enableGUIStandardItemLighting(); + drawString(calculateOffsetOnScale(x + 34, scale), calculateOffsetOnScale(y + 50, scale), t("gui.refinedstorage:crafting_preview.circular")); + drawString(calculateOffsetOnScale(x + 35, scale), calculateOffsetOnScale(y + 57, scale), t("gui.refinedstorage:crafting_preview.loop")); - ItemStack hoveringStack = null; + GlStateManager.popMatrix(); + } else { - for (int i = 0; i < 8; ++i) { - if (slot < stacks.size()) { - CraftingPreviewStack stack = stacks.get(slot); + int slot = scrollbar.getOffset() * 2; - drawItem(x, y + 5, stack.getStack()); + RenderHelper.enableGUIStandardItemLighting(); - float scale = 0.5f; + ItemStack hoveringStack = null; - GlStateManager.pushMatrix(); - GlStateManager.scale(scale, scale, 1); + for (int i = 0; i < 8; ++i) { + if (slot < stacks.size()) { + CraftingPreviewStack stack = stacks.get(slot); - int yy = y + 8; + drawItem(x, y + 5, stack.getStack()); - if (stack.needsCrafting()) { - String format = stack.cantCraft() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft"; - drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t(format, stack.getToCraft())); + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, 1); - yy += 7; + int yy = y + 8; + + if (stack.needsCrafting()) { + String format = stack.cantCraft() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft"; + drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t(format, stack.getToCraft())); + + yy += 7; + } + + if (stack.getStock() > 0) { + drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t("gui.refinedstorage:crafting_preview.available", stack.getStock())); + } + + GlStateManager.popMatrix(); + + if (inBounds(x, y, 16, 16, mouseX, mouseY)) { + hoveringStack = stack.getStack(); + } } - if (stack.getStock() > 0) { - drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t("gui.refinedstorage:crafting_preview.available", stack.getStock())); + if (i % 2 == 1) { + x -= 68; + y += 30; + } else { + x += 68; } - GlStateManager.popMatrix(); - - if (inBounds(x, y, 16, 16, mouseX, mouseY)) { - hoveringStack = stack.getStack(); - } + slot++; } - if (i % 2 == 1) { - x -= 68; - y += 30; - } else { - x += 68; + if (hoveringStack != null) { + drawTooltip(mouseX, mouseY, hoveringStack.getTooltip(Minecraft.getMinecraft().thePlayer, false)); } - - slot++; - } - - if (hoveringStack != null) { - drawTooltip(mouseX, mouseY, hoveringStack.getTooltip(Minecraft.getMinecraft().thePlayer, false)); } } diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 5db74dbd5..bc3e396c5 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -45,6 +45,8 @@ gui.refinedstorage:crafting_preview=Crafting Preview gui.refinedstorage:crafting_preview.to_craft=To craft: %d gui.refinedstorage:crafting_preview.available=Available: %d gui.refinedstorage:crafting_preview.missing=Missing: %d +gui.refinedstorage:crafting_preview.circular=Circular dependency! +gui.refinedstorage:crafting_preview.loop=loop in processing... misc.refinedstorage:energy_stored=%d / %d RS misc.refinedstorage:energy_usage=Usage: %d RS/t