Browse Source

Fixed Lots of bugs

Unknown 6 years ago
parent
commit
c0dd3fc336

+ 1 - 1
build.gradle

@@ -6,7 +6,7 @@ sourceCompatibility = 1.8
 targetCompatibility = 1.8
 
 archivesBaseName = "RoughlyEnoughItems"
-version = "2.0.0.29"
+version = "2.0.0.30"
 
 minecraft {
 }

+ 29 - 0
src/main/java/me/shedaniel/rei/client/GuiHelper.java

@@ -0,0 +1,29 @@
+package me.shedaniel.rei.client;
+
+import me.shedaniel.rei.gui.ContainerGuiOverlay;
+import me.shedaniel.rei.gui.widget.TextFieldWidget;
+import net.minecraft.client.gui.ContainerGui;
+
+public class GuiHelper {
+    
+    private static ContainerGuiOverlay overlay;
+    public static TextFieldWidget searchField;
+    
+    public static ContainerGuiOverlay getOverlay(ContainerGui lastGui) {
+        if (overlay == null) {
+            overlay = new ContainerGuiOverlay(lastGui);
+            overlay.onInitialized();
+        }
+        return overlay;
+    }
+    
+    public static void setOverlay(ContainerGuiOverlay overlay) {
+        GuiHelper.overlay = overlay;
+        overlay.onInitialized();
+    }
+    
+    public static void resetOverlay() {
+        overlay = null;
+    }
+    
+}

+ 25 - 17
src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java

@@ -1,15 +1,14 @@
 package me.shedaniel.rei.gui;
 
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.gui.widget.*;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerGui;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiEventListener;
-import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
@@ -21,16 +20,15 @@ import java.util.List;
 
 public class ContainerGuiOverlay extends Gui {
     
+    public static String searchTerm = "";
     private static int page = 0;
     private final List<IWidget> widgets;
     private final List<QueuedTooltip> queuedTooltips;
     private Rectangle rectangle;
     private IMixinContainerGui containerGui;
     private Window window;
-    private ItemListOverlay itemListOverlay;
+    private static ItemListOverlay itemListOverlay;
     private ButtonWidget buttonLeft, buttonRight;
-    private TextFieldWidget searchField;
-    public static String searchTerm= "";
     
     public ContainerGuiOverlay(ContainerGui containerGui) {
         this.queuedTooltips = new ArrayList<>();
@@ -87,17 +85,28 @@ public class ContainerGuiOverlay extends Gui {
                 super.draw(mouseX, mouseY, partialTicks);
             }
         });
-        Rectangle textFieldArea = getTextFieldArea();
-        this.listeners.add(searchField = new TextFieldWidget(-1, MinecraftClient.getInstance().fontRenderer,
-                (int) textFieldArea.getX(), (int) textFieldArea.getY(), (int) textFieldArea.getWidth(), (int) textFieldArea.getHeight()) {
-            @Override
-            public void addText(String string_1) {
-                super.addText(string_1);
-                searchTerm = this.getText();
-                itemListOverlay.updateList(page, searchTerm);
-            }
-        });
-        searchField.setText(searchTerm);
+//        Rectangle textFieldArea = getTextFieldArea();
+//        this.widgets.add(searchField = new TextFieldWidget(-1, MinecraftClient.getInstance().fontRenderer,
+//                (int) textFieldArea.getX(), (int) textFieldArea.getY(), (int) textFieldArea.getWidth(), (int) textFieldArea.getHeight()) {
+//            @Override
+//            public void addText(String string_1) {
+//                super.addText(string_1);
+//                searchTerm = this.getText();
+//                itemListOverlay.updateList(page, searchTerm);
+//            }
+//        });
+        if (GuiHelper.searchField == null)
+            GuiHelper.searchField = new TextFieldWidget(0, 0, 0, 0) {
+                @Override
+                public void addText(String string_1) {
+                    super.addText(string_1);
+                    searchTerm = this.getText();
+                    itemListOverlay.updateList(page, searchTerm);
+                }
+            };
+        GuiHelper.searchField.setBounds(getTextFieldArea());
+        this.widgets.add(GuiHelper.searchField);
+        GuiHelper.searchField.setText(searchTerm);
         
         this.listeners.addAll(widgets);
     }
