Unknown 5 жил өмнө
parent
commit
b99cd53e3d

+ 6 - 0
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);
     }
     

+ 6 - 0
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);
     }
     

+ 8 - 3
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

+ 1 - 0
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();

+ 25 - 0
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;