Unknown 6 жил өмнө
parent
commit
85224173a0
46 өөрчлөгдсөн 357 нэмэгдсэн , 735 устгасан
  1. 2 0
      .gitignore
  2. 11 0
      CHANGELOG.md
  3. 0 32
      build.gradle
  4. 5 5
      gradle.properties
  5. 12 0
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  6. 3 0
      src/main/java/me/shedaniel/rei/api/ConfigManager.java
  7. 8 0
      src/main/java/me/shedaniel/rei/api/DisplaySettings.java
  8. 10 1
      src/main/java/me/shedaniel/rei/api/RecipeCategory.java
  9. 0 10
      src/main/java/me/shedaniel/rei/client/ClientHelper.java
  10. 38 0
      src/main/java/me/shedaniel/rei/client/ConfigManager.java
  11. 3 1
      src/main/java/me/shedaniel/rei/client/ConfigObject.java
  12. 3 3
      src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java
  13. 5 23
      src/main/java/me/shedaniel/rei/client/ScreenHelper.java
  14. 4 5
      src/main/java/me/shedaniel/rei/client/SearchArgument.java
  15. 24 20
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  16. 15 15
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  17. 0 145
      src/main/java/me/shedaniel/rei/gui/config/ConfigEntry.java
  18. 0 35
      src/main/java/me/shedaniel/rei/gui/config/ConfigEntryListWidget.java
  19. 0 340
      src/main/java/me/shedaniel/rei/gui/config/ConfigScreen.java
  20. 94 0
      src/main/java/me/shedaniel/rei/gui/config/ItemListOrderingEntry.java
  21. 1 1
      src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java
  22. 3 3
      src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java
  23. 5 5
      src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java
  24. 5 5
      src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java
  25. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  26. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java
  27. 6 6
      src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java
  28. 6 7
      src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java
  29. 1 1
      src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java
  30. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java
  31. 5 1
      src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java
  32. 5 5
      src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java
  33. 2 2
      src/main/java/me/shedaniel/rei/gui/widget/SpeedCraftingButtonWidget.java
  34. 8 8
      src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
  35. 5 3
      src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
  36. 11 0
      src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java
  37. 2 2
      src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryScreen.java
  38. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultBlastingCategory.java
  39. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java
  40. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultCampfireCategory.java
  41. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultCraftingCategory.java
  42. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingCategory.java
  43. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultSmokingCategory.java
  44. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultStoneCuttingCategory.java
  45. 30 28
      src/main/java/me/shedaniel/rei/utils/ClothRegistry.java
  46. 2 0
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json

+ 2 - 0
.gitignore

@@ -27,3 +27,5 @@ Thumbs.db
 .DS_Store
 
 secret\.properties
+
+local\.properties

+ 11 - 0
CHANGELOG.md

@@ -1,3 +1,14 @@
+# v2.5.0.70
+- Removed mouseScrolled Override in mixins
+- Added spectator mode in gamemode switcher
+- Gamemodes & Weather are now translatable: [#47](https://github.com/shedaniel/RoughlyEnoughItems/issues/47)
+- Fixed Search Field
+- Fixed Button Focus
+- Added Button Tooltips
+- Removed credits button (it will be back)
+- Removed disabling credits option
+- Update to 19w12a
+- New config screen from [Cloth](https://minecraft.curseforge.com/projects/cloth)
 # v2.4.2.68
 - Fixed [Cloth](https://minecraft.curseforge.com/projects/cloth) missing message
 # v2.4.2.67

+ 0 - 32
build.gradle

@@ -3,7 +3,6 @@ import net.fabricmc.loom.task.RemapJar
 plugins {
     id 'fabric-loom' version '0.2.0-SNAPSHOT'
     id "com.github.johnrengelman.shadow" version "4.0.3"
-    id "com.matthewprenger.cursegradle" version "1.1.2"
 }
 
 sourceCompatibility = 1.8
@@ -49,7 +48,6 @@ dependencies {
     minecraft "com.mojang:minecraft:${project.minecraft_version}"
     mappings "net.fabricmc:yarn:${project.yarn_version}"
     modCompile "net.fabricmc:fabric-loader:${project.fabricloader_version}"
-//    modCompile "com.jamieswhiteshirt:developer-mode:${project.developermode_version}"
     modCompile "info.tehnut.pluginloader:plugin-loader:${project.pluginloader_version}"
     modCompile "net.fabricmc:fabric:${project.fabric_version}"
     modCompile "cloth:Cloth:${cloth_version}"
@@ -57,33 +55,3 @@ dependencies {
     compile "blue.endless:jankson:${project.jankson_version}"
     contained "blue.endless:jankson:${project.jankson_version}"
 }
-
-curseforge {
-    if (project.hasProperty("curseForgeApiKey")) {
-        apiKey = project.properties.curseForgeApiKey
-    }
-    project {
-        id = "310111"
-        changelogType = "markdown"
-        changelog = file("CHANGELOG.md")
-        releaseType = "release"
-        addGameVersion "1.14-Snapshot"
-        mainArtifact(remapShadowJar.jar) {
-            displayName = "[Fabric $project.minecraft_version] v$project.version"
-            relations {
-                requiredDependency "fabric"
-                optionalDependency "pluginloader"
-                tool "rei-addons"
-            }
-        }
-    }
-    options {
-        forgeGradleIntegration = false
-    }
-}
-
-afterEvaluate {
-    // CurseGradle generates tasks in afterEvaluate for each project
-    // There isn't really any other way to make it depend on a task unless it is an AbstractArchiveTask
-    tasks.curseforge310111.dependsOn remapShadowJar
-}

+ 5 - 5
gradle.properties

@@ -1,9 +1,9 @@
-mod_version=2.5.0.69
-minecraft_version=19w11b
-yarn_version=19w11b.11
-fabric_version=0.2.3.111
+mod_version=2.5.0.70
+minecraft_version=19w12a
+yarn_version=19w12a.2
+fabric_version=0.2.4.113
 fabricloader_version=0.3.7.109
 pluginloader_version=1.14-1.0.6-8
 developermode_version=1.0.3
 jankson_version=1.1.0
-cloth_version=0.1.1.8
+cloth_version=0.1.2.11

+ 12 - 0
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -15,6 +15,7 @@ import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.api.ModInitializer;
 import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
 import net.fabricmc.loader.api.FabricLoader;
+import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;
 import net.minecraft.server.network.ServerPlayerEntity;
@@ -25,6 +26,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -99,6 +101,16 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
             RoughlyEnoughItemsCore.LOGGER.fatal("[REI] Cloth NOT found! It is a dependency of REI: https://minecraft.curseforge.com/projects/cloth");
             System.exit(0);
         }
+        
+        if (!FabricLoader.getInstance().isModLoaded("modmenu")) {
+            try {
+                Class<?> modMenuApi_ = Class.forName("io.github.prospector.modmenu.api.ModMenuApi");
+                Method addConfigOverride_ = modMenuApi_.getMethod("addConfigOverride", String.class, Runnable.class);
+                addConfigOverride_.invoke(null, "roughlyenoughitems", (Runnable) () -> getConfigManager().openConfigScreen(MinecraftClient.getInstance().currentScreen));
+            } catch (Exception e) {
+                RoughlyEnoughItemsCore.LOGGER.error("Error enabling the Mod Menu config button for Hwyla", e);
+            }
+        }
     }
     
     @Override

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

@@ -1,6 +1,7 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.client.ConfigObject;
+import net.minecraft.client.gui.Screen;
 
 import java.io.IOException;
 
@@ -16,4 +17,6 @@ public interface ConfigManager {
     
     void toggleCraftableOnly();
     
+    void openConfigScreen(Screen parent);
+    
 }

+ 8 - 0
src/main/java/me/shedaniel/rei/api/DisplaySettings.java

@@ -12,4 +12,12 @@ public interface DisplaySettings<T extends RecipeDisplay> {
         return -1;
     }
     
+    default VisableType canDisplay(T display) {
+        return VisableType.ALWAYS;
+    }
+    
+    public static enum VisableType {
+        ALWAYS, PASS, NEVER;
+    }
+    
 }

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

@@ -1,5 +1,6 @@
 package me.shedaniel.rei.api;
 
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
@@ -26,7 +27,7 @@ public interface RecipeCategory<T extends RecipeDisplay> {
     }
     
     default void drawCategoryBackground(Rectangle bounds, int mouseX, int mouseY, float delta) {
-        new RecipeBaseWidget(bounds).draw(mouseX, mouseY, delta);
+        new RecipeBaseWidget(bounds).render();
         DrawableHelper.drawRect(bounds.x + 17, bounds.y + 5, bounds.x + bounds.width - 17, bounds.y + 17, RecipeViewingScreen.SUB_COLOR.getRGB());
         DrawableHelper.drawRect(bounds.x + 17, bounds.y + 21, bounds.x + bounds.width - 17, bounds.y + 33, RecipeViewingScreen.SUB_COLOR.getRGB());
     }
@@ -50,6 +51,14 @@ public interface RecipeCategory<T extends RecipeDisplay> {
         };
     }
     