@@ -130,7 +139,6 @@ public class ContainerGuiOverlay extends Gui {
         queuedTooltips.forEach(queuedTooltip -> containerGui.getContainerGui().drawTooltip(queuedTooltip.text, queuedTooltip.mouse.x, queuedTooltip.mouse.y));
         queuedTooltips.clear();
         GuiLighting.disable();
-        searchField.render(mouseX, mouseY, partialTicks);
     }
     
     public void addTooltip(QueuedTooltip queuedTooltip) {

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

@@ -2,10 +2,7 @@ package me.shedaniel.rei.gui.widget;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.client.REIItemListOrdering;
-import me.shedaniel.rei.client.RecipeHelper;
-import me.shedaniel.rei.client.SearchArgument;
+import me.shedaniel.rei.client.*;
 import me.shedaniel.rei.listeners.ClientLoaded;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
@@ -49,7 +46,7 @@ public class ItemListOverlay extends Drawable implements IWidget {
         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())
-            containerGui.getOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.rei.delete_items"))));
+            GuiHelper.getOverlay(containerGui.getContainerGui()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.rei.delete_items"))));
     }
     
     public void updateList(int page, String searchTerm) {
@@ -90,9 +87,9 @@ public class ItemListOverlay extends Drawable implements IWidget {
                             }
                         } else {
                             if (button == 0)
-                                return ClientHelper.executeRecipeKeyBind(containerGui.getOverlay(), getCurrentStack().copy(), containerGui);
+                                return ClientHelper.executeRecipeKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
                             else if (button == 1)
-                                return ClientHelper.executeUsageKeyBind(containerGui.getOverlay(), getCurrentStack().copy(), containerGui);
+                                return ClientHelper.executeUsageKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
                         }
                     }
                     return false;

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

