Эх сурвалжийг харах

Using Cloth events instead of overwriting methods

Unknown 6 жил өмнө
parent
commit
f2119cdb55
34 өөрчлөгдсөн 270 нэмэгдсэн , 286 устгасан
  1. 2 0
      CHANGELOG.md
  2. 4 4
      gradle.properties
  3. 0 5
      src/main/java/me/shedaniel/rei/api/TabGetter.java
  4. 3 3
      src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java
  5. 0 14
      src/main/java/me/shedaniel/rei/client/ScreenHelper.java
  6. 25 18
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  7. 16 14
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  8. 6 6
      src/main/java/me/shedaniel/rei/gui/config/ItemListOrderingEntry.java
  9. 0 20
      src/main/java/me/shedaniel/rei/gui/credits/CreditsEntry.java
  10. 11 13
      src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java
  11. 24 0
      src/main/java/me/shedaniel/rei/gui/credits/CreditsItem.java
  12. 2 2
      src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java
  13. 44 51
      src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java
  14. 13 2
      src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java
  15. 11 4
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  16. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java
  17. 10 5
      src/main/java/me/shedaniel/rei/gui/widget/HighlightableWidget.java
  18. 6 10
      src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java
  19. 5 7
      src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java
  20. 3 4
      src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java
  21. 6 6
      src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java
  22. 1 2
      src/main/java/me/shedaniel/rei/gui/widget/SpeedCraftingButtonWidget.java
  23. 3 4
      src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
  24. 4 5
      src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
  25. 6 3
      src/main/java/me/shedaniel/rei/gui/widget/Widget.java
  26. 9 0
      src/main/java/me/shedaniel/rei/listeners/CreativePlayerInventoryScreenHooks.java
  27. 5 15
      src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java
  28. 1 7
      src/main/java/me/shedaniel/rei/mixin/MixinCraftingTableScreen.java
  29. 17 20
      src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryScreen.java
  30. 1 7
      src/main/java/me/shedaniel/rei/mixin/MixinPlayerInventoryScreen.java
  31. 0 19
      src/main/java/me/shedaniel/rei/mixin/MixinTabGetter.java
  32. 28 11
      src/main/java/me/shedaniel/rei/utils/ClothRegistry.java
  33. 1 1
      src/main/resources/fabric.mod.json
  34. 0 1
      src/main/resources/roughlyenoughitems.client.json

+ 2 - 0
CHANGELOG.md

@@ -1,3 +1,5 @@
+# v2.5.1.75
+- Using Cloth events instead of overwriting methods \o/ (Please update [Cloth](https://minecraft.curseforge.com/projects/cloth))
 # v2.5.1.74
 # v2.5.1.74
 - Updated to 19w13a
 - Updated to 19w13a
 # v2.5.0.73
 # v2.5.0.73

+ 4 - 4
gradle.properties

@@ -1,9 +1,9 @@
-mod_version=2.5.1.74
-minecraft_version=19w13a
-yarn_version=19w13a.3
+mod_version=2.5.1.75
+minecraft_version=19w13b
+yarn_version=19w13b.1
 fabric_version=0.2.6.117
 fabric_version=0.2.6.117
 fabricloader_version=0.3.7.109
 fabricloader_version=0.3.7.109
 pluginloader_version=1.14-1.0.6-8
 pluginloader_version=1.14-1.0.6-8
 developermode_version=1.0.3
 developermode_version=1.0.3
 jankson_version=1.1.0
 jankson_version=1.1.0
-cloth_version=0.1.4.14
+cloth_version=0.1.5.16

+ 0 - 5
src/main/java/me/shedaniel/rei/api/TabGetter.java

@@ -1,5 +0,0 @@
-package me.shedaniel.rei.api;
-
-public interface TabGetter {
-    int rei_getSelectedTab();
-}

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

@@ -167,7 +167,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         plugins.sort((first, second) -> {
         plugins.sort((first, second) -> {
             return second.getPriority() - first.getPriority();
             return second.getPriority() - first.getPriority();
         });
         });
-        RoughlyEnoughItemsCore.LOGGER.info("Loading %d REI plugins: %s", plugins.size(), String.join(", ", plugins.stream().map(plugin -> {
+        RoughlyEnoughItemsCore.LOGGER.info("[REI] Loading %d plugins: %s", plugins.size(), String.join(", ", plugins.stream().map(plugin -> {
             return RoughlyEnoughItemsCore.getPluginIdentifier(plugin).map(Identifier::toString).orElseGet(() -> "null");
             return RoughlyEnoughItemsCore.getPluginIdentifier(plugin).map(Identifier::toString).orElseGet(() -> "null");
         }).collect(Collectors.toList())));
         }).collect(Collectors.toList())));
         Collections.reverse(plugins);
         Collections.reverse(plugins);
@@ -184,8 +184,8 @@ public class RecipeHelperImpl implements RecipeHelper {
             if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_SPEED_CRAFT))
             if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_SPEED_CRAFT))
                 plugin.registerSpeedCraft(this);
                 plugin.registerSpeedCraft(this);
         });
         });
-        RoughlyEnoughItemsCore.LOGGER.info("Registered REI Categories: " + String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())));
-        RoughlyEnoughItemsCore.LOGGER.info("Registered %d recipes for REI.", recipeCount.get());
+        RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered Categories: " + String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())));
+        RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d recipes.", recipeCount.get());
     }
     }
     
     
     @Override
     @Override

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

@@ -1,7 +1,6 @@
 package me.shedaniel.rei.client;
 package me.shedaniel.rei.client;
 
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
@@ -9,9 +8,6 @@ import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.InputListener;
-import net.minecraft.client.gui.widget.ButtonWidget;
-import net.minecraft.client.gui.widget.RecipeBookButtonWidget;
 import net.minecraft.client.util.Window;
 import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
 import org.apache.logging.log4j.util.TriConsumer;
 import org.apache.logging.log4j.util.TriConsumer;
@@ -47,16 +43,6 @@ public class ScreenHelper implements ClientModInitializer {
         return getLastOverlay(false, false);
         return getLastOverlay(false, false);
     }
     }
     
     
-    public static void disableRecipeBook(ContainerScreen lastContainerScreen, List<InputListener> listeners, List<ButtonWidget> buttonWidgets) {
-        RoughlyEnoughItemsCore.LOGGER.info("%d %d", listeners.size(), buttonWidgets.size());
-        for(InputListener listener : listeners)
-            if (listener instanceof RecipeBookButtonWidget)
-                listeners.remove(listener);
-        for(ButtonWidget buttonWidget : buttonWidgets)
-            if (buttonWidget instanceof RecipeBookButtonWidget)
-                buttonWidgets.remove(buttonWidget);
-    }
-    
     public static ContainerScreen getLastContainerScreen() {
     public static ContainerScreen getLastContainerScreen() {
         return lastContainerScreen;
         return lastContainerScreen;
     }
     }

+ 25 - 18
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -10,10 +10,7 @@ import me.shedaniel.rei.client.Weather;
 import me.shedaniel.rei.gui.widget.*;
 import me.shedaniel.rei.gui.widget.*;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.audio.PositionedSoundInstance;
-import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.InputListener;
-import net.minecraft.client.gui.Screen;
-import net.minecraft.client.gui.ScreenComponent;
+import net.minecraft.client.gui.*;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
 import net.minecraft.client.util.Window;
@@ -32,7 +29,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
-public class ContainerScreenOverlay extends ScreenComponent {
+public class ContainerScreenOverlay extends AbstractParentElement implements Drawable {
     
     
     private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private static final List<QueuedTooltip> QUEUED_TOOLTIPS = Lists.newArrayList();
     private static final List<QueuedTooltip> QUEUED_TOOLTIPS = Lists.newArrayList();
@@ -189,10 +186,11 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 page = MathHelper.clamp(page, 0, getTotalPage());
                 page = MathHelper.clamp(page, 0, getTotalPage());
                 this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
                 this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
                 super.render(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)
-                    ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x, y), I18n.translate("text.rei.go_back_first_page").split("\n")));
+            }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.go_back_first_page"));
             }
             }
             
             
             @Override
             @Override
