Unknown 6 ani în urmă
părinte
comite
68a8a9b2ad
39 a modificat fișierele cu 230 adăugiri și 172 ștergeri
  1. 3 3
      gradle.properties
  2. 1 1
      src/main/java/me/shedaniel/rei/api/RecipeCategory.java
  3. 0 10
      src/main/java/me/shedaniel/rei/client/ClientHelper.java
  4. 0 3
      src/main/java/me/shedaniel/rei/client/ConfigObject.java
  5. 37 0
      src/main/java/me/shedaniel/rei/client/ScreenHelper.java
  6. 6 7
      src/main/java/me/shedaniel/rei/client/Weather.java
  7. 69 48
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  8. 26 4
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  9. 3 3
      src/main/java/me/shedaniel/rei/gui/config/ConfigEntry.java
  10. 7 16
      src/main/java/me/shedaniel/rei/gui/config/ConfigScreen.java
  11. 4 4
      src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java
  12. 12 0
      src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java
  13. 2 7
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  14. 2 2
      src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java
  15. 7 2
      src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java
  16. 3 2
      src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java
  17. 4 4
      src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java
  18. 8 7
      src/main/java/me/shedaniel/rei/gui/widget/SpeedCraftingButtonWidget.java
  19. 1 3
      src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
  20. 0 1
      src/main/java/me/shedaniel/rei/gui/widget/Widget.java
  21. 0 16
      src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java
  22. 2 2
      src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryScreen.java
  23. 2 1
      src/main/java/me/shedaniel/rei/mixin/MixinTabGetter.java
  24. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultBlastingCategory.java
  25. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java
  26. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultCampfireCategory.java
  27. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultCraftingCategory.java
  28. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingCategory.java
  29. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultSmokingCategory.java
  30. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultStoneCuttingCategory.java
  31. 10 0
      src/main/java/me/shedaniel/rei/utils/ClothRegistry.java
  32. 0 2
      src/main/resources/assets/roughlyenoughitems/lang/en_ud.json
  33. 12 3
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  34. 0 4
      src/main/resources/assets/roughlyenoughitems/lang/et_ee.json
  35. 0 2
      src/main/resources/assets/roughlyenoughitems/lang/lol_us.json
  36. 1 5
      src/main/resources/assets/roughlyenoughitems/lang/pt_br.json
  37. 0 1
      src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json
  38. 0 1
      src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json
  39. 1 1
      src/main/resources/fabric.mod.json

+ 3 - 3
gradle.properties

@@ -1,9 +1,9 @@
-mod_version=2.4.2.68
+mod_version=2.5.0.69
 minecraft_version=19w11b
-yarn_version=19w11b.4
+yarn_version=19w11b.11
 fabric_version=0.2.3.111
 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.7
+cloth_version=0.1.1.8

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

@@ -1,8 +1,8 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.gui.RecipeViewingScreen;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;

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

@@ -16,7 +16,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.Mouse;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.client.util.InputUtil;
@@ -28,7 +27,6 @@ import net.minecraft.util.Identifier;
 import net.minecraft.util.PacketByteBuf;
 import net.minecraft.util.registry.Registry;
 
-import java.awt.*;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -54,14 +52,6 @@ public class ClientHelper implements ClientModInitializer {
         return "";
     }
     
-    public static Point getMouseLocation() {
-        MinecraftClient client = MinecraftClient.getInstance();
-        Mouse mouse = client.mouse;
-        double double_1 = mouse.getX() * (double) client.window.getScaledWidth() / (double) client.window.getWidth();
-        double double_2 = mouse.getY() * (double) client.window.getScaledHeight() / (double) client.window.getHeight();
-        return new Point((int) double_1, (int) double_2);
-    }
-    
     public static boolean isCheating() {
         return RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating;
     }

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

