diff options
5 files changed, 46 insertions, 3 deletions
diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index 664c08a33..f2fb9755f 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -100,6 +100,12 @@ public class RecipeViewingScreen extends Screen { for (Element element : children()) if (element.keyPressed(int_1, int_2, int_3)) return true; + if (int_1 == 259) { + if (ScreenHelper.hasLastRecipeScreen()) + minecraft.openScreen(ScreenHelper.getLastRecipeScreen()); + else minecraft.openScreen(ScreenHelper.getLastContainerScreen()); + return true; + } return super.keyPressed(int_1, int_2, int_3); } diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index a2b0e86d8..2489baf0f 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -431,6 +431,12 @@ public class VillagerRecipeViewingScreen extends Screen { for (Element element : children()) if (element.keyPressed(int_1, int_2, int_3)) return true; + if (int_1 == 259) { + if (ScreenHelper.hasLastRecipeScreen()) + minecraft.openScreen(ScreenHelper.getLastRecipeScreen()); + else minecraft.openScreen(ScreenHelper.getLastContainerScreen()); + return true; + } return super.keyPressed(int_1, int_2, int_3); } diff --git a/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java index 730bcd5b9..952608a66 100644 --- a/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java @@ -27,6 +27,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.util.InputUtil; import net.minecraft.item.Item; @@ -235,12 +236,16 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer { @Override public void openRecipeViewingScreen(Map<RecipeCategory<?>, List<RecipeDisplay>> map) { + Screen screen = null; if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getRecipeScreenType() == RecipeScreenType.VILLAGER) - MinecraftClient.getInstance().openScreen(new VillagerRecipeViewingScreen(map)); + screen = new VillagerRecipeViewingScreen(map); else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getRecipeScreenType() == RecipeScreenType.UNSET) - MinecraftClient.getInstance().openScreen(new PreRecipeViewingScreen(map)); + screen = new PreRecipeViewingScreen(map); else - MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(map)); + screen = new RecipeViewingScreen(map); + if (MinecraftClient.getInstance().currentScreen instanceof VillagerRecipeViewingScreen || MinecraftClient.getInstance().currentScreen instanceof RecipeViewingScreen) + ScreenHelper.storeRecipeScreen(MinecraftClient.getInstance().currentScreen); + MinecraftClient.getInstance().openScreen(screen); } @Override diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index 9bbdf1ed1..1501d1355 100644 --- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -218,6 +218,7 @@ public class RecipeHelperImpl implements RecipeHelper { @SuppressWarnings("deprecation") public void recipesLoaded(RecipeManager recipeManager) { + ScreenHelper.clearRecipeScreens(); this.recipeCount.set(0); this.recipeManager = recipeManager; this.recipeCategoryListMap.clear(); diff --git a/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java b/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java index 9a1feba0d..915dbb604 100644 --- a/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java +++ b/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java @@ -5,7 +5,9 @@ package me.shedaniel.rei.impl; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import me.shedaniel.cloth.hooks.ClothClientHooks; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.gui.ContainerScreenOverlay; @@ -14,12 +16,14 @@ import me.shedaniel.rei.listeners.ContainerScreenHooks; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.event.client.ClientTickCallback; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; import net.minecraft.client.util.Window; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import org.apache.logging.log4j.util.TriConsumer; +import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; @@ -30,6 +34,27 @@ public class ScreenHelper implements ClientModInitializer { private static boolean overlayVisible = true; private static ContainerScreenOverlay overlay; private static AbstractContainerScreen<?> lastContainerScreen = null; + private static LinkedHashSet<Screen> lastRecipeScreen = Sets.newLinkedHashSetWithExpectedSize(5); + + public static void storeRecipeScreen(Screen screen) { + while (lastRecipeScreen.size() >= 5) + lastRecipeScreen.remove(0); + lastRecipeScreen.add(screen); + } + + public static boolean hasLastRecipeScreen() { + return !lastRecipeScreen.isEmpty(); + } + + public static Screen getLastRecipeScreen() { + Screen screen = Iterables.getLast(lastRecipeScreen); + lastRecipeScreen.remove(screen); + return screen; + } + + public static void clearRecipeScreens() { + lastRecipeScreen.clear(); + } public static boolean isOverlayVisible() { return overlayVisible; |