+    default boolean canDisplay(RecipeDisplay display) {
+        if (getDisplaySettings().canDisplay(display) == DisplaySettings.VisableType.ALWAYS)
+            return true;
+        if (getDisplaySettings().canDisplay(display) == DisplaySettings.VisableType.NEVER)
+            return false;
+        return RoughlyEnoughItemsCore.getConfigManager().getConfig().preferVisibleRecipes;
+    }
+    
     default int getDisplayHeight() {
         return getDisplaySettings().getDisplayHeight(this);
     }

+ 0 - 10
src/main/java/me/shedaniel/rei/client/ClientHelper.java

@@ -7,7 +7,6 @@ import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.RecipeDisplay;
 import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
-import me.shedaniel.rei.gui.config.ConfigScreen;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
 import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
@@ -16,7 +15,6 @@ import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.ModContainer;
 import net.fabricmc.loader.api.metadata.ModMetadata;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.client.util.InputUtil;
 import net.minecraft.item.ItemStack;
@@ -110,14 +108,6 @@ public class ClientHelper implements ClientModInitializer {
         return map.keySet().size() > 0;
     }
     
-    public static void openConfigWindow(Screen parent, boolean initOverlay) {
-        MinecraftClient.getInstance().openScreen(new ConfigScreen(parent, initOverlay));
-    }
-    
-    public static void openConfigWindow(Screen parent) {
-        openConfigWindow(parent, true);
-    }
-    
     public static List<ItemStack> getInventoryItemsTypes() {
         List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor, MinecraftClient.getInstance().player.inventory.offHand);
         List<ItemStack> inventoryStacks = new ArrayList<>();

+ 38 - 0
src/main/java/me/shedaniel/rei/client/ConfigManager.java

@@ -4,8 +4,18 @@ import blue.endless.jankson.Jankson;
 import blue.endless.jankson.JsonObject;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import javafx.util.Pair;
+import me.shedaniel.cloth.api.ConfigScreenBuilder;
+import me.shedaniel.cloth.gui.ClothConfigScreen;
+import me.shedaniel.cloth.gui.entries.BooleanListEntry;
+import me.shedaniel.cloth.gui.entries.IntegerListEntry;
+import me.shedaniel.cloth.gui.entries.StringListEntry;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.gui.config.ItemListOrderingEntry;
 import net.fabricmc.loader.api.FabricLoader;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Screen;
+import net.minecraft.client.resource.language.I18n;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -118,4 +128,32 @@ public class ConfigManager implements me.shedaniel.rei.api.ConfigManager {
         craftableOnly = !craftableOnly;
     }
     
+    @Override
+    public void openConfigScreen(Screen parent) {
+        ClothConfigScreen.Builder builder = new ClothConfigScreen.Builder(parent, I18n.translate("text.rei.config.title"), null);
+        builder.addCategory(I18n.translate("text.rei.config.general")).addOption(new BooleanListEntry("text.rei.config.cheating", config.cheating, bool -> config.cheating = bool));
+        ConfigScreenBuilder.CategoryBuilder appearance = builder.addCategory(I18n.translate("text.rei.config.appearance"));
+        appearance.addOption(new BooleanListEntry("text.rei.config.side_search_box", config.sideSearchField, bool -> config.sideSearchField = bool));
+        appearance.addOption(new ItemListOrderingEntry("text.rei.config.list_ordering", new Pair<>(config.itemListOrdering, config.isAscending)));
+        appearance.addOption(new BooleanListEntry("text.rei.config.mirror_rei", config.mirrorItemPanel, bool -> config.mirrorItemPanel = bool));
+        appearance.addOption(new IntegerListEntry("text.rei.config.max_recipes_per_page", config.maxRecipePerPage, i -> config.maxRecipePerPage = i).setMinimum(2).setMaximum(99));
+        ConfigScreenBuilder.CategoryBuilder modules = builder.addCategory(I18n.translate("text.rei.config.modules"));
+        modules.addOption(new BooleanListEntry("text.rei.config.enable_craftable_only", config.enableCraftableOnlyButton, bool -> config.enableCraftableOnlyButton = bool));
+        modules.addOption(new BooleanListEntry("text.rei.config.enable_util_buttons", config.showUtilsButtons, bool -> config.showUtilsButtons = bool));
+        modules.addOption(new BooleanListEntry("text.rei.config.disable_recipe_book", config.disableRecipeBook, bool -> config.disableRecipeBook = bool));
+        ConfigScreenBuilder.CategoryBuilder advanced = builder.addCategory(I18n.translate("text.rei.config.advanced"));
+        advanced.addOption(new StringListEntry("text.rei.give_command", config.giveCommand, s -> config.giveCommand = s));
+        advanced.addOption(new StringListEntry("text.rei.gamemode_command", config.gamemodeCommand, s -> config.gamemodeCommand = s));
+        advanced.addOption(new StringListEntry("text.rei.weather_command", config.weatherCommand, s -> config.weatherCommand = s));
+        advanced.addOption(new BooleanListEntry("text.rei.config.prefer_visible_recipes", config.preferVisibleRecipes, bool -> config.preferVisibleRecipes = bool));
+        builder.setOnSave(savedConfig -> {
+            try {
+                ConfigManager.this.saveConfig();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        });
+        MinecraftClient.getInstance().openScreen(builder.build());
+    }
+    
 }

+ 3 - 1
src/main/java/me/shedaniel/rei/client/ConfigObject.java

@@ -31,7 +31,7 @@ public class ConfigObject {
     @Comment("True: item panel on the left, false: on the right")
     public boolean mirrorItemPanel = false;
     
-    @Comment("To disable REI's defualt plugin, don't change this unless you understand what you are doing")
+    @Comment("To disable REI's default plugin, don't change this unless you understand what you are doing")
     public boolean loadDefaultPlugin = true;
     
     @Comment("Maximum recipes viewed at one time.")
@@ -43,6 +43,8 @@ public class ConfigObject {
     @Comment("Disable Recipe Book")
     public boolean disableRecipeBook = false;
     
+    public boolean preferVisibleRecipes = false;
+    
     @Comment("The location of choose page dialog")
     public RelativePoint choosePageDialogPoint = new RelativePoint(.5, .5);
     

+ 3 - 3
src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java

@@ -81,7 +81,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         Map<RecipeCategory, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
         categories.forEach(category -> {
             if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty())
-                recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()));
+                recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()).stream().filter(display -> category.canDisplay(display)).collect(Collectors.toList()));
         });
         return recipeCategoryListMap;
     }
@@ -119,7 +119,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         Map<RecipeCategory, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
         categories.forEach(category -> {
             if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty())
-                recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()));
+                recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()).stream().filter(display -> category.canDisplay(display)).collect(Collectors.toList()));
         });
         return recipeCategoryListMap;
     }
@@ -200,7 +200,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         recipeCategoryListMap.forEach((identifier, recipeDisplays) -> tempMap.put(identifier, new LinkedList<>(recipeDisplays)));
         categories.forEach(category -> {
             if (tempMap.containsKey(category.getIdentifier()))
-                map.put(category, tempMap.get(category.getIdentifier()));
+                map.put(category, tempMap.get(category.getIdentifier()).stream().filter(display -> category.canDisplay(display)).collect(Collectors.toList()));
         });
         return map;
     }

+ 5 - 23
src/main/java/me/shedaniel/rei/client/ScreenHelper.java

@@ -1,7 +1,6 @@
 package me.shedaniel.rei.client;
 
 import com.google.common.collect.Lists;
-import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
@@ -10,13 +9,12 @@ import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.gui.InputListener;
 import net.minecraft.client.gui.widget.ButtonWidget;
 import net.minecraft.client.gui.widget.RecipeBookButtonWidget;
-import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
+import org.apache.logging.log4j.util.TriConsumer;
 
 import java.awt.*;
 import java.util.List;
@@ -71,35 +69,19 @@ public class ScreenHelper implements ClientModInitializer {
         return (ContainerScreenHooks) lastContainerScreen;
     }
     