@@ -3,6 +3,7 @@ package me.shedaniel.rei.gui.widget;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Drawable;
@@ -81,7 +82,7 @@ public class ItemSlotWidget extends Drawable implements HighlightableWidget {
     
     protected void drawToolTip(ItemStack itemStack) {
         List<String> toolTip = getTooltip(itemStack);
-        containerGui.getOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), toolTip));
+        GuiHelper.getOverlay(containerGui.getContainerGui()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), toolTip));
     }
     
     protected List<String> getTooltip(ItemStack itemStack) {
@@ -120,9 +121,9 @@ public class ItemSlotWidget extends Drawable implements HighlightableWidget {
             return false;
         if (getBounds().contains(mouseX, mouseY)) {
             if (button == 0)
-                return ClientHelper.executeRecipeKeyBind(containerGui.getOverlay(), getCurrentStack().copy(), containerGui);
+                return ClientHelper.executeRecipeKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
             else if (button == 1)
-                return ClientHelper.executeUsageKeyBind(containerGui.getOverlay(), getCurrentStack().copy(), containerGui);
+                return ClientHelper.executeUsageKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
         }
         return false;
     }

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

@@ -5,7 +5,7 @@ import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.IRecipeCategory;
 import me.shedaniel.rei.api.IRecipeDisplay;
 import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.gui.ContainerGuiOverlay;
+import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
@@ -36,7 +36,6 @@ public class RecipeViewingWidget extends Gui {
     private List<IRecipeCategory> categories;
     private IRecipeCategory selectedCategory;
     private IMixinContainerGui parent;
-    private ContainerGuiOverlay overlay;
     private int page, categoryPages;
     private ButtonWidget recipeBack, recipeNext, categoryBack, categoryNext;
     
@@ -50,7 +49,6 @@ public class RecipeViewingWidget extends Gui {
         this.categories = new LinkedList<>(categoriesMap.keySet());
         Collections.reverse(categories);
         this.selectedCategory = categories.get(0);
-        this.overlay = parent.getOverlay();
         this.tabs = new ArrayList<>();
     }
     
@@ -58,10 +56,6 @@ public class RecipeViewingWidget extends Gui {
         return parent;
     }
     
-    public ContainerGuiOverlay getOverlay() {
-        return overlay;
-    }
-    
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (int_1 == 256 && this.doesEscapeKeyClose()) {
@@ -76,7 +70,7 @@ public class RecipeViewingWidget extends Gui {
     
     @Override
     public void onClosed() {
-        parent.setOverlay(overlay);
+        GuiHelper.resetOverlay();
     }
     
     @Override
@@ -178,10 +172,10 @@ public class RecipeViewingWidget extends Gui {
                 widgets.addAll(selectedCategory.setupDisplay(getParent(), middleDisplay, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 108, 150, 66)));
             }
         }
-        
-        overlay.onInitialized();
+    
+        GuiHelper.getOverlay(parent.getContainerGui()).onInitialized();
         listeners.addAll(tabs);
-        listeners.add(overlay);
+        listeners.add(GuiHelper.getOverlay(parent.getContainerGui()));
         listeners.addAll(widgets);
     }
     
@@ -206,7 +200,7 @@ public class RecipeViewingWidget extends Gui {
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
-        overlay.render(mouseX, mouseY, partialTicks);
+        GuiHelper.getOverlay(parent.getContainerGui()).render(mouseX, mouseY, partialTicks);
     }
     
     @Override

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

@@ -3,6 +3,7 @@ package me.shedaniel.rei.gui.widget;
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.rei.client.GuiHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.render.GuiLighting;
@@ -89,7 +90,7 @@ public class TabWidget extends Drawable implements HighlightableWidget {
     }
     
     private void drawTooltip() {
-        recipeViewingWidget.getParent().getOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(categoryName)));
+        GuiHelper.getOverlay(recipeViewingWidget.getParent().getContainerGui()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(categoryName)));
     }
     
     @Override

+ 601 - 0
src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java