@@ -34,9 +34,6 @@ public class ConfigObject {
     @Comment("To disable REI's defualt plugin, don't change this unless you understand what you are doing")
     public boolean loadDefaultPlugin = true;
     
-    @Comment("Toggle the credits button")
-    public boolean disableCreditsButton = false;
-    
     @Comment("Maximum recipes viewed at one time.")
     public int maxRecipePerPage = 3;
     

+ 37 - 0
src/main/java/me/shedaniel/rei/client/ScreenHelper.java

@@ -1,18 +1,24 @@
 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;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
+import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.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 java.awt.*;
 import java.util.List;
 
 public class ScreenHelper implements ClientModInitializer {
@@ -65,6 +71,37 @@ public class ScreenHelper implements ClientModInitializer {
         return (ContainerScreenHooks) lastContainerScreen;
     }
     
+    public static void drawHoveringWidget(int x, int y, Drawable drawable, int width, int height, float delta) {
+        Window window = MinecraftClient.getInstance().window;
+        drawHoveringWidget(new Dimension(window.getScaledWidth(), window.getScaledHeight()), x, y, drawable, width, height, delta);
+    }
+    
+    public static void drawHoveringWidget(Dimension dimension, int x, int y, Drawable drawable, 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);
+    }
+    
     @Override
     public void onInitializeClient() {
         ClientTickCallback.EVENT.register(client -> {

+ 6 - 7
src/main/java/me/shedaniel/rei/client/Weather.java

@@ -1,14 +1,14 @@
 package me.shedaniel.rei.client;
 
 public enum Weather {
-    CLEAR(0, "Clear"), RAIN(1, "Rain"), THUNDER(2, "Thunder");
+    CLEAR(0, "text.rei.weather.clear"), RAIN(1, "text.rei.weather.rain"), THUNDER(2, "text.rei.weather.thunder");
     
     private final int id;
-    private final String name;
+    private final String translateKey;
     
-    Weather(int id, String name) {
+    Weather(int id, String translateKey) {
         this.id = id;
-        this.name = name;
+        this.translateKey = translateKey;
     }
     
     public static Weather byId(int int_1) {
@@ -31,8 +31,7 @@ public enum Weather {
         return id;
     }
     
-    public String getName() {
-        return name;
+    public String getTranslateKey() {
+        return translateKey;
     }
-    
 }

+ 69 - 48
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -2,11 +2,11 @@ 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.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.Weather;
-import me.shedaniel.rei.gui.credits.CreditsScreen;
 import me.shedaniel.rei.gui.widget.*;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
@@ -26,10 +26,10 @@ import net.minecraft.util.math.MathHelper;
 import net.minecraft.world.GameMode;
 
 import java.awt.*;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 public class ContainerScreenOverlay extends ScreenComponent {
@@ -45,6 +45,10 @@ public class ContainerScreenOverlay extends ScreenComponent {
     private ButtonWidget buttonLeft, buttonRight;
     private int lastLeft;
     
+    public static ItemListOverlay getItemListOverlay() {
+        return itemListOverlay;
+    }
+    
     public void onInitialized() {
         onInitialized(false);
     }
@@ -66,6 +70,15 @@ public class ContainerScreenOverlay extends ScreenComponent {
                     page = getTotalPage();
                 itemListOverlay.updateList(getItemListArea(), page, searchTerm);
             }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.previous_page"));
+            }
+            
+            @Override
+            public void setHasFocus(boolean boolean_1) {
+            }
         });
         widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + 5, 16, 16, new TranslatableTextComponent("text.rei.right_arrow")) {
             @Override
@@ -75,6 +88,15 @@ public class ContainerScreenOverlay extends ScreenComponent {
                     page = 0;
                 itemListOverlay.updateList(getItemListArea(), page, searchTerm);
             }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.next_page"));
+            }
+            
+            @Override
+            public void setHasFocus(boolean boolean_1) {
+            }
         });
         if (setPage)
             page = MathHelper.clamp(page, 0, getTotalPage());
@@ -97,24 +119,23 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 drawTexturedRect(getBounds().x + 3, getBounds().y + 3, 0, 0, 14, 14);
-                if (isHighlighted(mouseX, mouseY)) {
-                    List<String> list = new LinkedList<>(Arrays.asList(I18n.translate("text.rei.config_tooltip").split("\n")));
-                    list.add(" ");
-                    if (!ClientHelper.isCheating())
-                        list.add("§c§m" + I18n.translate("text.rei.cheating"));
-                    else
-                        list.add("§a" + I18n.translate("text.rei.cheating"));
-                    addTooltip(QueuedTooltip.create(list));
-                }
+            }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                String tooltips = I18n.translate("text.rei.config_tooltip");
+                tooltips += "\n  ";
+                if (!ClientHelper.isCheating())
+                    tooltips += "\n§c§m" + I18n.translate("text.rei.cheating");
+                else
+                    tooltips += "\n§a" + I18n.translate("text.rei.cheating");
+                return Optional.ofNullable(tooltips);
+            }
+            
+            @Override
+            public void setHasFocus(boolean boolean_1) {
             }
         });
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().disableCreditsButton)
-            widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 50 : 10, window.getScaledHeight() - 30, 40, 20, I18n.translate("text.rei.credits")) {
-                @Override
-                public void onPressed() {
-                    MinecraftClient.getInstance().openScreen(new CreditsScreen(ScreenHelper.getLastContainerScreen()));
-                }
-            });
         if (RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons) {
             widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 55 : 35, 10, 20, 20, "") {
                 @Override
@@ -126,14 +147,21 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 public void draw(int mouseX, int mouseY, float partialTicks) {
                     text = getGameModeShortText(getCurrentGameMode());
                     super.draw(mouseX, mouseY, partialTicks);
-                    if (isHighlighted(mouseX, mouseY))
-                        addTooltip(QueuedTooltip.create(I18n.translate("text.rei.gamemode_button.tooltip", getGameModeText(getNextGameMode())).split("\n")));
+                }
+                
+                @Override
+                public Optional<String> getTooltips() {
+                    return Optional.ofNullable(I18n.translate("text.rei.gamemode_button.tooltip", getGameModeText(getNextGameMode())));
+                }
+                
+                @Override
+                public void setHasFocus(boolean boolean_1) {
                 }
             });
             widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 80 : 60, 10, 20, 20, "") {
                 @Override
                 public void onPressed() {
-                    MinecraftClient.getInstance().player.sendChatMessage(RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand.replaceAll("\\{weather}", getNextWeather().getName().toLowerCase()));
+                    MinecraftClient.getInstance().player.sendChatMessage(RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand.replaceAll("\\{weather}", getNextWeather().name().toLowerCase()));
                 }
                 
                 @Override
@@ -143,8 +171,15 @@ public class ContainerScreenOverlay extends ScreenComponent {
                     MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
                     GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                     drawTexturedRect(getBounds().x + 3, getBounds().y + 3, getCurrentWeather().getId() * 14, 14, 14, 14);
-                    if (isHighlighted(mouseX, mouseY))
-                        addTooltip(QueuedTooltip.create(I18n.translate("text.rei.weather_button.tooltip", getNextWeather().getName()).split("\n")));
+                }
+                
+                @Override
+                public Optional<String> getTooltips() {
+                    return Optional.ofNullable(I18n.translate("text.rei.weather_button.tooltip", I18n.translate(getNextWeather().getTranslateKey())));
+                }
+                
+                @Override
+                public void setHasFocus(boolean boolean_1) {
                 }
             });
         }
