From f23e3934943a083a784875a03308f2a699dbbaf1 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 27 Sep 2020 11:34:02 +0200 Subject: [PATCH] Changed JEI transfer error mechanics --- CHANGELOG.md | 1 + .../jei/GridRecipeTransferHandler.java | 61 +++++++++++++++---- .../integration/jei/Ingredient.java | 4 +- .../integration/jei/IngredientTracker.java | 26 +++++--- ...a => RecipeTransferCraftingGridError.java} | 23 ++++--- .../jei/RecipeTransferPatternGridError.java | 36 +++++++++++ .../screen/widget/ScrollbarWidget.java | 2 +- .../assets/refinedstorage/lang/en_us.json | 3 +- 8 files changed, 122 insertions(+), 34 deletions(-) rename src/main/java/com/refinedmods/refinedstorage/integration/jei/{RecipeTransferGridError.java => RecipeTransferCraftingGridError.java} (74%) create mode 100644 src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 40829f4d3..80438b3f7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Refined Storage Changelog ### 1.9.7 +- Changed JEI transfer error mechanics (raoulvdberge) - Fixed crash when opening Controller GUI (Darkere) - Fixed dye being consumed without effect in some cases (Darkere) diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java index 431adbca7..cb9138efe 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java @@ -29,7 +29,8 @@ import java.util.stream.Collectors; public class GridRecipeTransferHandler implements IRecipeTransferHandler { public static final long TRANSFER_SCROLLBAR_DELAY_MS = 200; - public static long LAST_TRANSFER_TIME; + + public static long lastTransferTime; @Override public Class getContainerClass() { @@ -38,16 +39,55 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler { - RS.NETWORK_HANDLER.sendToServer(new GridCraftingPreviewRequestMessage(id, count, Screen.hasShiftDown(), false)); - }); - } else if (doTransfer) { + if (doTransfer) { + if (tracker.hasMissingButAutocraftingAvailable() && Screen.hasControlDown()) { + tracker.createCraftingRequests().forEach((id, count) -> RS.NETWORK_HANDLER.sendToServer( + new GridCraftingPreviewRequestMessage( + id, + count, + Screen.hasShiftDown(), + false + ) + )); + } else { + moveItems(container, recipeLayout); + } + } else { + if (tracker.hasMissing()) { + return new RecipeTransferCraftingGridError(tracker); + } + } + + return null; + } + + private IRecipeTransferError transferRecipeForPatternGrid(GridContainer container, IRecipeLayout recipeLayout, PlayerEntity player, boolean doTransfer) { + IngredientTracker tracker = createTracker(container, recipeLayout, player); + + if (doTransfer) { moveItems(container, recipeLayout); + } else { + if (tracker.isAutocraftingAvailable()) { + return new RecipeTransferPatternGridError(tracker); + } } return null; @@ -55,9 +95,6 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler inputs = new LinkedList<>(); diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java index 96fc5faa5..c9a7c3ef4 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java @@ -6,9 +6,9 @@ import net.minecraft.item.ItemStack; import java.util.UUID; class Ingredient { - private IGuiIngredient guiIngredient; + private final IGuiIngredient guiIngredient; private UUID craftStackId; - private int required; + private final int required; private int fulfilled; public Ingredient(IGuiIngredient guiIngredient) { diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java index 8277760c8..be39f9a45 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java @@ -32,17 +32,19 @@ public class IngredientTracker { return; } - if (ingredient.isAvailable()) { - continue; - } + Optional match = ingredient + .getGuiIngredient() + .getAllIngredients() + .stream() + .filter(s -> API.instance().getComparer().isEqual(stack, s, IComparer.COMPARE_NBT)) + .findFirst(); - Optional match = ingredient.getGuiIngredient().getAllIngredients().stream().filter((ItemStack matchingStack) -> API.instance().getComparer().isEqual(stack, matchingStack, IComparer.COMPARE_NBT)).findFirst(); if (match.isPresent()) { - //craftables and non-craftables are 2 different gridstacks - //as such we need to ignore craftable stacks as they are not actual items + // Craftables and non-craftables are 2 different gridstacks + // As such we need to ignore craftable stacks as they are not actual items if (gridStack != null && gridStack.isCraftable()) { ingredient.setCraftStackId(gridStack.getId()); - } else { + } else if (!ingredient.isAvailable()) { int needed = ingredient.getMissingAmount(); int used = Math.min(available, needed); ingredient.fulfill(used); @@ -56,7 +58,15 @@ public class IngredientTracker { return ingredients.stream().anyMatch(ingredient -> !ingredient.isAvailable()); } - public Map getCraftingRequests() { + public boolean hasMissingButAutocraftingAvailable() { + return ingredients.stream().anyMatch(ingredient -> !ingredient.isAvailable() && ingredient.isCraftable()); + } + + public boolean isAutocraftingAvailable() { + return ingredients.stream().anyMatch(Ingredient::isCraftable); + } + + public Map createCraftingRequests() { Map toRequest = new HashMap<>(); for (Ingredient ingredient : ingredients) { diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferGridError.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java similarity index 74% rename from src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferGridError.java rename to src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java index dcbb08c5f..94b0434b8 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferGridError.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java @@ -15,12 +15,13 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; -public class RecipeTransferGridError implements IRecipeTransferError { - private static final Color HIGHLIGHT_COLOR = new Color(1.0f, 0.0f, 0.0f, 0.4f); - private static final Color HIGHLIGHT_AUTOCRAFT_COLOR = new Color(0.0f, 0.0f, 1.0f, 0.4f); - IngredientTracker tracker; +public class RecipeTransferCraftingGridError implements IRecipeTransferError { + private static final Color MISSING_HIGHLIGHT_COLOR = new Color(1.0f, 0.0f, 0.0f, 0.4f); + protected static final Color AUTOCRAFTING_HIGHLIGHT_COLOR = new Color(0.0f, 0.0f, 1.0f, 0.4f); - public RecipeTransferGridError(IngredientTracker tracker) { + protected final IngredientTracker tracker; + + public RecipeTransferCraftingGridError(IngredientTracker tracker) { this.tracker = tracker; } @@ -31,24 +32,26 @@ public class RecipeTransferGridError implements IRecipeTransferError { @Override public void showError(MatrixStack stack, int mouseX, int mouseY, IRecipeLayout recipeLayout, int recipeX, int recipeY) { - List message = drawIngredientHighlights(stack, tracker, recipeX, recipeY); + List message = drawIngredientHighlights(stack, recipeX, recipeY); + Screen currentScreen = Minecraft.getInstance().currentScreen; GuiUtils.drawHoveringText(ItemStack.EMPTY, stack, message, mouseX, mouseY, currentScreen.width, currentScreen.height, 150, Minecraft.getInstance().fontRenderer); } - private List drawIngredientHighlights(MatrixStack stack, IngredientTracker tracker, int recipeX, int recipeY) { + protected List drawIngredientHighlights(MatrixStack stack, int recipeX, int recipeY) { List message = new ArrayList<>(); message.add(new TranslationTextComponent("jei.tooltip.transfer")); + boolean craftMessage = false; boolean missingMessage = false; for (Ingredient ingredient : tracker.getIngredients()) { if (!ingredient.isAvailable()) { if (ingredient.isCraftable()) { - ingredient.getGuiIngredient().drawHighlight(stack, HIGHLIGHT_AUTOCRAFT_COLOR.getRGB(), recipeX, recipeY); + ingredient.getGuiIngredient().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); craftMessage = true; } else { - ingredient.getGuiIngredient().drawHighlight(stack, HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); + ingredient.getGuiIngredient().drawHighlight(stack, MISSING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); missingMessage = true; } } @@ -59,7 +62,7 @@ public class RecipeTransferGridError implements IRecipeTransferError { } if (craftMessage) { - message.add(new TranslationTextComponent("gui.refinedstorage.jei.tooltip.error.recipe.transfer.missing.autocraft").mergeStyle(TextFormatting.BLUE)); + message.add(new TranslationTextComponent("gui.refinedstorage.jei.transfer.request_autocrafting").mergeStyle(TextFormatting.BLUE)); } return message; diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java new file mode 100644 index 000000000..d7ec59a19 --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java @@ -0,0 +1,36 @@ +package com.refinedmods.refinedstorage.integration.jei; + +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; + +import java.util.ArrayList; +import java.util.List; + +public class RecipeTransferPatternGridError extends RecipeTransferCraftingGridError { + public RecipeTransferPatternGridError(IngredientTracker tracker) { + super(tracker); + } + + @Override + protected List drawIngredientHighlights(MatrixStack stack, int recipeX, int recipeY) { + List message = new ArrayList<>(); + message.add(new TranslationTextComponent("jei.tooltip.transfer")); + + boolean craftMessage = false; + + for (Ingredient ingredient : tracker.getIngredients()) { + if (ingredient.isCraftable()) { + ingredient.getGuiIngredient().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); + craftMessage = true; + } + } + + if (craftMessage) { + message.add(new TranslationTextComponent("gui.refinedstorage.jei.transfer.autocrafting_available").mergeStyle(TextFormatting.BLUE)); + } + + return message; + } +} diff --git a/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java b/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java index 9ec150528..dd9b5ee43 100644 --- a/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java +++ b/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java @@ -72,7 +72,7 @@ public class ScrollbarWidget implements IGuiEventListener { if (button == 0 && RenderUtils.inBounds(x, y, width, height, mx, my)) { // Prevent accidental scrollbar click after clicking recipe transfer button - if (JeiIntegration.isLoaded() && System.currentTimeMillis() - GridRecipeTransferHandler.LAST_TRANSFER_TIME <= GridRecipeTransferHandler.TRANSFER_SCROLLBAR_DELAY_MS) { + if (JeiIntegration.isLoaded() && System.currentTimeMillis() - GridRecipeTransferHandler.lastTransferTime <= GridRecipeTransferHandler.TRANSFER_SCROLLBAR_DELAY_MS) { return false; } diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.json b/src/main/resources/assets/refinedstorage/lang/en_us.json index a15b796bc..22dad43b5 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.json +++ b/src/main/resources/assets/refinedstorage/lang/en_us.json @@ -88,7 +88,8 @@ "gui.refinedstorage.crafter_manager": "Crafter Manager", "gui.refinedstorage.alternatives": "Alternatives", "gui.refinedstorage.alternatives.apply": "Apply", - "gui.refinedstorage.jei.tooltip.error.recipe.transfer.missing.autocraft": "CTRL + CLICK to request autocrafting", + "gui.refinedstorage.jei.transfer.autocrafting_available": "Autocrafting available", + "gui.refinedstorage.jei.transfer.request_autocrafting": "CTRL + CLICK to request autocrafting", "misc.refinedstorage.energy_stored": "%d / %d FE", "misc.refinedstorage.energy_usage": "Usage: %d FE/t", "misc.refinedstorage.energy_usage_minimal": "%d FE/t",