Răsfoiți Sursa

Craftable Only WIP

Unknown 6 ani în urmă
părinte
comite
4c175cf8a0
59 a modificat fișierele cu 294 adăugiri și 109 ștergeri
  1. 1 1
      build.gradle
  2. 5 2
      src/main/java/me/shedaniel/Core.java
  3. 1 0
      src/main/java/me/shedaniel/api/IDisplayCategory.java
  4. 1 1
      src/main/java/me/shedaniel/api/IDisplayCategoryCraftable.java
  5. 0 7
      src/main/java/me/shedaniel/api/IDisplayHelper.java
  6. 3 1
      src/main/java/me/shedaniel/api/IDrawable.java
  7. 4 0
      src/main/java/me/shedaniel/api/IRecipe.java
  8. 1 0
      src/main/java/me/shedaniel/api/IRecipeManager.java
  9. 1 1
      src/main/java/me/shedaniel/api/TriBooleanSupplier.java
  10. 1 2
      src/main/java/me/shedaniel/config/REIConfig.java
  11. 1 0
      src/main/java/me/shedaniel/config/REIItemListOrdering.java
  12. 8 0
      src/main/java/me/shedaniel/config/REIRuntimeConfig.java
  13. 27 2
      src/main/java/me/shedaniel/gui/ConfigGui.java
  14. 2 0
      src/main/java/me/shedaniel/gui/Drawable.java
  15. 68 6
      src/main/java/me/shedaniel/gui/GuiItemList.java
  16. 6 0
      src/main/java/me/shedaniel/gui/REIRenderHelper.java
  17. 6 5
      src/main/java/me/shedaniel/gui/RecipeGui.java
  18. 1 0
      src/main/java/me/shedaniel/gui/SearchArgument.java
  19. 0 2
      src/main/java/me/shedaniel/gui/widget/Button.java
  20. 3 3
      src/main/java/me/shedaniel/gui/widget/Control.java
  21. 2 0
      src/main/java/me/shedaniel/gui/widget/IFocusable.java
  22. 1 0
      src/main/java/me/shedaniel/gui/widget/REISlot.java
  23. 1 0
      src/main/java/me/shedaniel/gui/widget/TextBox.java
  24. 2 0
      src/main/java/me/shedaniel/gui/widget/WidgetArrow.java
  25. 29 27
      src/main/java/me/shedaniel/impl/REIRecipeManager.java
  26. 1 0
      src/main/java/me/shedaniel/library/KeyBindFunction.java
  27. 2 0
      src/main/java/me/shedaniel/library/Sink.java
  28. 1 0
      src/main/java/me/shedaniel/listenerdefinitions/CharInput.java
  29. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/ClientTickable.java
  30. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/DoneLoading.java
  31. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/DrawContainer.java
  32. 3 1
      src/main/java/me/shedaniel/listenerdefinitions/GuiClick.java
  33. 1 0
      src/main/java/me/shedaniel/listenerdefinitions/GuiKeyDown.java
  34. 3 1
      src/main/java/me/shedaniel/listenerdefinitions/GuiMouseScroll.java
  35. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/IMixinContainerGui.java
  36. 0 7
      src/main/java/me/shedaniel/listenerdefinitions/KeybindHandler.java
  37. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/MinecraftResize.java
  38. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/PotionCraftingAdder.java
  39. 2 0
      src/main/java/me/shedaniel/listenerdefinitions/RecipeLoadListener.java
  40. 1 2
      src/main/java/me/shedaniel/listeners/DrawContainerListener.java
  41. 10 16
      src/main/java/me/shedaniel/mixins/MixinContainerGui.java
  42. 14 4
      src/main/java/me/shedaniel/mixins/MixinCreativePlayerInventoryGui.java
  43. 2 0
      src/main/java/me/shedaniel/mixins/MixinDoneLoading.java
  44. 2 0
      src/main/java/me/shedaniel/mixins/MixinKeyboardListener.java
  45. 1 0
      src/main/java/me/shedaniel/mixins/MixinRecipeManager.java
  46. 7 0
      src/main/java/me/shedaniel/plugin/RandomRecipe.java
  47. 1 0
      src/main/java/me/shedaniel/plugin/TestRandomCategory.java
  48. 2 2
      src/main/java/me/shedaniel/plugin/blastfurnace/VanillaBlastFurnaceCategory.java
  49. 9 3
      src/main/java/me/shedaniel/plugin/blastfurnace/VanillaBlastFurnaceRecipe.java
  50. 2 3
      src/main/java/me/shedaniel/plugin/crafting/VanillaCraftingCategory.java
  51. 9 0
      src/main/java/me/shedaniel/plugin/crafting/VanillaCraftingRecipe.java
  52. 2 3
      src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceCategory.java
  53. 9 0
      src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceRecipe.java
  54. 8 0
      src/main/java/me/shedaniel/plugin/potion/VanillaPotionRecipe.java
  55. 2 2
      src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerCategory.java
  56. 9 3
      src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerRecipe.java
  57. 3 1
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  58. BIN
      src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png
  59. 1 1
      src/main/resources/fabric.mod.json

+ 1 - 1
build.gradle

@@ -6,7 +6,7 @@ sourceCompatibility = 1.8
 targetCompatibility = 1.8
 
 archivesBaseName = "RoughlyEnoughItems"
-version = "1.5-16"
+version = "1.5.1-17"
 
 minecraft {
 }

+ 5 - 2
src/main/java/me/shedaniel/Core.java

@@ -1,6 +1,7 @@
 package me.shedaniel;
 
 import me.shedaniel.config.REIConfig;
+import me.shedaniel.config.REIRuntimeConfig;
 import me.shedaniel.listenerdefinitions.ClientTickable;
 import me.shedaniel.listenerdefinitions.IEvent;
 import me.shedaniel.listeners.DrawContainerListener;