@@ -156,6 +191,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 super.draw(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
                     addTooltip(QueuedTooltip.create(I18n.translate("text.rei.go_back_first_page").split("\n")));
+                else if (focused)
+                    ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x, y), I18n.translate("text.rei.go_back_first_page").split("\n")));
             }
             
             @Override
@@ -164,6 +201,10 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 page = 0;
                 itemListOverlay.updateList(getItemListArea(), page, searchTerm);
             }
+            
+            @Override
+            public void setHasFocus(boolean boolean_1) {
+            }
         });
         if (ScreenHelper.searchField == null)
             ScreenHelper.searchField = new TextFieldWidget(0, 0, 0, 0) {
@@ -217,38 +258,18 @@ public class ContainerScreenOverlay extends ScreenComponent {
     }
     
     private String getGameModeShortText(GameMode gameMode) {
-        switch (gameMode) {
-            case CREATIVE:
-                return "C";
-            case SURVIVAL:
-                return "S";
-            case ADVENTURE:
-                return "A";
-            case SPECTATOR:
-                return "SP";
-        }
-        return gameMode.name();
+        return I18n.translate("text.rei.short_gamemode." + gameMode.getName());
     }
     
     private String getGameModeText(GameMode gameMode) {
-        switch (gameMode) {
-            case CREATIVE:
-                return "Creative";
-            case SURVIVAL:
-                return "Survival";
-            case ADVENTURE:
-                return "Adventure";
-            case SPECTATOR:
-                return "Spectator";
-        }
-        return gameMode.name();
+        return I18n.translate("selectWorld.gameMode." + gameMode.getName());
     }
     
     private GameMode getNextGameMode() {
         try {
             GameMode current = getCurrentGameMode();
             int next = current.getId() + 1;
-            if (next >= 3)
+            if (next > 3)
                 next = 0;
             return GameMode.byId(next);
         } catch (Exception e) {
@@ -372,7 +393,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
     public boolean mouseScrolled(double i, double j, double amount) {
         if (!ScreenHelper.isOverlayVisible())
             return false;
-        if (rectangle.contains(ClientHelper.getMouseLocation())) {
+        if (rectangle.contains(ClothInitializer.clientUtils.getMouseLocation())) {
             if (amount > 0 && buttonLeft.enabled)
                 buttonLeft.onPressed();
             else if (amount < 0 && buttonRight.enabled)
@@ -399,7 +420,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
         }
         if (!ScreenHelper.isOverlayVisible())
             return false;
-        Point point = ClientHelper.getMouseLocation();
+        Point point = ClothInitializer.clientUtils.getMouseLocation();
         ItemStack itemStack = null;
         if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen)
             if (ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot() != null && !ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack().isEmpty())

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

@@ -2,6 +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.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.client.ClientHelper;
@@ -128,6 +129,11 @@ public class RecipeViewingScreen extends Screen {
                 page = 0;
                 RecipeViewingScreen.this.onInitialized();
             }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.previous_category"));
+            }
         });
         widgets.add(new ClickableLabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 7, "") {
             @Override
@@ -158,6 +164,11 @@ public class RecipeViewingScreen extends Screen {
                 page = 0;
                 RecipeViewingScreen.this.onInitialized();
             }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.next_category"));
+            }
         });
         categoryBack.enabled = categories.size() > 1;
         categoryNext.enabled = categories.size() > 1;
