Browse Source

Using more of the API instead of the Impl

shedaniel 5 years ago
parent
commit
9e29839826
40 changed files with 224 additions and 283 deletions
  1. 2 1
      src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java
  2. 7 4
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  3. 1 0
      src/main/java/me/shedaniel/rei/api/ConfigManager.java
  4. 0 31
      src/main/java/me/shedaniel/rei/api/ConfigObject.java
  5. 2 1
      src/main/java/me/shedaniel/rei/api/DisplayHelper.java
  6. 0 1
      src/main/java/me/shedaniel/rei/api/EntryRegistry.java
  7. 1 1
      src/main/java/me/shedaniel/rei/api/EntryStack.java
  8. 0 11
      src/main/java/me/shedaniel/rei/api/LiveRecipeGenerator.java
  9. 6 8
      src/main/java/me/shedaniel/rei/api/RecipeHelper.java
  10. 0 4
      src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java
  11. 0 2
      src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java
  12. 45 46
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  13. 3 3
      src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java
  14. 3 4
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  15. 2 3
      src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
  16. 1 0
      src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java
  17. 1 25
      src/main/java/me/shedaniel/rei/gui/entries/SimpleRecipeEntry.java
  18. 1 2
      src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java
  19. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  20. 17 20
      src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
  21. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java
  22. 2 2
      src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java
  23. 1 15
      src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java
  24. 4 2
      src/main/java/me/shedaniel/rei/impl/BaseBoundsHandlerImpl.java
  25. 11 8
      src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
  26. 3 0
      src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
  27. 3 17
      src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
  28. 3 0
      src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java
  29. 5 0
      src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java
  30. 3 0
      src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java
  31. 12 2
      src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java
  32. 12 3
      src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java
  33. 1 0
      src/main/java/me/shedaniel/rei/impl/ObjectHolderImpl.java
  34. 50 45
      src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
  35. 5 4
      src/main/java/me/shedaniel/rei/impl/ScreenHelper.java
  36. 4 0
      src/main/java/me/shedaniel/rei/impl/SearchArgument.java
  37. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java
  38. 0 3
      src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java
  39. 1 2
      src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java
  40. 4 5
      src/main/java/me/shedaniel/rei/utils/CollectionUtils.java

+ 2 - 1
src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java

@@ -6,6 +6,7 @@
 package me.shedaniel.rei;
 
 import io.github.prospector.modmenu.api.ModMenuApi;
+import me.shedaniel.rei.api.ConfigManager;
 import net.minecraft.client.gui.screen.Screen;
 
 import java.util.Optional;
@@ -25,7 +26,7 @@ public class REIModMenuEntryPoint implements ModMenuApi {
     }
     
     public Screen getScreen(Screen parent) {
-        return RoughlyEnoughItemsCore.getConfigManager().getConfigScreen(parent);
+        return ConfigManager.getInstance().getConfigScreen(parent);
     }
     
 }

+ 7 - 4
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -134,6 +134,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET);
     }
     
+    @SuppressWarnings("deprecation")
     @Override
     public void onInitializeClient() {
         configManager = new ConfigManagerImpl();
@@ -215,14 +216,16 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 return;
             }
             lastSync.set(System.currentTimeMillis());
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().doesRegisterRecipesInAnotherThread()) {
-                CompletableFuture.runAsync(() -> ((RecipeHelperImpl) RoughlyEnoughItemsCore.getRecipeHelper()).recipesLoaded(recipeManager), SYNC_RECIPES);
+            if (ConfigManager.getInstance().getConfig().doesRegisterRecipesInAnotherThread()) {
+                //noinspection deprecation
+                CompletableFuture.runAsync(() -> ((RecipeHelperImpl) RecipeHelper.getInstance()).recipesLoaded(recipeManager), SYNC_RECIPES);
             } else {
-                ((RecipeHelperImpl) RoughlyEnoughItemsCore.getRecipeHelper()).recipesLoaded(recipeManager);
+                //noinspection deprecation
+                ((RecipeHelperImpl) RecipeHelper.getInstance()).recipesLoaded(recipeManager);
             }
         });
         ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> {
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().doesDisableRecipeBook() && screen instanceof AbstractContainerScreen && abstractButtonWidget instanceof TexturedButtonWidget)
+            if (ConfigManager.getInstance().getConfig().doesDisableRecipeBook() && screen instanceof AbstractContainerScreen && abstractButtonWidget instanceof TexturedButtonWidget)
                 if (((RecipeBookButtonWidgetHooks) abstractButtonWidget).rei_getTexture().equals(recipeButtonTex))
                     return ActionResult.FAIL;
             return ActionResult.PASS;

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