-    public static void drawHoveringWidget(int x, int y, Drawable drawable, int width, int height, float delta) {
+    public static void drawHoveringWidget(int x, int y, TriConsumer<Integer, Integer, Float> consumer, int width, int height, float delta) {
         Window window = MinecraftClient.getInstance().window;
-        drawHoveringWidget(new Dimension(window.getScaledWidth(), window.getScaledHeight()), x, y, drawable, width, height, delta);
+        drawHoveringWidget(new Dimension(window.getScaledWidth(), window.getScaledHeight()), x, y, consumer, width, height, delta);
     }
     
-    public static void drawHoveringWidget(Dimension dimension, int x, int y, Drawable drawable, int width, int height, float delta) {
+    public static void drawHoveringWidget(Dimension dimension, int x, int y, TriConsumer<Integer, Integer, Float> consumer, int width, int height, float delta) {
         int int_5 = x + 12;
         int int_6 = y - 12;
-        
         if (int_5 + width > dimension.width)
             int_5 -= 28 + width;
         if (int_6 + height + 6 > dimension.height)
             int_6 = dimension.height - height - 6;
-        
-        drawable.draw(int_5, int_6, delta);
-        //        zOffset = 300.0F;
-        //        itemRenderer.zOffset = 300.0F;
-        //        int int_9 = -267386864;
-        //        drawGradientRect(int_5 - 3, int_6 - 4, int_5 + width + 3, int_6 - 3, -267386864, -267386864);
-        //        drawGradientRect(int_5 - 3, int_6 + height + 3, int_5 + width + 3, int_6 + height + 4, -267386864, -267386864);
-        //        drawGradientRect(int_5 - 3, int_6 - 3, int_5 + width + 3, int_6 + height + 3, -267386864, -267386864);
-        //        drawGradientRect(int_5 - 4, int_6 - 3, int_5 - 3, int_6 + height + 3, -267386864, -267386864);
-        //        drawGradientRect(int_5 + width + 3, int_6 - 3, int_5 + width + 4, int_6 + height + 3, -267386864, -267386864);
-        //        int int_10 = 1347420415;
-        //        int int_11 = 1344798847;
-        //        drawGradientRect(int_5 - 3, int_6 - 3 + 1, int_5 - 3 + 1, int_6 + height + 3 - 1, 1347420415, 1344798847);
-        //        drawGradientRect(int_5 + width + 2, int_6 - 3 + 1, int_5 + width + 3, int_6 + height + 3 - 1, 1347420415, 1344798847);
-        //        drawGradientRect(int_5 - 3, int_6 - 3, int_5 + width + 3, int_6 - 3 + 1, 1347420415, 1347420415);
-        //        drawGradientRect(int_5 - 3, int_6 + height + 2, int_5 + width + 3, int_6 + height + 3, 1344798847, 1344798847);
+        consumer.accept(int_5, int_6, delta);
     }
     
     @Override

+ 4 - 5
src/main/java/me/shedaniel/rei/client/SearchArgument.java

@@ -2,14 +2,9 @@ package me.shedaniel.rei.client;
 
 public class SearchArgument {
     
-    public enum ArgumentType {
-        TEXT, MOD, TOOLTIP
-    }
-    
     private ArgumentType argumentType;
     private String text;
     private boolean include;
-    
     public SearchArgument(ArgumentType argumentType, String text, boolean include) {
         this.argumentType = argumentType;
         this.text = text;
@@ -33,4 +28,8 @@ public class SearchArgument {
         return String.format("Argument[%s]: name = %s, include = %b", argumentType.name(), text, include);
     }
     
+    public enum ArgumentType {
+        TEXT, MOD, TOOLTIP
+    }
+    
 }

+ 24 - 20
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -2,7 +2,7 @@ package me.shedaniel.rei.gui;
 
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
@@ -77,7 +77,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
             }
             
             @Override
-            public void setHasFocus(boolean boolean_1) {
+            public void onFocusChanged(boolean boolean_1) {
             }
         });
         widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + 5, 16, 16, new TranslatableTextComponent("text.rei.right_arrow")) {
@@ -95,7 +95,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
             }
             
             @Override
-            public void setHasFocus(boolean boolean_1) {
+            public void onFocusChanged(boolean boolean_1) {
             }
         });
         if (setPage)
@@ -107,12 +107,12 @@ public class ContainerScreenOverlay extends ScreenComponent {
                     ClientHelper.setCheating(!ClientHelper.isCheating());
                     return;
                 }
-                ClientHelper.openConfigWindow(ScreenHelper.getLastContainerScreen());
+                RoughlyEnoughItemsCore.getConfigManager().openConfigScreen(ScreenHelper.getLastContainerScreen());
             }
             
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GuiLighting.disable();
                 if (ClientHelper.isCheating())
                     drawRect(getBounds().x, getBounds().y, getBounds().x + 20, getBounds().y + 20, new Color(255, 0, 0, 42).getRGB());
@@ -133,7 +133,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
             }
             
             @Override
-            public void setHasFocus(boolean boolean_1) {
+            public void onFocusChanged(boolean boolean_1) {
             }
         });
         if (RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons) {
@@ -144,9 +144,9 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 }
                 
                 @Override
-                public void draw(int mouseX, int mouseY, float partialTicks) {
+                public void render(int mouseX, int mouseY, float partialTicks) {
                     text = getGameModeShortText(getCurrentGameMode());
-                    super.draw(mouseX, mouseY, partialTicks);
+                    super.render(mouseX, mouseY, partialTicks);
                 }
                 
                 @Override
@@ -155,7 +155,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 }
                 
                 @Override
-                public void setHasFocus(boolean boolean_1) {
+                public void onFocusChanged(boolean boolean_1) {
                 }
             });
             widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 80 : 60, 10, 20, 20, "") {
@@ -165,8 +165,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 }
                 
                 @Override
-                public void draw(int mouseX, int mouseY, float partialTicks) {
-                    super.draw(mouseX, mouseY, partialTicks);
+                public void render(int mouseX, int mouseY, float partialTicks) {
+                    super.render(mouseX, mouseY, partialTicks);
                     GuiLighting.disable();
                     MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
                     GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
@@ -179,16 +179,16 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 }
                 
                 @Override
-                public void setHasFocus(boolean boolean_1) {
+                public void onFocusChanged(boolean boolean_1) {
                 }
             });
         }
         widgets.add(new ClickableLabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
+            public void render(int mouseX, int mouseY, float partialTicks) {
                 page = MathHelper.clamp(page, 0, getTotalPage());
                 this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
-                super.draw(mouseX, mouseY, partialTicks);
+                super.render(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
                     addTooltip(QueuedTooltip.create(I18n.translate("text.rei.go_back_first_page").split("\n")));
                 else if (focused)
@@ -203,7 +203,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
             }
             
             @Override
-            public void setHasFocus(boolean boolean_1) {
+            public void onFocusChanged(boolean boolean_1) {
             }
         });
         if (ScreenHelper.searchField == null)
@@ -325,7 +325,11 @@ public class ContainerScreenOverlay extends ScreenComponent {
         GuiLighting.disable();
         Screen currentScreen = MinecraftClient.getInstance().currentScreen;
         if (!(currentScreen instanceof RecipeViewingScreen) || !((RecipeViewingScreen) currentScreen).choosePageActivated)
-            QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> MinecraftClient.getInstance().currentScreen.drawTooltip(queuedTooltip.getText(), queuedTooltip.getLocation().x, queuedTooltip.getLocation().y));
+            QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> {
+                GlStateManager.translatef(0, 0, 600);
+                MinecraftClient.getInstance().currentScreen.drawTooltip(queuedTooltip.getText(), queuedTooltip.getLocation().x, queuedTooltip.getLocation().y);
+                GlStateManager.translatef(0, 0, -600);
+            });
         QUEUED_TOOLTIPS.clear();
         GuiLighting.disable();
     }
@@ -356,7 +360,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
         buttonRight.enabled = itemListOverlay.getWidgets().size() > 0;
         widgets.forEach(widget -> {
             GuiLighting.disable();
-            widget.draw(int_1, int_2, float_1);
+            widget.render(int_1, int_2, float_1);
         });
         GuiLighting.disable();
     }
@@ -393,7 +397,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
     public boolean mouseScrolled(double i, double j, double amount) {
         if (!ScreenHelper.isOverlayVisible())
             return false;
-        if (rectangle.contains(ClothInitializer.clientUtils.getMouseLocation())) {
+        if (rectangle.contains(ClientUtils.getMouseLocation())) {
             if (amount > 0 && buttonLeft.enabled)
                 buttonLeft.onPressed();
             else if (amount < 0 && buttonRight.enabled)
@@ -420,7 +424,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
         }
         if (!ScreenHelper.isOverlayVisible())
             return false;
-        Point point = ClothInitializer.clientUtils.getMouseLocation();
+        Point point = ClientUtils.getMouseLocation();
         ItemStack itemStack = null;
         if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen)
             if (ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot() != null && !ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack().isEmpty())

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.gui;
 
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.client.ClientHelper;
@@ -86,7 +86,7 @@ public class RecipeViewingScreen extends Screen {
         }
         if (int_1 == 258) {
             if (isShiftPressed())
-                this.method_19354();
+                this.focusPrevious();
             else
                 this.focusNext();
             return true;
@@ -137,9 +137,9 @@ public class RecipeViewingScreen extends Screen {
         });
         widgets.add(new ClickableLabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 7, "") {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
+            public void render(int mouseX, int mouseY, float partialTicks) {
                 this.text = selectedCategory.getCategoryName();
-                super.draw(mouseX, mouseY, partialTicks);
+                super.render(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
                     ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.view_all_categories").split("\n")));
                 else if (focused)
@@ -189,9 +189,9 @@ public class RecipeViewingScreen extends Screen {
         });
         widgets.add(new ClickableLabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 23, "") {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
+            public void render(int mouseX, int mouseY, float partialTicks) {
                 this.text = String.format("%d/%d", page + 1, getTotalPages(selectedCategory));
-                super.draw(mouseX, mouseY, partialTicks);
+                super.render(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
                     ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.choose_page").split("\n")));
                 else if (focused)
@@ -306,33 +306,33 @@ public class RecipeViewingScreen extends Screen {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float delta) {
+    public void render(int mouseX, int mouseY, float delta) {
         this.drawGradientRect(0, 0, this.screenWidth, this.screenHeight, -1072689136, -804253680);
         if (selectedCategory != null)
             selectedCategory.drawCategoryBackground(bounds, mouseX, mouseY, delta);
         else {
-            new RecipeBaseWidget(bounds).draw(mouseX, mouseY, delta);
+            new RecipeBaseWidget(bounds).render();
             drawRect(bounds.x + 17, bounds.y + 5, bounds.x + bounds.width - 17, bounds.y + 17, SUB_COLOR.getRGB());
             drawRect(bounds.x + 17, bounds.y + 21, bounds.x + bounds.width - 17, bounds.y + 33, SUB_COLOR.getRGB());
         }
         tabs.stream().filter(tabWidget -> {
             return !tabWidget.isSelected();
-        }).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, delta));
+        }).forEach(tabWidget -> tabWidget.render(mouseX, mouseY, delta));
         GuiLighting.disable();
-        super.draw(mouseX, mouseY, delta);
+        super.render(mouseX, mouseY, delta);
         widgets.forEach(widget -> {
             GuiLighting.disable();
-            widget.draw(mouseX, mouseY, delta);
+            widget.render(mouseX, mouseY, delta);
         });
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
-        tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, delta));
+        tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.render(mouseX, mouseY, delta));
         ScreenHelper.getLastOverlay().drawOverlay(mouseX, mouseY, delta);
         if (choosePageActivated) {
             zOffset = 500.0f;
             this.drawGradientRect(0, 0, this.screenWidth, this.screenHeight, -1072689136, -804253680);
             zOffset = 0.0f;
-            recipeChoosePageWidget.draw(mouseX, mouseY, delta);
+            recipeChoosePageWidget.render(mouseX, mouseY, delta);
         }
     }
     