@@ -0,0 +1,601 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.google.common.base.Predicates;
+import com.mojang.blaze3d.platform.GlStateManager;
+import net.minecraft.SharedConstants;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.FontRenderer;
+import net.minecraft.client.gui.Drawable;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexFormats;
+import net.minecraft.util.math.MathHelper;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class TextFieldWidget extends Drawable implements IWidget {
+    
+    private final FontRenderer fontRenderer;
+    private int width;
+    private int height;
+    private int x;
+    private int y;
+    private String text;
+    private int maxLength;
+    private int focusedTicks;
+    private boolean hasBorder;
+    private boolean field_2096;
+    private boolean focused;
+    private boolean editable;
+    private boolean field_17037;
+    private int field_2103;
+    private int cursorMax;
+    private int cursorMin;
+    private int field_2100;
+    private int field_2098;
+    private boolean visible;
+    private String suggestion;
+    private Consumer<String> changedListener;
+    private Predicate<String> textPredicate;
+    private BiFunction<String, Integer, String> field_2099;
+    
+    public TextFieldWidget(Rectangle rectangle) {
+        this(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+    }
+    
+    public void setBounds(Rectangle rectangle) {
+        this.x = rectangle.x;
+        this.y = rectangle.y;
+        this.width = rectangle.width;
+        this.height = rectangle.height;
+    }
+    
+    public TextFieldWidget(int x, int y, int width, int height) {
+        this.text = "";
+        this.maxLength = 32;
+        this.hasBorder = true;
+        this.field_2096 = true;
+        this.editable = true;
+        this.field_2100 = 14737632;
+        this.field_2098 = 7368816;
+        this.visible = true;
+        this.textPredicate = Predicates.alwaysTrue();
+        this.field_2099 = (string_1, integer_1) -> {
+            return string_1;
+        };
+        this.fontRenderer = MinecraftClient.getInstance().fontRenderer;
+        this.x = x;
+        this.y = y;
+        this.width = width;
+        this.height = height;
+    }
+    
+    public void setChangedListener(Consumer<String> biConsumer_1) {
+        this.changedListener = biConsumer_1;
+    }
+    
+    public void method_1854(BiFunction<String, Integer, String> biFunction_1) {
+        this.field_2099 = biFunction_1;
+    }
+    
+    public void tick() {
+        ++this.focusedTicks;
+    }
+    
+    public String getText() {
+        return this.text;
+    }
+    
+    public void setText(String string_1) {
+        if (this.textPredicate.test(string_1)) {
+            if (string_1.length() > this.maxLength) {
+                this.text = string_1.substring(0, this.maxLength);
+            } else {
+                this.text = string_1;
+            }
+            
+            this.onChanged(string_1);
+            this.method_1872();
+        }
+    }
+    
+    public String getSelectedText() {
+        int int_1 = this.cursorMax < this.cursorMin ? this.cursorMax : this.cursorMin;
+        int int_2 = this.cursorMax < this.cursorMin ? this.cursorMin : this.cursorMax;
+        return this.text.substring(int_1, int_2);
+    }
+    
+    public void method_1890(Predicate<String> predicate_1) {
+        this.textPredicate = predicate_1;
+    }
+    
+    public void addText(String string_1) {
+        String string_2 = "";
+        String string_3 = SharedConstants.stripInvalidChars(string_1);
+        int int_1 = this.cursorMax < this.cursorMin ? this.cursorMax : this.cursorMin;
+        int int_2 = this.cursorMax < this.cursorMin ? this.cursorMin : this.cursorMax;
+        int int_3 = this.maxLength - this.text.length() - (int_1 - int_2);
+        if (!this.text.isEmpty()) {
+            string_2 = string_2 + this.text.substring(0, int_1);
+        }
+        
+        int int_5;
+        if (int_3 < string_3.length()) {
+            string_2 = string_2 + string_3.substring(0, int_3);
+            int_5 = int_3;
+        } else {
+            string_2 = string_2 + string_3;
+            int_5 = string_3.length();
+        }
+        
+        if (!this.text.isEmpty() && int_2 < this.text.length()) {
+            string_2 = string_2 + this.text.substring(int_2);
+        }
+        
+        if (this.textPredicate.test(string_2)) {
+            this.text = string_2;
+            this.setCursor(int_1 + int_5);
+            this.method_1884(this.cursorMax);
+            this.onChanged(this.text);
+        }
+    }
+    
+    public void onChanged(String string_1) {
+        if (this.changedListener != null) {
+            this.changedListener.accept(string_1);
+        }
+        
+    }
+    
+    private void method_16873(int int_1) {
+        if (Gui.isControlPressed()) {
+            this.method_1877(int_1);
+        } else {
+            this.method_1878(int_1);
+        }
+        
+    }
+    
+    public void method_1877(int int_1) {
+        if (!this.text.isEmpty()) {
+            if (this.cursorMin != this.cursorMax) {
+                this.addText("");
+            } else {
+                this.method_1878(this.method_1853(int_1) - this.cursorMax);
+            }
+        }
+    }
+    
+    public void method_1878(int int_1) {
+        if (!this.text.isEmpty()) {
+            if (this.cursorMin != this.cursorMax) {
+                this.addText("");
+            } else {
+                boolean boolean_1 = int_1 < 0;
+                int int_2 = boolean_1 ? this.cursorMax + int_1 : this.cursorMax;
+                int int_3 = boolean_1 ? this.cursorMax : this.cursorMax + int_1;
+                String string_1 = "";
+                if (int_2 >= 0) {
+                    string_1 = this.text.substring(0, int_2);
+                }
+                
+                if (int_3 < this.text.length()) {
+                    string_1 = string_1 + this.text.substring(int_3);
+                }
+                
+                if (this.textPredicate.test(string_1)) {
+                    this.text = string_1;
+                    if (boolean_1) {
+                        this.moveCursor(int_1);
+                    }
+                    
+                    this.onChanged(this.text);
+                }
+            }
+        }
+    }
+    
+    public int method_1853(int int_1) {
+        return this.method_1869(int_1, this.getCursor());
+    }
+    
+    public int method_1869(int int_1, int int_2) {
+        return this.method_1864(int_1, int_2, true);
+    }
+    
+    public int method_1864(int int_1, int int_2, boolean boolean_1) {
+        int int_3 = int_2;
+        boolean boolean_2 = int_1 < 0;
+        int int_4 = Math.abs(int_1);
+        
+        for(int int_5 = 0; int_5 < int_4; ++int_5) {
+            if (!boolean_2) {
+                int int_6 = this.text.length();
+                int_3 = this.text.indexOf(32, int_3);
+                if (int_3 == -1) {
+                    int_3 = int_6;
+                } else {
+                    while (boolean_1 && int_3 < int_6 && this.text.charAt(int_3) == ' ') {
+                        ++int_3;
+                    }
+                }
+            } else {
+                while (boolean_1 && int_3 > 0 && this.text.charAt(int_3 - 1) == ' ') {
+                    --int_3;
+                }
+                
+                while (int_3 > 0 && this.text.charAt(int_3 - 1) != ' ') {
+                    --int_3;
+                }
+            }
+        }
+        
+        return int_3;
+    }
+    
+    public void moveCursor(int int_1) {
+        this.method_1883(this.cursorMax + int_1);
+    }
+    
+    public void method_1883(int int_1) {
+        this.setCursor(int_1);
+        if (!this.field_17037) {
+            this.method_1884(this.cursorMax);
+        }
+        
+        this.onChanged(this.text);
+    }
+    
+    public void method_1870() {
+        this.method_1883(0);
+    }
+    
+    public void method_1872() {
+        this.method_1883(this.text.length());
+    }
+    
+    public boolean keyPressed(int int_1, int int_2, int int_3) {
+        if (this.isVisible() && this.isFocused()) {
+            this.field_17037 = Gui.isShiftPressed();
+            if (Gui.isSelectAllShortcutPressed(int_1)) {
+                this.method_1872();
+                this.method_1884(0);
+                return true;
+            } else if (Gui.isCopyShortcutPressed(int_1)) {
+                MinecraftClient.getInstance().keyboard.setClipboard(this.getSelectedText());
+                return true;
+            } else if (Gui.isPasteShortcutPressed(int_1)) {
+                if (this.editable) {
+                    this.addText(MinecraftClient.getInstance().keyboard.getClipboard());
+                }
+                
+                return true;
+            } else if (Gui.isCutShortcutPressed(int_1)) {
+                MinecraftClient.getInstance().keyboard.setClipboard(this.getSelectedText());
+                if (this.editable) {
+                    this.addText("");
+                }
+                
+                return true;
+            } else {
+                switch (int_1) {
+                    case 259:
+                        if (this.editable) {
+                            this.method_16873(-1);
+                        }
+                        
+                        return true;
+                    case 260:
+                    case 264:
+                    case 265:
+                    case 266:
+                    case 267:
+                    default:
+                        return int_1 != 256;
+                    case 261:
+                        if (this.editable) {
+                            this.method_16873(1);
+                        }
+                        
+                        return true;
+                    case 262:
+                        if (Gui.isControlPressed()) {
+                            this.method_1883(this.method_1853(1));
+                        } else {
+                            this.moveCursor(1);
+                        }
+                        
+                        return true;
+                    case 263:
+                        if (Gui.isControlPressed()) {
+                            this.method_1883(this.method_1853(-1));
+                        } else {
+                            this.moveCursor(-1);
+                        }
+                        
+                        return true;
+                    case 268:
+                        this.method_1870();
+                        return true;
+                    case 269:
+                        this.method_1872();
+                        return true;
+                }
+            }
+        } else {
+            return false;
+        }
+    }
+    
+    public boolean charTyped(char char_1, int int_1) {
+        if (this.isVisible() && this.isFocused()) {
+            if (SharedConstants.isValidChar(char_1)) {
+                if (this.editable) {
+                    this.addText(Character.toString(char_1));
+                }
+                
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+    
+    @Override
+    public List<IWidget> getListeners() {
+        return new ArrayList<>();
+    }
+    
+    public boolean mouseClicked(double double_1, double double_2, int int_1) {
+        if (!this.isVisible()) {
+            return false;
+        } else {
+            boolean boolean_1 = double_1 >= (double) this.x && double_1 < (double) (this.x + this.width) && double_2 >= (double) this.y && double_2 < (double) (this.y + this.height);
+            if (this.field_2096) {
+                this.setFocused(boolean_1);
+            }
+            
+            if (this.focused && boolean_1 && int_1 == 0) {
+                int int_2 = MathHelper.floor(double_1) - this.x;
+                if (this.hasBorder) {
+                    int_2 -= 4;
+                }
+                
+                String string_1 = this.fontRenderer.method_1714(this.text.substring(this.field_2103), this.method_1859());
+                this.method_1883(this.fontRenderer.method_1714(string_1, int_2).length() + this.field_2103);
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+    
+    public void draw(int int_1, int int_2, float float_1) {
+        if (this.isVisible()) {
+            if (this.hasBorder()) {
+                drawRect(this.x - 1, this.y - 1, this.x + this.width + 1, this.y + this.height + 1, -6250336);
+                drawRect(this.x, this.y, this.x + this.width, this.y + this.height, -16777216);
+            }
+            
+            int int_3 = this.editable ? this.field_2100 : this.field_2098;
+            int int_4 = this.cursorMax - this.field_2103;
+            int int_5 = this.cursorMin - this.field_2103;
+            String string_1 = this.fontRenderer.method_1714(this.text.substring(this.field_2103), this.method_1859());
+            boolean boolean_1 = int_4 >= 0 && int_4 <= string_1.length();
+            boolean boolean_2 = this.focused && this.focusedTicks / 6 % 2 == 0 && boolean_1;
+            int int_6 = this.hasBorder ? this.x + 4 : this.x;
+            int int_7 = this.hasBorder ? this.y + (this.height - 8) / 2 : this.y;
+            int int_8 = int_6;
+            if (int_5 > string_1.length()) {
+                int_5 = string_1.length();
+            }
+            
+            if (!string_1.isEmpty()) {
+                String string_2 = boolean_1 ? string_1.substring(0, int_4) : string_1;
+                int_8 = this.fontRenderer.drawWithShadow((String) this.field_2099.apply(string_2, this.field_2103), (float) int_6, (float) int_7, int_3);
+            }
+            
+            boolean boolean_3 = this.cursorMax < this.text.length() || this.text.length() >= this.getMaxLength();
+            int int_9 = int_8;
+            if (!boolean_1) {
+                int_9 = int_4 > 0 ? int_6 + this.width : int_6;
+            } else if (boolean_3) {
+                int_9 = int_8 - 1;
+                --int_8;
+            }
+            
+            if (!string_1.isEmpty() && boolean_1 && int_4 < string_1.length()) {
+                this.fontRenderer.drawWithShadow((String) this.field_2099.apply(string_1.substring(int_4), this.cursorMax), (float) int_8, (float) int_7, int_3);
+            }
+            
+            if (!boolean_3 && this.suggestion != null) {
+                this.fontRenderer.drawWithShadow(this.suggestion, (float) (int_9 - 1), (float) int_7, -8355712);
+            }
+            
+            int var10002;
+            int var10003;
+            if (boolean_2) {
+                if (boolean_3) {
+                    int var10001 = int_7 - 1;
+                    var10002 = int_9 + 1;
+                    var10003 = int_7 + 1;
+                    this.fontRenderer.getClass();
+                    Drawable.drawRect(int_9, var10001, var10002, var10003 + 9, -3092272);
+                } else {
+                    this.fontRenderer.drawWithShadow("_", (float) int_9, (float) int_7, int_3);
+                }
+            }
+            
+            if (int_5 != int_4) {
+                int int_10 = int_6 + this.fontRenderer.getStringWidth(string_1.substring(0, int_5));
+                var10002 = int_7 - 1;
+                var10003 = int_10 - 1;
+                int var10004 = int_7 + 1;
+                this.fontRenderer.getClass();
+                this.method_1886(int_9, var10002, var10003, var10004 + 9);
+            }
+            
+        }
+    }
+    
+    private void method_1886(int int_1, int int_2, int int_3, int int_4) {
+        int int_6;
+        if (int_1 < int_3) {
+            int_6 = int_1;
+            int_1 = int_3;
+            int_3 = int_6;
+        }
+        
+        if (int_2 < int_4) {
+            int_6 = int_2;
+            int_2 = int_4;
+            int_4 = int_6;
+        }
+        
+        if (int_3 > this.x + this.width) {
+            int_3 = this.x + this.width;
+        }
+        
+        if (int_1 > this.x + this.width) {
+            int_1 = this.x + this.width;
+        }
+        
+        Tessellator tessellator_1 = Tessellator.getInstance();
+        BufferBuilder bufferBuilder_1 = tessellator_1.getBufferBuilder();
+        GlStateManager.color4f(0.0F, 0.0F, 255.0F, 255.0F);
+        GlStateManager.disableTexture();
+        GlStateManager.enableColorLogicOp();
+        GlStateManager.logicOp(GlStateManager.LogicOp.OR_REVERSE);
+        bufferBuilder_1.begin(7, VertexFormats.POSITION);
+        bufferBuilder_1.vertex((double) int_1, (double) int_4, 0.0D).next();
+        bufferBuilder_1.vertex((double) int_3, (double) int_4, 0.0D).next();
+        bufferBuilder_1.vertex((double) int_3, (double) int_2, 0.0D).next();
+        bufferBuilder_1.vertex((double) int_1, (double) int_2, 0.0D).next();
+        tessellator_1.draw();
+        GlStateManager.disableColorLogicOp();
+        GlStateManager.enableTexture();
+    }
+    
+    public int getMaxLength() {
+        return this.maxLength;
+    }
+    
+    public void setMaxLength(int int_1) {
+        this.maxLength = int_1;
+        if (this.text.length() > int_1) {
+            this.text = this.text.substring(0, int_1);
+            this.onChanged(this.text);
+        }
+    }
+    
+    public int getCursor() {
+        return this.cursorMax;
+    }
+    
+    public void setCursor(int int_1) {
+        this.cursorMax = MathHelper.clamp(int_1, 0, this.text.length());
+    }
+    
+    public boolean hasBorder() {
+        return this.hasBorder;
+    }
+    
+    public void setHasBorder(boolean boolean_1) {
+        this.hasBorder = boolean_1;
+    }
+    
+    public void method_1868(int int_1) {
+        this.field_2100 = int_1;
+    }
+    
+    public void method_1860(int int_1) {
+        this.field_2098 = int_1;
+    }
+    
+    public void setHasFocus(boolean boolean_1) {
+        this.setFocused(boolean_1);
+    }
+    
+    public boolean hasFocus() {
+        return true;
+    }
+    
+    public boolean isFocused() {
+        return this.focused;
+    }
+    
+    public void setFocused(boolean boolean_1) {
+        if (boolean_1 && !this.focused) {
+            this.focusedTicks = 0;
+        }
+        
+        this.focused = boolean_1;
+    }
+    
+    public void setIsEditable(boolean boolean_1) {
+        this.editable = boolean_1;
+    }
+    
+    public int method_1859() {
+        return this.hasBorder() ? this.width - 8 : this.width;
+    }
+    
+    public void method_1884(int int_1) {
+        int int_2 = this.text.length();
+        this.cursorMin = MathHelper.clamp(int_1, 0, int_2);
+        if (this.fontRenderer != null) {
+            if (this.field_2103 > int_2) {
+                this.field_2103 = int_2;
+            }
+            
+            int int_3 = this.method_1859();
+            String string_1 = this.fontRenderer.method_1714(this.text.substring(this.field_2103), int_3);
+            int int_4 = string_1.length() + this.field_2103;
+            if (this.cursorMin == this.field_2103) {
+                this.field_2103 -= this.fontRenderer.method_1711(this.text, int_3, true).length();
+            }
+            
+            if (this.cursorMin > int_4) {
+                this.field_2103 += this.cursorMin - int_4;
+            } else if (this.cursorMin <= this.field_2103) {
+                this.field_2103 -= this.field_2103 - this.cursorMin;
+            }
+            
+            this.field_2103 = MathHelper.clamp(this.field_2103, 0, int_2);
+        }
+        
+    }
+    
+    public void method_1856(boolean boolean_1) {
+        this.field_2096 = boolean_1;
+    }
+    
+    public boolean isVisible() {
+        return this.visible;
+    }
+    
+    public void setVisible(boolean boolean_1) {
+        this.visible = boolean_1;
+    }
+    
+    public void setSuggestion(String string_1) {
+        this.suggestion = string_1;
+    }
+    
+    public int method_1889(int int_1) {
+        return int_1 > this.text.length() ? this.x : this.x + this.fontRenderer.getStringWidth(this.text.substring(0, int_1));
+    }
+    
+    public void setX(int int_1) {
+        this.x = int_1;
+    }
+    
+}

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

@@ -18,8 +18,6 @@ public interface IMixinContainerGui {
     
     public ItemStack getDraggedStack();
     
-    public ContainerGuiOverlay getOverlay();
-    
     public ContainerGui getContainerGui();
     
     public void setOverlay(ContainerGuiOverlay overlay);

+ 6 - 14
src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java

@@ -1,5 +1,6 @@
 package me.shedaniel.rei.mixin;
 
+import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.gui.ContainerGuiOverlay;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
@@ -26,7 +27,6 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
     @Shadow
     protected int containerHeight;
     
-    private ContainerGuiOverlay overlay;
     private ContainerGui lastGui;
     
     @Shadow
@@ -53,24 +53,21 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
     }
     
     @Override
-    public ContainerGuiOverlay getOverlay() {
-        if (this.overlay == null)
-            this.overlay = new ContainerGuiOverlay(lastGui);
-        return this.overlay;
+    public void setOverlay(ContainerGuiOverlay overlay) {
+        GuiHelper.setOverlay(overlay);
     }
     
     @Inject(method = "onInitialized()V", at = @At("RETURN"))
     protected void onInitialized(CallbackInfo info) {
-        this.overlay = null;
-        this.listeners.add(getOverlay());
-        getOverlay().onInitialized();
+        GuiHelper.resetOverlay();
+        this.listeners.add(GuiHelper.getOverlay(lastGui));
     }
     
     @Inject(method = "draw(IIF)V", at = @At("RETURN"))
     public void draw(int int_1, int int_2, float float_1, CallbackInfo info) {
         if (MinecraftClient.getInstance().currentGui instanceof ContainerGui)
             this.lastGui = (ContainerGui) MinecraftClient.getInstance().currentGui;
-        getOverlay().render(int_1, int_2, float_1);
+        GuiHelper.getOverlay(lastGui).render(int_1, int_2, float_1);
     }
     
     @Override
@@ -110,9 +107,4 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
             }
     }
     
-    @Override
-    public void setOverlay(ContainerGuiOverlay overlay) {
-        this.overlay = overlay;
-        overlay.onInitialized();
-    }
 }

+ 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": "2.0.0.29",
+  "version": "2.0.0.30",
   "side": "client",
   "authors": [
     "Danielshe"