@@ -14,6 +14,7 @@ import java.io.IOException;
 public interface ConfigManager {
     
     static ConfigManager getInstance() {
+        //noinspection deprecation
         return RoughlyEnoughItemsCore.getConfigManager();
     }
     

+ 0 - 31
src/main/java/me/shedaniel/rei/api/ConfigObject.java

@@ -72,35 +72,4 @@ public interface ConfigObject {
     
     boolean doesRegisterRecipesInAnotherThread();
     
-    RelativePoint getChoosePageDialogPoint();
-    
-    void setChoosePageDialogPoint(RelativePoint choosePageDialogPoint);
-    
-    public static class RelativePoint {
-        
-        private double relativeX, relativeY;
-        
-        public RelativePoint(double relativeX, double relativeY) {
-            this.relativeX = relativeX;
-            this.relativeY = relativeY;
-        }
-        
-        public double getRelativeX() {
-            return relativeX;
-        }
-        
-        public double getRelativeY() {
-            return relativeY;
-        }
-        
-        public double getX(double width) {
-            return width * relativeX;
-        }
-        
-        public double getY(double height) {
-            return height * relativeY;
-        }
-        
-    }
-    
 }

+ 2 - 1
src/main/java/me/shedaniel/rei/api/DisplayHelper.java

@@ -17,6 +17,7 @@ import static net.minecraft.util.ActionResult.PASS;
 public interface DisplayHelper {
     
     static DisplayHelper getInstance() {
+        //noinspection deprecation
         return RoughlyEnoughItemsCore.getDisplayHelper();
     }
     
@@ -117,7 +118,7 @@ public interface DisplayHelper {
          * @return the item list bounds
          */
         default Rectangle getItemListArea(Rectangle rectangle) {
-            return new Rectangle(rectangle.x + 1, rectangle.y + 2 + (RoughlyEnoughItemsCore.getConfigManager().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + (RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled() ? 0 : 22), rectangle.width - 2, rectangle.height - (RoughlyEnoughItemsCore.getConfigManager().getConfig().getSearchFieldLocation() != SearchFieldLocation.CENTER ? 27 + 22 : 27) + (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled() ? 0 : 22));
+            return new Rectangle(rectangle.x + 1, rectangle.y + 2 + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled() ? 0 : 22), rectangle.width - 2, rectangle.height - (ConfigManager.getInstance().getConfig().getSearchFieldLocation() != SearchFieldLocation.CENTER ? 27 + 22 : 27) + (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled() ? 0 : 22));
         }
         
         /**

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

@@ -6,7 +6,6 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.annotations.ToBeRemoved;
 import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;

+ 1 - 1
src/main/java/me/shedaniel/rei/api/EntryStack.java

@@ -10,7 +10,6 @@ import me.shedaniel.rei.gui.widget.QueuedTooltip;
 import me.shedaniel.rei.impl.EmptyEntryStack;
 import me.shedaniel.rei.impl.FluidEntryStack;
 import me.shedaniel.rei.impl.ItemEntryStack;
-import net.minecraft.block.Block;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.fluid.Fluid;
 import net.minecraft.item.Item;
@@ -25,6 +24,7 @@ import java.util.Optional;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@SuppressWarnings("deprecation")
 public interface EntryStack {
     
     static EntryStack empty() {

+ 0 - 11
src/main/java/me/shedaniel/rei/api/LiveRecipeGenerator.java

@@ -5,7 +5,6 @@
 
 package me.shedaniel.rei.api;
 
-import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 
 import java.util.List;
@@ -15,20 +14,10 @@ public interface LiveRecipeGenerator<T extends RecipeDisplay> {
     
     Identifier getCategoryIdentifier();
     
-    @Deprecated
-    default Optional<List<T>> getRecipeFor(ItemStack stack) {
-        return Optional.empty();
-    }
-    
     default Optional<List<T>> getRecipeFor(EntryStack entry) {
         return Optional.empty();
     }
     
-    @Deprecated
-    default Optional<List<T>> getUsageFor(ItemStack stack) {
-        return Optional.empty();
-    }
-    
     default Optional<List<T>> getUsageFor(EntryStack entry) {
         return Optional.empty();
     }

+ 6 - 8
src/main/java/me/shedaniel/rei/api/RecipeHelper.java

@@ -20,10 +20,8 @@ import java.util.function.Predicate;
 
 public interface RecipeHelper {
     
-    /**
-     * @return the api instance of {@link me.shedaniel.rei.impl.RecipeHelperImpl}
-     */
     static RecipeHelper getInstance() {
+        //noinspection deprecation
         return RoughlyEnoughItemsCore.getRecipeHelper();
     }
     
@@ -56,7 +54,7 @@ public interface RecipeHelper {
      *
      * @param category the category to register
      */
-    void registerCategory(RecipeCategory category);
+    void registerCategory(RecipeCategory<?> category);
     
     /**
      * Registers the working stations of a category
@@ -106,7 +104,7 @@ public interface RecipeHelper {
      *
      * @return the list of categories
      */
-    List<RecipeCategory> getAllCategories();
+    List<RecipeCategory<?>> getAllCategories();
     
     /**
      * Gets a map of usages for an entry
@@ -122,7 +120,7 @@ public interface RecipeHelper {
      * @param category the category of the display
      * @return the optional of speed crafting button area
      */
-    Optional<ButtonAreaSupplier> getAutoCraftButtonArea(RecipeCategory category);
+    Optional<ButtonAreaSupplier> getAutoCraftButtonArea(RecipeCategory<?> category);
     
     /**
      * Registers a speed crafting button area
@@ -155,7 +153,7 @@ public interface RecipeHelper {
      */
     Map<RecipeCategory<?>, List<RecipeDisplay>> getAllRecipes();
     
-    List<RecipeDisplay> getAllRecipesFromCategory(RecipeCategory category);
+    List<RecipeDisplay> getAllRecipesFromCategory(RecipeCategory<?> category);
     
     /**
      * Registers a recipe visibility handler
@@ -207,7 +205,7 @@ public interface RecipeHelper {
      */
     void registerLiveRecipeGenerator(LiveRecipeGenerator<?> liveRecipeGenerator);
     
-    void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen> screenClass, Identifier... categories);
+    void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen<?>> screenClass, Identifier... categories);
     
     <T extends Recipe<?>> void registerRecipes(Identifier category, Class<T> recipeClass, Function<T, RecipeDisplay> mappingFunction);
     

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

@@ -5,13 +5,9 @@
 
 package me.shedaniel.rei.api;
 
-import com.google.common.collect.Lists;
 import me.shedaniel.rei.server.ContainerInfo;
 import net.minecraft.container.Container;
-import net.minecraft.item.ItemStack;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 public interface TransferRecipeDisplay extends RecipeDisplay {

+ 0 - 2
src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java

@@ -10,8 +10,6 @@ import me.shedaniel.rei.api.EntryRegistry;
 import me.shedaniel.rei.api.REIPluginEntry;
 import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.api.annotations.ToBeRemoved;
-import net.fabricmc.loader.api.SemanticVersion;
-import net.fabricmc.loader.util.version.VersionParsingException;
 
 public interface REIPluginV0 extends REIPluginEntry {
     

+ 45 - 46
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -11,13 +11,9 @@ import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.ClientHelper;
-import me.shedaniel.rei.api.DisplayHelper;
-import me.shedaniel.rei.api.EntryStack;
-import me.shedaniel.rei.api.RecipeHelper;
+import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.gui.config.SearchFieldLocation;
 import me.shedaniel.rei.gui.widget.*;
-import me.shedaniel.rei.impl.RecipeHelperImpl;
 import me.shedaniel.rei.impl.ScreenHelper;
 import me.shedaniel.rei.impl.Weather;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
@@ -109,13 +105,14 @@ public class ContainerScreenOverlay extends Widget {
         //Update Variables
         this.children().clear();
         this.window = MinecraftClient.getInstance().getWindow();
-        DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
-        this.rectangle = RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel() ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen);
+        @SuppressWarnings({"RawTypeCanBeGeneric", "rawtypes"})
+        DisplayHelper.DisplayBoundsHandler boundsHandler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
+        this.rectangle = ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen);
         widgets.add(entryListWidget = new EntryListWidget(page));
         entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
         
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled()) {
-            widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + (RoughlyEnoughItemsCore.getConfigManager().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16, new TranslatableText("text.rei.left_arrow")) {
+        if (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
+            widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16, new TranslatableText("text.rei.left_arrow")) {
                 @Override
                 public void onPressed() {
                     page--;
@@ -139,7 +136,7 @@ public class ContainerScreenOverlay extends Widget {
                     return isNotInExclusionZones(mouseX, mouseY) && super.containsMouse(mouseX, mouseY);
                 }
             });
-            widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + (RoughlyEnoughItemsCore.getConfigManager().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16, new TranslatableText("text.rei.right_arrow")) {
+            widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16, new TranslatableText("text.rei.right_arrow")) {
                 @Override
                 public void onPressed() {
                     page++;
@@ -168,14 +165,14 @@ public class ContainerScreenOverlay extends Widget {
         if (setPage)
             page = MathHelper.clamp(page, 0, getTotalPage());
         
-        widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 30 : 10, 10, 20, 20, "") {
+        widgets.add(new ButtonWidget(ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 30 : 10, 10, 20, 20, "") {
             @Override
             public void onPressed() {
                 if (Screen.hasShiftDown()) {
                     ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating());
                     return;
                 }
-                RoughlyEnoughItemsCore.getConfigManager().openConfigScreen(ScreenHelper.getLastContainerScreen());
+                ConfigManager.getInstance().openConfigScreen(ScreenHelper.getLastContainerScreen());
             }
             
             @Override
@@ -218,11 +215,11 @@ public class ContainerScreenOverlay extends Widget {
                 return isNotInExclusionZones(mouseX, mouseY) && super.containsMouse(mouseX, mouseY);
             }
         });
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().doesShowUtilsButtons()) {
-            widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 55 : 35, 10, 20, 20, "") {
+        if (ConfigManager.getInstance().getConfig().doesShowUtilsButtons()) {
+            widgets.add(new ButtonWidget(ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 55 : 35, 10, 20, 20, "") {
                 @Override
                 public void onPressed() {
-                    MinecraftClient.getInstance().player.sendChatMessage(RoughlyEnoughItemsCore.getConfigManager().getConfig().getGamemodeCommand().replaceAll("\\{gamemode}", getNextGameMode(Screen.hasShiftDown()).getName()));
+                    MinecraftClient.getInstance().player.sendChatMessage(ConfigManager.getInstance().getConfig().getGamemodeCommand().replaceAll("\\{gamemode}", getNextGameMode(Screen.hasShiftDown()).getName()));
                 }
                 
                 @Override
@@ -246,12 +243,12 @@ public class ContainerScreenOverlay extends Widget {
                     return isNotInExclusionZones(mouseX, mouseY) && super.containsMouse(mouseX, mouseY);
                 }
             });
-            int xxx = RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 30 : 10;
+            int xxx = ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 30 : 10;
             for (Weather weather : Weather.values()) {
                 widgets.add(new ButtonWidget(xxx, 35, 20, 20, "") {
                     @Override
                     public void onPressed() {
-                        MinecraftClient.getInstance().player.sendChatMessage(RoughlyEnoughItemsCore.getConfigManager().getConfig().getWeatherCommand().replaceAll("\\{weather}", weather.name().toLowerCase(Locale.ROOT)));
+                        MinecraftClient.getInstance().player.sendChatMessage(ConfigManager.getInstance().getConfig().getWeatherCommand().replaceAll("\\{weather}", weather.name().toLowerCase(Locale.ROOT)));
                     }
                     
                     @Override
@@ -278,11 +275,11 @@ public class ContainerScreenOverlay extends Widget {
                         return isNotInExclusionZones(mouseX, mouseY) && super.containsMouse(mouseX, mouseY);
                     }
                 });
-                xxx += RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel() ? -25 : 25;
+                xxx += ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? -25 : 25;
             }
         }
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled()) {
-            widgets.add(new ClickableLabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + (RoughlyEnoughItemsCore.getConfigManager().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10, "", getTotalPage() > 0) {
+        if (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
+            widgets.add(new ClickableLabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10, "", getTotalPage() > 0) {
                 @Override
                 public void render(int mouseX, int mouseY, float delta) {
                     page = MathHelper.clamp(page, 0, getTotalPage());
@@ -309,20 +306,22 @@ public class ContainerScreenOverlay extends Widget {
             });
             buttonLeft.enabled = buttonRight.enabled = getTotalPage() > 0;
         }
-        if (ScreenHelper.searchField == null)
+        if (ScreenHelper.getSearchField() == null) {
+            //noinspection deprecation
             ScreenHelper.setSearchField(new OverlaySearchField(0, 0, 0, 0));
-        ScreenHelper.searchField.getBounds().setBounds(getTextFieldArea());
-        this.widgets.add(ScreenHelper.searchField);
-        ScreenHelper.searchField.setText(searchTerm);
-        ScreenHelper.searchField.setChangedListener(s -> {
+        }
+        ScreenHelper.getSearchField().getBounds().setBounds(getTextFieldArea());
+        this.widgets.add(ScreenHelper.getSearchField());
+        ScreenHelper.getSearchField().setText(searchTerm);
+        ScreenHelper.getSearchField().setChangedListener(s -> {
             searchTerm = s;
             entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         });
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isCraftableFilterEnabled())
+        if (ConfigManager.getInstance().getConfig().isCraftableFilterEnabled())
             this.widgets.add(toggleButtonWidget = new CraftableToggleButtonWidget(getCraftableToggleArea()) {
                 @Override
                 public void onPressed() {
-                    RoughlyEnoughItemsCore.getConfigManager().toggleCraftableOnly();
+                    ConfigManager.getInstance().toggleCraftableOnly();
                     entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
                 }
                 
@@ -392,8 +391,8 @@ public class ContainerScreenOverlay extends Widget {
     }
     
     private Rectangle getTextFieldArea() {
-        int widthRemoved = RoughlyEnoughItemsCore.getConfigManager().getConfig().isCraftableFilterEnabled() ? 22 : 2;
-        SearchFieldLocation searchFieldLocation = RoughlyEnoughItemsCore.getConfigManager().getConfig().getSearchFieldLocation();
+        int widthRemoved = ConfigManager.getInstance().getConfig().isCraftableFilterEnabled() ? 22 : 2;
+        SearchFieldLocation searchFieldLocation = ConfigManager.getInstance().getConfig().getSearchFieldLocation();
         if (searchFieldLocation == SearchFieldLocation.BOTTOM_SIDE)
             return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 18);
         if (searchFieldLocation == SearchFieldLocation.TOP_SIDE)
@@ -427,13 +426,13 @@ public class ContainerScreenOverlay extends Widget {
     @Override
     public void render(int mouseX, int mouseY, float delta) {
         List<ItemStack> currentStacks = ClientHelper.getInstance().getInventoryItemsTypes();
-        if (RoughlyEnoughItemsCore.getDisplayHelper().getBaseBoundsHandler() != null && RoughlyEnoughItemsCore.getDisplayHelper().getBaseBoundsHandler().shouldRecalculateArea(!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel(), rectangle))
+        if (DisplayHelper.getInstance().getBaseBoundsHandler() != null && DisplayHelper.getInstance().getBaseBoundsHandler().shouldRecalculateArea(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), rectangle))
             shouldReInit = true;
         if (shouldReInit)
             init(true);
-        else if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && ((currentStacks.size() != ScreenHelper.inventoryStacks.size()) || !hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks))) {
+        else if (ConfigManager.getInstance().isCraftableOnlyEnabled() && ((currentStacks.size() != ScreenHelper.inventoryStacks.size()) || !hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks))) {
             ScreenHelper.inventoryStacks = currentStacks;
-            DisplayHelper.DisplayBoundsHandler<?> boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
+            DisplayHelper.DisplayBoundsHandler<?> boundsHandler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
             entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         }
         if (OverlaySearchField.isSearching) {
@@ -451,9 +450,9 @@ public class ContainerScreenOverlay extends Widget {
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         this.renderWidgets(mouseX, mouseY, delta);
-        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && RoughlyEnoughItemsCore.getConfigManager().getConfig().areClickableRecipeArrowsEnabled()) {
+        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && ConfigManager.getInstance().getConfig().areClickableRecipeArrowsEnabled()) {
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
-            for (RecipeHelperImpl.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
+            for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
                 if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
                     if (area.getRectangle().contains(mouseX - hooks.rei_getContainerLeft(), mouseY - hooks.rei_getContainerTop())) {
                         String collect = CollectionUtils.mapAndJoinToString(area.getCategories(), identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName(), ", ");
@@ -465,7 +464,7 @@ public class ContainerScreenOverlay extends Widget {
     
     public void lateRender(int mouseX, int mouseY, float delta) {
         if (ScreenHelper.isOverlayVisible()) {
-            ScreenHelper.searchField.laterRender(mouseX, mouseY, delta);
+            ScreenHelper.getSearchField().laterRender(mouseX, mouseY, delta);
             if (toggleButtonWidget != null)
                 toggleButtonWidget.lateRender(mouseX, mouseY, delta);
             Screen currentScreen = MinecraftClient.getInstance().currentScreen;
@@ -509,7 +508,7 @@ public class ContainerScreenOverlay extends Widget {
     public void renderWidgets(int int_1, int int_2, float float_1) {
         if (!ScreenHelper.isOverlayVisible())
             return;
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled())
+        if (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled())
             buttonLeft.enabled = buttonRight.enabled = getTotalPage() > 0;
         widgets.forEach(widget -> {
             GuiLighting.disable();
@@ -527,7 +526,7 @@ public class ContainerScreenOverlay extends Widget {
         if (!ScreenHelper.isOverlayVisible())
             return false;
         if (isInside(PointHelper.fromMouse())) {
-            if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled()) {
+            if (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
                 if (amount > 0 && buttonLeft.enabled)
                     buttonLeft.onPressed();
                 else if (amount < 0 && buttonRight.enabled)
@@ -568,10 +567,10 @@ public class ContainerScreenOverlay extends Widget {
         if (!ScreenHelper.isOverlayVisible())
             return false;
         if (ClientHelper.getInstance().getFocusSearchFieldKeyBinding().matchesKey(int_1, int_2)) {
-            ScreenHelper.searchField.setFocused(true);
-            setFocused(ScreenHelper.searchField);
-            ScreenHelper.searchField.keybindFocusTime = System.currentTimeMillis();
-            ScreenHelper.searchField.keybindFocusKey = int_1;
+            ScreenHelper.getSearchField().setFocused(true);
+            setFocused(ScreenHelper.getSearchField());
+            ScreenHelper.getSearchField().keybindFocusTime = System.currentTimeMillis();
+            ScreenHelper.getSearchField().keybindFocusKey = int_1;
             return true;
         }
         return false;
@@ -596,9 +595,9 @@ public class ContainerScreenOverlay extends Widget {
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
         if (!ScreenHelper.isOverlayVisible())
             return false;
-        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && RoughlyEnoughItemsCore.getConfigManager().getConfig().areClickableRecipeArrowsEnabled()) {
+        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && ConfigManager.getInstance().getConfig().areClickableRecipeArrowsEnabled()) {
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
-            for (RecipeHelperImpl.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
+            for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
                 if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
                     if (area.getRectangle().contains(double_1 - hooks.rei_getContainerLeft(), double_2 - hooks.rei_getContainerTop())) {
                         ClientHelper.getInstance().executeViewAllRecipesFromCategories(Arrays.asList(area.getCategories()));
@@ -626,8 +625,8 @@ public class ContainerScreenOverlay extends Widget {
     public boolean isInside(double mouseX, double mouseY) {
         if (!rectangle.contains(mouseX, mouseY))
             return false;
-        for (DisplayHelper.DisplayBoundsHandler<?> handler : RoughlyEnoughItemsCore.getDisplayHelper().getSortedBoundsHandlers(MinecraftClient.getInstance().currentScreen.getClass())) {
-            ActionResult in = handler.isInZone(!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel(), mouseX, mouseY);
+        for (DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(MinecraftClient.getInstance().currentScreen.getClass())) {
+            ActionResult in = handler.isInZone(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), mouseX, mouseY);
             if (in != ActionResult.PASS)
                 return in == ActionResult.SUCCESS;
         }
@@ -635,7 +634,7 @@ public class ContainerScreenOverlay extends Widget {
     }
     
     public boolean isNotInExclusionZones(double mouseX, double mouseY) {
-        for (DisplayHelper.DisplayBoundsHandler<?> handler : RoughlyEnoughItemsCore.getDisplayHelper().getSortedBoundsHandlers(MinecraftClient.getInstance().currentScreen.getClass())) {
+        for (DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(MinecraftClient.getInstance().currentScreen.getClass())) {
             ActionResult in = handler.isInZone(true, mouseX, mouseY);
             if (in != ActionResult.PASS)
                 return in == ActionResult.SUCCESS;

+ 3 - 3
src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java

@@ -7,8 +7,8 @@ package me.shedaniel.rei.gui;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ClientHelper;
+import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.RecipeDisplay;
 import me.shedaniel.rei.gui.config.RecipeScreenType;
@@ -54,9 +54,9 @@ public class PreRecipeViewingScreen extends Screen {
         this.widgets.add(new ButtonWidget(width / 2 - 100, height - 40, 200, 20, I18n.translate("text.rei.select")) {
             @Override
             public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().setRecipeScreenType(original ? RecipeScreenType.ORIGINAL : RecipeScreenType.VILLAGER);
+                ConfigManager.getInstance().getConfig().setRecipeScreenType(original ? RecipeScreenType.ORIGINAL : RecipeScreenType.VILLAGER);
                 try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
+                    ConfigManager.getInstance().saveConfig();
                 } catch (IOException | FiberException e) {
                     e.printStackTrace();
                 }

+ 3 - 4
src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java

@@ -9,7 +9,6 @@ import com.google.common.collect.Lists;
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.gui.widget.*;
 import me.shedaniel.rei.impl.ScreenHelper;
@@ -294,7 +293,7 @@ public class RecipeViewingScreen extends Screen {
         else
             recipeChoosePageWidget = null;
         
-        List<List<EntryStack>> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(selectedCategory.getIdentifier());
+        List<List<EntryStack>> workingStations = RecipeHelper.getInstance().getWorkingStations(selectedCategory.getIdentifier());
         if (!workingStations.isEmpty()) {
             int hh = MathHelper.floor((bounds.height - 16) / 18f);
             int actualHeight = Math.min(hh, workingStations.size());
@@ -353,12 +352,12 @@ public class RecipeViewingScreen extends Screen {
         if (selectedCategory.getFixedRecipesPerPage() > 0)
             return selectedCategory.getFixedRecipesPerPage() - 1;
         int height = selectedCategory.getDisplayHeight();
-        return MathHelper.clamp(MathHelper.floor(((double) largestHeight - 40d) / ((double) height + 7d)) - 1, 0, Math.min(RoughlyEnoughItemsCore.getConfigManager().getConfig().getMaxRecipePerPage() - 1, selectedCategory.getMaximumRecipePerPage() - 1));
+        return MathHelper.clamp(MathHelper.floor(((double) largestHeight - 40d) / ((double) height + 7d)) - 1, 0, Math.min(ConfigManager.getInstance().getConfig().getMaxRecipePerPage() - 1, selectedCategory.getMaximumRecipePerPage() - 1));
     }
     
     private int getRecipesPerPageByHeight() {
         int height = selectedCategory.getDisplayHeight();
-        return MathHelper.clamp(MathHelper.floor(((double) guiHeight - 40d) / ((double) height + 7d)), 0, Math.min(RoughlyEnoughItemsCore.getConfigManager().getConfig().getMaxRecipePerPage() - 1, selectedCategory.getMaximumRecipePerPage() - 1));
+        return MathHelper.clamp(MathHelper.floor(((double) guiHeight - 40d) / ((double) height + 7d)), 0, Math.min(ConfigManager.getInstance().getConfig().getMaxRecipePerPage() - 1, selectedCategory.getMaximumRecipePerPage() - 1));
     }
     
     @Override

+ 2 - 3
src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java

@@ -14,7 +14,6 @@ import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWi
 import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.Precision;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.gui.entries.RecipeEntry;
 import me.shedaniel.rei.gui.widget.*;
@@ -101,7 +100,7 @@ public class VillagerRecipeViewingScreen extends Screen {
         int guiHeight = MathHelper.clamp(category.getDisplayHeight() + 40, 166, largestHeight);
         this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight);
         
-        List<List<EntryStack>> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(category.getIdentifier());
+        List<List<EntryStack>> workingStations = RecipeHelper.getInstance().getWorkingStations(category.getIdentifier());
         if (!workingStations.isEmpty()) {
             int ww = MathHelper.floor((bounds.width - 16) / 18f);
             int w = Math.min(ww, workingStations.size());
@@ -324,7 +323,7 @@ public class VillagerRecipeViewingScreen extends Screen {
     
     @Override
     public void render(int mouseX, int mouseY, float delta) {
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().doesVillagerScreenHavePermanentScrollBar()) {
+        if (ConfigManager.getInstance().getConfig().doesVillagerScreenHavePermanentScrollBar()) {
             scrollBarAlphaFutureTime = System.currentTimeMillis();
             scrollBarAlphaFuture = 0;
             scrollBarAlpha = 1;

+ 1 - 0
src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java

@@ -106,6 +106,7 @@ public abstract class RecipeEntry extends DrawableHelper implements EntryStack {
     
     @Override
     public <T> ObjectHolder<T> getSetting(Settings<T> settings) {
+        //noinspection deprecation
         return new ObjectHolderImpl<>(settings.getDefaultValue());
     }
     

+ 1 - 25
src/main/java/me/shedaniel/rei/gui/entries/SimpleRecipeEntry.java

@@ -13,7 +13,6 @@ import me.shedaniel.rei.gui.widget.QueuedTooltip;
 import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;
-import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.Pair;
 import net.minecraft.util.math.MathHelper;
@@ -28,30 +27,7 @@ import java.util.stream.Collectors;
 
 public class SimpleRecipeEntry extends RecipeEntry {
     
-    private static final Comparator<EntryStack> ENTRY_COMPARATOR = (o1, o2) -> {
-        if (o1.getType() == EntryStack.Type.FLUID) {
-            if (o2.getType() == EntryStack.Type.ITEM)
-                return -1;
-            return o1.getFluid().hashCode() - o2.getFluid().hashCode();
-        } else if (o2.getType() == EntryStack.Type.FLUID) {
-            if (o1.getType() == EntryStack.Type.ITEM)
-                return 1;
-            return o1.getFluid().hashCode() - o2.getFluid().hashCode();
-        }
-        ItemStack i1 = o1.getItemStack();
-        ItemStack i2 = o2.getItemStack();
-        if (i1.getItem() == i2.getItem()) {
-            if (i1.getCount() != i2.getCount())
-                return i1.getCount() - i2.getCount();
-            int compare = Boolean.compare(i1.hasTag(), i2.hasTag());
-            if (compare != 0)
-                return compare;
-            if (i1.getTag().getSize() != i2.getTag().getSize())
-                return i1.getTag().getSize() - i2.getTag().getSize();
-            return i1.getTag().hashCode() - i2.getTag().hashCode();
-        }
-        return i1.getItem().hashCode() - i2.getItem().hashCode();
-    };
+    private static final Comparator<EntryStack> ENTRY_COMPARATOR = Comparator.comparingLong(EntryStack::hashCode);
     private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private List<EntryWidget> inputWidgets;
     private EntryWidget outputWidget;

+ 1 - 2
src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java

@@ -11,7 +11,6 @@ import it.unimi.dsi.fastutil.ints.IntList;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.gui.toast.CopyRecipeIdentifierToast;
 import me.shedaniel.rei.impl.ScreenHelper;
@@ -178,7 +177,7 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (displaySupplier.get().getRecipeLocation().isPresent() && ClientHelper.getInstance().getCopyRecipeIdentifierKeyBinding().matchesKey(int_1, int_2) && containsMouse(PointHelper.fromMouse())) {
             minecraft.keyboard.setClipboard(displaySupplier.get().getRecipeLocation().get().toString());
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isToastDisplayedOnCopyIdentifier()) {
+            if (ConfigManager.getInstance().getConfig().isToastDisplayedOnCopyIdentifier()) {
                 CopyRecipeIdentifierToast.addToast(I18n.translate("msg.rei.copied_recipe_id"), I18n.translate("msg.rei.recipe_id_details", displaySupplier.get().getRecipeLocation().get().toString()));
             }
             return true;

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

@@ -7,7 +7,7 @@ package me.shedaniel.rei.gui.widget;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ConfigManager;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;
@@ -43,7 +43,7 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
         GuiLighting.disable();
         MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        int color = RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? 939579655 : 956235776;
+        int color = ConfigManager.getInstance().isCraftableOnlyEnabled() ? 939579655 : 956235776;
         setBlitOffset(getBlitOffset() + 10);
         this.fillGradient(getBounds().x, getBounds().y, getBounds().x + getBounds().width, getBounds().y + getBounds().height, color, color);
         setBlitOffset(0);
@@ -60,6 +60,6 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     
     @Override
     public Optional<String> getTooltips() {
-        return Optional.ofNullable(I18n.translate(RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all"));
+        return Optional.ofNullable(I18n.translate(ConfigManager.getInstance().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all"));
     }
 }

+ 17 - 20
src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java

@@ -14,10 +14,7 @@ import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWi
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.ClientHelper;
-import me.shedaniel.rei.api.DisplayHelper;
-import me.shedaniel.rei.api.EntryStack;
-import me.shedaniel.rei.api.RecipeHelper;
+import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.gui.config.ItemCheatingMode;
 import me.shedaniel.rei.gui.config.ItemListOrdering;
 import me.shedaniel.rei.impl.ScreenHelper;
@@ -49,7 +46,7 @@ import java.util.function.Supplier;
 @SuppressWarnings({"deprecation", "rawtypes"})
 public class EntryListWidget extends Widget {
     
-    private static final Supplier<Boolean> RENDER_EXTRA_CONFIG = () -> RoughlyEnoughItemsCore.getConfigManager().getConfig().doesRenderEntryExtraOverlay();
+    private static final Supplier<Boolean> RENDER_EXTRA_CONFIG = () -> ConfigManager.getInstance().getConfig().doesRenderEntryExtraOverlay();
     private static final String SPACE = " ", EMPTY = "";
     private static final Comparator<EntryStack> ASCENDING_COMPARATOR;
     private static List<Item> searchBlacklisted = Lists.newArrayList();
@@ -65,9 +62,9 @@ public class EntryListWidget extends Widget {
     
     static {
         ASCENDING_COMPARATOR = (entry, entry1) -> {
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.name))
+            if (ConfigManager.getInstance().getConfig().getItemListOrdering().equals(ItemListOrdering.name))
                 return tryGetEntryStackName(entry).compareToIgnoreCase(tryGetEntryStackName(entry1));
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.item_groups)) {
+            if (ConfigManager.getInstance().getConfig().getItemListOrdering().equals(ItemListOrdering.item_groups)) {
                 if (entry.getType() == EntryStack.Type.ITEM && entry1.getType() == EntryStack.Type.ITEM) {
                     ItemStack stack0 = entry.getItemStack();
                     ItemStack stack1 = entry1.getItemStack();
@@ -250,7 +247,7 @@ public class EntryListWidget extends Widget {
     
     @Override
     public boolean mouseScrolled(double double_1, double double_2, double double_3) {
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled() && rectangle.contains(double_1, double_2)) {
+        if (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled() && rectangle.contains(double_1, double_2)) {
             if (scrollBarAlphaFuture == 0)
                 scrollBarAlphaFuture = 1f;
             if (System.currentTimeMillis() - scrollBarAlphaFutureTime > 300f)
@@ -263,7 +260,7 @@ public class EntryListWidget extends Widget {
     
     @Override
     public void render(int int_1, int int_2, float float_1) {
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().doesVillagerScreenHavePermanentScrollBar()) {
+        if (ConfigManager.getInstance().getConfig().doesVillagerScreenHavePermanentScrollBar()) {
             scrollBarAlphaFutureTime = System.currentTimeMillis();
             scrollBarAlphaFuture = 0;
             scrollBarAlpha = 1;
@@ -288,7 +285,7 @@ public class EntryListWidget extends Widget {
         
         GuiLighting.disable();
         RenderSystem.pushMatrix();
-        boolean widgetScrolled = RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled();
+        boolean widgetScrolled = ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled();
         if (!widgetScrolled)
             scroll = 0;
         else {
@@ -349,13 +346,13 @@ public class EntryListWidget extends Widget {
         this.widgets = Lists.newCopyOnWriteArrayList();
         calculateListSize(rectangle);
         if (currentDisplayed.isEmpty() || processSearchTerm)
-            currentDisplayed = processSearchTerm(searchTerm, RoughlyEnoughItemsCore.getEntryRegistry().getStacksList(), CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create));
+            currentDisplayed = processSearchTerm(searchTerm, EntryRegistry.getInstance().getStacksList(), CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create));
         int startX = rectangle.getCenterX() - width * 9;
         int startY = rectangle.getCenterY() - height * 9;
         this.listArea = new Rectangle(startX, startY, width * 18, height * 18);
         int fitSlotsPerPage = getTotalFitSlotsPerPage(startX, startY, listArea);
         int j = page * fitSlotsPerPage;
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled()) {
+        if (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
             height = Integer.MAX_VALUE;
             j = 0;
         }
@@ -381,7 +378,7 @@ public class EntryListWidget extends Widget {
     }
     
     public int getTotalPage() {
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isEntryListWidgetScrolled())
+        if (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled())
             return 1;
         int fitSlotsPerPage = getTotalFitSlotsPerPage(listArea.x, listArea.y, listArea);
         if (fitSlotsPerPage > 0)
@@ -399,8 +396,8 @@ public class EntryListWidget extends Widget {
     }
     
     public boolean canBeFit(int left, int top, Rectangle listArea) {
-        for (DisplayHelper.DisplayBoundsHandler sortedBoundsHandler : RoughlyEnoughItemsCore.getDisplayHelper().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) {
-            ActionResult fit = sortedBoundsHandler.canItemSlotWidgetFit(!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel(), left, top, minecraft.currentScreen, listArea);
+        for (DisplayHelper.DisplayBoundsHandler sortedBoundsHandler : DisplayHelper.getInstance().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) {
+            ActionResult fit = sortedBoundsHandler.canItemSlotWidgetFit(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), left, top, minecraft.currentScreen, listArea);
             if (fit != ActionResult.PASS)
                 return fit == ActionResult.SUCCESS;
         }
@@ -441,9 +438,9 @@ public class EntryListWidget extends Widget {
     private List<EntryStack> processSearchTerm(String searchTerm, List<EntryStack> ol, List<EntryStack> inventoryItems) {
         lastSearchArgument.clear();
         List<EntryStack> os = new LinkedList<>(ol);
-        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering() != ItemListOrdering.registry)
+        if (ConfigManager.getInstance().getConfig().getItemListOrdering() != ItemListOrdering.registry)
             os.sort(ASCENDING_COMPARATOR);
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isItemListAscending())
+        if (!ConfigManager.getInstance().getConfig().isItemListAscending())
             Collections.reverse(os);
         String[] splitSearchTerm = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|");
         for (String s : splitSearchTerm) {
@@ -474,7 +471,7 @@ public class EntryListWidget extends Widget {
             stacks = os;
         else
             stacks = CollectionUtils.filter(os, entry -> filterEntry(entry, lastSearchArgument));
-        if (!RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() || stacks.isEmpty() || inventoryItems.isEmpty())
+        if (!ConfigManager.getInstance().isCraftableOnlyEnabled() || stacks.isEmpty() || inventoryItems.isEmpty())
             return Collections.unmodifiableList(stacks);
         List<EntryStack> workingItems = RecipeHelper.getInstance().findCraftableEntriesByItems(inventoryItems);
         List<EntryStack> newList = Lists.newLinkedList();
@@ -586,9 +583,9 @@ public class EntryListWidget extends Widget {
             if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating()) {
                 EntryStack entry = getCurrentEntry().copy();
                 if (entry.getType() == EntryStack.Type.ITEM) {
-                    if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.REI_LIKE)
+                    if (ConfigManager.getInstance().getConfig().getItemCheatingMode() == ItemCheatingMode.REI_LIKE)
                         entry.setAmount(button != 1 ? 1 : entry.getItemStack().getMaxCount());
-                    else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.JEI_LIKE)
+                    else if (ConfigManager.getInstance().getConfig().getItemCheatingMode() == ItemCheatingMode.JEI_LIKE)
                         entry.setAmount(button != 0 ? 1 : entry.getItemStack().getMaxCount());
                     else
                         entry.setAmount(1);

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

@@ -7,7 +7,7 @@ package me.shedaniel.rei.gui.widget;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.gui.config.RecipeScreenType;
 import me.shedaniel.rei.impl.ScreenHelper;
 import net.minecraft.client.render.GuiLighting;
@@ -86,7 +86,7 @@ public class PanelWidget extends WidgetWithBounds {
     }
     
     protected boolean isRendering() {
-        return RoughlyEnoughItemsCore.getConfigManager().getConfig().getRecipeScreenType() != RecipeScreenType.VILLAGER;
+        return ConfigManager.getInstance().getConfig().getRecipeScreenType() != RecipeScreenType.VILLAGER;
     }
     
     protected int getInnerColor() {
@@ -98,7 +98,7 @@ public class PanelWidget extends WidgetWithBounds {
     }
     
     protected int getYTextureOffset() {
-        return RoughlyEnoughItemsCore.getConfigManager().getConfig().isUsingLightGrayRecipeBorder() ? 0 : 66;
+        return ConfigManager.getInstance().getConfig().isUsingLightGrayRecipeBorder() ? 0 : 66;
     }
     
 }

+ 2 - 2
src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java

@@ -6,7 +6,7 @@
 package me.shedaniel.rei.gui.widget;
 
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ConfigManager;
 
 public class RecipeBaseWidget extends PanelWidget {
     
@@ -16,7 +16,7 @@ public class RecipeBaseWidget extends PanelWidget {
     
     @Override
     protected int getYTextureOffset() {
-        return RoughlyEnoughItemsCore.getConfigManager().getConfig().isUsingLightGrayRecipeBorder() ? 0 : 66;
+        return ConfigManager.getInstance().getConfig().isUsingLightGrayRecipeBorder() ? 0 : 66;
     }
     
 }

+ 1 - 15
src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java

@@ -9,19 +9,14 @@ import com.google.common.collect.Lists;
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
-import me.shedaniel.rei.impl.ConfigObjectImpl;
 import me.shedaniel.rei.impl.ScreenHelper;
-import me.zeroeightsix.fiber.exception.FiberException;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
 import net.minecraft.util.math.MathHelper;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
@@ -47,8 +42,7 @@ public class RecipeChoosePageWidget extends DraggableWidget {
     
     private static Point getPointFromConfig() {
         Window window = MinecraftClient.getInstance().getWindow();
-        ConfigObjectImpl.RelativePoint point = RoughlyEnoughItemsCore.getConfigManager().getConfig().getChoosePageDialogPoint();
-        return new Point(point.getX(window.getScaledWidth()), point.getY(window.getScaledHeight()));
+        return new Point(window.getScaledWidth() * .5, window.getScaledHeight() * .5);
     }
     
     @Override
@@ -185,14 +179,6 @@ public class RecipeChoosePageWidget extends DraggableWidget {
     
     @Override
     public void onMouseReleaseMidPoint(Point midPoint) {
-        ConfigManager configManager = RoughlyEnoughItemsCore.getConfigManager();
-        Window window = minecraft.getWindow();
-        configManager.getConfig().setChoosePageDialogPoint(new ConfigObjectImpl.RelativePoint(midPoint.getX() / window.getScaledWidth(), midPoint.getY() / window.getScaledHeight()));
-        try {
-            configManager.saveConfig();
-        } catch (IOException | FiberException e) {
-            e.printStackTrace();
-        }
     }
     
 }

+ 4 - 2
src/main/java/me/shedaniel/rei/impl/BaseBoundsHandlerImpl.java

@@ -7,9 +7,9 @@ package me.shedaniel.rei.impl;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.BaseBoundsHandler;
 import me.shedaniel.rei.api.DisplayHelper;
+import me.shedaniel.rei.api.annotations.Internal;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.util.ActionResult;
@@ -19,6 +19,8 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.function.Function;
 
+@Deprecated
+@Internal
 public class BaseBoundsHandlerImpl implements BaseBoundsHandler {
     
     private static final Comparator<? super Rectangle> RECTANGLE_COMPARER = Comparator.comparingLong(Rectangle::hashCode);
@@ -64,7 +66,7 @@ public class BaseBoundsHandlerImpl implements BaseBoundsHandler {
     }
     
     private long currentHashCode(boolean isOnRightSide) {
-        DisplayHelper.DisplayBoundsHandler handler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
+        DisplayHelper.DisplayBoundsHandler handler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
         return areasHashCode(isOnRightSide ? handler.getRightBounds(MinecraftClient.getInstance().currentScreen) : handler.getLeftBounds(MinecraftClient.getInstance().currentScreen), getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide, false));
     }
     

+ 11 - 8
src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java

@@ -11,6 +11,7 @@ import io.netty.buffer.Unpooled;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.RoughlyEnoughItemsNetwork;
 import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.api.annotations.Internal;
 import me.shedaniel.rei.gui.PreRecipeViewingScreen;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
@@ -43,6 +44,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+@Deprecated
+@Internal
 public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
     
     public static ClientHelperImpl instance;
@@ -129,14 +132,14 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
     
     @Override
     public boolean isCheating() {
-        return RoughlyEnoughItemsCore.getConfigManager().getConfig().isCheating();
+        return ConfigManager.getInstance().getConfig().isCheating();
     }
     
     @Override
     public void setCheating(boolean cheating) {
-        RoughlyEnoughItemsCore.getConfigManager().getConfig().setCheating(cheating);
+        ConfigManager.getInstance().getConfig().setCheating(cheating);
         try {
-            RoughlyEnoughItemsCore.getConfigManager().saveConfig();
+            ConfigManager.getInstance().saveConfig();
         } catch (IOException | FiberException e) {
             e.printStackTrace();
         }
@@ -168,7 +171,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
             if (identifier == null)
                 return false;
             String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().asString() : "";
-            String og = cheatedStack.getCount() == 1 ? RoughlyEnoughItemsCore.getConfigManager().getConfig().getGiveCommand().replaceAll(" \\{count}", "") : RoughlyEnoughItemsCore.getConfigManager().getConfig().getGiveCommand();
+            String og = cheatedStack.getCount() == 1 ? ConfigManager.getInstance().getConfig().getGiveCommand().replaceAll(" \\{count}", "") : ConfigManager.getInstance().getConfig().getGiveCommand();
             String madeUpCommand = og.replaceAll("\\{player_name}", MinecraftClient.getInstance().player.getEntityName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getCount()));
             if (madeUpCommand.length() > 256) {
                 madeUpCommand = og.replaceAll("\\{player_name}", MinecraftClient.getInstance().player.getEntityName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", "").replaceAll("\\{count}", String.valueOf(cheatedStack.getCount()));
@@ -217,7 +220,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
     @Override
     public boolean executeViewAllRecipesFromCategory(Identifier category) {
         Map<RecipeCategory<?>, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
-        Optional<RecipeCategory> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
+        Optional<RecipeCategory<?>> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
         if (!any.isPresent())
             return false;
         RecipeCategory<?> recipeCategory = any.get();
@@ -231,7 +234,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
     public boolean executeViewAllRecipesFromCategories(List<Identifier> categories) {
         Map<RecipeCategory<?>, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
         for (Identifier category : categories) {
-            Optional<RecipeCategory> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
+            Optional<RecipeCategory<?>> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
             if (!any.isPresent())
                 continue;
             RecipeCategory<?> recipeCategory = any.get();
@@ -245,9 +248,9 @@ 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)
+        if (ConfigManager.getInstance().getConfig().getRecipeScreenType() == RecipeScreenType.VILLAGER)
             screen = new VillagerRecipeViewingScreen(map);
-        else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getRecipeScreenType() == RecipeScreenType.UNSET)
+        else if (ConfigManager.getInstance().getConfig().getRecipeScreenType() == RecipeScreenType.UNSET)
             screen = new PreRecipeViewingScreen(map);
         else
             screen = new RecipeViewingScreen(map);

+ 3 - 0
src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java

@@ -8,6 +8,7 @@ package me.shedaniel.rei.impl;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.api.ConfigObject;
+import me.shedaniel.rei.api.annotations.Internal;
 import me.zeroeightsix.fiber.JanksonSettings;
 import me.zeroeightsix.fiber.exception.FiberException;
 import net.fabricmc.loader.api.FabricLoader;
@@ -21,6 +22,8 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.util.List;
 
+@Deprecated
+@Internal
 public class ConfigManagerImpl implements ConfigManager {
     
     private final File configFile;

+ 3 - 17
src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java

@@ -6,12 +6,15 @@
 package me.shedaniel.rei.impl;
 
 import me.shedaniel.rei.api.ConfigObject;
+import me.shedaniel.rei.api.annotations.Internal;
 import me.shedaniel.rei.gui.config.*;
 import me.zeroeightsix.fiber.exception.FiberException;
 import me.zeroeightsix.fiber.tree.ConfigNode;
 import me.zeroeightsix.fiber.tree.ConfigValue;
 import me.zeroeightsix.fiber.tree.Node;
 
+@Deprecated
+@Internal
 public class ConfigObjectImpl implements ConfigObject {
     
     public ConfigNode configNode = new ConfigNode();
@@ -189,12 +192,6 @@ public class ConfigObjectImpl implements ConfigObject {
             .withName("scrollingEntryListWidget")
             .build();
     
-    //    private ConfigValue<RelativePoint> choosePageDialogPoint = ConfigValue.builder(RelativePoint.class)
-    //            .withParent(technical)
-    //            .withDefaultValue(new RelativePoint(.5, .5))
-    //            .withName("choosePageDialogPoint")
-    //            .build();
-    
     public ConfigObjectImpl() throws FiberException {
     
     }
@@ -343,15 +340,4 @@ public class ConfigObjectImpl implements ConfigObject {
     public boolean doesRegisterRecipesInAnotherThread() {
         return registerRecipesInAnotherThread.getValue().booleanValue();
     }
-    
-    @Override
-    public RelativePoint getChoosePageDialogPoint() {
-        //        return choosePageDialogPoint.getValue();
-        return new RelativePoint(.5, .5);
-    }
-    
-    @Override
-    public void setChoosePageDialogPoint(RelativePoint choosePageDialogPoint) {
-        //        this.choosePageDialogPoint.setValue(choosePageDialogPoint);
-    }
 }

+ 3 - 0
src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java

@@ -10,12 +10,15 @@ import com.google.common.collect.Maps;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.api.BaseBoundsHandler;
 import me.shedaniel.rei.api.DisplayHelper;
+import me.shedaniel.rei.api.annotations.Internal;
 
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+@Deprecated
+@Internal
 public class DisplayHelperImpl implements DisplayHelper {
     
     private static final Comparator<DisplayBoundsHandler<?>> BOUNDS_HANDLER_COMPARATOR;

+ 5 - 0
src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java

@@ -87,4 +87,9 @@ public class EmptyEntryStack extends AbstractEntryStack {
     public void render(Rectangle bounds, int mouseX, int mouseY, float delta) {
     
     }
+    
+    @Override
+    public int hashCode() {
+        return 0;
+    }
 }

+ 3 - 0
src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java

@@ -8,6 +8,7 @@ package me.shedaniel.rei.impl;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.api.EntryRegistry;
 import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.api.annotations.Internal;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.DefaultedList;
@@ -17,6 +18,8 @@ import java.util.TreeSet;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 
+@Deprecated
+@Internal
 public class EntryRegistryImpl implements EntryRegistry {
     
     private final CopyOnWriteArrayList<EntryStack> entries = Lists.newCopyOnWriteArrayList();

+ 12 - 2
src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java

@@ -7,8 +7,8 @@ package me.shedaniel.rei.impl;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ClientHelper;
+import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.api.EntryStack;
 import me.shedaniel.rei.gui.widget.EntryListWidget;
 import me.shedaniel.rei.gui.widget.QueuedTooltip;
@@ -137,6 +137,16 @@ public class FluidEntryStack extends AbstractEntryStack {
         return fluid == stack.getFluid() && amount == stack.getAmount();
     }
     
+    @Override
+    public int hashCode() {
+        int result = 1;
+        result = 31 * result + getType().ordinal();
+        result = 31 * result + fluid.hashCode();
+        result = 31 * result + amount;
+        result = 31 * result;
+        return result;
+    }
+    
     @Nullable
     @Override
     public QueuedTooltip getTooltip(int mouseX, int mouseY) {
@@ -148,7 +158,7 @@ public class FluidEntryStack extends AbstractEntryStack {
             if (amountTooltip != null) for (String s : amountTooltip.split("\n")) toolTip.add(s);
         }
         toolTip.addAll(getSetting(Settings.TOOLTIP_APPEND_EXTRA).value().apply(this));
-        if (getSetting(Settings.TOOLTIP_APPEND_MOD).value().get() && RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) {
+        if (getSetting(Settings.TOOLTIP_APPEND_MOD).value().get() && ConfigManager.getInstance().getConfig().shouldAppendModNames()) {
             final String modString = ClientHelper.getInstance().getFormattedModFromIdentifier(Registry.FLUID.getId(fluid));
             boolean alreadyHasMod = false;
             for (String s : toolTip)

+ 12 - 3
src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java

@@ -8,14 +8,13 @@ package me.shedaniel.rei.impl;
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.math.api.Rectangle;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ClientHelper;
+import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.api.EntryStack;
 import me.shedaniel.rei.api.ItemStackRenderOverlayHook;
 import me.shedaniel.rei.gui.widget.EntryListWidget;
 import me.shedaniel.rei.gui.widget.QueuedTooltip;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
@@ -108,6 +107,16 @@ public class ItemEntryStack extends AbstractEntryStack {
         return getAmount() == stack.getAmount();
     }
     
+    @Override
+    public int hashCode() {
+        int result = 1;
+        result = 31 * result + getType().ordinal();
+        result = 31 * result + itemStack.getItem().hashCode();
+        result = 31 * result + itemStack.getCount();
+        result = 31 * result + (itemStack.hasTag() ? itemStack.getTag().hashCode() : 0);
+        return result;
+    }
+    
     @Nullable
     @Override
     public QueuedTooltip getTooltip(int mouseX, int mouseY) {
@@ -115,7 +124,7 @@ public class ItemEntryStack extends AbstractEntryStack {
             return null;
         List<String> toolTip = Lists.newArrayList(EntryListWidget.tryGetItemStackToolTip(getItemStack(), true));
         toolTip.addAll(getSetting(Settings.TOOLTIP_APPEND_EXTRA).value().apply(this));
-        if (getSetting(Settings.TOOLTIP_APPEND_MOD).value().get() && RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) {
+        if (getSetting(Settings.TOOLTIP_APPEND_MOD).value().get() && ConfigManager.getInstance().getConfig().shouldAppendModNames()) {
             final String modString = ClientHelper.getInstance().getFormattedModFromItem(getItem());
             boolean alreadyHasMod = false;
             for (String s : toolTip)

+ 1 - 0
src/main/java/me/shedaniel/rei/impl/ObjectHolderImpl.java

@@ -7,6 +7,7 @@ package me.shedaniel.rei.impl;
 
 import me.shedaniel.rei.api.ObjectHolder;
 
+@Deprecated
 public class ObjectHolderImpl<T> implements ObjectHolder<T> {
     private Object o;
     

+ 50 - 45
src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java

@@ -10,7 +10,9 @@ import com.google.common.collect.Maps;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.api.annotations.Internal;
 import me.shedaniel.rei.api.plugins.REIPluginV0;
+import me.shedaniel.rei.utils.CollectionUtils;
 import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.SemanticVersion;
 import net.fabricmc.loader.api.Version;
@@ -26,9 +28,12 @@ import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
+@Deprecated
+@Internal
 public class RecipeHelperImpl implements RecipeHelper {
     
     private static final Comparator<DisplayVisibilityHandler> VISIBILITY_HANDLER_COMPARATOR;
+    @SuppressWarnings("rawtypes")
     private static final Comparator<Recipe> RECIPE_COMPARATOR = (o1, o2) -> {
         int int_1 = o1.getId().getNamespace().compareTo(o2.getId().getNamespace());
         if (int_1 == 0)
@@ -46,11 +51,11 @@ public class RecipeHelperImpl implements RecipeHelper {
     private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList();
     private final AtomicInteger recipeCount = new AtomicInteger();
     private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newHashMap();
-    private final List<RecipeCategory> categories = Lists.newArrayList();
+    private final List<RecipeCategory<?>> categories = Lists.newArrayList();
     private final Map<Identifier, ButtonAreaSupplier> speedCraftAreaSupplierMap = Maps.newHashMap();
     private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newHashMap();
     private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList();
-    private final List<LiveRecipeGenerator<?>> liveRecipeGenerators = Lists.newArrayList();
+    private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newArrayList();
     private RecipeManager recipeManager;
     
     @Override
@@ -84,7 +89,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public void registerCategory(RecipeCategory category) {
+    public void registerCategory(RecipeCategory<?> category) {
         categories.add(category);
         recipeCategoryListMap.put(category.getIdentifier(), Lists.newLinkedList());
         categoryWorkingStations.put(category.getIdentifier(), Lists.newLinkedList());
@@ -125,16 +130,14 @@ public class RecipeHelperImpl implements RecipeHelper {
         Map<Identifier, List<RecipeDisplay>> categoriesMap = new HashMap<>();
         categories.forEach(f -> categoriesMap.put(f.getIdentifier(), Lists.newArrayList()));
         for (Map.Entry<Identifier, List<RecipeDisplay>> entry : recipeCategoryListMap.entrySet()) {
-            RecipeCategory category = getCategory(entry.getKey());
+            RecipeCategory<?> category = getCategory(entry.getKey());
             for (RecipeDisplay recipeDisplay : entry.getValue())
                 for (EntryStack outputStack : recipeDisplay.getOutputEntries())
                     if (stack.equals(outputStack))
                         categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay);
         }
-        for (LiveRecipeGenerator<?> liveRecipeGenerator : liveRecipeGenerators) {
-            liveRecipeGenerator.getRecipeFor(stack).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll((List<RecipeDisplay>) o));
-            if (stack.getType() == EntryStack.Type.ITEM)
-                liveRecipeGenerator.getRecipeFor(stack.getItemStack()).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll((List<RecipeDisplay>) o));
+        for (LiveRecipeGenerator<RecipeDisplay> liveRecipeGenerator : liveRecipeGenerators) {
+            liveRecipeGenerator.getRecipeFor(stack).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll(o));
         }
         Map<RecipeCategory<?>, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
         categories.forEach(category -> {
@@ -148,8 +151,8 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public RecipeCategory getCategory(Identifier identifier) {
-        return categories.stream().filter(category -> category.getIdentifier().equals(identifier)).findFirst().orElse(null);
+    public RecipeCategory<?> getCategory(Identifier identifier) {
+        return CollectionUtils.findFirstOrNull(categories, category -> category.getIdentifier().equals(identifier));
     }
     
     @Override
@@ -162,7 +165,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         Map<Identifier, List<RecipeDisplay>> categoriesMap = new HashMap<>();
         categories.forEach(f -> categoriesMap.put(f.getIdentifier(), Lists.newArrayList()));
         for (Map.Entry<Identifier, List<RecipeDisplay>> entry : recipeCategoryListMap.entrySet()) {
-            RecipeCategory category = getCategory(entry.getKey());
+            RecipeCategory<?> category = getCategory(entry.getKey());
             for (RecipeDisplay recipeDisplay : entry.getValue()) {
                 boolean found = false;
                 for (List<EntryStack> input : recipeDisplay.getInputEntries()) {
@@ -178,16 +181,14 @@ public class RecipeHelperImpl implements RecipeHelper {
                 }
             }
         }
-        for (LiveRecipeGenerator<?> liveRecipeGenerator : liveRecipeGenerators) {
-            liveRecipeGenerator.getUsageFor(stack).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll((List<RecipeDisplay>) o));
-            if (stack.getType() == EntryStack.Type.ITEM)
-                liveRecipeGenerator.getUsageFor(stack.getItemStack()).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll((List<RecipeDisplay>) o));
+        for (LiveRecipeGenerator<RecipeDisplay> liveRecipeGenerator : liveRecipeGenerators) {
+            liveRecipeGenerator.getUsageFor(stack).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll(o));
         }
         Map<RecipeCategory<?>, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
-        categories.forEach(category -> {
+        for (RecipeCategory<?> category : categories) {
             if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty())
                 recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()).stream().filter(display -> isDisplayVisible(display)).collect(Collectors.toList()));
-        });
+        }
         for (RecipeCategory<?> category : Lists.newArrayList(recipeCategoryListMap.keySet()))
             if (recipeCategoryListMap.get(category).isEmpty())
                 recipeCategoryListMap.remove(category);
@@ -195,12 +196,12 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public List<RecipeCategory> getAllCategories() {
-        return new LinkedList<>(categories);
+    public List<RecipeCategory<?>> getAllCategories() {
+        return Collections.unmodifiableList(categories);
     }
     
     @Override
-    public Optional<ButtonAreaSupplier> getAutoCraftButtonArea(RecipeCategory category) {
+    public Optional<ButtonAreaSupplier> getAutoCraftButtonArea(RecipeCategory<?> category) {
         if (!speedCraftAreaSupplierMap.containsKey(category.getIdentifier()))
             return Optional.ofNullable(bounds -> new Rectangle(bounds.getMaxX() - 16, bounds.getMaxY() - 16, 10, 10));
         return Optional.ofNullable(speedCraftAreaSupplierMap.get(category.getIdentifier()));
@@ -235,11 +236,11 @@ public class RecipeHelperImpl implements RecipeHelper {
         this.displayVisibilityHandlers.clear();
         this.liveRecipeGenerators.clear();
         this.autoTransferHandlers.clear();
-        ((DisplayHelperImpl) RoughlyEnoughItemsCore.getDisplayHelper()).resetData();
-        ((DisplayHelperImpl) RoughlyEnoughItemsCore.getDisplayHelper()).resetCache();
+        ((DisplayHelperImpl) DisplayHelper.getInstance()).resetData();
+        ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache();
         BaseBoundsHandler baseBoundsHandler = new BaseBoundsHandlerImpl();
-        RoughlyEnoughItemsCore.getDisplayHelper().registerBoundsHandler(baseBoundsHandler);
-        ((DisplayHelperImpl) RoughlyEnoughItemsCore.getDisplayHelper()).setBaseBoundsHandler(baseBoundsHandler);
+        DisplayHelper.getInstance().registerBoundsHandler(baseBoundsHandler);
+        ((DisplayHelperImpl) DisplayHelper.getInstance()).setBaseBoundsHandler(baseBoundsHandler);
         long startTime = System.currentTimeMillis();
         List<REIPluginEntry> plugins = new LinkedList<>(RoughlyEnoughItemsCore.getPlugins());
         plugins.sort((first, second) -> {
@@ -247,7 +248,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         });
         RoughlyEnoughItemsCore.LOGGER.info("[REI] Loading %d plugins: %s", plugins.size(), plugins.stream().map(REIPluginEntry::getPluginIdentifier).map(Identifier::toString).collect(Collectors.joining(", ")));
         Collections.reverse(plugins);
-        RoughlyEnoughItemsCore.getEntryRegistry().getStacksList().clear();
+        EntryRegistry.getInstance().getStacksList().clear();
         Version reiVersion = FabricLoader.getInstance().getModContainer("roughlyenoughitems").get().getMetadata().getVersion();
         if (!(reiVersion instanceof SemanticVersion))
             RoughlyEnoughItemsCore.LOGGER.warn("[REI] Roughly Enough Items is not using semantic versioning, will be ignoring plugins' minimum versions!");
@@ -270,8 +271,8 @@ public class RecipeHelperImpl implements RecipeHelper {
                     if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0)
                         return;
                 if (plugin instanceof REIPluginV0) {
-                    ((REIPluginV0) plugin).registerBounds(RoughlyEnoughItemsCore.getDisplayHelper());
-                    ((REIPluginV0) plugin).registerEntries(RoughlyEnoughItemsCore.getEntryRegistry());
+                    ((REIPluginV0) plugin).registerBounds(DisplayHelper.getInstance());
+                    ((REIPluginV0) plugin).registerEntries(EntryRegistry.getInstance());
                     ((REIPluginV0) plugin).registerPluginCategories(this);
                     ((REIPluginV0) plugin).registerRecipeDisplays(this);
                     ((REIPluginV0) plugin).registerOthers(this);
@@ -294,15 +295,17 @@ public class RecipeHelperImpl implements RecipeHelper {
             }
         }
         if (!recipeFunctions.isEmpty()) {
-            List<Recipe> allSortedRecipes = getAllSortedRecipes();
+            @SuppressWarnings("rawtypes") List<Recipe> allSortedRecipes = getAllSortedRecipes();
             Collections.reverse(allSortedRecipes);
-            recipeFunctions.forEach(recipeFunction -> {
+            for (RecipeFunction recipeFunction : recipeFunctions) {
                 try {
-                    allSortedRecipes.stream().filter(recipe -> recipeFunction.recipeFilter.test(recipe)).forEach(t -> registerDisplay(recipeFunction.category, (RecipeDisplay) recipeFunction.mappingFunction.apply(t), 0));
+                    for (Recipe<?> recipe : CollectionUtils.filter(allSortedRecipes, recipe -> recipeFunction.recipeFilter.test(recipe))) {
+                        registerDisplay(recipeFunction.category, (RecipeDisplay) recipeFunction.mappingFunction.apply(recipe), 0);
+                    }
                 } catch (Exception e) {
                     RoughlyEnoughItemsCore.LOGGER.error("[REI] Failed to add recipes!", e);
                 }
-            });
+            }
         }
         if (getDisplayVisibilityHandlers().isEmpty())
             registerRecipeVisibilityHandler(new DisplayVisibilityHandler() {
@@ -317,11 +320,11 @@ public class RecipeHelperImpl implements RecipeHelper {
                 }
             });
         // Clear Cache
-        ((DisplayHelperImpl) RoughlyEnoughItemsCore.getDisplayHelper()).resetCache();
+        ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache();
         ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true);
         
         long usedTime = System.currentTimeMillis() - startTime;
-        RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", RoughlyEnoughItemsCore.getEntryRegistry().getStacksList().size(), recipeCount.get(), RoughlyEnoughItemsCore.getDisplayHelper().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime);
+        RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount.get(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime);
     }
     
     @Override
@@ -341,6 +344,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
+    @SuppressWarnings("rawtypes")
     public List<Recipe> getAllSortedRecipes() {
         return getRecipeManager().values().stream().sorted(RECIPE_COMPARATOR).collect(Collectors.toList());
     }
@@ -348,18 +352,18 @@ public class RecipeHelperImpl implements RecipeHelper {
     @Override
     public Map<RecipeCategory<?>, List<RecipeDisplay>> getAllRecipes() {
         Map<RecipeCategory<?>, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
-        categories.forEach(recipeCategory -> {
+        for (RecipeCategory<?> recipeCategory : categories) {
             if (recipeCategoryListMap.containsKey(recipeCategory.getIdentifier())) {
-                List<RecipeDisplay> list = recipeCategoryListMap.get(recipeCategory.getIdentifier()).stream().filter(display -> isDisplayVisible(display)).collect(Collectors.toList());
+                List<RecipeDisplay> list = CollectionUtils.filter(recipeCategoryListMap.get(recipeCategory.getIdentifier()), this::isDisplayVisible);
                 if (!list.isEmpty())
                     map.put(recipeCategory, list);
             }
-        });
+        }
         return map;
     }
     
     @Override
-    public List<RecipeDisplay> getAllRecipesFromCategory(RecipeCategory category) {
+    public List<RecipeDisplay> getAllRecipesFromCategory(RecipeCategory<?> category) {
         return recipeCategoryListMap.get(category.getIdentifier());
     }
     
@@ -387,7 +391,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     @SuppressWarnings("deprecation")
     @Override
     public boolean isDisplayVisible(RecipeDisplay display) {
-        RecipeCategory category = getCategory(display.getRecipeCategory());
+        RecipeCategory<?> category = getCategory(display.getRecipeCategory());
         List<DisplayVisibilityHandler> list = getDisplayVisibilityHandlers().stream().sorted(VISIBILITY_HANDLER_COMPARATOR).collect(Collectors.toList());
         for (DisplayVisibilityHandler displayVisibilityHandler : list) {
             try {
@@ -402,7 +406,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen> screenClass, Identifier... categories) {
+    public void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen<?>> screenClass, Identifier... categories) {
         this.screenClickAreas.add(new ScreenClickAreaImpl(screenClass, rectangle, categories));
     }
     
@@ -412,18 +416,18 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public <T extends Recipe<?>> void registerRecipes(Identifier category, Function<Recipe, Boolean> recipeFilter, Function<T, RecipeDisplay> mappingFunction) {
+    public <T extends Recipe<?>> void registerRecipes(Identifier category, @SuppressWarnings("rawtypes") Function<Recipe, Boolean> recipeFilter, Function<T, RecipeDisplay> mappingFunction) {
         recipeFunctions.add(new RecipeFunction(category, recipeFilter::apply, mappingFunction));
     }
     
     @Override
-    public <T extends Recipe<?>> void registerRecipes(Identifier category, Predicate<Recipe> recipeFilter, Function<T, RecipeDisplay> mappingFunction) {
+    public <T extends Recipe<?>> void registerRecipes(Identifier category, @SuppressWarnings("rawtypes") Predicate<Recipe> recipeFilter, Function<T, RecipeDisplay> mappingFunction) {
         recipeFunctions.add(new RecipeFunction(category, recipeFilter, mappingFunction));
     }
     
     @Override
     public void registerLiveRecipeGenerator(LiveRecipeGenerator<?> liveRecipeGenerator) {
-        liveRecipeGenerators.add(liveRecipeGenerator);
+        liveRecipeGenerators.add((LiveRecipeGenerator<RecipeDisplay>) liveRecipeGenerator);
     }
     
     @Override
@@ -432,17 +436,17 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     private class ScreenClickAreaImpl implements ScreenClickArea {
-        Class<? extends AbstractContainerScreen> screenClass;
+        Class<? extends AbstractContainerScreen<?>> screenClass;
         Rectangle rectangle;
         Identifier[] categories;
         
-        private ScreenClickAreaImpl(Class<? extends AbstractContainerScreen> screenClass, Rectangle rectangle, Identifier[] categories) {
+        private ScreenClickAreaImpl(Class<? extends AbstractContainerScreen<?>> screenClass, Rectangle rectangle, Identifier[] categories) {
             this.screenClass = screenClass;
             this.rectangle = rectangle;
             this.categories = categories;
         }
         
-        public Class<? extends AbstractContainerScreen> getScreenClass() {
+        public Class<? extends AbstractContainerScreen<?>> getScreenClass() {
             return screenClass;
         }
         
@@ -455,6 +459,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         }
     }
     
+    @SuppressWarnings("rawtypes")
     private class RecipeFunction {
         Identifier category;
         Predicate<Recipe> recipeFilter;

+ 5 - 4
src/main/java/me/shedaniel/rei/impl/ScreenHelper.java

@@ -9,7 +9,7 @@ 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.api.ConfigManager;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.OverlaySearchField;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
@@ -40,6 +40,7 @@ public class ScreenHelper implements ClientModInitializer {
     private static AbstractContainerScreen<?> lastContainerScreen = null;
     private static LinkedHashSet<Screen> lastRecipeScreen = Sets.newLinkedHashSetWithExpectedSize(5);
     
+    @SuppressWarnings("deprecation")
     public static OverlaySearchField getSearchField() {
         return searchField;
     }
@@ -121,7 +122,7 @@ public class ScreenHelper implements ClientModInitializer {
     }
     
     public static boolean isDarkModeEnabled() {
-        return RoughlyEnoughItemsCore.getConfigManager().getConfig().isUsingDarkTheme();
+        return ConfigManager.getInstance().getConfig().isUsingDarkTheme();
     }
     
     @Override
@@ -132,8 +133,8 @@ public class ScreenHelper implements ClientModInitializer {
             return ActionResult.PASS;
         });
         ClientTickCallback.EVENT.register(minecraftClient -> {
-            if (isOverlayVisible() && searchField != null)
-                searchField.tick();
+            if (isOverlayVisible() && getSearchField() != null)
+                getSearchField().tick();
         });
     }
     

+ 4 - 0
src/main/java/me/shedaniel/rei/impl/SearchArgument.java

@@ -5,9 +5,13 @@
 
 package me.shedaniel.rei.impl;
 
+import me.shedaniel.rei.api.annotations.Internal;
+
 import java.util.Locale;
 import java.util.function.Function;
 
+@Deprecated
+@Internal
 public class SearchArgument {
     
     public static final SearchArgument ALWAYS = new SearchArgument(ArgumentType.ALWAYS, "", true);

+ 2 - 2
src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java

@@ -5,7 +5,7 @@
 
 package me.shedaniel.rei.plugin;
 
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.api.plugins.REIPluginV0;
 import me.shedaniel.rei.plugin.autocrafting.DefaultCategoryHandler;
@@ -30,7 +30,7 @@ public class DefaultAutoCraftingPlugin implements REIPluginV0 {
     
     @Override
     public void registerOthers(RecipeHelper recipeHelper) {
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLoadingDefaultPlugin()) {
+        if (!ConfigManager.getInstance().getConfig().isLoadingDefaultPlugin()) {
             return;
         }
         recipeHelper.registerAutoCraftingHandler(new DefaultCategoryHandler());

+ 0 - 3
src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java

@@ -9,11 +9,8 @@ import me.shedaniel.rei.api.AutoTransferHandler;
 import me.shedaniel.rei.api.RecipeDisplay;
 import me.shedaniel.rei.impl.ScreenHelper;
 import me.shedaniel.rei.listeners.RecipeBookGuiHooks;
-import me.shedaniel.rei.plugin.blasting.DefaultBlastingDisplay;
 import me.shedaniel.rei.plugin.cooking.DefaultCookingDisplay;
 import me.shedaniel.rei.plugin.crafting.DefaultCraftingDisplay;
-import me.shedaniel.rei.plugin.smelting.DefaultSmeltingDisplay;
-import me.shedaniel.rei.plugin.smoking.DefaultSmokingDisplay;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.client.resource.language.I18n;

+ 1 - 2
src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java

@@ -8,7 +8,6 @@ package me.shedaniel.rei.utils;
 import me.shedaniel.cloth.hooks.ScreenHooks;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.fiber2cloth.api.Fiber2Cloth;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.gui.config.ItemCheatingMode;
 import me.shedaniel.rei.gui.config.ItemListOrderingConfig;
@@ -31,7 +30,7 @@ import static me.shedaniel.fiber2cloth.impl.Fiber2ClothImpl.splitLine;
 public class ClothScreenRegistry {
     
     public static Screen getConfigScreen(Screen parent) {
-        final ConfigManager configManager = RoughlyEnoughItemsCore.getConfigManager();
+        final ConfigManager configManager = ConfigManager.getInstance();
         ConfigEntryBuilder configEntryBuilder = ConfigEntryBuilder.create();
         return Fiber2Cloth.create(parent, "roughlyenoughitems", configManager.getConfig().getConfigNode(), "config.roughlyenoughitems.title").setSaveRunnable(() -> {
             try {

+ 4 - 5
src/main/java/me/shedaniel/rei/utils/CollectionUtils.java

@@ -47,14 +47,13 @@ public class CollectionUtils {
     }
     
     public static final <T> List<T> filter(List<T> list, Predicate<T> predicate) {
-        List<T> l = null;
+        List<T> l = new LinkedList<>();
         for (T t : list) {
             if (predicate.test(t)) {
-                if (l == null) l = new LinkedList<>();
                 l.add(t);
             }
         }
-        return l == null ? Collections.emptyList() : l;
+        return l;
     }
     
     public static final <T, R> List<R> map(List<T> list, Function<T, R> function) {
@@ -158,7 +157,7 @@ public class CollectionUtils {
     
     public static final <T> int sumInt(List<Integer> list) {
         int sum = 0;
-        for (Integer t : list) {
+        for (int t : list) {
             sum += t;
         }
         return sum;
@@ -174,7 +173,7 @@ public class CollectionUtils {
     
     public static final <T> double sumDouble(List<Double> list) {
         double sum = 0;
-        for (Double t : list) {
+        for (double t : list) {
             sum += t;
         }
         return sum;