@@ -311,7 +309,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
         return rectangle;
         return rectangle;
     }
     }
     
     
-    public void drawOverlay(int mouseX, int mouseY, float partialTicks) {
+    @Override
+    public void render(int mouseX, int mouseY, float partialTicks) {
         List<ItemStack> currentStacks = ClientHelper.getInventoryItemsTypes();
         List<ItemStack> currentStacks = ClientHelper.getInventoryItemsTypes();
         if (getLeft() != lastLeft)
         if (getLeft() != lastLeft)
             onInitialized(true);
             onInitialized(true);
@@ -321,7 +320,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
         }
         }
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         GuiLighting.disable();
-        this.draw(mouseX, mouseY, partialTicks);
+        this.renderWidgets(mouseX, mouseY, partialTicks);
         GuiLighting.disable();
         GuiLighting.disable();
         Screen currentScreen = MinecraftClient.getInstance().currentScreen;
         Screen currentScreen = MinecraftClient.getInstance().currentScreen;
         if (!(currentScreen instanceof RecipeViewingScreen) || !((RecipeViewingScreen) currentScreen).choosePageActivated)
         if (!(currentScreen instanceof RecipeViewingScreen) || !((RecipeViewingScreen) currentScreen).choosePageActivated)
@@ -353,11 +352,11 @@ public class ContainerScreenOverlay extends ScreenComponent {
         QUEUED_TOOLTIPS.add(queuedTooltip);
         QUEUED_TOOLTIPS.add(queuedTooltip);
     }
     }
     
     
-    public void draw(int int_1, int int_2, float float_1) {
+    public void renderWidgets(int int_1, int int_2, float float_1) {
         if (!ScreenHelper.isOverlayVisible())
         if (!ScreenHelper.isOverlayVisible())
             return;
             return;
-        buttonLeft.enabled = itemListOverlay.getWidgets().size() > 0;
-        buttonRight.enabled = itemListOverlay.getWidgets().size() > 0;
+        buttonLeft.enabled = itemListOverlay.children().size() > 0;
+        buttonRight.enabled = itemListOverlay.children().size() > 0;
         widgets.forEach(widget -> {
         widgets.forEach(widget -> {
             GuiLighting.disable();
             GuiLighting.disable();
             widget.render(int_1, int_2, float_1);
             widget.render(int_1, int_2, float_1);
@@ -415,7 +414,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
     @Override
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (ScreenHelper.isOverlayVisible())
         if (ScreenHelper.isOverlayVisible())
-            for(InputListener listener : widgets)
+            for(Element listener : widgets)
                 if (listener.keyPressed(int_1, int_2, int_3))
                 if (listener.keyPressed(int_1, int_2, int_3))
                     return true;
                     return true;
         if (ClientHelper.HIDE.matchesKey(int_1, int_2)) {
         if (ClientHelper.HIDE.matchesKey(int_1, int_2)) {
@@ -442,14 +441,14 @@ public class ContainerScreenOverlay extends ScreenComponent {
     public boolean charTyped(char char_1, int int_1) {
     public boolean charTyped(char char_1, int int_1) {
         if (!ScreenHelper.isOverlayVisible())
         if (!ScreenHelper.isOverlayVisible())
             return false;
             return false;
-        for(InputListener listener : children())
+        for(Element listener : children())
             if (listener.charTyped(char_1, int_1))
             if (listener.charTyped(char_1, int_1))
                 return true;
                 return true;
         return super.charTyped(char_1, int_1);
         return super.charTyped(char_1, int_1);
     }
     }
     
     
     @Override
     @Override
-    public List<? extends InputListener> children() {
+    public List<? extends Element> children() {
         return widgets;
         return widgets;
     }
     }
     
     
@@ -457,7 +456,15 @@ public class ContainerScreenOverlay extends ScreenComponent {
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
         if (!ScreenHelper.isOverlayVisible())
         if (!ScreenHelper.isOverlayVisible())
             return false;
             return false;
-        return super.mouseClicked(double_1, double_2, int_1);
+        for(Element element : this.children()) {
+            if (element.mouseClicked(double_1, double_2, int_1)) {
+                this.method_20084(element);
+                if (int_1 == 0)
+                    this.setDragging(true);
+                return true;
+            }
+        }
+        return false;
     }
     }
     
     
 }
 }

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

@@ -11,7 +11,7 @@ import me.shedaniel.rei.gui.widget.*;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.resource.language.I18n;
@@ -144,10 +144,11 @@ public class RecipeViewingScreen extends Screen {
             public void render(int mouseX, int mouseY, float partialTicks) {
             public void render(int mouseX, int mouseY, float partialTicks) {
                 this.text = selectedCategory.getCategoryName();
                 this.text = selectedCategory.getCategoryName();
                 super.render(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)
-                    ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x, y), I18n.translate("text.rei.view_all_categories").split("\n")));
+            }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.view_all_categories"));
             }
             }
             
             
             @Override
             @Override
@@ -196,10 +197,11 @@ public class RecipeViewingScreen extends Screen {
             public void render(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));
                 this.text = String.format("%d/%d", page + 1, getTotalPages(selectedCategory));
                 super.render(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)
-                    ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x, y), I18n.translate("text.rei.choose_page").split("\n")));
+            }
+            
+            @Override
+            public Optional<String> getTooltips() {
+                return Optional.ofNullable(I18n.translate("text.rei.choose_page"));
             }
             }
             
             
             @Override
             @Override
@@ -331,7 +333,7 @@ public class RecipeViewingScreen extends Screen {
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         GuiLighting.disable();
         tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.render(mouseX, mouseY, delta));
         tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.render(mouseX, mouseY, delta));
-        ScreenHelper.getLastOverlay().drawOverlay(mouseX, mouseY, delta);
+        ScreenHelper.getLastOverlay().render(mouseX, mouseY, delta);
         if (choosePageActivated) {
         if (choosePageActivated) {
             blitOffset = 500.0f;
             blitOffset = 500.0f;
             this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680);
             this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680);
@@ -355,7 +357,7 @@ public class RecipeViewingScreen extends Screen {
                 return true;
                 return true;
             return false;
             return false;
         }
         }
-        for(InputListener listener : children())
+        for(Element listener : children())
             if (listener.charTyped(char_1, int_1))
             if (listener.charTyped(char_1, int_1))
                 return true;
                 return true;
         return super.charTyped(char_1, int_1);
         return super.charTyped(char_1, int_1);