@@ -382,13 +382,13 @@ public class RecipeViewingScreen extends Screen {
         for(InputListener listener : listeners)
             if (listener.mouseScrolled(i, j, amount))
                 return true;
-        if (getBounds().contains(ClothInitializer.clientUtils.getMouseLocation())) {
+        if (getBounds().contains(ClientUtils.getMouseLocation())) {
             if (amount > 0 && recipeBack.enabled)
                 recipeBack.onPressed();
             else if (amount < 0 && recipeNext.enabled)
                 recipeNext.onPressed();
         }
-        if ((new Rectangle(bounds.x, bounds.y - 28, bounds.width, 28)).contains(ClothInitializer.clientUtils.getMouseLocation())) {
+        if ((new Rectangle(bounds.x, bounds.y - 28, bounds.width, 28)).contains(ClientUtils.getMouseLocation())) {
             if (amount > 0 && categoryBack.enabled)
                 categoryBack.onPressed();
             else if (amount < 0 && categoryNext.enabled)

+ 0 - 145
src/main/java/me/shedaniel/rei/gui/config/ConfigEntry.java

@@ -1,145 +0,0 @@
-package me.shedaniel.rei.gui.config;
-
-import me.shedaniel.cloth.ClothInitializer;
-import me.shedaniel.rei.gui.widget.ButtonWidget;
-import me.shedaniel.rei.gui.widget.TextFieldWidget;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.widget.EntryListWidget;
-import net.minecraft.client.util.Window;
-import net.minecraft.text.Style;
-import net.minecraft.text.TextComponent;
-
-import java.awt.*;
-
-public abstract class ConfigEntry extends EntryListWidget.Entry<ConfigEntry> {
-    
-    public static class ButtonConfigEntry extends ConfigEntry {
-        private TextComponent nameComponent;
-        private ConfigEntryButtonProvider buttonProvider;
-        private ButtonWidget buttonWidget;
-        
-        public ButtonConfigEntry(TextComponent nameComponent, ConfigEntryButtonProvider buttonProvider) {
-            this.nameComponent = nameComponent;
-            this.buttonProvider = buttonProvider;
-            this.buttonWidget = new ButtonWidget(0, 0, 150, 20, "") {
-                @Override
-                public void onPressed() {
-                    buttonProvider.onPressed();
-                }
-            };
-        }
-        
-        @Override
-        public void draw(int entryWidth, int height, int i3, int i4, boolean isSelected, float delta) {
-            Window window = MinecraftClient.getInstance().window;
-            Point mouse = ClothInitializer.clientUtils.getMouseLocation();
-            if (MinecraftClient.getInstance().textRenderer.isRightToLeft()) {
-                MinecraftClient.getInstance().textRenderer.drawWithShadow(nameComponent.getFormattedText(), window.getScaledWidth() - MinecraftClient.getInstance().textRenderer.getStringWidth(nameComponent.getFormattedText()) - 40, getY() + 5, 16777215);
-                this.buttonWidget.text = buttonProvider.getText();
-                this.buttonWidget.getBounds().setLocation(getX(), getY() + 2);
-            } else {
-                MinecraftClient.getInstance().textRenderer.drawWithShadow(nameComponent.getFormattedText(), getX(), getY() + 5, 16777215);
-                this.buttonWidget.text = buttonProvider.getText();
-                this.buttonWidget.getBounds().setLocation(window.getScaledWidth() - 190, getY() + 2);
-            }
-            buttonProvider.draw(buttonWidget, mouse, delta);
-        }
-        
-        @Override
-        public boolean mouseClicked(double double_1, double double_2, int int_1) {
-            if (buttonWidget.mouseClicked(double_1, double_2, int_1))
-                return true;
-            return false;
-        }
-        
-        interface ConfigEntryButtonProvider {
-            
-            public void onPressed();
-            
-            public String getText();
-            
-            default public void draw(ButtonWidget button, Point mouse, float delta) {
-                button.draw(mouse.x, mouse.y, delta);
-            }
-            
-        }
-    }
-    
-    public static class CategoryTitleConfigEntry extends ConfigEntry {
-        private TextComponent textComponent;
-        
-        public CategoryTitleConfigEntry(TextComponent nameComponent) {
-            this.textComponent = nameComponent.setStyle(new Style().setBold(true));
-        }
-        
-        @Override
-        public void draw(int i, int i1, int i2, int i3, boolean b, float v) {
-            Window window = MinecraftClient.getInstance().window;
-            TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
-            textRenderer.draw(textComponent.getFormattedText(), (window.getScaledWidth() - textRenderer.getStringWidth(textComponent.getFormattedText())) / 2, getY() + 10, -1);
-        }
-    }
-    
-    public static class TextFieldConfigEntry extends ConfigEntry {
-        private TextComponent nameComponent;
-        private ConfigEntryTextFieldProvider textFieldProvider;
-        private TextFieldWidget textFieldWidget;
-        
-        public TextFieldConfigEntry(TextComponent nameComponent, ConfigEntryTextFieldProvider textFieldProvider) {
-            this.nameComponent = nameComponent;
-            this.textFieldProvider = textFieldProvider;
-            this.textFieldWidget = new TextFieldWidget(0, 0, 148, 18);
-            this.textFieldWidget.setChangedListener(s -> textFieldProvider.onUpdateText(textFieldWidget, s));
-            this.textFieldProvider.onInitWidget(textFieldWidget);
-        }
-        
-        @Override
-        public void draw(int entryWidth, int height, int i3, int i4, boolean isSelected, float delta) {
-            Window window = MinecraftClient.getInstance().window;
-            Point mouse = ClothInitializer.clientUtils.getMouseLocation();
-            if (MinecraftClient.getInstance().textRenderer.isRightToLeft()) {
-                MinecraftClient.getInstance().textRenderer.drawWithShadow(nameComponent.getFormattedText(), window.getScaledWidth() - MinecraftClient.getInstance().textRenderer.getStringWidth(nameComponent.getFormattedText()) - 40, getY() + 5, 16777215);
-                this.textFieldWidget.getBounds().setLocation(getX() + 1, getY() + 2);
-            } else {
-                MinecraftClient.getInstance().textRenderer.drawWithShadow(nameComponent.getFormattedText(), getX(), getY() + 5, 16777215);
-                this.textFieldWidget.getBounds().setLocation(window.getScaledWidth() - 190 + 1, getY() + 2);
-            }
-            textFieldProvider.draw(textFieldWidget, mouse, delta);
-        }
-        
-        @Override
-        public boolean mouseClicked(double double_1, double double_2, int int_1) {
-            if (textFieldWidget.mouseClicked(double_1, double_2, int_1))
-                return true;
-            return false;
-        }
-        
-        @Override
-        public boolean charTyped(char char_1, int int_1) {
-            if (textFieldWidget.charTyped(char_1, int_1))
-                return true;
-            return false;
-        }
-        
-        @Override
-        public boolean keyPressed(int int_1, int int_2, int int_3) {
-            if (textFieldWidget.keyPressed(int_1, int_2, int_3))
-                return true;
-            return false;
-        }
-        
-        interface ConfigEntryTextFieldProvider {
-            
-            public void onInitWidget(TextFieldWidget widget);
-            
-            public void onUpdateText(TextFieldWidget widget, String text);
-            
-            default public void draw(TextFieldWidget widget, Point mouse, float delta) {
-                widget.draw(mouse.x, mouse.y, delta);
-            }
-            
-        }
-    }
-    
-}

+ 0 - 35
src/main/java/me/shedaniel/rei/gui/config/ConfigEntryListWidget.java

@@ -1,35 +0,0 @@
-package me.shedaniel.rei.gui.config;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.widget.EntryListWidget;
-
-public class ConfigEntryListWidget extends EntryListWidget<ConfigEntry> {
-    
-    public ConfigEntryListWidget(MinecraftClient client, int width, int height, int startY, int endY, int entryHeight) {
-        super(client, width, height, startY, endY, entryHeight);
-        method_1943(false); //toggleShowSelection
-    }
-    
-    public void configClearEntries() {
-        clearEntries();
-    }
-    
-    private ConfigEntry getEntry(int int_1) {
-        return this.getInputListeners().get(int_1);
-    }
-    
-    public void configAddEntry(ConfigEntry entry) {
-        addEntry(entry);
-    }
-    
-    @Override
-    public int getEntryWidth() {
-        return width - 80;
-    }
-    
-    @Override
-    protected int getScrollbarPosition() {
-        return width - 40;
-    }
-    
-}

+ 0 - 340
src/main/java/me/shedaniel/rei/gui/config/ConfigScreen.java

@@ -1,340 +0,0 @@
-package me.shedaniel.rei.gui.config;
-
-import com.google.common.collect.Lists;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.client.ItemListOrdering;
-import me.shedaniel.rei.client.ScreenHelper;
-import me.shedaniel.rei.gui.credits.CreditsScreen;
-import me.shedaniel.rei.gui.widget.QueuedTooltip;
-import me.shedaniel.rei.gui.widget.TextFieldWidget;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.Screen;
-import net.minecraft.client.gui.widget.ButtonWidget;
-import net.minecraft.client.render.GuiLighting;
-import net.minecraft.client.resource.language.I18n;
-import net.minecraft.text.TranslatableTextComponent;
-
-import java.awt.*;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-public class ConfigScreen extends Screen {
-    
-    private final List<QueuedTooltip> tooltipList;
-    private Screen parent;
-    private boolean initOverlay;
-    private ConfigEntryListWidget entryListWidget;
-    
-    public ConfigScreen(Screen parent, boolean initOverlay) {
-        this.parent = parent;
-        this.initOverlay = initOverlay;
-        this.tooltipList = Lists.newArrayList();
-    }
-    
-    @Override
-    public boolean keyPressed(int int_1, int int_2, int int_3) {
-        if (int_1 == 256) {
-            MinecraftClient.getInstance().openScreen(parent);
-            if (initOverlay)
-                ScreenHelper.getLastOverlay().onInitialized();
-            return true;
-        }
-        return super.keyPressed(int_1, int_2, int_3);
-    }
-    
-    @Override
-    protected void onInitialized() {
-        listeners.add(entryListWidget = new ConfigEntryListWidget(client, screenWidth, screenHeight, 32, screenHeight - 32, 24));
-        entryListWidget.configClearEntries();
-        entryListWidget.configAddEntry(new ConfigEntry.CategoryTitleConfigEntry(new TranslatableTextComponent("text.rei.config.general")));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.cheating"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                ClientHelper.setCheating(!ClientHelper.isCheating());
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(ClientHelper.isCheating());
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.CategoryTitleConfigEntry(new TranslatableTextComponent("text.rei.config.appearance")));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.side_search_box"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField = !RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField);
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.list_ordering"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                int index = Arrays.asList(ItemListOrdering.values()).indexOf(RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering) + 1;
-                if (index >= ItemListOrdering.values().length) {
-                    index = 0;
-                    RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending = !RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending;
-                }
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering = ItemListOrdering.values()[index];
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return I18n.translate("text.rei.config.list_ordering_button", I18n.translate(RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering.getNameTranslationKey()), I18n.translate(RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending ? "ordering.rei.ascending" : "ordering.rei.descending"));
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.mirror_rei"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel = !RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel);
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.CategoryTitleConfigEntry(new TranslatableTextComponent("text.rei.config.modules")));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.enable_craftable_only"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton = !RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton);
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.load_default_plugin"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin = !RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin);
-            }
-            
-            @Override
-            public void draw(me.shedaniel.rei.gui.widget.ButtonWidget button, Point mouse, float delta) {
-                button.draw(mouse.x, mouse.y, delta);
-                if (button.isHighlighted(mouse))
-                    tooltipList.add(QueuedTooltip.create(I18n.translate("text.rei.config.load_default_plugin.restart_tooltip").split("\n")));
-                
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.enable_util_buttons"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons = !RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons);
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.disable_recipe_book"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook = !RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook);
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.CategoryTitleConfigEntry(new TranslatableTextComponent("text.rei.config.advanced")));
-        entryListWidget.configAddEntry(new ConfigEntry.TextFieldConfigEntry(new TranslatableTextComponent("text.rei.give_command"), new ConfigEntry.TextFieldConfigEntry.ConfigEntryTextFieldProvider() {
-            @Override
-            public void onInitWidget(TextFieldWidget widget) {
-                widget.setMaxLength(99999);
-                widget.setText(RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand);
-                widget.setSuggestion(I18n.translate("text.rei.give_command.suggestion"));
-            }
-            
-            @Override
-            public void onUpdateText(TextFieldWidget button, String text) {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand = text;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public void draw(TextFieldWidget widget, Point mouse, float delta) {
-                widget.draw(mouse.x, mouse.y, delta);
-                if (widget.isHighlighted(mouse))
-                    tooltipList.add(QueuedTooltip.create(I18n.translate("text.rei.give_command.tooltip").split("\n")));
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.TextFieldConfigEntry(new TranslatableTextComponent("text.rei.gamemode_command"), new ConfigEntry.TextFieldConfigEntry.ConfigEntryTextFieldProvider() {
-            @Override
-            public void onInitWidget(TextFieldWidget widget) {
-                widget.setMaxLength(99999);
-                widget.setText(RoughlyEnoughItemsCore.getConfigManager().getConfig().gamemodeCommand);
-            }
-            
-            @Override
-            public void onUpdateText(TextFieldWidget button, String text) {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().gamemodeCommand = text;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.TextFieldConfigEntry(new TranslatableTextComponent("text.rei.weather_command"), new ConfigEntry.TextFieldConfigEntry.ConfigEntryTextFieldProvider() {
-            @Override
-            public void onInitWidget(TextFieldWidget widget) {
-                widget.setMaxLength(99999);
-                widget.setText(RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand);
-            }
-            
-            @Override
-            public void onUpdateText(TextFieldWidget button, String text) {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand = text;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }));
-        entryListWidget.configAddEntry(new ConfigEntry.TextFieldConfigEntry(new TranslatableTextComponent("text.rei.config.max_recipes_per_page"), new ConfigEntry.TextFieldConfigEntry.ConfigEntryTextFieldProvider() {
-            @Override
-            public void onInitWidget(TextFieldWidget widget) {
-                widget.setMaxLength(2);
-                widget.setText(RoughlyEnoughItemsCore.getConfigManager().getConfig().maxRecipePerPage + "");
-                widget.stripInvaild = s -> {
-                    StringBuilder stringBuilder_1 = new StringBuilder();
-                    char[] var2 = s.toCharArray();
-                    int var3 = var2.length;
-                    
-                    for(int var4 = 0; var4 < var3; ++var4) {
-                        char char_1 = var2[var4];
-                        if (Character.isDigit(char_1))
-                            stringBuilder_1.append(char_1);
-                    }
-                    
-                    return stringBuilder_1.toString();
-                };
-            }
-            
-            @Override
-            public void onUpdateText(TextFieldWidget button, String text) {
-                if (isInvaildNumber(text))
-                    try {
-                        RoughlyEnoughItemsCore.getConfigManager().getConfig().maxRecipePerPage = Integer.valueOf(text);
-                        RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                    } catch (Exception e) {
-                    }
-            }
-            
-            @Override
-            public void draw(TextFieldWidget widget, Point mouse, float delta) {
-                widget.setEditableColor(isInvaildNumber(widget.getText()) ? -1 : Color.RED.getRGB());
-                widget.draw(mouse.x, mouse.y, delta);
-            }
-            
-            private boolean isInvaildNumber(String text) {
-                try {
-                    int page = Integer.valueOf(text);
-                    return page >= 2 && page <= 99;
-                } catch (Exception e) {
-                }
-                return false;
-            }
-        }));
-        addButton(new ButtonWidget(screenWidth / 2 - 100, screenHeight - 26, I18n.translate("gui.done")) {
-            @Override
-            public void onPressed() {
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-                ConfigScreen.this.client.openScreen(parent);
-                if (initOverlay)
-                    ScreenHelper.getLastOverlay().onInitialized();
-            }
-        });
-        addButton(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? screenWidth - 55 : 10, screenHeight - 26, 45, 20, I18n.translate("text.rei.credits")) {
-            @Override
-            public void onPressed() {
-                MinecraftClient.getInstance().openScreen(new CreditsScreen(ConfigScreen.this));
-            }
-        });
-        super.onInitialized();
-    }
-    
-    private String getTrueFalseText(boolean showCraftableOnlyButton) {
-        return String.format("%s%s", showCraftableOnlyButton ? "§a" : "§c", showCraftableOnlyButton ? I18n.translate("text.rei.enabled") : I18n.translate("text.rei.disabled"));
-    }
-    
-    @Override
-    public boolean mouseScrolled(double double_1, double double_2, double double_3) {
-        if (entryListWidget.mouseScrolled(double_1, double_2, double_3))
-            return true;
-        return super.mouseScrolled(double_1, double_2, double_3);
-    }
-    
-    @Override
-    public void draw(int int_1, int int_2, float float_1) {
-        this.drawTextureBackground(0);
-        this.entryListWidget.draw(int_1, int_2, float_1);
-        this.drawStringCentered(this.fontRenderer, I18n.translate("text.rei.config"), this.screenWidth / 2, 16, 16777215);
-        super.draw(int_1, int_2, float_1);
-        GuiLighting.disable();
-        tooltipList.forEach(queuedTooltip -> drawTooltip(queuedTooltip.getText(), queuedTooltip.getLocation().x, queuedTooltip.getLocation().y));
-        tooltipList.clear();
-        GuiLighting.disable();
-    }
-    
-}

+ 94 - 0
src/main/java/me/shedaniel/rei/gui/config/ItemListOrderingEntry.java

@@ -0,0 +1,94 @@
+package me.shedaniel.rei.gui.config;
+
+import javafx.util.Pair;
+import me.shedaniel.cloth.api.ClientUtils;
+import me.shedaniel.cloth.gui.ClothConfigScreen.ListEntry;
+import me.shedaniel.cloth.gui.ClothConfigScreen.ListWidget;
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.client.ItemListOrdering;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.widget.ButtonWidget;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.client.util.Window;
+
+import java.awt.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class ItemListOrderingEntry extends ListEntry {
+    private AtomicReference<Pair<ItemListOrdering, Boolean>> value;
+    private ButtonWidget buttonWidget;
+    
+    public ItemListOrderingEntry(String fieldName, Pair<ItemListOrdering, Boolean> val) {
+        super(fieldName);
+        this.value = new AtomicReference(val);
+        this.buttonWidget = new ButtonWidget(0, 0, 150, 20, "") {
+            public void onPressed() {
+                int index = Arrays.asList(ItemListOrdering.values()).indexOf(value.get().getKey()) + 1;
+                boolean currentAscending = value.get().getValue();
+                if (index >= ItemListOrdering.values().length) {
+                    index = 0;
+                    currentAscending = !currentAscending;
+                }
+                ItemListOrderingEntry.this.value.set(new Pair<>(ItemListOrdering.values()[index], currentAscending));
+                ((ListWidget) ItemListOrderingEntry.this.getParent()).getScreen().setEdited(true);
+            }
+        };
+    }
+    
+    public Object getObject() {
+        return this.value.get();
+    }
+    
+    public void draw(int entryWidth, int height, int i3, int i4, boolean isSelected, float delta) {
+        Window window = MinecraftClient.getInstance().window;
+        Point mouse = ClientUtils.getMouseLocation();
+        this.buttonWidget.y = this.getY();
+        this.buttonWidget.setMessage(I18n.translate("text.rei.config.list_ordering_button", I18n.translate(value.get().getKey().getNameTranslationKey()), I18n.translate(value.get().getValue() ? "ordering.rei.ascending" : "ordering.rei.descending")));
+        if (MinecraftClient.getInstance().textRenderer.isRightToLeft()) {
+            MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(this.getFieldName(), new Object[0]), (float) (window.getScaledWidth() - this.getX() - MinecraftClient.getInstance().textRenderer.getStringWidth(I18n.translate(this.getFieldName(), new Object[0]))), (float) (this.getY() + 5), 16777215);
+            this.buttonWidget.x = this.getX();
+        } else {
+            MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(this.getFieldName(), new Object[0]), (float) this.getX(), (float) (this.getY() + 5), 16777215);
+            this.buttonWidget.x = window.getScaledWidth() - this.getX() - this.buttonWidget.getWidth();
+        }
+        
+        this.buttonWidget.render(mouse.x, mouse.y, delta);
+    }
+    
+    public String getYesNoText(boolean bool) {
+        return bool ? "§aYes" : "§cNo";
+    }
+    
+    @Override
+    public List<? extends InputListener> getInputListeners() {
+        return Collections.singletonList(buttonWidget);
+    }
+    
+    public boolean isActive() {
+        return this.buttonWidget.isHovered();
+    }
+    
+    public void setActive(boolean b) {
+    }
+    
+    public InputListener getFocused() {
+        return null;
+    }
+    
+    public void setFocused(InputListener inputListener) {
+    }
+    
+    public boolean mouseClicked(double double_1, double double_2, int int_1) {
+        return this.buttonWidget.mouseClicked(double_1, double_2, int_1);
+    }
+    
+    @Override
+    public void save() {
+        RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering = value.get().getKey();
+        RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending = value.get().getValue();
+    }
+}

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java

@@ -7,7 +7,7 @@ public class CreditsEntryListWidget extends EntryListWidget<CreditsEntry> {
     
     public CreditsEntryListWidget(MinecraftClient client, int width, int height, int startY, int endY, int entryHeight) {
         super(client, width, height, startY, endY, entryHeight);
-        method_1943(false); //toggleShowSelection
+        setRenderSelection(false); //toggleShowSelection
     }
     
     public void creditsClearEntries() {

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

@@ -51,11 +51,11 @@ public class CreditsScreen extends Screen {
     }
     
     @Override
-    public void draw(int int_1, int int_2, float float_1) {
+    public void render(int int_1, int int_2, float float_1) {
         this.drawTextureBackground(0);
-        this.entryListWidget.draw(int_1, int_2, float_1);
+        this.entryListWidget.render(int_1, int_2, float_1);
         this.drawStringCentered(this.fontRenderer, I18n.translate("text.rei.credits"), this.screenWidth / 2, 16, 16777215);
-        super.draw(int_1, int_2, float_1);
+        super.render(int_1, int_2, float_1);
     }
     
 }

+ 5 - 5
src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java

@@ -21,7 +21,7 @@ public abstract class ButtonWidget extends HighlightableWidget {
     public String text;
     public boolean enabled;
     public boolean visible;
-    private boolean focused;
+    public boolean focused;
     private Rectangle bounds;
     
     public ButtonWidget(Rectangle rectangle, TextComponent text) {
@@ -59,12 +59,12 @@ public abstract class ButtonWidget extends HighlightableWidget {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float partialTicks) {
         if (this.visible) {
             int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;
             MinecraftClient client = MinecraftClient.getInstance();
             TextRenderer textRenderer = client.textRenderer;
-            client.getTextureManager().bindTexture(AbstractButtonWidget.WIDGET_TEX);
+            client.getTextureManager().bindTexture(AbstractButtonWidget.WIDGETS_LOCATION);
             GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
             int textureOffset = this.getTextureId(isHovered(mouseX, mouseY));
             GlStateManager.enableBlend();
@@ -107,12 +107,12 @@ public abstract class ButtonWidget extends HighlightableWidget {
     }
     
     @Override
-    public boolean hasFocus() {
+    public boolean isPartOfFocusCycle() {
         return visible && enabled;
     }
     
     @Override
-    public void setHasFocus(boolean boolean_1) {
+    public void onFocusChanged(boolean boolean_1) {
         focused = boolean_1;
     }
     

+ 5 - 5
src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java

@@ -4,15 +4,15 @@ import java.awt.*;
 
 public abstract class ClickableLabelWidget extends LabelWidget {
     
-    private static final int hoveredColor = (new Color(102, 255, 204)).getRGB();
-    protected boolean focused;
+    public static final int hoveredColor = (new Color(102, 255, 204)).getRGB();
+    public boolean focused;
     
     public ClickableLabelWidget(int x, int y, String text) {
         super(x, y, text);
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float partialTicks) {
         int colour = -1;
         if (isHovered(mouseX, mouseY))
             colour = hoveredColor;
@@ -39,7 +39,7 @@ public abstract class ClickableLabelWidget extends LabelWidget {
     }
     
     @Override
-    public boolean hasFocus() {
+    public boolean isPartOfFocusCycle() {
         return true;
     }
     
@@ -48,7 +48,7 @@ public abstract class ClickableLabelWidget extends LabelWidget {
     }
     
     @Override
-    public void setHasFocus(boolean boolean_1) {
+    public void onFocusChanged(boolean boolean_1) {
         focused = boolean_1;
     }
     

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

@@ -15,7 +15,7 @@ import java.awt.*;
 
 public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     
-    protected static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private ItemRenderer itemRenderer;
     
     public CraftableToggleButtonWidget(Rectangle rectangle) {
@@ -28,9 +28,9 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float partialTicks) {
         GuiLighting.disable();
-        super.draw(mouseX, mouseY, partialTicks);
+        super.render(mouseX, mouseY, partialTicks);
         
         GuiLighting.enableForItems();
         this.itemRenderer.zOffset = 0.0F;

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

@@ -1,6 +1,6 @@
 package me.shedaniel.rei.gui.widget;
 
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.InputListener;
 import net.minecraft.client.util.Window;
@@ -9,7 +9,7 @@ import java.awt.*;
 
 public abstract class DraggableWidget extends HighlightableWidget {
     
-    protected boolean dragged = false;
+    public boolean dragged = false;
     private Point midPoint, startPoint;
     private int relateX, relateY;
     
@@ -35,7 +35,7 @@ public abstract class DraggableWidget extends HighlightableWidget {
     
     @Override
     public boolean mouseDragged(double double_1, double double_2, int int_1, double double_3, double double_4) {
-        Point mouse = ClothInitializer.clientUtils.getMouseLocation();
+        Point mouse = ClientUtils.getMouseLocation();
         if (int_1 == 0) {
             if (!dragged) {
                 if (getGrabBounds().contains(mouse)) {

+ 6 - 6
src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java

@@ -1,7 +1,7 @@
 package me.shedaniel.rei.gui.widget;
 
 import com.google.common.collect.Lists;
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.client.ClientHelper;
@@ -71,10 +71,10 @@ public class ItemListOverlay extends Widget {
     }
     
     @Override
-    public void draw(int int_1, int int_2, float float_1) {
-        widgets.forEach(widget -> widget.draw(int_1, int_2, float_1));
+    public void render(int int_1, int int_2, float float_1) {
+        widgets.forEach(widget -> widget.render(int_1, int_2, float_1));
         ClientPlayerEntity player = MinecraftClient.getInstance().player;
-        if (rectangle.contains(ClothInitializer.clientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer())
+        if (rectangle.contains(ClientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer())
             ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.delete_items")));
     }
     
@@ -97,10 +97,10 @@ public class ItemListOverlay extends Widget {
                 break;
             ItemSlotWidget slotWidget = new ItemSlotWidget((int) (startX + (i % width) * 18), (int) (startY + MathHelper.floor(i / width) * 18), Collections.singletonList(currentDisplayed.get(j)), false, true, true) {
                 @Override
-                protected void drawToolTip(ItemStack itemStack) {
+                protected void drawToolTip(ItemStack itemStack, float delta) {
                     ClientPlayerEntity player = MinecraftClient.getInstance().player;
                     if (!ClientHelper.isCheating() || player.inventory.getCursorStack().isEmpty())
-                        super.drawToolTip(itemStack);
+                        super.drawToolTip(itemStack, delta);
                 }
                 
                 @Override

+ 6 - 7
src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java

@@ -2,7 +2,7 @@ package me.shedaniel.rei.gui.widget;
 
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
@@ -59,7 +59,7 @@ public class ItemSlotWidget extends HighlightableWidget {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float delta) {
         final ItemStack itemStack = getCurrentStack();
         if (drawBackground) {
             MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
@@ -83,12 +83,11 @@ public class ItemSlotWidget extends HighlightableWidget {
             itemRenderer.zOffset = 0.0F;
         }
         if (!itemStack.isEmpty() && isHighlighted(mouseX, mouseY) && showToolTips)
-            drawToolTip(itemStack);
+            drawToolTip(itemStack, delta);
     }
     
-    protected void drawToolTip(ItemStack itemStack) {
-        List<String> toolTip = getTooltip(itemStack);
-        ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(toolTip));
+    protected void drawToolTip(ItemStack itemStack, float delta) {
+        ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack)));
     }
     
     protected List<String> getTooltip(ItemStack itemStack) {
@@ -142,7 +141,7 @@ public class ItemSlotWidget extends HighlightableWidget {
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (!clickToMoreRecipes)
             return false;
-        if (getBounds().contains(ClothInitializer.clientUtils.getMouseLocation()))
+        if (getBounds().contains(ClientUtils.getMouseLocation()))
             if (ClientHelper.RECIPE.matchesKey(int_1, int_2))
                 return ClientHelper.executeRecipeKeyBind(getCurrentStack().copy());
             else if (ClientHelper.USAGE.matchesKey(int_1, int_2))

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

@@ -34,7 +34,7 @@ public class LabelWidget extends HighlightableWidget {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float partialTicks) {
         drawStringCentered(textRenderer, text, x, y, -1);
     }
     

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.gui.widget;
 
 
 import com.google.common.collect.Lists;
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 
 import java.awt.*;
 import java.util.LinkedList;
@@ -27,11 +27,11 @@ public class QueuedTooltip {
     }
     
     public static QueuedTooltip create(List<String> text) {
-        return QueuedTooltip.create(ClothInitializer.clientUtils.getMouseLocation(), text);
+        return QueuedTooltip.create(ClientUtils.getMouseLocation(), text);
     }
     
     public static QueuedTooltip create(String... text) {
-        return QueuedTooltip.create(ClothInitializer.clientUtils.getMouseLocation(), text);
+        return QueuedTooltip.create(ClientUtils.getMouseLocation(), text);
     }
     
     public Point getLocation() {

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

@@ -32,8 +32,12 @@ public class RecipeBaseWidget extends HighlightableWidget {
         return Collections.emptyList();
     }
     
+    public void render() {
+        render(0, 0, 0);
+    }
+    
     @Override
-    public void draw(int mouseX, int mouseY, float delta) {
+    public void render(int mouseX, int mouseY, float delta) {
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);

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

@@ -89,7 +89,7 @@ public class RecipeChoosePageWidget extends DraggableWidget {
             }
             
             @Override
-            public void draw(int i, int i1, float v) {
+            public void render(int i, int i1, float v) {
                 MinecraftClient.getInstance().textRenderer.draw(I18n.translate("text.rei.choose_page"), bounds.x + 5, bounds.y + 5, 4210752);
                 String endString = String.format(" /%d", maxPage);
                 int width = MinecraftClient.getInstance().textRenderer.getStringWidth(endString);
@@ -135,12 +135,12 @@ public class RecipeChoosePageWidget extends DraggableWidget {
     }
     
     @Override
-    public void draw(int i, int i1, float v) {
+    public void render(int i, int i1, float v) {
         widgets.forEach(widget -> {
             GuiLighting.disable();
-            GlStateManager.translatef(0, 0, 600);
-            widget.draw(i, i1, v);
-            GlStateManager.translatef(0, 0, -600);
+            GlStateManager.translatef(0, 0, 800);
+            widget.render(i, i1, v);
+            GlStateManager.translatef(0, 0, -800);
         });
     }
     

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

@@ -29,9 +29,9 @@ public class SpeedCraftingButtonWidget extends ButtonWidget {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float partialTicks) {
         this.enabled = functional != null && functional.acceptRecipe(ScreenHelper.getLastContainerScreen(), displaySupplier.get());
-        super.draw(mouseX, mouseY, partialTicks);
+        super.render(mouseX, mouseY, partialTicks);
     }
     
     @Override

+ 8 - 8
src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java

@@ -15,14 +15,14 @@ import java.util.List;
 
 public class TabWidget extends HighlightableWidget {
     
-    private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     
-    private boolean shown = false, selected = false;
-    private ItemStack item;
-    private int id;
-    private RecipeViewingScreen recipeViewingWidget;
-    private String categoryName;
-    private Rectangle bounds;
+    public boolean shown = false, selected = false;
+    public ItemStack item;
+    public int id;
+    public RecipeViewingScreen recipeViewingWidget;
+    public String categoryName;
+    public Rectangle bounds;
     private ItemRenderer itemRenderer;
     
     public TabWidget(int id, RecipeViewingScreen recipeViewingWidget, Rectangle bounds) {
@@ -66,7 +66,7 @@ public class TabWidget extends HighlightableWidget {
     }
     
     @Override
-    public void draw(int mouseX, int mouseY, float partialTicks) {
+    public void render(int mouseX, int mouseY, float partialTicks) {
         if (shown) {
             int l = (int) this.bounds.getCenterX() - 8, i1 = (int) this.bounds.getCenterY() - 6;
             

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

@@ -336,6 +336,7 @@ public class TextFieldWidget extends HighlightableWidget {
         }
     }
     
+    @Override
     public boolean charTyped(char char_1, int int_1) {
         if (this.isVisible() && this.isFocused()) {
             if (SharedConstants.isValidChar(char_1)) {
@@ -381,7 +382,7 @@ public class TextFieldWidget extends HighlightableWidget {
         }
     }
     
-    public void draw(int int_1, int int_2, float float_1) {
+    public void render(int int_1, int int_2, float float_1) {
         if (this.isVisible()) {
             if (this.hasBorder()) {
                 drawRect(this.bounds.x - 1, this.bounds.y - 1, this.bounds.x + this.bounds.width + 1, this.bounds.y + this.bounds.height + 1, -6250336);
@@ -523,11 +524,12 @@ public class TextFieldWidget extends HighlightableWidget {
         this.notEditableColor = int_1;
     }
     
-    public void setHasFocus(boolean boolean_1) {
+    public void onFocusChanged(boolean boolean_1) {
         this.setFocused(boolean_1);
     }
     
-    public boolean hasFocus() {
+    @Override
+    public boolean isPartOfFocusCycle() {
         return true;
     }
     

+ 11 - 0
src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java

@@ -67,4 +67,15 @@ public class MixinContainerScreen extends Screen implements ContainerScreenHooks
         }
     }
     
+    // TODO: Make this use an event when Cloth mixin issues are fixed
+    @Override
+    public boolean charTyped(char char_1, int int_1) {
+        if (!(MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen)) {
+            if (ScreenHelper.getLastOverlay().charTyped(char_1, int_1)) {
+                return true;
+            }
+        }
+        return super.charTyped(char_1, int_1);
+    }
+    
 }

+ 2 - 2
src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryScreen.java

@@ -1,6 +1,6 @@
 package me.shedaniel.rei.mixin;
 
-import me.shedaniel.cloth.ClothInitializer;
+import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
@@ -31,7 +31,7 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
     @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true)
     public void mouseScrolled(double i, double j, double amount, CallbackInfoReturnable<Boolean> ci) {
         if (!doRenderScrollBar() && selectedTab == ItemGroup.INVENTORY.getIndex())
-            if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().getRectangle().contains(ClothInitializer.clientUtils.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(i, j, amount)) {
+            if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().getRectangle().contains(ClientUtils.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(i, j, amount)) {
                 ci.setReturnValue(true);
                 ci.cancel();
             }

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

@@ -44,8 +44,8 @@ public class DefaultBlastingCategory implements RecipeCategory<DefaultBlastingDi
         Point startPoint = new Point((int) bounds.getCenterX() - 41, (int) bounds.getCenterY() - 27);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

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

@@ -45,8 +45,8 @@ public class DefaultBrewingCategory implements RecipeCategory<DefaultBrewingDisp
         Point startPoint = new Point((int) bounds.getCenterX() - 52, (int) bounds.getCenterY() - 29);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

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

@@ -43,8 +43,8 @@ public class DefaultCampfireCategory implements RecipeCategory<DefaultCampfireDi
         Point startPoint = new Point((int) bounds.getCenterX() - 41, (int) bounds.getCenterY() - 27);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

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

@@ -43,8 +43,8 @@ public class DefaultCraftingCategory implements RecipeCategory<DefaultCraftingDi
         Point startPoint = new Point((int) bounds.getCenterX() - 58, (int) bounds.getCenterY() - 27);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

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

@@ -43,8 +43,8 @@ public class DefaultSmeltingCategory implements RecipeCategory<DefaultSmeltingDi
         Point startPoint = new Point((int) bounds.getCenterX() - 41, (int) bounds.getCenterY() - 27);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

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

@@ -43,8 +43,8 @@ public class DefaultSmokingCategory implements RecipeCategory<DefaultSmokingDisp
         Point startPoint = new Point((int) bounds.getCenterX() - 41, (int) bounds.getCenterY() - 27);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

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

@@ -42,8 +42,8 @@ public class DefaultStoneCuttingCategory implements RecipeCategory<DefaultStoneC
         Point startPoint = new Point((int) bounds.getCenterX() - 41, (int) bounds.getCenterY() - 13);
         List<Widget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
             @Override
-            public void draw(int mouseX, int mouseY, float partialTicks) {
-                super.draw(mouseX, mouseY, partialTicks);
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                super.render(mouseX, mouseY, partialTicks);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 GuiLighting.disable();
                 MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);

+ 30 - 28
src/main/java/me/shedaniel/rei/utils/ClothRegistry.java

@@ -1,8 +1,7 @@
 package me.shedaniel.rei.utils;
 
-import me.shedaniel.cloth.ClothInitializer;
-import me.shedaniel.cloth.api.EventPriority;
-import me.shedaniel.cloth.hooks.ClothHooks;
+import me.shedaniel.cloth.api.ClientUtils;
+import me.shedaniel.cloth.hooks.ClothClientHooks;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.TabGetter;
 import me.shedaniel.rei.client.RecipeHelperImpl;
@@ -12,46 +11,49 @@ import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.client.gui.widget.RecipeBookButtonWidget;
 import net.minecraft.item.ItemGroup;
+import net.minecraft.util.ActionResult;
 
 public class ClothRegistry {
     
     public static void register() {
-        ClothHooks.CLIENT_SYNC_RECIPES.registerListener(event -> {
-            ((RecipeHelperImpl) RoughlyEnoughItemsCore.getRecipeHelper()).recipesLoaded(event.getManager());
+        ClothClientHooks.SYNC_RECIPES.register((minecraftClient, recipeManager, synchronizeRecipesS2CPacket) -> {
+            ((RecipeHelperImpl) RoughlyEnoughItemsCore.getRecipeHelper()).recipesLoaded(recipeManager);
         });
-        ClothHooks.CLIENT_SCREEN_ADD_BUTTON.registerListener(event -> {
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook && event.getScreen() instanceof ContainerScreen && event.getButtonWidget() instanceof RecipeBookButtonWidget)
-                event.setCancelled(true);
-        }, EventPriority.LOWEST);
-        ClothHooks.CLIENT_POST_INIT_SCREEN.registerListener(post -> {
-            if (post.getScreen() instanceof ContainerScreen) {
-                if (post.getScreen() instanceof CreativePlayerInventoryScreen) {
-                    TabGetter tabGetter = (TabGetter) post.getScreen();
+        ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> {
+            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook && screen instanceof ContainerScreen && abstractButtonWidget instanceof RecipeBookButtonWidget)
+                return ActionResult.FAIL;
+            return ActionResult.PASS;
+        });
+        ClothClientHooks.SCREEN_INIT_POST.register((minecraftClient, screen, screenHooks) -> {
+            if (screen instanceof ContainerScreen) {
+                if (screen instanceof CreativePlayerInventoryScreen) {
+                    TabGetter tabGetter = (TabGetter) screen;
                     if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                         return;
                 }
-                ScreenHelper.setLastContainerScreen((ContainerScreen) post.getScreen());
-                post.getInputListeners().add(ScreenHelper.getLastOverlay(true, false));
+                ScreenHelper.setLastContainerScreen((ContainerScreen) screen);
+                screenHooks.cloth_getInputListeners().add(ScreenHelper.getLastOverlay(true, false));
             }
-        }, EventPriority.LOWEST);
-        ClothHooks.CLIENT_POST_DRAW_SCREEN.registerListener(post -> {
-            if (post.getScreen() instanceof ContainerScreen) {
-                if (post.getScreen() instanceof CreativePlayerInventoryScreen) {
-                    TabGetter tabGetter = (TabGetter) post.getScreen();
+        });
+        ClothClientHooks.SCREEN_RENDER_POST.register((minecraftClient, screen, i, i1, v) -> {
+            if (screen instanceof ContainerScreen) {
+                if (screen instanceof CreativePlayerInventoryScreen) {
+                    TabGetter tabGetter = (TabGetter) screen;
                     if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                         return;
                 }
-                ScreenHelper.getLastOverlay().drawOverlay(post.getMouseX(), post.getMouseY(), post.getDelta());
+                ScreenHelper.getLastOverlay().drawOverlay(i, i1, v);
             }
-        }, EventPriority.LOWEST);
-        ClothHooks.CLIENT_SCREEN_MOUSE_SCROLLED.registerListener(event -> {
-            if (event.getScreen() instanceof ContainerScreen && !(event.getScreen() instanceof CreativePlayerInventoryScreen)) {
+        });
+        ClothClientHooks.SCREEN_MOUSE_SCROLLED.register((minecraftClient, screen, v, v1, v2) -> {
+            if (screen instanceof ContainerScreen && !(screen instanceof CreativePlayerInventoryScreen)) {
                 ContainerScreenOverlay overlay = ScreenHelper.getLastOverlay();
-                if (ScreenHelper.isOverlayVisible() && ContainerScreenOverlay.getItemListOverlay().getListArea().contains(ClothInitializer.clientUtils.getMouseLocation()))
-                    if (overlay.mouseScrolled(event.getMouseX(), event.getMouseY(), event.getAmount()))
-                        event.setCancelled(true);
+                if (ScreenHelper.isOverlayVisible() && ContainerScreenOverlay.getItemListOverlay().getListArea().contains(ClientUtils.getMouseLocation()))
+                    if (overlay.mouseScrolled(v, v1, v2))
+                        return ActionResult.SUCCESS;
             }
-        }, EventPriority.LOWEST);
+            return ActionResult.PASS;
+        });
     }
     
 }

+ 2 - 0
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -72,6 +72,8 @@
   "text.rei.next_category": "Next Category",
   "text.rei.previous_page": "Previous Page",
   "text.rei.next_page": "Next Page",
+  "text.rei.config.prefer_visible_recipes": "Prefer Visible Recipes",
+  "text.rei.config.title": "Roughly Enough Items Config",
   "_comment": "Don't change / translate the credit down below if you are doing it :)",
   "text.rei.credit.text": "§lRoughly Enough Items\n§7Originally a fork for Almost Enough Items.\n\n§lDevelopers\n  - Originally by ZenDarva\n  - Created by Danielshe\n  - Plugin Support by TehNut\n\n§lLanguage Translation\n  English - Danielshe\n  Simplified Chinese - Danielshe\n  Traditional Chinese - hugoalh & Danielshe\n  French - Yanis48\n  German - MelanX\n  Estonian - Madis0\n  Portuguese - thiagokenis\n  LOLCAT - Danielshe\n  Upside Down - Danielshe\n\n§lLicense\n§7Roughly Enough Items is using MIT."
 }