@@ -31,8 +32,8 @@ public class Core implements ClientModInitializer {
     private static List<IEvent> events = new LinkedList<>();
     public static final File configFile = new File(FabricLoader.INSTANCE.getConfigDirectory(), "rei.json");
     public static REIConfig config;
+    public static REIRuntimeConfig runtimeConfig;
     public static ClientListener clientListener;
-    public static boolean centreSearchBox;
     public static Logger LOGGER = LogManager.getFormatterLogger("REI");
     
     @Override
@@ -42,7 +43,7 @@ public class Core implements ClientModInitializer {
         registerFabricEvents();
         try {
             loadConfig();
-            centreSearchBox = config.centreSearchBox;
+            runtimeConfig = new REIRuntimeConfig();
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -52,6 +53,8 @@ public class Core implements ClientModInitializer {
     private void registerFabricEvents() {
         ClientTickEvent.CLIENT.register(minecraftClient -> {
             getListeners(ClientTickable.class).forEach(ClientTickable::clientTick);
+            if (!Core.config.enableCraftableOnlyButton)
+                Core.runtimeConfig.craftableOnly = false;
         });
     }
     

+ 1 - 0
src/main/java/me/shedaniel/api/IDisplayCategory.java

@@ -10,6 +10,7 @@ import java.util.List;
  * Created by James on 8/7/2018.
  */
 public interface IDisplayCategory<T extends IRecipe> {
+    
     public String getId();
     
     public String getDisplayName();

+ 1 - 1
src/main/java/me/shedaniel/api/DisplayCategoryCraftable.java → src/main/java/me/shedaniel/api/IDisplayCategoryCraftable.java

@@ -8,7 +8,7 @@ import net.minecraft.client.gui.Gui;
 
 import java.util.List;
 
-public interface DisplayCategoryCraftable<T extends IRecipe> extends IDisplayCategory<T> {
+public interface IDisplayCategoryCraftable<T extends IRecipe> extends IDisplayCategory<T> {
     
     public boolean canAutoCraftHere(Class<? extends Gui> guiClass, T recipe);
     

+ 0 - 7
src/main/java/me/shedaniel/api/IDisplayHelper.java

@@ -1,7 +0,0 @@
-package me.shedaniel.api;
-
-/**
- * Created by James on 8/7/2018.
- */
-public interface IDisplayHelper {
-}

+ 3 - 1
src/main/java/me/shedaniel/api/IDrawable.java

@@ -4,7 +4,9 @@ package me.shedaniel.api;
  * Created by James on 8/7/2018.
  */
 public interface IDrawable {
+    
     public void draw();
-
+    
     public boolean isHighlighted();
+    
 }

+ 4 - 0
src/main/java/me/shedaniel/api/IRecipe.java

@@ -1,5 +1,7 @@
 package me.shedaniel.api;
 
+import net.minecraft.item.ItemStack;
+
 import java.util.List;
 
 /**
@@ -13,4 +15,6 @@ public interface IRecipe<T> {
 
     public List<List<T>> getInput();
     
+    public List<List<T>> getRecipeRequiredInput();
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/api/IRecipeManager.java

@@ -17,4 +17,5 @@ public interface IRecipeManager {
     public void addDisplayAdapter(IDisplayCategory adapter);
     
     public Map<IDisplayCategory, List<IRecipe>> getRecipesFor(ItemStack stack);
+    
 }

+ 1 - 1
src/main/java/me/shedaniel/api/TriBooleanProducer.java → src/main/java/me/shedaniel/api/TriBooleanSupplier.java

@@ -3,6 +3,6 @@ package me.shedaniel.api;
 /**
  * Created by James on 8/4/2018.
  */
-public interface TriBooleanProducer {
+public interface TriBooleanSupplier {
     public boolean accept(int first, int second, int third);
 }

+ 1 - 2
src/main/java/me/shedaniel/config/REIConfig.java

@@ -9,8 +9,6 @@ public class REIConfig {
     
     public static Gson GSON = new GsonBuilder()
             .setPrettyPrinting()
-            .serializeNulls()
-            .disableHtmlEscaping()
             .create();
     
     public int recipeKeyBind = KeyEvent.VK_R;
@@ -19,5 +17,6 @@ public class REIConfig {
     public boolean centreSearchBox = false;
     public REIItemListOrdering itemListOrdering = REIItemListOrdering.REGISTRY;
     public boolean isAscending = true;
+    public boolean enableCraftableOnlyButton = false;
     
 }

+ 1 - 0
src/main/java/me/shedaniel/config/REIItemListOrdering.java

@@ -17,4 +17,5 @@ public enum REIItemListOrdering {
     public String getNameTranslationKey() {
         return nameTranslationKey;
     }
+    
 }

+ 8 - 0
src/main/java/me/shedaniel/config/REIRuntimeConfig.java

@@ -0,0 +1,8 @@
+package me.shedaniel.config;
+
+public class REIRuntimeConfig {
+    
+    public boolean craftableOnly = false;
+    public boolean centreSearchBox = false;
+    
+}

+ 27 - 2
src/main/java/me/shedaniel/gui/ConfigGui.java

@@ -74,6 +74,30 @@ public class ConfigGui extends Gui {
             }
         });
         addButton(new ButtonWidget(1001, parent.width / 2 - 90, 150, 150, 20, "") {
+            @Override
+            public void onPressed(double double_1, double double_2) {
+                Core.config.enableCraftableOnlyButton = !Core.config.enableCraftableOnlyButton;
+                try {
+                    Core.saveConfig();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            
+            @Override
+            public void draw(int int_1, int int_2, float float_1) {
+                GuiLighting.disable();
+                this.text = I18n.translate("text.rei.enable_craftable_only.button", Core.config.enableCraftableOnlyButton ? "§a" : "§c", Core.config.enableCraftableOnlyButton);
+                super.draw(int_1, int_2, float_1);
+                if (this.hovered)
+                    drawSuggestion(int_1, int_2);
+            }
+            
+            protected void drawSuggestion(int x, int y) {
+                drawTooltip(Arrays.asList(I18n.translate("text.rei.enable_craftable_only.tooltip").split("\n")), x, y);
+            }
+        });
+        addButton(new ButtonWidget(1002, parent.width / 2 - 90, 180, 150, 20, "") {
             @Override
             public void onPressed(double double_1, double double_2) {
                 int index = Arrays.asList(REIItemListOrdering.values()).indexOf(Core.config.itemListOrdering) + 1;
@@ -89,7 +113,7 @@ public class ConfigGui extends Gui {
                     e.printStackTrace();
                 }
             }
-    
+            
             @Override
             public void draw(int int_1, int int_2, float float_1) {
                 GuiLighting.disable();
@@ -112,7 +136,7 @@ public class ConfigGui extends Gui {
         text = I18n.translate("key.rei.hide") + ": ";
         drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 25 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 90 + 6, -1);
         text = I18n.translate("text.rei.list_ordering") + ": ";
-        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 95 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 150 + 6, -1);
+        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 95 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 180 + 6, -1);
     }
     
     @Override
@@ -126,4 +150,5 @@ public class ConfigGui extends Gui {
             return super.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_);
         }
     }
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/gui/Drawable.java

@@ -9,6 +9,7 @@ import java.awt.*;
  * Created by James on 7/28/2018.
  */
 public abstract class Drawable implements IDrawable {
+    
     protected Rectangle rect;
     
     public Drawable(int x, int y, int width, int height) {
@@ -30,4 +31,5 @@ public abstract class Drawable implements IDrawable {
         }
         return false;
     }
+    
 }

+ 68 - 6
src/main/java/me/shedaniel/gui/GuiItemList.java

@@ -1,8 +1,10 @@
 package me.shedaniel.gui;
 
+import com.google.common.collect.ImmutableList;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.ClientListener;
 import me.shedaniel.Core;
+import me.shedaniel.api.IRecipe;
 import me.shedaniel.config.REIItemListOrdering;
 import me.shedaniel.gui.widget.Button;
 import me.shedaniel.gui.widget.Control;
@@ -14,12 +16,15 @@ import net.fabricmc.fabric.client.itemgroup.FabricCreativeGuiComponents;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerGui;
 import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
+import net.minecraft.item.Item;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemStack;
 import net.minecraft.text.TextComponent;
 import net.minecraft.text.TranslatableTextComponent;
+import net.minecraft.util.DefaultedList;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.registry.Registry;
@@ -45,10 +50,11 @@ public class GuiItemList extends Drawable {
     protected boolean visible = true;
     private int oldGuiLeft = 0;
     private boolean cheatMode = false;
+    private List<ItemStack> lastPlayerItems = new ArrayList<>();
     
     public GuiItemList(ContainerGui overlayedGui) {
         super(calculateRect(overlayedGui));
-        FOOTERSIZE = Core.centreSearchBox ? 18 : 44;
+        FOOTERSIZE = Core.runtimeConfig.centreSearchBox ? 18 : 44;
         displaySlots = new ArrayList<>();
         controls = new ArrayList<>();
         this.overlayedGui = overlayedGui;
@@ -102,11 +108,21 @@ public class GuiItemList extends Drawable {
         }
         searchBox = new TextBox(getSearchBoxArea());
         searchBox.setText(savedText);
+        if (Core.config.enableCraftableOnlyButton) {
+            Button buttonCraftableOnly = new Button(getCraftableToggleArea(), "");
+            buttonCraftableOnly.setOnClick(i -> {
+                Core.runtimeConfig.craftableOnly = !Core.runtimeConfig.craftableOnly;
+                REIRenderHelper.updateSearch();
+                return true;
+            });
+            controls.add(buttonCraftableOnly);
+        }
         controls.add(searchBox);
         buttonCheating = new Button(5, 5, 45, 20, getCheatModeText());
         buttonCheating.onClick = this::cheatClicked;
         buttonConfig = new Button(5, 28, 45, 20, I18n.translate("text.rei.config"));
         buttonConfig.onClick = i -> {
+            MinecraftClient.getInstance().openGui(null);
             MinecraftClient.getInstance().openGui(new ConfigGui(overlayedGui));
             return true;
         };
@@ -119,13 +135,21 @@ public class GuiItemList extends Drawable {
     }
     
     private Rectangle getSearchBoxArea() {
+        int widthOffset = Core.config.enableCraftableOnlyButton ? -24 : 0;
         int ch = ((IMixinContainerGui) overlayedGui).getContainerHeight(), cw = ((IMixinContainerGui) overlayedGui).getContainerWidth();
-        if (Core.centreSearchBox) {
+        if (Core.runtimeConfig.centreSearchBox) {
             if (ch + 4 + 18 > MinecraftClient.getInstance().window.getScaledHeight()) //Will be out of bounds
-                return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height + 100, cw, 18);
-            return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height - 31, cw, 18);
+                return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height + 100, cw + widthOffset, 18);
+            return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height - 31, cw + widthOffset, 18);
         }
-        return new Rectangle(rect.x, rect.height - 31, rect.width - 4, 18);
+        return new Rectangle(rect.x, rect.height - 31, rect.width - 4 + widthOffset, 18);
+    }
+    
+    private Rectangle getCraftableToggleArea() {
+        Rectangle searchBoxArea = getSearchBoxArea();
+        searchBoxArea.setLocation(searchBoxArea.x + searchBoxArea.width + 4, searchBoxArea.y - 2);
+        searchBoxArea.setSize(20, 20);
+        return searchBoxArea;
     }
     
     private void fillSlots() {
@@ -184,11 +208,22 @@ public class GuiItemList extends Drawable {
     public void draw() {
         if (!visible)
             return;
+        if (MinecraftClient.getInstance().currentGui instanceof ContainerGui)
+            overlayedGui = (ContainerGui) MinecraftClient.getInstance().currentGui;
+        if (Core.runtimeConfig.craftableOnly) {
+            List<ItemStack> currentPlayerItems = getInventoryItemsTypes();
+            for(ItemStack item : lastPlayerItems)
+                if (!currentPlayerItems.contains(item) || currentPlayerItems.size() != lastPlayerItems.size()) {
+                    lastPlayerItems = new ArrayList<>(currentPlayerItems);
+                    updateView();
+                }
+        }
         if (needsResize == true || oldGuiLeft != ((IMixinContainerGui) overlayedGui).getGuiLeft())
             resize();
         GlStateManager.pushMatrix();
         updateButtons();
         controls.forEach(Control::draw);
+        GuiLighting.disable();
         String header = String.format("%s/%s", page + 1, MathHelper.ceil(view.size() / displaySlots.size()) + 1);
         MinecraftClient.getInstance().fontRenderer.drawWithShadow(header, rect.x + (rect.width / 2) - (MinecraftClient.getInstance().fontRenderer.getStringWidth(header) / 2), rect.y + 10, -1);
         GlStateManager.popMatrix();
@@ -283,11 +318,38 @@ public class GuiItemList extends Drawable {
                 stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
             });
         }
-        view.addAll(stacks.stream().distinct().collect(Collectors.toList()));
+        List<ItemStack> workingItems = ClientListener.stackList == null ? new ArrayList<>() : ClientListener.stackList;
+        if (Core.runtimeConfig.craftableOnly) {
+            List<IRecipe> workingRecipes = new ArrayList<>();
+            REIRecipeManager.instance().findUsageForItems(getInventoryItemsTypes()).forEach(workingRecipes::add);
+            workingItems = new ArrayList<>();
+            for(IRecipe workingRecipe : workingRecipes) {
+                List list = workingRecipe.getOutput();
+                try {
+                    workingItems.addAll((List<ItemStack>) list);
+                } catch (Exception e) {
+                }
+            }
+        }
+        final List<ItemStack> finalWorkingItems = workingItems;
+        view.addAll(stacks.stream().filter(itemStack -> {
+            for(ItemStack workingItem : finalWorkingItems)
+                if (itemStack.isEqualIgnoreTags(workingItem))
+                    return true;
+            return false;
+        }).distinct().collect(Collectors.toList()));
         page = 0;
         fillSlots();
     }
     
+    private List<ItemStack> getInventoryItemsTypes() {
+        List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor
+                , MinecraftClient.getInstance().player.inventory.offHand);
+        List<ItemStack> inventoryStacks = new ArrayList<>();
+        field_7543.forEach(inventoryStacks::addAll);
+        return inventoryStacks.stream().distinct().collect(Collectors.toList());
+    }
+    
     private boolean filterItem(ItemStack itemStack, List<SearchArgument> arguments) {
         String mod = getMod(itemStack);
         List<String> toolTipsList = REIRenderHelper.getOverlayedGui().getStackTooltip(itemStack);

+ 6 - 0
src/main/java/me/shedaniel/gui/REIRenderHelper.java

@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
  * Created by James on 7/28/2018.
  */
 public class REIRenderHelper {
+    
     static Point mouseLoc;
     static public GuiItemList reiGui;
     static ContainerGui overlayedGui;
@@ -230,6 +231,10 @@ public class REIRenderHelper {
             reiGui.tick();
     }
     
+    public static boolean isGuiVisible() {
+        return reiGui != null && reiGui.visible;
+    }
+    
     public static boolean recipeKeyBind() {
         if (!(MinecraftClient.getInstance().currentGui instanceof ContainerGui))
             return false;
@@ -271,4 +276,5 @@ public class REIRenderHelper {
         }
         return false;
     }
+    
 }

+ 6 - 5
src/main/java/me/shedaniel/gui/RecipeGui.java

@@ -1,7 +1,7 @@
 package me.shedaniel.gui;
 
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.api.DisplayCategoryCraftable;
+import me.shedaniel.api.IDisplayCategoryCraftable;
 import me.shedaniel.api.IDisplayCategory;
 import me.shedaniel.api.IRecipe;
 import me.shedaniel.gui.widget.Button;
@@ -166,12 +166,12 @@ public class RecipeGui extends ContainerGui {
         
         List<Control> newControls = new LinkedList<>();
         selectedCategory.addWidget(newControls, 0);
-        if (selectedCategory instanceof DisplayCategoryCraftable)
-            ((DisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipe, 0);
+        if (selectedCategory instanceof IDisplayCategoryCraftable)
+            ((IDisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipe, 0);
         if (recipes.get(selectedCategory).size() >= recipePointer + 2) {
             selectedCategory.addWidget(newControls, 1);
-            if (selectedCategory instanceof DisplayCategoryCraftable)
-                ((DisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipes.get(selectedCategory).get(recipePointer + 1), 1);
+            if (selectedCategory instanceof IDisplayCategoryCraftable)
+                ((IDisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipes.get(selectedCategory).get(recipePointer + 1), 1);
         }
         newControls.forEach(f -> f.move(left, top));
         controls.addAll(newControls);
@@ -283,4 +283,5 @@ public class RecipeGui extends ContainerGui {
     private int getTotalPages() {
         return MathHelper.clamp(riseDoublesToInt(recipes.get(selectedCategory).size() / 2d), 1, Integer.MAX_VALUE);
     }
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/gui/SearchArgument.java

@@ -32,4 +32,5 @@ public class SearchArgument {
     public String toString() {
         return String.format("Argument[%s]: name = %s, include = %b", argumentType.name(), text, include);
     }
+    
 }

+ 0 - 2
src/main/java/me/shedaniel/gui/widget/Button.java

@@ -17,7 +17,6 @@ public class Button extends Control {
     private String buttonText;
     protected static final Identifier BUTTON_TEXTURES = new Identifier("textures/gui/widgets.png");
     
-    
     public Button(int x, int y, int width, int height, String buttonText) {
         super(x, y, width, height);
         this.buttonText = buttonText;
@@ -32,7 +31,6 @@ public class Button extends Control {
         buttonText = text;
     }
     
-    
     @Override
     public void draw() {
         GlStateManager.pushMatrix();

+ 3 - 3
src/main/java/me/shedaniel/gui/widget/Control.java

@@ -1,7 +1,7 @@
 package me.shedaniel.gui.widget;
 
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.api.TriBooleanProducer;
+import me.shedaniel.api.TriBooleanSupplier;
 import me.shedaniel.gui.Drawable;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.Tessellator;
@@ -15,9 +15,10 @@ import java.util.function.IntFunction;
  * Created by James on 7/29/2018.
  */
 public abstract class Control extends Drawable {
+    
     private boolean enabled = true;
     public IntFunction<Boolean> onClick;
-    public TriBooleanProducer onKeyDown;
+    public TriBooleanSupplier onKeyDown;
     public BiConsumer<Character, Integer> charPressed;
     
     public Control(int x, int y, int width, int height) {
@@ -55,7 +56,6 @@ public abstract class Control extends Drawable {
             p_drawRect_1_ = p_drawRect_3_;
             p_drawRect_3_ = lvt_5_3_;
         }
-        
         float lvt_5_3_1 = (float) (p_drawRect_4_ >> 24 & 255) / 255.0F;
         float lvt_6_1_ = (float) (p_drawRect_4_ >> 16 & 255) / 255.0F;
         float lvt_7_1_ = (float) (p_drawRect_4_ >> 8 & 255) / 255.0F;

+ 2 - 0
src/main/java/me/shedaniel/gui/widget/IFocusable.java

@@ -4,7 +4,9 @@ package me.shedaniel.gui.widget;
  * Created by James on 8/3/2018.
  */
 public interface IFocusable {
+    
     public boolean hasFocus();
     
     public void setFocused(boolean val);
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/gui/widget/REISlot.java

@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
  * Created by James on 7/28/2018.
  */
 public class REISlot extends Control {
+    
     private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private boolean cheatable = false;
     private List<ItemStack> itemList = new LinkedList<>();

+ 1 - 0
src/main/java/me/shedaniel/gui/widget/TextBox.java

@@ -81,4 +81,5 @@ public class TextBox extends Control implements IFocusable {
     public void tick() {
         textField.tick();
     }
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/gui/widget/WidgetArrow.java

@@ -6,6 +6,7 @@ import net.minecraft.client.render.GuiLighting;
 import net.minecraft.util.Identifier;
 
 public class WidgetArrow extends Control {
+    
     private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private int progress = 0;
     private int updateTick = 0;
@@ -45,4 +46,5 @@ public class WidgetArrow extends Control {
                 progress = 0;
         }
     }
+    
 }

+ 29 - 27
src/main/java/me/shedaniel/impl/REIRecipeManager.java

@@ -21,6 +21,7 @@ import java.util.function.Function;
  * Created by James on 8/7/2018.
  */
 public class REIRecipeManager implements IRecipeManager {
+    
     private Map<String, List<IRecipe>> recipeList;
     private List<IDisplayCategory> displayAdapters;
     public static RecipeManager recipeManager;
@@ -34,6 +35,10 @@ public class REIRecipeManager implements IRecipeManager {
         guiExcludeMap = new HashMap<>();
     }
     
+    public Map<String, List<IRecipe>> getRecipeList() {
+        return recipeList;
+    }
+    
     public List<IDisplayCategory> getDisplayAdapters() {
         return displayAdapters;
     }
@@ -55,18 +60,17 @@ public class REIRecipeManager implements IRecipeManager {
     public boolean canAddSlot(Class<? extends Gui> guiClass, Rectangle slotRect) {
         if (!guiExcludeMap.containsKey(guiClass))
             return true;
-        for(Function<Rectangle, Boolean> rectangleBooleanFunction : guiExcludeMap.get(guiClass)) {
+        for(Function<Rectangle, Boolean> rectangleBooleanFunction : guiExcludeMap.get(guiClass))
             if (!rectangleBooleanFunction.apply(slotRect))
                 return false;
-        }
         return true;
     }
     
     @Override
     public void addRecipe(String id, IRecipe recipe) {
-        if (recipeList.containsKey(id)) {
+        if (recipeList.containsKey(id))
             recipeList.get(id).add(recipe);
-        } else {
+        else {
             List<IRecipe> recipes = new LinkedList<>();
             recipeList.put(id, recipes);
             recipes.add(recipe);
@@ -75,9 +79,9 @@ public class REIRecipeManager implements IRecipeManager {
     
     @Override
     public void addRecipe(String id, List<? extends IRecipe> recipes) {
-        if (recipeList.containsKey(id)) {
+        if (recipeList.containsKey(id))
             recipeList.get(id).addAll(recipes);
-        } else {
+        else {
             List<IRecipe> newRecipeList = new LinkedList<>();
             recipeList.put(id, newRecipeList);
             newRecipeList.addAll(recipes);
@@ -93,21 +97,15 @@ public class REIRecipeManager implements IRecipeManager {
     public Map<IDisplayCategory, List<IRecipe>> getRecipesFor(ItemStack stack) {
         Map<IDisplayCategory, List<IRecipe>> categories = new HashMap<>();
         displayAdapters.forEach(f -> categories.put(f, new LinkedList<>()));
-        for(List<IRecipe> value : recipeList.values()) {
-            for(IRecipe iRecipe : value) {
-                for(Object o : iRecipe.getOutput()) {
-                    if (o instanceof ItemStack) {
-                        if (ItemStack.areEqualIgnoreTags(stack, (ItemStack) o)) {
-                            for(IDisplayCategory iDisplayCategory : categories.keySet()) {
+        for(List<IRecipe> value : recipeList.values())
+            for(IRecipe iRecipe : value)
+                for(Object o : iRecipe.getOutput())
+                    if (o instanceof ItemStack)
+                        if (ItemStack.areEqualIgnoreTags(stack, (ItemStack) o))
+                            for(IDisplayCategory iDisplayCategory : categories.keySet())
                                 if (iDisplayCategory.getId() == iRecipe.getId()) {
                                     categories.get(iDisplayCategory).add(iRecipe);
                                 }
-                            }
-                        }
-                    }
-                }
-            }
-        }
         categories.keySet().removeIf(f -> categories.get(f).isEmpty());
         return categories;
     }
@@ -115,20 +113,18 @@ public class REIRecipeManager implements IRecipeManager {
     public Map<IDisplayCategory, List<IRecipe>> getUsesFor(ItemStack stack) {
         Map<IDisplayCategory, List<IRecipe>> categories = new HashMap<>();
         displayAdapters.forEach(f -> categories.put(f, new LinkedList<>()));
-        for(List<IRecipe> value : recipeList.values()) {
+        for(List<IRecipe> value : recipeList.values())
             for(IRecipe iRecipe : value) {
                 boolean found = false;
                 for(Object o : iRecipe.getInput()) {
                     List<ItemStack> input = (List<ItemStack>) o;
-                    
                     for(ItemStack itemStack : input) {
                         if (ItemStack.areEqualIgnoreTags(itemStack, stack)) {
-                            for(IDisplayCategory iDisplayCategory : categories.keySet()) {
+                            for(IDisplayCategory iDisplayCategory : categories.keySet())
                                 if (iDisplayCategory.getId() == iRecipe.getId()) {
                                     categories.get(iDisplayCategory).add(iRecipe);
                                     found = true;
                                 }
-                            }
                             if (found)
                                 break;
                         }
@@ -137,11 +133,18 @@ public class REIRecipeManager implements IRecipeManager {
                         break;
                 }
             }
-        }
         categories.keySet().removeIf(f -> categories.get(f).isEmpty());
         return categories;
     }
     
+    public List<IRecipe> findUsageForItems(List<ItemStack> types) {
+        List<IRecipe> recipes = new ArrayList<>();
+        types.forEach(item -> {
+            Map<IDisplayCategory, List<IRecipe>> itemUsages = getUsesFor(item);
+            itemUsages.values().forEach(iRecipes -> recipes.addAll(iRecipes));
+        });
+        return recipes;
+    }
     
     public List<IDisplayCategory> getAdatapersForOutput(ItemStack stack) {
         return null;
@@ -166,8 +169,7 @@ public class REIRecipeManager implements IRecipeManager {
         RecipeGui gui;
         if (MinecraftClient.getInstance().currentGui instanceof RecipeGui)
             gui = new RecipeGui(null, ((RecipeGui) MinecraftClient.getInstance().currentGui).getPrevScreen(), recipes);
-        else
-            gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes);
+        else gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes);
         MinecraftClient.getInstance().openGui(gui);
     }
     
@@ -178,8 +180,8 @@ public class REIRecipeManager implements IRecipeManager {
         RecipeGui gui;
         if (MinecraftClient.getInstance().currentGui instanceof RecipeGui)
             gui = new RecipeGui(null, ((RecipeGui) MinecraftClient.getInstance().currentGui).getPrevScreen(), recipes);
-        else
-            gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes);
+        else gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes);
         MinecraftClient.getInstance().openGui(gui);
     }
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/library/KeyBindFunction.java

@@ -19,4 +19,5 @@ public abstract class KeyBindFunction {
     }
     
     public abstract boolean apply(int key);
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/library/Sink.java

@@ -2,5 +2,7 @@ package me.shedaniel.library;
 
 @FunctionalInterface
 public interface Sink {
+    
     public void Sink();
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/listenerdefinitions/CharInput.java

@@ -6,4 +6,5 @@ package me.shedaniel.listenerdefinitions;
 public interface CharInput extends IEvent {
     
     public boolean charInput(long p_onCharEvent_1_, int p_onCharEvent_3_, int p_onCharEvent_4_);
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/ClientTickable.java

@@ -1,5 +1,7 @@
 package me.shedaniel.listenerdefinitions;
 
 public interface ClientTickable extends IEvent {
+    
     public void clientTick();
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/DoneLoading.java

@@ -4,5 +4,7 @@ package me.shedaniel.listenerdefinitions;
  * Created by James on 7/27/2018.
  */
 public interface DoneLoading extends IEvent {
+    
     void onDoneLoading();
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/DrawContainer.java

@@ -6,5 +6,7 @@ import net.minecraft.client.gui.ContainerGui;
  * Created by James on 7/27/2018.
  */
 public interface DrawContainer extends IEvent {
+    
     public void draw(int mouseX, int mouseY, float dunno, ContainerGui gui);
+    
 }

+ 3 - 1
src/main/java/me/shedaniel/listenerdefinitions/GuiCickListener.java → src/main/java/me/shedaniel/listenerdefinitions/GuiClick.java

@@ -3,6 +3,8 @@ package me.shedaniel.listenerdefinitions;
 /**
  * Created by James on 7/29/2018.
  */
-public interface GuiCickListener extends IEvent {
+public interface GuiClick extends IEvent {
+    
     public boolean onClick(int x, int y, int button);
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/listenerdefinitions/GuiKeyDown.java

@@ -6,4 +6,5 @@ package me.shedaniel.listenerdefinitions;
 public interface GuiKeyDown extends IEvent {
     
     public boolean keyDown(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_);
+    
 }

+ 3 - 1
src/main/java/me/shedaniel/listenerdefinitions/MouseScrollListener.java → src/main/java/me/shedaniel/listenerdefinitions/GuiMouseScroll.java

@@ -1,5 +1,7 @@
 package me.shedaniel.listenerdefinitions;
 
-public interface MouseScrollListener extends IEvent {
+public interface GuiMouseScroll extends IEvent {
+    
     public boolean mouseScrolled(double direction);
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/IMixinContainerGui.java

@@ -4,6 +4,7 @@ import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
 
 public interface IMixinContainerGui {
+    
     public ItemStack getDraggedStack();
     
     public int getGuiLeft();
@@ -15,4 +16,5 @@ public interface IMixinContainerGui {
     public int getXSize();
     
     public Slot getHoveredSlot();
+    
 }

+ 0 - 7
src/main/java/me/shedaniel/listenerdefinitions/KeybindHandler.java

@@ -1,7 +0,0 @@
-package me.shedaniel.listenerdefinitions;
-
-public interface KeybindHandler extends IEvent {
-    
-    public void processKeybinds();
-    
-}

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/MinecraftResize.java

@@ -4,5 +4,7 @@ package me.shedaniel.listenerdefinitions;
  * Created by James on 7/28/2018.
  */
 public interface MinecraftResize extends IEvent {
+    
     public void resize(int scaledWidth, int scaledHeight);
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/PotionCraftingAdder.java

@@ -4,5 +4,7 @@ import net.minecraft.item.Item;
 import net.minecraft.potion.Potion;
 
 public interface PotionCraftingAdder extends IEvent {
+    
     public void addPotionRecipe(Potion inputType, Item reagent, Potion outputType);
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/listenerdefinitions/RecipeLoadListener.java

@@ -3,5 +3,7 @@ package me.shedaniel.listenerdefinitions;
 import net.minecraft.recipe.RecipeManager;
 
 public interface RecipeLoadListener extends IEvent {
+    
     public void recipesLoaded(RecipeManager recipeManager);
+    
 }

+ 1 - 2
src/main/java/me/shedaniel/listeners/DrawContainerListener.java

@@ -2,7 +2,6 @@ package me.shedaniel.listeners;
 
 import me.shedaniel.gui.REIRenderHelper;
 import me.shedaniel.listenerdefinitions.*;
-import net.fabricmc.fabric.networking.CustomPayloadPacketRegistry;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerGui;
 import net.minecraft.client.gui.Gui;
@@ -12,7 +11,7 @@ import net.minecraft.item.ItemGroup;
 /**
  * Created by James on 7/27/2018.
  */
-public class DrawContainerListener implements DrawContainer, GuiCickListener, GuiKeyDown, CharInput, ClientTickable, MouseScrollListener, MinecraftResize {
+public class DrawContainerListener implements DrawContainer, GuiClick, GuiKeyDown, CharInput, ClientTickable, GuiMouseScroll, MinecraftResize {
     
     @Override
     public void draw(int x, int y, float dunno, ContainerGui gui) {

+ 10 - 16
src/main/java/me/shedaniel/mixins/MixinContainerGui.java

@@ -19,6 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
  */
 @Mixin(ContainerGui.class)
 public abstract class MixinContainerGui extends Gui implements IMixinContainerGui {
+    
     @Shadow
     protected Slot focusedSlot;
     @Shadow
@@ -40,32 +41,24 @@ public abstract class MixinContainerGui extends Gui implements IMixinContainerGu
     
     @Inject(method = "mouseClicked(DDI)Z", at = @At("HEAD"), cancellable = true)
     private void mouseClick(double p_mouseClicked_1_, double p_mouseClicked_3_, int p_mouseClicked_5_, CallbackInfoReturnable<Boolean> ci) {
-        boolean handled = false;
-        for(GuiCickListener listener : Core.getListeners(GuiCickListener.class)) {
+        for(GuiClick listener : Core.getListeners(GuiClick.class))
             if (listener.onClick((int) p_mouseClicked_1_, (int) p_mouseClicked_3_, p_mouseClicked_5_)) {
                 ci.setReturnValue(true);
-                handled = true;
+                ci.cancel();
             }
-        }
-        if (handled)
-            ci.cancel();
     }
     
     @Inject(method = "keyPressed(III)Z", at = @At("HEAD"), cancellable = true)
     private void onKeyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_, CallbackInfoReturnable<Boolean> ci) {
-        boolean handled = false;
-        for(GuiKeyDown listener : Core.getListeners(GuiKeyDown.class)) {
-            if (listener.keyDown(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_))
-                handled = true;
-        }
-        if (handled) {
-            ci.setReturnValue(handled);
-            ci.cancel();
-        }
+        for(GuiKeyDown listener : Core.getListeners(GuiKeyDown.class))
+            if (listener.keyDown(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_)) {
+                ci.setReturnValue(true);
+                ci.cancel();
+            }
     }
     
     public boolean mouseScrolled(double p_mouseScrolled_1_) {
-        for(MouseScrollListener listener : Core.getListeners(MouseScrollListener.class))
+        for(GuiMouseScroll listener : Core.getListeners(GuiMouseScroll.class))
             if (listener.mouseScrolled(p_mouseScrolled_1_))
                 return true;
         return super.mouseScrolled(p_mouseScrolled_1_);
@@ -100,4 +93,5 @@ public abstract class MixinContainerGui extends Gui implements IMixinContainerGu
     public int getContainerWidth() {
         return containerWidth;
     }
+    
 }

+ 14 - 4
src/main/java/me/shedaniel/mixins/MixinCreativePlayerInventoryGui.java

@@ -1,6 +1,8 @@
 package me.shedaniel.mixins;
 
 import me.shedaniel.Core;
+import me.shedaniel.gui.REIRenderHelper;
+import me.shedaniel.listenerdefinitions.GuiClick;
 import me.shedaniel.listenerdefinitions.GuiKeyDown;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryGui;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryGui;
@@ -27,15 +29,13 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractPlayerInve
     
     @Inject(method = "keyPressed(III)Z", at = @At("HEAD"), cancellable = true)
     public void keyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_, CallbackInfoReturnable<Boolean> ci) {
-        boolean handled = false;
         if (method_2469() == ItemGroup.INVENTORY.getId())
             for(GuiKeyDown listener : Core.getListeners(GuiKeyDown.class))
                 if (listener.keyDown(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_)) {
                     ci.setReturnValue(true);
-                    handled = true;
+                    ci.cancel();
+                    return;
                 }
-        if (handled)
-            ci.cancel();
     }
     
     @Inject(method = "mouseScrolled(D)Z", at = @At("HEAD"), cancellable = true)
@@ -46,4 +46,14 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractPlayerInve
         }
     }
     
+    @Inject(method = "mouseClicked(DDI)Z", at = @At("HEAD"), cancellable = true)
+    public void mouseClicked(double double_1, double double_2, int int_1, CallbackInfoReturnable<Boolean> ci) {
+        if (method_2469() == ItemGroup.INVENTORY.getId() && REIRenderHelper.isGuiVisible())
+            for(GuiClick guiClick : Core.getListeners(GuiClick.class))
+                if (guiClick.onClick((int) double_1, (int) double_2, int_1)) {
+                    ci.setReturnValue(true);
+                    ci.cancel();
+                }
+    }
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/mixins/MixinDoneLoading.java

@@ -13,9 +13,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
  */
 @Mixin(Bootstrap.class)
 public class MixinDoneLoading {
+    
     @Inject(method = "initialize", at = @At("RETURN"))
     private static void onBootstrapRegister(CallbackInfo ci) {
         Core.LOGGER.info("REI: Done Loading");
         Core.getListeners(DoneLoading.class).forEach(DoneLoading::onDoneLoading);
     }
+    
 }

+ 2 - 0
src/main/java/me/shedaniel/mixins/MixinKeyboardListener.java

@@ -13,6 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
  */
 @Mixin(Keyboard.class)
 public class MixinKeyboardListener {
+    
     @Inject(method = "onChar", at = @At("RETURN"), cancellable = true)
     private void onCharEvent(long p_onCharEvent_1_, int p_onCharEvent_3_, int p_onCharEvent_4_, CallbackInfo ci) {
         boolean handled = false;
@@ -24,4 +25,5 @@ public class MixinKeyboardListener {
         if (handled)
             ci.cancel();
     }
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/mixins/MixinRecipeManager.java

@@ -23,4 +23,5 @@ public class MixinRecipeManager {
             listener.recipesLoaded(recipeManager);
         }
     }
+    
 }

+ 7 - 0
src/main/java/me/shedaniel/plugin/RandomRecipe.java

@@ -4,6 +4,7 @@ import me.shedaniel.api.IRecipe;
 import net.minecraft.block.Blocks;
 import net.minecraft.item.ItemStack;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
@@ -30,4 +31,10 @@ public class RandomRecipe implements IRecipe<ItemStack> {
     public List<List<ItemStack>> getInput() {
         return new LinkedList<>(Arrays.asList(new LinkedList<>(Arrays.asList(new ItemStack[]{new ItemStack(Blocks.OAK_LOG.getItem())}))));
     }
+    
+    @Override
+    public List<List<ItemStack>> getRecipeRequiredInput() {
+        return new ArrayList<>();
+    }
+    
 }

+ 1 - 0
src/main/java/me/shedaniel/plugin/TestRandomCategory.java

@@ -66,4 +66,5 @@ public class TestRandomCategory implements IDisplayCategory<RandomRecipe> {
     public ItemStack getCategoryIcon() {
         return item;
     }
+    
 }

+ 2 - 2
src/main/java/me/shedaniel/plugin/blastfurnace/VanillaBlastFurnaceCategory.java

@@ -1,6 +1,6 @@
 package me.shedaniel.plugin.blastfurnace;
 
-import me.shedaniel.api.DisplayCategoryCraftable;
+import me.shedaniel.api.IDisplayCategoryCraftable;
 import me.shedaniel.gui.RecipeGui;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
@@ -21,7 +21,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class VanillaBlastFurnaceCategory implements DisplayCategoryCraftable<VanillaBlastFurnaceRecipe> {
+public class VanillaBlastFurnaceCategory implements IDisplayCategoryCraftable<VanillaBlastFurnaceRecipe> {
     private List<VanillaBlastFurnaceRecipe> recipes;
     
     @Override

+ 9 - 3
src/main/java/me/shedaniel/plugin/blastfurnace/VanillaBlastFurnaceRecipe.java

@@ -10,9 +10,7 @@ import net.minecraft.recipe.Ingredient;
 import net.minecraft.recipe.smelting.BlastingRecipe;
 import net.minecraft.recipe.smelting.SmokingRecipe;
 
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 public class VanillaBlastFurnaceRecipe implements IRecipe<ItemStack> {
@@ -45,6 +43,14 @@ public class VanillaBlastFurnaceRecipe implements IRecipe<ItemStack> {
         return input;
     }
     
+    @Override
+    public List<List<ItemStack>> getRecipeRequiredInput() {
+        List<List<ItemStack>> input = new LinkedList<>();
+        for(Ingredient ingredient : recipe.getPreviewInputs())
+            Collections.addAll(input, new LinkedList<>(Arrays.asList(ingredient.getStackArray())));
+        return input;
+    }
+    
     public BlastingRecipe getRecipe() {
         return recipe;
     }

+ 2 - 3
src/main/java/me/shedaniel/plugin/crafting/VanillaCraftingCategory.java

@@ -1,10 +1,9 @@
 package me.shedaniel.plugin.crafting;
 
-import me.shedaniel.api.DisplayCategoryCraftable;
+import me.shedaniel.api.IDisplayCategoryCraftable;
 import me.shedaniel.gui.RecipeGui;
 import me.shedaniel.gui.widget.*;
 import me.shedaniel.listenerdefinitions.IMixinRecipeBookGui;
-import me.shedaniel.mixins.MixinRecipeBookGui;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Gui;
@@ -18,7 +17,7 @@ import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
-public class VanillaCraftingCategory implements DisplayCategoryCraftable<VanillaCraftingRecipe> {
+public class VanillaCraftingCategory implements IDisplayCategoryCraftable<VanillaCraftingRecipe> {
     Window mainWindow = MinecraftClient.getInstance().window;
     private List<VanillaCraftingRecipe> recipes;
     

+ 9 - 0
src/main/java/me/shedaniel/plugin/crafting/VanillaCraftingRecipe.java

@@ -4,6 +4,10 @@ import me.shedaniel.api.IRecipe;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 public abstract class VanillaCraftingRecipe implements IRecipe<ItemStack> {
     
     public int getWidth() {
@@ -16,4 +20,9 @@ public abstract class VanillaCraftingRecipe implements IRecipe<ItemStack> {
     
     public abstract Recipe getRecipe();
     
+    @Override
+    public List<List<ItemStack>> getRecipeRequiredInput() {
+        return getInput();
+    }
+    
 }

+ 2 - 3
src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceCategory.java

@@ -1,6 +1,6 @@
 package me.shedaniel.plugin.furnace;
 
-import me.shedaniel.api.DisplayCategoryCraftable;
+import me.shedaniel.api.IDisplayCategoryCraftable;
 import me.shedaniel.gui.RecipeGui;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
@@ -11,7 +11,6 @@ import net.minecraft.block.Blocks;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Gui;
-import net.minecraft.client.gui.container.BlastFurnaceGui;
 import net.minecraft.client.gui.container.FurnaceGui;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.Item;
@@ -22,7 +21,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class VanillaFurnaceCategory implements DisplayCategoryCraftable<VanillaFurnaceRecipe> {
+public class VanillaFurnaceCategory implements IDisplayCategoryCraftable<VanillaFurnaceRecipe> {
     private List<VanillaFurnaceRecipe> recipes;
     
     @Override

+ 9 - 0
src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceRecipe.java

@@ -9,6 +9,7 @@ import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.smelting.SmeltingRecipe;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -44,6 +45,14 @@ public class VanillaFurnaceRecipe implements IRecipe<ItemStack> {
         return input;
     }
     
+    @Override
+    public List<List<ItemStack>> getRecipeRequiredInput() {
+        List<List<ItemStack>> input = new LinkedList<>();
+        for(Ingredient ingredient : recipe.getPreviewInputs())
+            Collections.addAll(input, new LinkedList<>(Arrays.asList(ingredient.getStackArray())));
+        return input;
+    }
+    
     public Recipe getRecipe() {
         return recipe;
     }

+ 8 - 0
src/main/java/me/shedaniel/plugin/potion/VanillaPotionRecipe.java

@@ -37,6 +37,14 @@ public class VanillaPotionRecipe implements IRecipe<ItemStack> {
         return input;
     }
     
+    @Override
+    public List<List<ItemStack>> getRecipeRequiredInput() {
+        List<List<ItemStack>> input = new LinkedList<>();
+        input.add(new ArrayList<>(Arrays.asList(this.input)));
+        input.add(new ArrayList<>(Arrays.asList(this.reactWith)));
+        return input;
+    }
+    
     public List<ItemStack> getOutput(int slot) {
         List<ItemStack> stack = new ArrayList<>();
         for(int i = 0; i < slot * 2; i++)

+ 2 - 2
src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerCategory.java

@@ -1,6 +1,6 @@
 package me.shedaniel.plugin.smoker;
 
-import me.shedaniel.api.DisplayCategoryCraftable;
+import me.shedaniel.api.IDisplayCategoryCraftable;
 import me.shedaniel.gui.RecipeGui;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
@@ -21,7 +21,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class VanillaSmokerCategory implements DisplayCategoryCraftable<VanillaSmokerRecipe> {
+public class VanillaSmokerCategory implements IDisplayCategoryCraftable<VanillaSmokerRecipe> {
     private List<VanillaSmokerRecipe> recipes;
     
     @Override

+ 9 - 3
src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerRecipe.java

@@ -7,9 +7,7 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Ingredient;
 import net.minecraft.recipe.smelting.SmokingRecipe;
 
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 public class VanillaSmokerRecipe implements IRecipe<ItemStack> {
@@ -42,6 +40,14 @@ public class VanillaSmokerRecipe implements IRecipe<ItemStack> {
         return input;
     }
     
+    @Override
+    public List<List<ItemStack>> getRecipeRequiredInput() {
+        List<List<ItemStack>> input = new LinkedList<>();
+        for(Ingredient ingredient : recipe.getPreviewInputs())
+            Collections.addAll(input, new LinkedList<>(Arrays.asList(ingredient.getStackArray())));
+        return input;
+    }
+    
     public SmokingRecipe getRecipe() {
         return recipe;
     }

+ 3 - 1
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -29,5 +29,7 @@
   "ordering.rei.name": "Name",
   "ordering.rei.item_groups": "Item Groups",
   "text.auto_craft.wrong_gui": "§cCan't auto craft in this inventory!",
-  "text.auto_craft.crafting.too_small": "§cThis inventory is too small!"
+  "text.auto_craft.crafting.too_small": "§cThis inventory is too small!",
+  "text.rei.enable_craftable_only.button": "Craftable Only: %s%b",
+  "text.rei.enable_craftable_only.tooltip": "Please resize the window after editing\nthis config to apply the changes"
 }

BIN
src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png


+ 1 - 1
src/main/resources/fabric.mod.json

@@ -2,7 +2,7 @@
   "id": "roughlyenoughitems",
   "name": "RoughlyEnoughItems",
   "description": "To allow players to view items and recipes.",
-  "version": "1.5",
+  "version": "1.5.1",
   "side": "client",
   "authors": [
     "Danielshe"