@@ -383,7 +385,7 @@ public class RecipeViewingScreen extends Screen {
     
     
     @Override
     @Override
     public boolean mouseScrolled(double i, double j, double amount) {
     public boolean mouseScrolled(double i, double j, double amount) {
-        for(InputListener listener : children())
+        for(Element listener : children())
             if (listener.mouseScrolled(i, j, amount))
             if (listener.mouseScrolled(i, j, amount))
                 return true;
                 return true;
         if (getBounds().contains(ClientUtils.getMouseLocation())) {
         if (getBounds().contains(ClientUtils.getMouseLocation())) {
@@ -413,7 +415,7 @@ public class RecipeViewingScreen extends Screen {
                 init();
                 init();
                 return false;
                 return false;
             }
             }
-        for(InputListener entry : children())
+        for(Element entry : children())
             if (entry.mouseClicked(double_1, double_2, int_1)) {
             if (entry.mouseClicked(double_1, double_2, int_1)) {
                 method_20084(entry);
                 method_20084(entry);
                 if (int_1 == 0)
                 if (int_1 == 0)
@@ -424,7 +426,7 @@ public class RecipeViewingScreen extends Screen {
     }
     }
     
     
     @Override
     @Override
-    public InputListener getFocused() {
+    public Element getFocused() {
         if (choosePageActivated)
         if (choosePageActivated)
             return recipeChoosePageWidget;
             return recipeChoosePageWidget;
         return super.getFocused();
         return super.getFocused();

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

@@ -7,7 +7,7 @@ import me.shedaniel.cloth.gui.ClothConfigScreen.ListWidget;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.ItemListOrdering;
 import me.shedaniel.rei.client.ItemListOrdering;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
 import net.minecraft.client.gui.widget.ButtonWidget;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
 import net.minecraft.client.util.Window;
@@ -21,7 +21,7 @@ public class ItemListOrderingEntry extends ListEntry {
     private AtomicReference<Pair<ItemListOrdering, Boolean>> value;
     private AtomicReference<Pair<ItemListOrdering, Boolean>> value;
     private ButtonWidget buttonWidget;
     private ButtonWidget buttonWidget;
     private ButtonWidget resetButton;
     private ButtonWidget resetButton;
-    private List<InputListener> widgets;
+    private List<Element> widgets;
     
     
     public ItemListOrderingEntry(String fieldName, Pair<ItemListOrdering, Boolean> val) {
     public ItemListOrderingEntry(String fieldName, Pair<ItemListOrdering, Boolean> val) {
         super(fieldName);
         super(fieldName);
@@ -53,7 +53,7 @@ public class ItemListOrderingEntry extends ListEntry {
     }
     }
     
     
     @Override
     @Override
-    public void draw(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
+    public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
         Window window = MinecraftClient.getInstance().window;
         Window window = MinecraftClient.getInstance().window;
         this.resetButton.active = this.getDefaultValue().isPresent() && (((Pair<ItemListOrdering, Boolean>) this.getDefaultValue().get()).getKey() != this.value.get().getKey() || ((Pair<ItemListOrdering, Boolean>) this.getDefaultValue().get()).getValue().booleanValue() != this.value.get().getValue().booleanValue());
         this.resetButton.active = this.getDefaultValue().isPresent() && (((Pair<ItemListOrdering, Boolean>) this.getDefaultValue().get()).getKey() != this.value.get().getKey() || ((Pair<ItemListOrdering, Boolean>) this.getDefaultValue().get()).getValue().booleanValue() != this.value.get().getValue().booleanValue());
         this.resetButton.y = y;
         this.resetButton.y = y;
@@ -79,7 +79,7 @@ public class ItemListOrderingEntry extends ListEntry {
     }
     }
     
     
     @Override
     @Override
-    public List<? extends InputListener> children() {
+    public List<? extends Element> children() {
         return widgets;
         return widgets;
     }
     }
     
     
@@ -90,11 +90,11 @@ public class ItemListOrderingEntry extends ListEntry {
     public void setDragging(boolean b) {
     public void setDragging(boolean b) {
     }
     }
     
     
-    public InputListener getFocused() {
+    public Element getFocused() {
         return null;
         return null;
     }
     }
     
     
-    public void setFocused(InputListener inputListener) {
+    public void setFocused(Element inputListener) {
     }
     }
     
     
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
     public boolean mouseClicked(double double_1, double double_2, int int_1) {

+ 0 - 20
src/main/java/me/shedaniel/rei/gui/credits/CreditsEntry.java

@@ -1,20 +0,0 @@
-package me.shedaniel.rei.gui.credits;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.widget.EntryListWidget;
-import net.minecraft.text.TextComponent;
-
-public class CreditsEntry extends EntryListWidget.Entry<CreditsEntry> {
-    
-    private TextComponent textComponent;
-    
-    public CreditsEntry(TextComponent textComponent) {
-        this.textComponent = textComponent;
-    }
-    
-    @Override
-    public void draw(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
-        MinecraftClient.getInstance().textRenderer.drawWithShadow(textComponent.getFormattedText(), x + 5, y + 5, -1);
-    }
-    
-}

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

@@ -1,37 +1,35 @@
 package me.shedaniel.rei.gui.credits;
 package me.shedaniel.rei.gui.credits;
 
 
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.widget.EntryListWidget;
+import net.minecraft.client.gui.widget.ItemListWidget;
 
 
-public class CreditsEntryListWidget extends EntryListWidget<CreditsEntry> {
+public class CreditsEntryListWidget extends ItemListWidget<CreditsItem> {
     
     
     public CreditsEntryListWidget(MinecraftClient client, int width, int height, int startY, int endY, int entryHeight) {
     public CreditsEntryListWidget(MinecraftClient client, int width, int height, int startY, int endY, int entryHeight) {
         super(client, width, height, startY, endY, entryHeight);
         super(client, width, height, startY, endY, entryHeight);
-        field_19091 = false; // showSelection
+        visible = false; // showSelection
     }
     }
     
     
     public void creditsClearEntries() {
     public void creditsClearEntries() {
-        clearEntries();
+        clearItems();
     }
     }
     
     
-    private CreditsEntry getEntry(int int_1) {
+    private CreditsItem getEntry(int int_1) {
         return this.children().get(int_1);
         return this.children().get(int_1);
     }
     }
     
     
-    public void creditsAddEntry(CreditsEntry entry) {
-        addEntry(entry);
+    public void creditsAddEntry(CreditsItem entry) {
+        addItem(entry);
     }
     }
     
     
     @Override
     @Override
-    // getRowWidth
-    public int method_20053() {
-        return field_19083 - 80; // width
+    public int getItemWidth() {
+        return width - 80;
     }
     }
     
     
     @Override
     @Override
-    // getScrollbarPosition
-    protected int method_20078() {
-        return field_19083 - 40; // width
+    protected int getScrollbarPosition() {
+        return width - 40;
     }
     }
     
     
 }
 }

+ 24 - 0
src/main/java/me/shedaniel/rei/gui/credits/CreditsItem.java

@@ -0,0 +1,24 @@
+package me.shedaniel.rei.gui.credits;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.widget.ItemListWidget;
+import net.minecraft.text.TextComponent;
+
+public class CreditsItem extends ItemListWidget.Item<CreditsItem> {
+    
+    private String text;
+    
+    public CreditsItem(TextComponent textComponent) {
+        this(textComponent.getFormattedText());
+    }
+    
+    public CreditsItem(String text) {
+        this.text = text;
+    }
+    
+    @Override
+    public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
+        MinecraftClient.getInstance().textRenderer.drawWithShadow(text, x + 5, y + 5, -1);
+    }
+    
+}

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

@@ -34,8 +34,8 @@ public class CreditsScreen extends Screen {
         children.add(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32, 12));
         children.add(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32, 12));
         entryListWidget.creditsClearEntries();
         entryListWidget.creditsClearEntries();
         for(String line : I18n.translate("text.rei.credit.text").split("\n"))
         for(String line : I18n.translate("text.rei.credit.text").split("\n"))
-            entryListWidget.creditsAddEntry(new CreditsEntry(new StringTextComponent(line)));
-        entryListWidget.creditsAddEntry(new CreditsEntry(new StringTextComponent("")));
+            entryListWidget.creditsAddEntry(new CreditsItem(new StringTextComponent(line)));
+        entryListWidget.creditsAddEntry(new CreditsItem(new StringTextComponent("")));
         children.add(buttonDone = new ButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) {
         children.add(buttonDone = new ButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) {
             @Override
             @Override
             public void onPressed() {
             public void onPressed() {

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

@@ -2,10 +2,9 @@ package me.shedaniel.rei.gui.widget;
 
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
-import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.AbstractButtonWidget;
 import net.minecraft.client.gui.widget.AbstractButtonWidget;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.text.TextComponent;
 import net.minecraft.text.TextComponent;
@@ -20,7 +19,6 @@ public abstract class ButtonWidget extends HighlightableWidget {
     
     
     public String text;
     public String text;
     public boolean enabled;
     public boolean enabled;
-    public boolean visible;
     public boolean focused;
     public boolean focused;
     private Rectangle bounds;
     private Rectangle bounds;
     
     
@@ -31,7 +29,6 @@ public abstract class ButtonWidget extends HighlightableWidget {
     public ButtonWidget(Rectangle rectangle, String text) {
     public ButtonWidget(Rectangle rectangle, String text) {
         this.bounds = rectangle;
         this.bounds = rectangle;
         this.enabled = true;
         this.enabled = true;
-        this.visible = true;
         this.text = text;
         this.text = text;
     }
     }
     
     
@@ -60,72 +57,68 @@ public abstract class ButtonWidget extends HighlightableWidget {
     
     
     @Override
     @Override
     public void render(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.WIDGETS_LOCATION);
-            GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-            int textureOffset = this.getTextureId(isHovered(mouseX, mouseY));
-            GlStateManager.enableBlend();
-            GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
-            GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
-            //Four Corners
-            this.blit(x, y, 0, 46 + textureOffset * 20, 4, 4);
-            this.blit(x + width - 4, y, 196, 46 + textureOffset * 20, 4, 4);
-            this.blit(x, y + height - 4, 0, 62 + textureOffset * 20, 4, 4);
-            this.blit(x + width - 4, y + height - 4, 196, 62 + textureOffset * 20, 4, 4);
-            
-            //Sides
-            this.blit(x + 4, y, 4, 46 + textureOffset * 20, width - 8, 4);
-            this.blit(x + 4, y + height - 4, 4, 62 + textureOffset * 20, width - 8, 4);
-            
-            for(int i = y + 4; i < y + height - 4; i += 4) {
-                this.blit(x, i, 0, 50 + textureOffset * 20, width / 2, MathHelper.clamp(y + height - 4 - i, 0, 4));
-                this.blit(x + width / 2, i, 200 - width / 2, 50 + textureOffset * 20, width / 2, MathHelper.clamp(y + height - 4 - i, 0, 4));
-            }
-            
-            int colour = 14737632;
-            if (!this.enabled) {
-                colour = 10526880;
-            } else if (isHovered(mouseX, mouseY)) {
-                colour = 16777120;
-            }
-            
-            this.drawCenteredString(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")));
+        int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;
+        TextRenderer textRenderer = minecraft.textRenderer;
+        minecraft.getTextureManager().bindTexture(AbstractButtonWidget.WIDGETS_LOCATION);
+        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        int textureOffset = this.getTextureId(isHovered(mouseX, mouseY));
+        GlStateManager.enableBlend();
+        GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
+        GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
+        //Four Corners
+        this.blit(x, y, 0, 46 + textureOffset * 20, 4, 4);
+        this.blit(x + width - 4, y, 196, 46 + textureOffset * 20, 4, 4);
+        this.blit(x, y + height - 4, 0, 62 + textureOffset * 20, 4, 4);
+        this.blit(x + width - 4, y + height - 4, 196, 62 + textureOffset * 20, 4, 4);
+        
+        //Sides
+        this.blit(x + 4, y, 4, 46 + textureOffset * 20, width - 8, 4);
+        this.blit(x + 4, y + height - 4, 4, 62 + textureOffset * 20, width - 8, 4);
+        
+        for(int i = y + 4; i < y + height - 4; i += 4) {
+            this.blit(x, i, 0, 50 + textureOffset * 20, width / 2, MathHelper.clamp(y + height - 4 - i, 0, 4));
+            this.blit(x + width / 2, i, 200 - width / 2, 50 + textureOffset * 20, width / 2, MathHelper.clamp(y + height - 4 - i, 0, 4));
         }
         }
+        
+        int colour = 14737632;
+        if (!this.enabled) {
+            colour = 10526880;
+        } else if (isHovered(mouseX, mouseY)) {
+            colour = 16777120;
+        }
+        
+        this.drawCenteredString(textRenderer, this.text, x + width / 2, y + (height - 8) / 2, colour);
+        
+        if (getTooltips().isPresent())
+            if (!focused && 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")));
     }
     }
     
     
     public boolean isHovered(int mouseX, int mouseY) {
     public boolean isHovered(int mouseX, int mouseY) {
-        return bounds.contains(mouseX, mouseY) || focused;
+        return isMouseOver(mouseX, mouseY) || focused;
     }
     }
     
     
     @Override
     @Override
     public boolean isPartOfFocusCycle() {
     public boolean isPartOfFocusCycle() {
-        return visible && enabled;
+        return enabled;
     }
     }
     
     
     @Override
     @Override
     public void onFocusChanged(boolean boolean_1, boolean boolean_2) {
     public void onFocusChanged(boolean boolean_1, boolean boolean_2) {
-        if (boolean_2)
-            focused = boolean_1;
+        focused = boolean_2;
     }
     }
     
     
     @Override
     @Override
-    public List<? extends InputListener> children() {
+    public List<? extends Element> children() {
         return Collections.emptyList();
         return Collections.emptyList();
     }
     }
     
     
     @Override
     @Override
     public boolean mouseClicked(double mouseX, double mouseY, int button) {
     public boolean mouseClicked(double mouseX, double mouseY, int button) {
         if (bounds.contains(mouseX, mouseY) && enabled && button == 0) {
         if (bounds.contains(mouseX, mouseY) && enabled && button == 0) {
-            MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
+            minecraft.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
             onPressed();
             onPressed();
             return true;
             return true;
         }
         }
@@ -134,11 +127,11 @@ public abstract class ButtonWidget extends HighlightableWidget {
     
     
     @Override
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
     public boolean keyPressed(int int_1, int int_2, int int_3) {
-        if (this.enabled && this.visible) {
+        if (this.enabled) {
             if (int_1 != 257 && int_1 != 32 && int_1 != 335) {
             if (int_1 != 257 && int_1 != 32 && int_1 != 335) {
                 return false;
                 return false;
             } else {
             } else {
-                MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
+                minecraft.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
                 this.onPressed();
                 this.onPressed();
                 return true;
                 return true;
             }
             }

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

@@ -1,6 +1,9 @@
 package me.shedaniel.rei.gui.widget;
 package me.shedaniel.rei.gui.widget;
 
 
+import me.shedaniel.rei.client.ScreenHelper;
+
 import java.awt.*;
 import java.awt.*;
+import java.util.Optional;
 
 
 public abstract class ClickableLabelWidget extends LabelWidget {
 public abstract class ClickableLabelWidget extends LabelWidget {
     
     
@@ -17,6 +20,11 @@ public abstract class ClickableLabelWidget extends LabelWidget {
         if (isHovered(mouseX, mouseY))
         if (isHovered(mouseX, mouseY))
             colour = hoveredColor;
             colour = hoveredColor;
         drawCenteredString(textRenderer, (isHovered(mouseX, mouseY) ? "§n" : "") + text, x, y, colour);
         drawCenteredString(textRenderer, (isHovered(mouseX, mouseY) ? "§n" : "") + text, x, y, colour);
+        if (getTooltips().isPresent())
+            if (!focused && isHighlighted(mouseX, mouseY))
+                ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltips().get().split("\n")));
+            else if (focused)
+                ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x, y), getTooltips().get().split("\n")));
     }
     }
     
     
     @Override
     @Override
@@ -28,6 +36,10 @@ public abstract class ClickableLabelWidget extends LabelWidget {
         return false;
         return false;
     }
     }
     
     
+    public Optional<String> getTooltips() {
+        return Optional.empty();
+    }
+    
     @Override
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (int_1 != 257 && int_1 != 32 && int_1 != 335) {
         if (int_1 != 257 && int_1 != 32 && int_1 != 335) {
@@ -49,8 +61,7 @@ public abstract class ClickableLabelWidget extends LabelWidget {
     
     
     @Override
     @Override
     public void onFocusChanged(boolean boolean_1, boolean boolean_2) {
     public void onFocusChanged(boolean boolean_1, boolean boolean_2) {
-        if (boolean_2)
-            focused = boolean_1;
+        focused = boolean_2;
     }
     }
     
     
     public abstract void onLabelClicked();
     public abstract void onLabelClicked();

+ 11 - 4
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 com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.block.Blocks;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.GuiLighting;
@@ -12,6 +11,7 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.Identifier;
 
 
 import java.awt.*;
 import java.awt.*;
+import java.util.Optional;
 
 
 public abstract class CraftableToggleButtonWidget extends ButtonWidget {
 public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     
     
@@ -20,7 +20,7 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     
     
     public CraftableToggleButtonWidget(Rectangle rectangle) {
     public CraftableToggleButtonWidget(Rectangle rectangle) {
         super(rectangle, "");
         super(rectangle, "");
-        this.itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+        this.itemRenderer = minecraft.getItemRenderer();
     }
     }
     
     
     public CraftableToggleButtonWidget(int x, int y, int width, int height) {
     public CraftableToggleButtonWidget(int x, int y, int width, int height) {
@@ -42,8 +42,15 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
         this.blitOffset = 100f;
         this.blitOffset = 100f;
         this.blit(getBounds().x, getBounds().y, (56 + (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? 0 : 20)), 202, 20, 20);
         this.blit(getBounds().x, getBounds().y, (56 + (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? 0 : 20)), 202, 20, 20);
         this.blitOffset = 0f;
         this.blitOffset = 0f;
-        if (getBounds().contains(mouseX, mouseY))
-            ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate(RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all")));
     }
     }
     
     
+    @Override
+    public boolean isPartOfFocusCycle() {
+        return false;
+    }
+    
+    @Override
+    public Optional<String> getTooltips() {
+        return Optional.ofNullable(I18n.translate(RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all"));
+    }
 }
 }

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.gui.widget;
 
 
 import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.cloth.api.ClientUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.Element;
 import net.minecraft.client.util.Window;
 import net.minecraft.client.util.Window;
 
 
 import java.awt.*;
 import java.awt.*;
@@ -51,7 +51,7 @@ public abstract class DraggableWidget extends HighlightableWidget {
             }
             }
             return true;
             return true;
         }
         }
-        for(InputListener listener : children())
+        for(Element listener : children())
             if (listener.mouseDragged(double_1, double_2, int_1, double_3, double_4))
             if (listener.mouseDragged(double_1, double_2, int_1, double_3, double_4))
                 return true;
                 return true;
         return false;
         return false;
@@ -67,7 +67,7 @@ public abstract class DraggableWidget extends HighlightableWidget {
                 onMouseReleaseMidPoint(getMidPoint());
                 onMouseReleaseMidPoint(getMidPoint());
                 return true;
                 return true;
             }
             }
-        for(InputListener listener : children())
+        for(Element listener : children())
             if (listener.mouseReleased(double_1, double_2, int_1))
             if (listener.mouseReleased(double_1, double_2, int_1))
                 return true;
                 return true;
         return false;
         return false;

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

@@ -6,16 +6,21 @@ public abstract class HighlightableWidget extends Widget {
     
     
     abstract public Shape getBounds();
     abstract public Shape getBounds();
     
     
-    public boolean isHighlighted(int mouseX, int mouseY) {
-        return getBounds().contains(mouseX, mouseY);
+    public final boolean isHighlighted(int mouseX, int mouseY) {
+        return isHighlighted((double) mouseX, (double) mouseY);
     }
     }
     
     
-    public boolean isHighlighted(Point point) {
-        return this.isHighlighted(point.x, point.y);
+    public final boolean isHighlighted(Point point) {
+        return isHighlighted(point.x, point.y);
     }
     }
     
     
     public boolean isHighlighted(double mouseX, double mouseY) {
     public boolean isHighlighted(double mouseX, double mouseY) {
-        return this.isHighlighted((int) mouseX, (int) mouseY);
+        return getBounds().contains(mouseX, mouseY);
+    }
+    
+    @Override
+    public boolean isMouseOver(double double_1, double double_2) {
+        return isHighlighted(double_1, double_2);
     }
     }
     
     
 }
 }

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

@@ -73,15 +73,11 @@ public class ItemListOverlay extends Widget {
     @Override
     @Override
     public void render(int int_1, int int_2, float 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));
         widgets.forEach(widget -> widget.render(int_1, int_2, float_1));
-        ClientPlayerEntity player = MinecraftClient.getInstance().player;
-        if (rectangle.contains(ClientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer())
+        ClientPlayerEntity player = minecraft.player;
+        if (rectangle.contains(ClientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && minecraft.isInSingleplayer())
             ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.delete_items")));
             ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.delete_items")));
     }
     }
     
     
-    public List<Widget> getWidgets() {
-        return widgets;
-    }
-    
     public void updateList(Rectangle bounds, int page, String searchTerm) {
     public void updateList(Rectangle bounds, int page, String searchTerm) {
         this.rectangle = bounds;
         this.rectangle = bounds;
         this.widgets = Lists.newLinkedList();
         this.widgets = Lists.newLinkedList();
@@ -98,7 +94,7 @@ public class ItemListOverlay extends Widget {
             ItemSlotWidget slotWidget = new ItemSlotWidget((int) (startX + (i % width) * 18), (int) (startY + MathHelper.floor(i / width) * 18), Collections.singletonList(currentDisplayed.get(j)), false, true, true) {
             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
                 @Override
                 protected void drawToolTip(ItemStack itemStack, float delta) {
                 protected void drawToolTip(ItemStack itemStack, float delta) {
-                    ClientPlayerEntity player = MinecraftClient.getInstance().player;
+                    ClientPlayerEntity player = minecraft.player;
                     if (!ClientHelper.isCheating() || player.inventory.getCursorStack().isEmpty())
                     if (!ClientHelper.isCheating() || player.inventory.getCursorStack().isEmpty())
                         super.drawToolTip(itemStack, delta);
                         super.drawToolTip(itemStack, delta);
                 }
                 }
@@ -245,12 +241,12 @@ public class ItemListOverlay extends Widget {
     @Override
     @Override
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
         if (rectangle.contains(double_1, double_2)) {
         if (rectangle.contains(double_1, double_2)) {
-            ClientPlayerEntity player = MinecraftClient.getInstance().player;
-            if (ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer()) {
+            ClientPlayerEntity player = minecraft.player;
+            if (ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && minecraft.isInSingleplayer()) {
                 ClientHelper.sendDeletePacket();
                 ClientHelper.sendDeletePacket();
                 return true;
                 return true;
             }
             }
-            if (!player.inventory.getCursorStack().isEmpty() && MinecraftClient.getInstance().isInSingleplayer())
+            if (!player.inventory.getCursorStack().isEmpty() && minecraft.isInSingleplayer())
                 return false;
                 return false;
             for(Widget widget : children())
             for(Widget widget : children())
                 if (widget.mouseClicked(double_1, double_2, int_1))
                 if (widget.mouseClicked(double_1, double_2, int_1))

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

@@ -5,8 +5,7 @@ import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.Element;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
@@ -46,7 +45,7 @@ public class ItemSlotWidget extends HighlightableWidget {
     }
     }
     
     
     @Override
     @Override
-    public List<? extends InputListener> children() {
+    public List<? extends Element> children() {
         return Collections.emptyList();
         return Collections.emptyList();
     }
     }
     
     
@@ -62,7 +61,7 @@ public class ItemSlotWidget extends HighlightableWidget {
     public void render(int mouseX, int mouseY, float delta) {
     public void render(int mouseX, int mouseY, float delta) {
         final ItemStack itemStack = getCurrentStack();
         final ItemStack itemStack = getCurrentStack();
         if (drawBackground) {
         if (drawBackground) {
-            MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
+            minecraft.getTextureManager().bindTexture(RECIPE_GUI);
             blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
             blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
         }
         }
         if (drawHighlightedBackground && isHighlighted(mouseX, mouseY)) {
         if (drawHighlightedBackground && isHighlighted(mouseX, mouseY)) {
@@ -76,10 +75,10 @@ public class ItemSlotWidget extends HighlightableWidget {
         }
         }
         if (!itemStack.isEmpty()) {
         if (!itemStack.isEmpty()) {
             GuiLighting.enableForItems();
             GuiLighting.enableForItems();
-            ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+            ItemRenderer itemRenderer = minecraft.getItemRenderer();
             itemRenderer.zOffset = 200.0F;
             itemRenderer.zOffset = 200.0F;
             itemRenderer.renderGuiItem(itemStack, x, y);
             itemRenderer.renderGuiItem(itemStack, x, y);
-            itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, itemStack, x, y, getItemCountOverlay(itemStack));
+            itemRenderer.renderGuiItemOverlay(minecraft.textRenderer, itemStack, x, y, getItemCountOverlay(itemStack));
             itemRenderer.zOffset = 0.0F;
             itemRenderer.zOffset = 0.0F;
         }
         }
         if (!itemStack.isEmpty() && isHighlighted(mouseX, mouseY) && showToolTips)
         if (!itemStack.isEmpty() && isHighlighted(mouseX, mouseY) && showToolTips)
@@ -92,7 +91,6 @@ public class ItemSlotWidget extends HighlightableWidget {
     
     
     protected List<String> getTooltip(ItemStack itemStack) {
     protected List<String> getTooltip(ItemStack itemStack) {
         final String modString = "§9§o" + ClientHelper.getModFromItemStack(itemStack);
         final String modString = "§9§o" + ClientHelper.getModFromItemStack(itemStack);
-        MinecraftClient mc = MinecraftClient.getInstance();
         List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack));
         List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack));
         toolTip.addAll(getExtraToolTips(itemStack));
         toolTip.addAll(getExtraToolTips(itemStack));
         for(String s : Lists.newArrayList(toolTip))
         for(String s : Lists.newArrayList(toolTip))

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

@@ -1,8 +1,7 @@
 package me.shedaniel.rei.gui.widget;
 package me.shedaniel.rei.gui.widget;
 
 
-import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.InputListener;
+import net.minecraft.client.gui.Element;
 
 
 import java.awt.*;
 import java.awt.*;
 import java.util.Collections;
 import java.util.Collections;
@@ -19,7 +18,7 @@ public class LabelWidget extends HighlightableWidget {
         this.x = x;
         this.x = x;
         this.y = y;
         this.y = y;
         this.text = text;
         this.text = text;
-        this.textRenderer = MinecraftClient.getInstance().textRenderer;
+        this.textRenderer = minecraft.textRenderer;
     }
     }
     
     
     @Override
     @Override
@@ -29,7 +28,7 @@ public class LabelWidget extends HighlightableWidget {
     }
     }
     
     
     @Override
     @Override
-    public List<? extends InputListener> children() {
+    public List<? extends Element> children() {
         return Collections.emptyList();
         return Collections.emptyList();
     }
     }
     
     

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

@@ -59,7 +59,7 @@ public class RecipeChoosePageWidget extends DraggableWidget {
     }
     }
     
     
     @Override
     @Override
-    public boolean isHighlighted(int mouseX, int mouseY) {
+    public boolean isHighlighted(double mouseX, double mouseY) {
         return getBounds().contains(mouseX, mouseY) || new Rectangle(bounds.x + bounds.width - 50, bounds.y + bounds.height - 3, 50, 36).contains(mouseX, mouseY);
         return getBounds().contains(mouseX, mouseY) || new Rectangle(bounds.x + bounds.width - 50, bounds.y + bounds.height - 3, 50, 36).contains(mouseX, mouseY);
     }
     }
     
     
@@ -90,14 +90,14 @@ public class RecipeChoosePageWidget extends DraggableWidget {
             
             
             @Override
             @Override
             public void render(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);
+                minecraft.textRenderer.draw(I18n.translate("text.rei.choose_page"), bounds.x + 5, bounds.y + 5, 4210752);
                 String endString = String.format(" /%d", maxPage);
                 String endString = String.format(" /%d", maxPage);
-                int width = MinecraftClient.getInstance().textRenderer.getStringWidth(endString);
-                MinecraftClient.getInstance().textRenderer.draw(endString, bounds.x + bounds.width - 5 - width, bounds.y + 22, 4210752);
+                int width = minecraft.textRenderer.getStringWidth(endString);
+                minecraft.textRenderer.draw(endString, bounds.x + bounds.width - 5 - width, bounds.y + 22, 4210752);
             }
             }
         });
         });
         String endString = String.format(" /%d", maxPage);
         String endString = String.format(" /%d", maxPage);
-        int width = MinecraftClient.getInstance().textRenderer.getStringWidth(endString);
+        int width = minecraft.textRenderer.getStringWidth(endString);
         this.widgets.add(textFieldWidget = new TextFieldWidget(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18));
         this.widgets.add(textFieldWidget = new TextFieldWidget(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18));
         textFieldWidget.stripInvaild = s -> {
         textFieldWidget.stripInvaild = s -> {
             StringBuilder stringBuilder_1 = new StringBuilder();
             StringBuilder stringBuilder_1 = new StringBuilder();
@@ -177,7 +177,7 @@ public class RecipeChoosePageWidget extends DraggableWidget {
     @Override
     @Override
     public void onMouseReleaseMidPoint(Point midPoint) {
     public void onMouseReleaseMidPoint(Point midPoint) {
         ConfigManager configManager = RoughlyEnoughItemsCore.getConfigManager();
         ConfigManager configManager = RoughlyEnoughItemsCore.getConfigManager();
-        Window window = MinecraftClient.getInstance().window;
+        Window window = minecraft.window;
         configManager.getConfig().choosePageDialogPoint = new RelativePoint(midPoint.getX() / window.getScaledWidth(), midPoint.getY() / window.getScaledHeight());
         configManager.getConfig().choosePageDialogPoint = new RelativePoint(midPoint.getX() / window.getScaledWidth(), midPoint.getY() / window.getScaledHeight());
         try {
         try {
             configManager.saveConfig();
             configManager.saveConfig();

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

@@ -3,7 +3,6 @@ package me.shedaniel.rei.gui.widget;
 import me.shedaniel.rei.api.RecipeDisplay;
 import me.shedaniel.rei.api.RecipeDisplay;
 import me.shedaniel.rei.api.SpeedCraftFunctional;
 import me.shedaniel.rei.api.SpeedCraftFunctional;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
-import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.resource.language.I18n;
 
 
 import java.awt.*;
 import java.awt.*;
@@ -23,7 +22,7 @@ public class SpeedCraftingButtonWidget extends ButtonWidget {
     
     
     @Override
     @Override
     public void onPressed() {
     public void onPressed() {
-        MinecraftClient.getInstance().openScreen(ScreenHelper.getLastContainerScreen());
+        minecraft.openScreen(ScreenHelper.getLastContainerScreen());
         ScreenHelper.getLastOverlay().onInitialized();
         ScreenHelper.getLastOverlay().onInitialized();
         functional.performAutoCraft(ScreenHelper.getLastContainerScreen(), displaySupplier.get());
         functional.performAutoCraft(ScreenHelper.getLastContainerScreen(), displaySupplier.get());
     }
     }

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

@@ -3,7 +3,6 @@ package me.shedaniel.rei.gui.widget;
 import com.mojang.blaze3d.platform.GlStateManager;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
-import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
@@ -29,7 +28,7 @@ public class TabWidget extends HighlightableWidget {
         this.id = id;
         this.id = id;
         this.recipeViewingWidget = recipeViewingWidget;
         this.recipeViewingWidget = recipeViewingWidget;
         this.bounds = bounds;
         this.bounds = bounds;
-        this.itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+        this.itemRenderer = minecraft.getItemRenderer();
     }
     }
     
     
     public void setItem(ItemStack item, String categoryName, boolean selected) {
     public void setItem(ItemStack item, String categoryName, boolean selected) {
@@ -72,13 +71,13 @@ public class TabWidget extends HighlightableWidget {
             
             
             GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
             GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
             GuiLighting.disable();
             GuiLighting.disable();
-            MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
+            minecraft.getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
             this.blit(bounds.x, bounds.y + 2, selected ? 28 : 0, 192, 28, (selected ? 30 : 27));
             this.blit(bounds.x, bounds.y + 2, selected ? 28 : 0, 192, 28, (selected ? 30 : 27));
             this.blitOffset = 100.0F;
             this.blitOffset = 100.0F;
             this.itemRenderer.zOffset = 100.0F;
             this.itemRenderer.zOffset = 100.0F;
             GuiLighting.enableForItems();
             GuiLighting.enableForItems();
             this.itemRenderer.renderGuiItem(getItemStack(), l, i1);
             this.itemRenderer.renderGuiItem(getItemStack(), l, i1);
-            this.itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, getItemStack(), l, i1);
+            this.itemRenderer.renderGuiItemOverlay(minecraft.textRenderer, getItemStack(), l, i1);
             GlStateManager.disableLighting();
             GlStateManager.disableLighting();
             this.itemRenderer.zOffset = 0.0F;
             this.itemRenderer.zOffset = 0.0F;
             this.blitOffset = 0.0F;
             this.blitOffset = 0.0F;

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

@@ -3,7 +3,6 @@ package me.shedaniel.rei.gui.widget;
 import com.google.common.base.Predicates;
 import com.google.common.base.Predicates;
 import com.mojang.blaze3d.platform.GlStateManager;
 import com.mojang.blaze3d.platform.GlStateManager;
 import net.minecraft.SharedConstants;
 import net.minecraft.SharedConstants;
-import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.BufferBuilder;
@@ -56,7 +55,7 @@ public class TextFieldWidget extends HighlightableWidget {
         this.renderTextProvider = (string_1, integer_1) -> {
         this.renderTextProvider = (string_1, integer_1) -> {
             return string_1;
             return string_1;
         };
         };
-        this.textRenderer = MinecraftClient.getInstance().textRenderer;
+        this.textRenderer = minecraft.textRenderer;
         this.bounds = rectangle;
         this.bounds = rectangle;
         this.stripInvaild = s -> SharedConstants.stripInvalidChars(s);
         this.stripInvaild = s -> SharedConstants.stripInvalidChars(s);
     }
     }
@@ -270,16 +269,16 @@ public class TextFieldWidget extends HighlightableWidget {
                 this.method_1884(0);
                 this.method_1884(0);
                 return true;
                 return true;
             } else if (Screen.isCopy(int_1)) {
             } else if (Screen.isCopy(int_1)) {
-                MinecraftClient.getInstance().keyboard.setClipboard(this.getSelectedText());
+                minecraft.keyboard.setClipboard(this.getSelectedText());
                 return true;
                 return true;
             } else if (Screen.isPaste(int_1)) {
             } else if (Screen.isPaste(int_1)) {
                 if (this.editable) {
                 if (this.editable) {
-                    this.addText(MinecraftClient.getInstance().keyboard.getClipboard());
+                    this.addText(minecraft.keyboard.getClipboard());
                 }
                 }
                 
                 
                 return true;
                 return true;
             } else if (Screen.isCut(int_1)) {
             } else if (Screen.isCut(int_1)) {
-                MinecraftClient.getInstance().keyboard.setClipboard(this.getSelectedText());
+                minecraft.keyboard.setClipboard(this.getSelectedText());
                 if (this.editable) {
                 if (this.editable) {
                     this.addText("");
                     this.addText("");
                 }
                 }

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

@@ -1,8 +1,11 @@
 package me.shedaniel.rei.gui.widget;
 package me.shedaniel.rei.gui.widget;
 
 
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.AbstractParentElement;
 import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.gui.Drawable;
-import net.minecraft.client.gui.ScreenComponent;
-
-public abstract class Widget extends ScreenComponent implements Drawable {
 
 
+public abstract class Widget extends AbstractParentElement implements Drawable {
+    
+    protected final MinecraftClient minecraft = MinecraftClient.getInstance();
+    
 }
 }

+ 9 - 0
src/main/java/me/shedaniel/rei/listeners/CreativePlayerInventoryScreenHooks.java

@@ -0,0 +1,9 @@
+package me.shedaniel.rei.listeners;
+
+public interface CreativePlayerInventoryScreenHooks {
+    int rei_getSelectedTab();
+    
+    boolean rei_doRenderScrollBar();
+    
+    boolean rei_getField2888();
+}

+ 5 - 15
src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java

@@ -1,9 +1,8 @@
 package me.shedaniel.rei.mixin;
 package me.shedaniel.rei.mixin;
 
 
-import me.shedaniel.rei.api.TabGetter;
+import me.shedaniel.rei.listeners.CreativePlayerInventoryScreenHooks;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
-import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
@@ -59,11 +58,11 @@ public class MixinContainerScreen extends Screen implements ContainerScreenHooks
         return focusedSlot;
         return focusedSlot;
     }
     }
     
     
-    @Inject(method = "keyPressed(III)Z", at = @At("HEAD"), cancellable = true, remap = false)
+    @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) {
     public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
-        if (MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen) {
-            TabGetter tabGetter = (TabGetter) MinecraftClient.getInstance().currentScreen;
-            if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
+        if (minecraft.currentScreen instanceof CreativePlayerInventoryScreen) {
+            CreativePlayerInventoryScreenHooks creativePlayerInventoryScreenHooks = (CreativePlayerInventoryScreenHooks) minecraft.currentScreen;
+            if (creativePlayerInventoryScreenHooks.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                 return;
                 return;
         }
         }
         if (ScreenHelper.getLastOverlay().keyPressed(int_1, int_2, int_3)) {
         if (ScreenHelper.getLastOverlay().keyPressed(int_1, int_2, int_3)) {
@@ -72,13 +71,4 @@ 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);
-    }
-    
 }
 }

+ 1 - 7
src/main/java/me/shedaniel/rei/mixin/MixinCraftingTableScreen.java

@@ -1,7 +1,6 @@
 package me.shedaniel.rei.mixin;
 package me.shedaniel.rei.mixin;
 
 
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.InputListener;
 import net.minecraft.client.gui.container.CraftingTableScreen;
 import net.minecraft.client.gui.container.CraftingTableScreen;
 import net.minecraft.client.gui.recipebook.RecipeBookGui;
 import net.minecraft.client.gui.recipebook.RecipeBookGui;
 import net.minecraft.container.Container;
 import net.minecraft.container.Container;
@@ -25,12 +24,7 @@ public abstract class MixinCraftingTableScreen extends ContainerScreen {
         super(container_1, playerInventory_1, textComponent_1);
         super(container_1, playerInventory_1, textComponent_1);
     }
     }
     
     
-    @Override
-    public InputListener getFocused() {
-        return super.getFocused();
-    }
-    
-    @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true, remap = false)
+    @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
     public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> ci) {
     public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> ci) {
         if (recipeBookGui.mouseClicked(mouseX, mouseY, button)) {
         if (recipeBookGui.mouseClicked(mouseX, mouseY, button)) {
             method_20084(recipeBookGui);
             method_20084(recipeBookGui);

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

@@ -1,7 +1,7 @@
 package me.shedaniel.rei.mixin;
 package me.shedaniel.rei.mixin;
 
 
-import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
+import me.shedaniel.rei.listeners.CreativePlayerInventoryScreenHooks;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.entity.player.PlayerInventory;
@@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
 
 @Mixin(CreativePlayerInventoryScreen.class)
 @Mixin(CreativePlayerInventoryScreen.class)
-public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerInventoryScreen<CreativePlayerInventoryScreen.CreativeContainer> {
+public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerInventoryScreen<CreativePlayerInventoryScreen.CreativeContainer> implements CreativePlayerInventoryScreenHooks {
     
     
     @Shadow
     @Shadow
     private static int selectedTab;
     private static int selectedTab;
@@ -28,16 +28,22 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
     @Shadow
     @Shadow
     protected abstract boolean doRenderScrollBar();
     protected abstract boolean doRenderScrollBar();
     
     
-    @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true, remap = false)
-    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(ClientUtils.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(i, j, amount)) {
-                ci.setReturnValue(true);
-                ci.cancel();
-            }
+    @Override
+    public int rei_getSelectedTab() {
+        return selectedTab;
+    }
+    
+    @Override
+    public boolean rei_doRenderScrollBar() {
+        return doRenderScrollBar();
+    }
+    
+    @Override
+    public boolean rei_getField2888() {
+        return field_2888;
     }
     }
     
     
-    @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true, remap = false)
+    @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true)
     public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
     public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
         if (selectedTab == ItemGroup.INVENTORY.getIndex())
         if (selectedTab == ItemGroup.INVENTORY.getIndex())
             if (ScreenHelper.getLastOverlay().keyPressed(int_1, int_2, int_3)) {
             if (ScreenHelper.getLastOverlay().keyPressed(int_1, int_2, int_3)) {
@@ -46,16 +52,7 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
             }
             }
     }
     }
     
     
-    @Inject(method = "charTyped", at = @At("HEAD"), cancellable = true, remap = false)
-    public void charTyped(char char_1, int int_1, CallbackInfoReturnable<Boolean> ci) {
-        if (!this.field_2888 && selectedTab == ItemGroup.INVENTORY.getIndex())
-            if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().charTyped(char_1, int_1)) {
-                ci.setReturnValue(true);
-                ci.cancel();
-            }
-    }
-    
-    @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true, remap = false)
+    @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
     public void mouseClicked(double i, double j, int k, CallbackInfoReturnable<Boolean> ci) {
     public void mouseClicked(double i, double j, int k, CallbackInfoReturnable<Boolean> ci) {
         if (selectedTab == ItemGroup.INVENTORY.getIndex())
         if (selectedTab == ItemGroup.INVENTORY.getIndex())
             if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(i, j, k)) {
             if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(i, j, k)) {

+ 1 - 7
src/main/java/me/shedaniel/rei/mixin/MixinPlayerInventoryScreen.java

@@ -1,6 +1,5 @@
 package me.shedaniel.rei.mixin;
 package me.shedaniel.rei.mixin;
 
 
-import net.minecraft.client.gui.InputListener;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.PlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.PlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.RecipeBookProvider;
 import net.minecraft.client.gui.ingame.RecipeBookProvider;
@@ -26,12 +25,7 @@ public abstract class MixinPlayerInventoryScreen extends AbstractPlayerInventory
         super(container_1, playerInventory_1, textComponent_1);
         super(container_1, playerInventory_1, textComponent_1);
     }
     }
     
     
-    @Override
-    public InputListener getFocused() {
-        return super.getFocused();
-    }
-    
-    @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true, remap = false)
+    @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
     public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> ci) {
     public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> ci) {
         if (recipeBook.mouseClicked(mouseX, mouseY, button)) {
         if (recipeBook.mouseClicked(mouseX, mouseY, button)) {
             method_20084(recipeBook);
             method_20084(recipeBook);

+ 0 - 19
src/main/java/me/shedaniel/rei/mixin/MixinTabGetter.java

@@ -1,19 +0,0 @@
-package me.shedaniel.rei.mixin;
-
-import me.shedaniel.rei.api.TabGetter;
-import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-
-@Mixin(CreativePlayerInventoryScreen.class)
-public class MixinTabGetter implements TabGetter {
-    
-    @Shadow
-    private static int selectedTab;
-    
-    @Override
-    public int rei_getSelectedTab() {
-        return selectedTab;
-    }
-    
-}

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

@@ -9,11 +9,11 @@ import me.shedaniel.cloth.gui.entries.IntegerListEntry;
 import me.shedaniel.cloth.gui.entries.StringListEntry;
 import me.shedaniel.cloth.gui.entries.StringListEntry;
 import me.shedaniel.cloth.hooks.ClothClientHooks;
 import me.shedaniel.cloth.hooks.ClothClientHooks;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.TabGetter;
 import me.shedaniel.rei.client.RecipeHelperImpl;
 import me.shedaniel.rei.client.RecipeHelperImpl;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.config.ItemListOrderingEntry;
 import me.shedaniel.rei.gui.config.ItemListOrderingEntry;
+import me.shedaniel.rei.listeners.CreativePlayerInventoryScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.Screen;
@@ -39,8 +39,8 @@ public class ClothRegistry {
         ClothClientHooks.SCREEN_INIT_POST.register((minecraftClient, screen, screenHooks) -> {
         ClothClientHooks.SCREEN_INIT_POST.register((minecraftClient, screen, screenHooks) -> {
             if (screen instanceof ContainerScreen) {
             if (screen instanceof ContainerScreen) {
                 if (screen instanceof CreativePlayerInventoryScreen) {
                 if (screen instanceof CreativePlayerInventoryScreen) {
-                    TabGetter tabGetter = (TabGetter) screen;
-                    if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
+                    CreativePlayerInventoryScreenHooks creativePlayerInventoryScreenHooks = (CreativePlayerInventoryScreenHooks) screen;
+                    if (creativePlayerInventoryScreenHooks.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                         return;
                         return;
                 }
                 }
                 ScreenHelper.setLastContainerScreen((ContainerScreen) screen);
                 ScreenHelper.setLastContainerScreen((ContainerScreen) screen);
@@ -50,20 +50,37 @@ public class ClothRegistry {
         ClothClientHooks.SCREEN_RENDER_POST.register((minecraftClient, screen, i, i1, v) -> {
         ClothClientHooks.SCREEN_RENDER_POST.register((minecraftClient, screen, i, i1, v) -> {
             if (screen instanceof ContainerScreen) {
             if (screen instanceof ContainerScreen) {
                 if (screen instanceof CreativePlayerInventoryScreen) {
                 if (screen instanceof CreativePlayerInventoryScreen) {
-                    TabGetter tabGetter = (TabGetter) screen;
-                    if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
+                    CreativePlayerInventoryScreenHooks creativePlayerInventoryScreenHooks = (CreativePlayerInventoryScreenHooks) screen;
+                    if (creativePlayerInventoryScreenHooks.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                         return;
                         return;
                 }
                 }
-                ScreenHelper.getLastOverlay().drawOverlay(i, i1, v);
+                ScreenHelper.getLastOverlay().render(i, i1, v);
             }
             }
         });
         });
         ClothClientHooks.SCREEN_MOUSE_SCROLLED.register((minecraftClient, screen, v, v1, v2) -> {
         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(ClientUtils.getMouseLocation()))
-                    if (overlay.mouseScrolled(v, v1, v2))
+            if (screen instanceof ContainerScreen)
+                if (screen instanceof CreativePlayerInventoryScreen) {
+                    if (((CreativePlayerInventoryScreenHooks) screen).rei_doRenderScrollBar())
+                        return ActionResult.PASS;
+                    if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().getRectangle().contains(ClientUtils.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(v, v1, v2))
                         return ActionResult.SUCCESS;
                         return ActionResult.SUCCESS;
-            }
+                } else {
+                    ContainerScreenOverlay overlay = ScreenHelper.getLastOverlay();
+                    if (ScreenHelper.isOverlayVisible() && ContainerScreenOverlay.getItemListOverlay().getListArea().contains(ClientUtils.getMouseLocation()))
+                        if (overlay.mouseScrolled(v, v1, v2))
+                            return ActionResult.SUCCESS;
+                }
+            return ActionResult.PASS;
+        });
+        ClothClientHooks.SCREEN_CHAR_TYPED.register((minecraftClient, screen, character, keyCode) -> {
+            if (screen instanceof ContainerScreen)
+                if (screen instanceof CreativePlayerInventoryScreen) {
+                    if (((CreativePlayerInventoryScreenHooks) screen).rei_getField2888() || ((CreativePlayerInventoryScreenHooks) screen).rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
+                        return ActionResult.PASS;
+                    if (ScreenHelper.getLastOverlay().charTyped(character, keyCode))
+                        return ActionResult.SUCCESS;
+                } else if (ScreenHelper.getLastOverlay().charTyped(character, keyCode))
+                    return ActionResult.SUCCESS;
             return ActionResult.PASS;
             return ActionResult.PASS;
         });
         });
     }
     }

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

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

+ 0 - 1
src/main/resources/roughlyenoughitems.client.json

@@ -9,7 +9,6 @@
     "MixinCraftingTableScreen",
     "MixinCraftingTableScreen",
     "MixinCreativePlayerInventoryScreen",
     "MixinCreativePlayerInventoryScreen",
     "MixinBrewingRecipeRegistry",
     "MixinBrewingRecipeRegistry",
-    "MixinTabGetter",
     "MixinRecipeBookGui"
     "MixinRecipeBookGui"
   ],
   ],
   "injectors": {
   "injectors": {