@@ -170,6 +181,11 @@ public class RecipeViewingScreen extends Screen {
                     page = getTotalPages(selectedCategory) - 1;
                 RecipeViewingScreen.this.onInitialized();
             }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.previous_page"));
+            }
         });
         widgets.add(new ClickableLabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 23, "") {
             @Override
@@ -197,9 +213,15 @@ public class RecipeViewingScreen extends Screen {
                     page = 0;
                 RecipeViewingScreen.this.onInitialized();
             }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.next_page"));
+            }
         });
-        recipeBack.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage();
-        recipeNext.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage();
+        int recipesPerPageByHeight = getRecipesPerPageByHeight();
+        recipeBack.enabled = categoriesMap.get(selectedCategory).size() > recipesPerPageByHeight;
+        recipeNext.enabled = categoriesMap.get(selectedCategory).size() > recipesPerPageByHeight;
         
         for(int i = 0; i < 6; i++) {
             int j = i + categoryPages * 6;
@@ -360,13 +382,13 @@ public class RecipeViewingScreen extends Screen {
         for(InputListener listener : listeners)
             if (listener.mouseScrolled(i, j, amount))
                 return true;
-        if (getBounds().contains(ClientHelper.getMouseLocation())) {
+        if (getBounds().contains(ClothInitializer.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(ClientHelper.getMouseLocation())) {
+        if ((new Rectangle(bounds.x, bounds.y - 28, bounds.width, 28)).contains(ClothInitializer.clientUtils.getMouseLocation())) {
             if (amount > 0 && categoryBack.enabled)
                 categoryBack.onPressed();
             else if (amount < 0 && categoryNext.enabled)

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

@@ -1,6 +1,6 @@
 package me.shedaniel.rei.gui.config;
 
-import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.cloth.ClothInitializer;
 import me.shedaniel.rei.gui.widget.ButtonWidget;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
 import net.minecraft.client.MinecraftClient;
@@ -33,7 +33,7 @@ public abstract class ConfigEntry extends EntryListWidget.Entry<ConfigEntry> {
         @Override
         public void draw(int entryWidth, int height, int i3, int i4, boolean isSelected, float delta) {
             Window window = MinecraftClient.getInstance().window;
-            Point mouse = ClientHelper.getMouseLocation();
+            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();
@@ -97,7 +97,7 @@ public abstract class ConfigEntry extends EntryListWidget.Entry<ConfigEntry> {
         @Override
         public void draw(int entryWidth, int height, int i3, int i4, boolean isSelected, float delta) {
             Window window = MinecraftClient.getInstance().window;
-            Point mouse = ClientHelper.getMouseLocation();
+            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);

+ 7 - 16
src/main/java/me/shedaniel/rei/gui/config/ConfigScreen.java

@@ -5,6 +5,7 @@ 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;
@@ -154,22 +155,6 @@ public class ConfigScreen extends Screen {
                 
             }
         }));
-        entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.disable_credits_button"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
-            @Override
-            public void onPressed() {
-                RoughlyEnoughItemsCore.getConfigManager().getConfig().disableCreditsButton = !RoughlyEnoughItemsCore.getConfigManager().getConfig().disableCreditsButton;
-                try {
-                    RoughlyEnoughItemsCore.getConfigManager().saveConfig();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            
-            @Override
-            public String getText() {
-                return getTrueFalseText(RoughlyEnoughItemsCore.getConfigManager().getConfig().disableCreditsButton);
-            }
-        }));
         entryListWidget.configAddEntry(new ConfigEntry.ButtonConfigEntry(new TranslatableTextComponent("text.rei.config.enable_util_buttons"), new ConfigEntry.ButtonConfigEntry.ConfigEntryButtonProvider() {
             @Override
             public void onPressed() {
@@ -320,6 +305,12 @@ public class ConfigScreen extends Screen {
                     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();
     }
     

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

@@ -2,7 +2,6 @@ package me.shedaniel.rei.gui.credits;
 
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.InputListener;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.widget.ButtonWidget;
 import net.minecraft.client.resource.language.I18n;
@@ -10,10 +9,10 @@ import net.minecraft.text.StringTextComponent;
 
 public class CreditsScreen extends Screen {
     
-    private ContainerScreen parent;
+    private Screen parent;
     private CreditsEntryListWidget entryListWidget;
     
-    public CreditsScreen(ContainerScreen parent) {
+    public CreditsScreen(Screen parent) {
         this.parent = parent;
     }
     
@@ -21,7 +20,8 @@ public class CreditsScreen extends Screen {
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (int_1 == 256 && this.doesEscapeKeyClose()) {
             this.client.openScreen(parent);
-            ScreenHelper.getLastOverlay().onInitialized();
+            if (parent instanceof ContainerScreen)
+                ScreenHelper.getLastOverlay().onInitialized();
             return true;
         }
         return super.keyPressed(int_1, int_2, int_3);

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

@@ -1,6 +1,7 @@
 package me.shedaniel.rei.gui.widget;
 
 import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.font.TextRenderer;
@@ -13,6 +14,7 @@ import net.minecraft.util.math.MathHelper;
 import java.awt.*;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 public abstract class ButtonWidget extends HighlightableWidget {
     
@@ -91,6 +93,12 @@ public abstract class ButtonWidget extends HighlightableWidget {
             }
             
             this.drawStringCentered(textRenderer, this.text, x + width / 2, y + (height - 8) / 2, colour);
+            
+            if (getTooltips().isPresent())
+                if (isHighlighted(mouseX, mouseY))
+                    ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltips().get().split("\n")));
+                else if (focused)
+                    ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x + width / 2, y + height / 2), getTooltips().get().split("\n")));
         }
     }
     
@@ -139,4 +147,8 @@ public abstract class ButtonWidget extends HighlightableWidget {
     
     public abstract void onPressed();
     
+    public Optional<String> getTooltips() {
+        return Optional.empty();
+    }
+    
 }

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

@@ -2,7 +2,6 @@ package me.shedaniel.rei.gui.widget;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
@@ -13,7 +12,6 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 
 import java.awt.*;
-import java.util.Arrays;
 
 public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     
@@ -31,6 +29,7 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     
     @Override
     public void draw(int mouseX, int mouseY, float partialTicks) {
+        GuiLighting.disable();
         super.draw(mouseX, mouseY, partialTicks);
         
         GuiLighting.enableForItems();
@@ -44,11 +43,7 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
         this.drawTexturedRect(getBounds().x, getBounds().y, (56 + (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? 0 : 20)), 202, 20, 20);
         this.zOffset = 0f;
         if (getBounds().contains(mouseX, mouseY))
-            drawTooltip();
-    }
-    
-    private void drawTooltip() {
-        ScreenHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate(RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all"))));
+            ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate(RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all")));
     }
     
 }

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

@@ -1,6 +1,6 @@
 package me.shedaniel.rei.gui.widget;
 
-import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.cloth.ClothInitializer;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.InputListener;
 import net.minecraft.client.util.Window;
@@ -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 = ClientHelper.getMouseLocation();
+        Point mouse = ClothInitializer.clientUtils.getMouseLocation();
         if (int_1 == 0) {
             if (!dragged) {
                 if (getGrabBounds().contains(mouse)) {

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

@@ -1,6 +1,7 @@
 package me.shedaniel.rei.gui.widget;
 
 import com.google.common.collect.Lists;
+import me.shedaniel.cloth.ClothInitializer;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.client.ClientHelper;
@@ -73,8 +74,8 @@ public class ItemListOverlay extends Widget {
     public void draw(int int_1, int int_2, float float_1) {
         widgets.forEach(widget -> widget.draw(int_1, int_2, float_1));
         ClientPlayerEntity player = MinecraftClient.getInstance().player;
-        if (rectangle.contains(ClientHelper.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer())
-            ScreenHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.rei.delete_items"))));
+        if (rectangle.contains(ClothInitializer.clientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer())
+            ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.delete_items")));
     }
     
     public List<Widget> getWidgets() {
@@ -132,6 +133,10 @@ public class ItemListOverlay extends Widget {
         return false;
     }
     
+    public Rectangle getListArea() {
+        return listArea;
+    }
+    
     public List<ItemStack> getCurrentDisplayed() {
         return currentDisplayed;
     }

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

@@ -2,6 +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.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
@@ -87,7 +88,7 @@ public class ItemSlotWidget extends HighlightableWidget {
     
     protected void drawToolTip(ItemStack itemStack) {
         List<String> toolTip = getTooltip(itemStack);
-        ScreenHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), toolTip));
+        ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(toolTip));
     }
     
     protected List<String> getTooltip(ItemStack itemStack) {
@@ -141,7 +142,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(ClientHelper.getMouseLocation()))
+        if (getBounds().contains(ClothInitializer.clientUtils.getMouseLocation()))
             if (ClientHelper.RECIPE.matchesKey(int_1, int_2))
                 return ClientHelper.executeRecipeKeyBind(getCurrentStack().copy());
             else if (ClientHelper.USAGE.matchesKey(int_1, int_2))

+ 4 - 4
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.rei.client.ClientHelper;
+import me.shedaniel.cloth.ClothInitializer;
 
 import java.awt.*;
 import java.util.LinkedList;
@@ -13,7 +13,7 @@ public class QueuedTooltip {
     private Point location;
     private List<String> text;
     
-    protected QueuedTooltip(Point location, List<String> text) {
+    private QueuedTooltip(Point location, List<String> text) {
         this.location = location;
         this.text = new LinkedList<>(text);
     }
@@ -27,11 +27,11 @@ public class QueuedTooltip {
     }
     
     public static QueuedTooltip create(List<String> text) {
-        return QueuedTooltip.create(ClientHelper.getMouseLocation(), text);
+        return QueuedTooltip.create(ClothInitializer.clientUtils.getMouseLocation(), text);
     }
     
     public static QueuedTooltip create(String... text) {
-        return QueuedTooltip.create(ClientHelper.getMouseLocation(), text);
+        return QueuedTooltip.create(ClothInitializer.clientUtils.getMouseLocation(), text);
     }
     
     public Point getLocation() {

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

@@ -2,13 +2,12 @@ package me.shedaniel.rei.gui.widget;
 
 import me.shedaniel.rei.api.RecipeDisplay;
 import me.shedaniel.rei.api.SpeedCraftFunctional;
-import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.resource.language.I18n;
 
 import java.awt.*;
-import java.util.Arrays;
+import java.util.Optional;
 import java.util.function.Supplier;
 
 public class SpeedCraftingButtonWidget extends ButtonWidget {
@@ -33,11 +32,13 @@ public class SpeedCraftingButtonWidget extends ButtonWidget {
     public void draw(int mouseX, int mouseY, float partialTicks) {
         this.enabled = functional != null && functional.acceptRecipe(ScreenHelper.getLastContainerScreen(), displaySupplier.get());
         super.draw(mouseX, mouseY, partialTicks);
-        if (getBounds().contains(mouseX, mouseY))
-            if (enabled)
-                ScreenHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.speed_craft.move_items"))));
-            else
-                ScreenHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.speed_craft.failed_move_items"))));
     }
     
+    @Override
+    public Optional<String> getTooltips() {
+        if (enabled)
+            return Optional.ofNullable(I18n.translate("text.speed_craft.move_items"));
+        else
+            return Optional.ofNullable(I18n.translate("text.speed_craft.failed_move_items"));
+    }
 }

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

@@ -1,7 +1,6 @@
 package me.shedaniel.rei.gui.widget;
 
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import net.minecraft.client.MinecraftClient;
@@ -11,7 +10,6 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 
 import java.awt.*;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -90,7 +88,7 @@ public class TabWidget extends HighlightableWidget {
     }
     
     private void drawTooltip() {
-        ScreenHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(categoryName)));
+        ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(categoryName));
     }
     
     @Override

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

@@ -1,7 +1,6 @@
 package me.shedaniel.rei.gui.widget;
 
 import net.minecraft.client.gui.Drawable;
-import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.ScreenComponent;
 
 public abstract class Widget extends ScreenComponent implements Drawable {

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

@@ -1,9 +1,7 @@
 package me.shedaniel.rei.mixin;
 
 import me.shedaniel.rei.api.TabGetter;
-import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
-import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
@@ -56,20 +54,6 @@ public class MixinContainerScreen extends Screen implements ContainerScreenHooks
         return focusedSlot;
     }
     
-    @Override
-    public boolean mouseScrolled(double i, double j, double double_1) {
-        if (MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen) {
-            TabGetter tabGetter = (TabGetter) MinecraftClient.getInstance().currentScreen;
-            if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
-                return super.mouseScrolled(i, j, double_1);
-        }
-        ContainerScreenOverlay overlay = ScreenHelper.getLastOverlay();
-        if (ScreenHelper.isOverlayVisible() && overlay.getRectangle().contains(ClientHelper.getMouseLocation()))
-            if (overlay.mouseScrolled(i, j, double_1))
-                return true;
-        return super.mouseScrolled(i, j, double_1);
-    }
-    
     @Inject(method = "keyPressed(III)Z", at = @At("HEAD"), cancellable = true)
     public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
         if (MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen) {

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

@@ -1,6 +1,6 @@
 package me.shedaniel.rei.mixin;
 
-import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.cloth.ClothInitializer;
 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(ClientHelper.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(i, j, amount)) {
+            if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().getRectangle().contains(ClothInitializer.clientUtils.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(i, j, amount)) {
                 ci.setReturnValue(true);
                 ci.cancel();
             }

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

@@ -8,7 +8,8 @@ import org.spongepowered.asm.mixin.Shadow;
 @Mixin(CreativePlayerInventoryScreen.class)
 public class MixinTabGetter implements TabGetter {
     
-    @Shadow private static int selectedTab;
+    @Shadow
+    private static int selectedTab;
     
     @Override
     public int rei_getSelectedTab() {

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

@@ -2,9 +2,9 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

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

@@ -2,9 +2,9 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

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

@@ -2,9 +2,9 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

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

@@ -3,9 +3,9 @@ package me.shedaniel.rei.plugin;
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

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

@@ -2,9 +2,9 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

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

@@ -2,9 +2,9 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

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

@@ -2,9 +2,9 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.gui.widget.ItemSlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;

+ 10 - 0
src/main/java/me/shedaniel/rei/utils/ClothRegistry.java

@@ -1,11 +1,13 @@
 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.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.TabGetter;
 import me.shedaniel.rei.client.RecipeHelperImpl;
 import me.shedaniel.rei.client.ScreenHelper;
+import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.client.gui.widget.RecipeBookButtonWidget;
@@ -42,6 +44,14 @@ public class ClothRegistry {
                 ScreenHelper.getLastOverlay().drawOverlay(post.getMouseX(), post.getMouseY(), post.getDelta());
             }
         }, EventPriority.LOWEST);
+        ClothHooks.CLIENT_SCREEN_MOUSE_SCROLLED.registerListener(event -> {
+            if (event.getScreen() instanceof ContainerScreen && !(event.getScreen() 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);
+            }
+        }, EventPriority.LOWEST);
     }
     
 }

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

@@ -36,7 +36,5 @@
   "text.rei.showing_all": "ll∀ ƃuᴉʍoɥS",
   "text.rei.delete_items": "§cɯǝʇI ǝʇǝlǝp",
   "text.rei.check_updates": "sǝʇɐpd∩ ʞɔǝɥƆ: ",
-  "text.rei.update_outdated": "§6¡pǝʇɐpʇno sᴉ IƎɹ\n§a%s§6: ʇuǝɹɹnƆ §a%s§6: ʇsǝʇɐ˥\n§a%s§6: ʎʇᴉɹoᴉɹԀ ǝʇɐpd∩",
-  "text.rei.update_changelog_line": "%s §6-",
   "text.rei.credits": "sʇᴉpǝɹƆ"
 }

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

@@ -55,14 +55,23 @@
   "text.rei.config.advanced": "Advanced",
   "text.rei.config.disable_recipe_book": "Disable Recipe Book:",
   "text.rei.choose_page": "Choose Page",
-  "text.rei.config.disable_credits_button": "Disable Credits Button:",
   "text.rei.config.max_recipes_per_page": "Maximum Recipes Each Page:",
   "text.rei.config.enable_util_buttons": "Enable Utils Buttons:",
   "text.rei.gamemode_button.tooltip": "Switch GameMode\n§7Switch to %s mode.",
   "text.rei.weather_button.tooltip": "Switch Weather\n§7Switch to %s.",
   "text.rei.enabled": "Yes",
   "text.rei.disabled": "No",
-
+  "text.rei.short_gamemode.survival": "S",
+  "text.rei.short_gamemode.creative": "C",
+  "text.rei.short_gamemode.adventure": "A",
+  "text.rei.short_gamemode.spectator": "SP",
+  "text.rei.weather.clear": "Clear",
+  "text.rei.weather.rain": "Rain",
+  "text.rei.weather.thunder": "Thunder",
+  "text.rei.previous_category": "Previous Category",
+  "text.rei.next_category": "Next Category",
+  "text.rei.previous_page": "Previous Page",
+  "text.rei.next_page": "Next Page",
   "_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  Hebrew - nerdoron\n  LOLCAT - Danielshe\n  Upside Down - Danielshe\n\n§lLicense\n§7Roughly Enough Items is using MIT."
+  "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."
 }

+ 0 - 4
src/main/resources/assets/roughlyenoughitems/lang/et_ee.json

@@ -55,14 +55,10 @@
   "text.rei.config.advanced": "Täpsemad",
   "text.rei.config.disable_recipe_book": "Keela retseptiraamat:",
   "text.rei.choose_page": "Vali leht",
-  "text.rei.config.disable_credits_button": "Keela tiitrite nupp:",
   "text.rei.config.max_recipes_per_page": "Maksimaalselt retsepte lehe kohta:",
   "text.rei.config.enable_util_buttons": "Luba režiimitööriistad:",
   "text.rei.gamemode_button.tooltip": "Vaheta mängurežiimi\n§7Lülita %s-režiimile.",
   "text.rei.weather_button.tooltip": "Vaheta ilma\n§7Lülita ilmale %s.",
   "text.rei.enabled": "Jah",
   "text.rei.disabled": "Ei",
-
-  "_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  Hebrew - nerdoron\n  LOLCAT - Danielshe\n  Upside Down - Danielshe\n\n§lLicense\n§7Roughly Enough Items is using MIT."
 }

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

@@ -36,7 +36,5 @@
   "text.rei.showing_all": "Sowin all",
   "text.rei.delete_items": "§cDel Itm",
   "text.rei.check_updates": "Chck Updatez: ",
-  "text.rei.update_outdated": "§6REI's 0utbat3d!\n§6Kurrant: §a%s §6Ratast: §a%s\n§6Upbate phrioriy: §a%s",
-  "text.rei.update_changelog_line": "§6- %s",
   "text.rei.credits": "Creditz"
 }

+ 1 - 5
src/main/resources/assets/roughlyenoughitems/lang/pt_br.json

@@ -55,14 +55,10 @@
   "text.rei.config.advanced": "Avançado",
   "text.rei.config.disable_recipe_book": "Desativar livro de receitas:",
   "text.rei.choose_page": "Selecionar página",
-  "text.rei.config.disable_credits_button": "Desabilitar botão de créditos:",
   "text.rei.config.max_recipes_per_page": "Quantidade máxima de receitas por página:",
   "text.rei.config.enable_util_buttons": "Habilitar botões de utilitários:",
   "text.rei.gamemode_button.tooltip": "Modo de Jogo Alterado\n§7Alterado para modo %s.",
   "text.rei.weather_button.tooltip": "Clima Alterado\n§7Alterado para %s.",
   "text.rei.enabled": "Sim",
-  "text.rei.disabled": "Não",
-
-  "_comment": "Don't change / translate the credit down below if you are doing it :)",
-  "text.rei.credit.text": "§lRoughly Enough Items\n§7Originalmente uma implementação para o MOD Almost Enough Items.\n\n§lDesenvolvedores\n  - Originalmente por ZenDarva\n  - Criado por Danielshe\n  - Plugin suporte por TehNut\n\n§lTraduções\n  English - Danielshe\n  Português do Brasil - ThiagoROX\n  Simplified Chinese - Danielshe\n  Traditional Chinese - hugoalh & Danielshe\n  French - Yanis48\n  German - MelanX\n  Estonian - Madis0\n  Hebrew - nerdoron\n  LOLCAT - Danielshe\n  Upside Down - Danielshe\n\n§lLicensa\n§7Roughly Enough Items utiliza licença MIT."
+  "text.rei.disabled": "Não"
 }

+ 0 - 1
src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json

@@ -54,7 +54,6 @@
   "text.rei.config.modules": "组件",
   "text.rei.config.advanced": "高级",
   "text.rei.choose_page": "选择页面",
-  "text.rei.config.disable_credits_button": "禁用感谢按钮:",
   "text.rei.config.max_recipes_per_page": "每页最多配方:",
   "text.rei.config.enable_util_buttons": "启用实用按钮:",
   "text.rei.gamemode_button.tooltip": "切换游戏模式\n§7切换至 %s 模式。",

+ 0 - 1
src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json

@@ -54,7 +54,6 @@
   "text.rei.config.modules": "組件",
   "text.rei.config.advanced": "高級",
   "text.rei.choose_page": "選擇頁面",
-  "text.rei.config.disable_credits_button": "禁用感謝按鈕:",
   "text.rei.config.max_recipes_per_page": "每頁最多配方:",
   "text.rei.config.enable_util_buttons": "啟用實用按鈕:",
   "text.rei.gamemode_button.tooltip": "切換遊戲模式\n§7切換至 %s 模式。",

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

@@ -2,7 +2,7 @@
   "id": "roughlyenoughitems",
   "name": "RoughlyEnoughItems",
   "description": "To allow players to view items and recipes. Version: ${version}",
-  "version": "2.4.2",
+  "version": "2.5",
   "side": "client",
   "authors": [
     "Danielshe"