Ver Fonte

Stuff's going on

Unknown há 6 anos atrás
pai
commit
43313db6c8
24 ficheiros alterados com 206 adições e 135 exclusões
  1. 5 4
      build.gradle
  2. 2 2
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  3. 5 0
      src/main/java/me/shedaniel/rei/api/TabGetter.java
  4. 4 7
      src/main/java/me/shedaniel/rei/client/ClientHelper.java
  5. 0 1
      src/main/java/me/shedaniel/rei/client/ConfigHelper.java
  6. 3 3
      src/main/java/me/shedaniel/rei/client/GuiHelper.java
  7. 14 18
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  8. 10 3
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  9. 17 1
      src/main/java/me/shedaniel/rei/gui/config/ConfigScreen.java
  10. 31 4
      src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java
  11. 1 3
      src/main/java/me/shedaniel/rei/listeners/ContainerScreenHooks.java
  12. 0 9
      src/main/java/me/shedaniel/rei/listeners/IMixinRecipeBookGui.java
  13. 0 7
      src/main/java/me/shedaniel/rei/listeners/IMixinTabGetter.java
  14. 14 0
      src/main/java/me/shedaniel/rei/mixin/GhostSlotsHook.java
  15. 7 14
      src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java
  16. 11 15
      src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryScreen.java
  17. 0 22
      src/main/java/me/shedaniel/rei/mixin/MixinRecipeBookGui.java
  18. 18 0
      src/main/java/me/shedaniel/rei/mixin/MixinTabGetter.java
  19. 6 6
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  20. 3 4
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  21. 26 5
      src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json
  22. 26 5
      src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json
  23. 1 1
      src/main/resources/fabric.mod.json
  24. 2 1
      src/main/resources/roughlyenoughitems.client.json

+ 5 - 4
build.gradle

@@ -6,11 +6,12 @@ sourceCompatibility = 1.8
 targetCompatibility = 1.8
 
 archivesBaseName = "RoughlyEnoughItems"
-version = "2.3.2.56"
+version = "2.3.3.57"
 
 def minecraftVersion = "19w09a"
-def yarnVersion = "19w09a.1"
-def fabricVersion = "0.2.3.107"
+def yarnVersion = "19w09a.4"
+def fabricVersion = "0.2.3.108"
+def fabricLoaderVersion = "0.3.7.109"
 def pluginLoaderVersion = "1.14-1.0.6-8"
 
 minecraft {
@@ -30,7 +31,7 @@ repositories {
 dependencies {
     minecraft "com.mojang:minecraft:${minecraftVersion}"
     mappings "net.fabricmc:yarn:${yarnVersion}"
-    modCompile "net.fabricmc:fabric-loader:0.3.7.109"
+    modCompile "net.fabricmc:fabric-loader:${fabricLoaderVersion}"
 
     // Fabric API. This is technically optional, but you probably want it anyway.
     modCompile "net.fabricmc:fabric:${fabricVersion}"

+ 2 - 2
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -11,7 +11,7 @@ import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.api.ModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
 import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
-import net.fabricmc.loader.FabricLoader;
+import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;
 import net.minecraft.server.network.ServerPlayerEntity;
@@ -77,7 +77,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
         configHelper = new ConfigHelper();
         
         // If pluginloader is not installed, base functionality should still remain
-        if (!FabricLoader.INSTANCE.getModContainers().stream().map(modContainer -> modContainer.getInfo().getId()).anyMatch(s -> s.equalsIgnoreCase("pluginloader"))) {
+        if (!FabricLoader.getInstance().isModLoaded("pluginloader")) {
             RoughlyEnoughItemsCore.LOGGER.warn("REI: Plugin Loader is not loaded! Please consider installing https://minecraft.curseforge.com/projects/pluginloader for REI plugin compatibility!");
             registerPlugin(new Identifier("roughlyenoughitems", "default_plugin"), new DefaultPlugin());
         }

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

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

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

@@ -14,6 +14,8 @@ import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
 import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
 import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl;
 import net.fabricmc.loader.api.FabricLoader;
+import net.fabricmc.loader.api.ModContainer;
+import net.fabricmc.loader.api.metadata.ModMetadata;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.Mouse;
 import net.minecraft.client.gui.Screen;
@@ -47,13 +49,8 @@ public class ClientHelper implements ClientModInitializer {
             String modid = location.getNamespace();
             if (modid.equalsIgnoreCase("minecraft"))
                 return "Minecraft";
-            return ((net.fabricmc.loader.FabricLoader) FabricLoader.getInstance()).getModContainers().stream().map(modContainer -> {
-                return modContainer.getInfo();
-            }).filter(modInfo -> modInfo.getId().equals(modid) || (modInfo.getName() != null && modInfo.getName().equals(modid))).findFirst().map(modInfo -> {
-                if (modInfo.getName() != null)
-                    return modInfo.getName();
-                return modid;
-            }).orElse(modid);
+            //            return FabricLoader.getInstance().getAllMods().stream().map(ModContainer::getMetadata).filter(metadata -> metadata.getId().equals(modid)).findFirst().map(ModMetadata::getName).orElse(modid);
+            return FabricLoader.getInstance().getModContainer(modid).map(ModContainer::getMetadata).map(ModMetadata::getName).orElse(modid);
         }
         return "";
     }

+ 0 - 1
src/main/java/me/shedaniel/rei/client/ConfigHelper.java

@@ -15,7 +15,6 @@ public class ConfigHelper {
     private REIConfig config;
     private boolean craftableOnly;
     
-    @SuppressWarnings("deprecated")
     public ConfigHelper() {
         this.configFile = new File(FabricLoader.getInstance().getConfigDirectory(), "rei.json");
         this.craftableOnly = false;

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

@@ -3,7 +3,7 @@ package me.shedaniel.rei.client;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
-import me.shedaniel.rei.listeners.IMixinContainerScreen;
+import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.item.ItemStack;
@@ -52,8 +52,8 @@ public class GuiHelper {
         GuiHelper.lastContainerScreen = lastContainerScreen;
     }
     
-    public static IMixinContainerScreen getLastMixinContainerScreen() {
-        return (IMixinContainerScreen) lastContainerScreen;
+    public static ContainerScreenHooks getLastContainerScreenHooks() {
+        return (ContainerScreenHooks) lastContainerScreen;
     }
     
 }

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

@@ -99,7 +99,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
                         list.add("§c§m" + I18n.translate("text.rei.cheating"));
                     else
                         list.add("§a" + I18n.translate("text.rei.cheating"));
-                    addTooltip(new QueuedTooltip(new Point(mouseX, mouseY), list));
+                    addTooltip(QueuedTooltip.create(list));
                 }
             }
         });
@@ -121,10 +121,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 public void draw(int mouseX, int mouseY, float partialTicks) {
                     text = getGameModeShortText(getCurrentGameMode());
                     super.draw(mouseX, mouseY, partialTicks);
-                    if (isHighlighted(mouseX, mouseY)) {
-                        List<String> list = Arrays.asList(I18n.translate("text.rei.gamemode_button.tooltip", getGameModeText(getNextGameMode())).split("\n"));
-                        addTooltip(new QueuedTooltip(new Point(mouseX, mouseY), list));
-                    }
+                    if (isHighlighted(mouseX, mouseY))
+                        addTooltip(QueuedTooltip.create(I18n.translate("text.rei.gamemode_button.tooltip", getGameModeText(getNextGameMode())).split("\n")));
                 }
             });
             widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigHelper().getConfig().mirrorItemPanel ? window.getScaledWidth() - 80 : 60, 10, 20, 20, "") {
@@ -140,10 +138,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
                     MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
                     GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                     drawTexturedRect(getBounds().x + 3, getBounds().y + 3, getCurrentWeather().getId() * 14, 14, 14, 14);
-                    if (isHighlighted(mouseX, mouseY)) {
-                        List<String> list = Arrays.asList(I18n.translate("text.rei.weather_button.tooltip", getNextWeather().getName()).split("\n"));
-                        addTooltip(new QueuedTooltip(new Point(mouseX, mouseY), list));
-                    }
+                    if (isHighlighted(mouseX, mouseY))
+                        addTooltip(QueuedTooltip.create(I18n.translate("text.rei.weather_button.tooltip", getNextWeather().getName()).split("\n")));
                 }
             });
         }
@@ -154,7 +150,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
                 super.draw(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
-                    GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(new Point(mouseX, mouseY), Arrays.asList(I18n.translate("text.rei.go_back_first_page").split("\n"))));
+                    addTooltip(QueuedTooltip.create(I18n.translate("text.rei.go_back_first_page").split("\n")));
             }
             
             @Override
@@ -260,14 +256,14 @@ public class ContainerScreenOverlay extends ScreenComponent {
     }
     
     private Rectangle getTextFieldArea() {
-        int widthRemoved = RoughlyEnoughItemsCore.getConfigHelper().getConfig().enableCraftableOnlyButton ? 22 : 0;
+        int widthRemoved = RoughlyEnoughItemsCore.getConfigHelper().getConfig().enableCraftableOnlyButton ? 22 : 2;
         if (RoughlyEnoughItemsCore.getConfigHelper().getConfig().sideSearchField)
             return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 18);
         if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingScreen) {
             RecipeViewingScreen widget = (RecipeViewingScreen) MinecraftClient.getInstance().currentScreen;
             return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18);
         }
-        return new Rectangle(GuiHelper.getLastMixinContainerScreen().rei_getContainerLeft(), window.getScaledHeight() - 22, GuiHelper.getLastMixinContainerScreen().rei_getContainerWidth() - widthRemoved, 18);
+        return new Rectangle(GuiHelper.getLastContainerScreenHooks().rei_getContainerLeft(), window.getScaledHeight() - 22, GuiHelper.getLastContainerScreenHooks().rei_getContainerWidth() - widthRemoved, 18);
     }
     
     private Rectangle getCraftableToggleArea() {
@@ -303,7 +299,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
         GuiLighting.disable();
         Screen currentScreen = MinecraftClient.getInstance().currentScreen;
         if (!(currentScreen instanceof RecipeViewingScreen) || !((RecipeViewingScreen) currentScreen).choosePageActivated)
-            QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> MinecraftClient.getInstance().currentScreen.drawTooltip(queuedTooltip.text, queuedTooltip.mouse.x, queuedTooltip.mouse.y));
+            QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> MinecraftClient.getInstance().currentScreen.drawTooltip(queuedTooltip.getText(), queuedTooltip.getLocation().x, queuedTooltip.getLocation().y));
         QUEUED_TOOLTIPS.clear();
         GuiLighting.disable();
     }
@@ -341,7 +337,7 @@ public class ContainerScreenOverlay extends ScreenComponent {
     
     private Rectangle calculateBoundary() {
         if (!RoughlyEnoughItemsCore.getConfigHelper().getConfig().mirrorItemPanel) {
-            int startX = GuiHelper.getLastMixinContainerScreen().rei_getContainerLeft() + GuiHelper.getLastMixinContainerScreen().rei_getContainerWidth() + 10;
+            int startX = GuiHelper.getLastContainerScreenHooks().rei_getContainerLeft() + GuiHelper.getLastContainerScreenHooks().rei_getContainerWidth() + 10;
             int width = window.getScaledWidth() - startX;
             if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingScreen) {
                 RecipeViewingScreen widget = (RecipeViewingScreen) MinecraftClient.getInstance().currentScreen;
@@ -359,8 +355,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
             return widget.getBounds().x;
         }
         if (MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen())
-            return GuiHelper.getLastMixinContainerScreen().rei_getContainerLeft() - 147 - 30;
-        return GuiHelper.getLastMixinContainerScreen().rei_getContainerLeft();
+            return GuiHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 147 - 30;
+        return GuiHelper.getLastContainerScreenHooks().rei_getContainerLeft();
     }
     
     private int getTotalPage() {
@@ -413,8 +409,8 @@ public class ContainerScreenOverlay extends ScreenComponent {
                 }
         }
         if (itemStack == null && MinecraftClient.getInstance().currentScreen instanceof ContainerScreen)
-            if (GuiHelper.getLastMixinContainerScreen().rei_getHoveredSlot() != null)
-                itemStack = GuiHelper.getLastMixinContainerScreen().rei_getHoveredSlot().getStack();
+            if (GuiHelper.getLastContainerScreenHooks().rei_getHoveredSlot() != null)
+                itemStack = GuiHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack();
         if (itemStack != null && !itemStack.isEmpty()) {
             if (ClientHelper.RECIPE.matchesKey(int_1, int_2))
                 return ClientHelper.executeRecipeKeyBind(this, itemStack);

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

@@ -21,8 +21,10 @@ import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
 import java.awt.*;
-import java.util.*;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.function.Supplier;
 
 public class RecipeViewingScreen extends Screen {
@@ -71,6 +73,11 @@ public class RecipeViewingScreen extends Screen {
     
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
+        if (int_1 == 256 && choosePageActivated) {
+            choosePageActivated = false;
+            onInitialized();
+            return true;
+        }
         if ((int_1 == 256 || this.client.options.keyInventory.matchesKey(int_1, int_2)) && this.doesEscapeKeyClose()) {
             MinecraftClient.getInstance().openScreen(GuiHelper.getLastContainerScreen());
             GuiHelper.getLastOverlay().onInitialized();
@@ -158,7 +165,7 @@ public class RecipeViewingScreen extends Screen {
                 this.text = selectedCategory.getCategoryName();
                 super.draw(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
-                    GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(new Point(mouseX, mouseY), Arrays.asList(I18n.translate("text.rei.view_all_categories").split("\n"))));
+                    GuiHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.view_all_categories").split("\n")));
             }
             
             @Override
@@ -173,7 +180,7 @@ public class RecipeViewingScreen extends Screen {
                 this.text = String.format("%d/%d", page + 1, getTotalPages(selectedCategory));
                 super.draw(mouseX, mouseY, partialTicks);
                 if (isHighlighted(mouseX, mouseY))
-                    GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(new Point(mouseX, mouseY), Arrays.asList(I18n.translate("text.rei.choose_page").split("\n"))));
+                    GuiHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.choose_page").split("\n")));
             }
             
             @Override

+ 17 - 1
src/main/java/me/shedaniel/rei/gui/config/ConfigScreen.java

@@ -238,7 +238,6 @@ public class ConfigScreen extends Screen {
             public void onInitWidget(TextFieldWidget widget) {
                 widget.setMaxLength(99999);
                 widget.setText(RoughlyEnoughItemsCore.getConfigHelper().getConfig().gamemodeCommand);
-                widget.setSuggestion(I18n.translate("text.rei.give_command.suggestion"));
             }
             
             @Override
@@ -251,6 +250,23 @@ public class ConfigScreen extends Screen {
                 }
             }
         }));
+        entryListWidget.configAddEntry(new ConfigEntry.TextFieldConfigEntry(new TranslatableTextComponent("text.rei.weather_command"), new ConfigEntry.TextFieldConfigEntry.ConfigEntryTextFieldProvider() {
+            @Override
+            public void onInitWidget(TextFieldWidget widget) {
+                widget.setMaxLength(99999);
+                widget.setText(RoughlyEnoughItemsCore.getConfigHelper().getConfig().weatherCommand);
+            }
+        
+            @Override
+            public void onUpdateText(TextFieldWidget button, String text) {
+                RoughlyEnoughItemsCore.getConfigHelper().getConfig().weatherCommand = text;
+                try {
+                    RoughlyEnoughItemsCore.getConfigHelper().saveConfig();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }));
         entryListWidget.configAddEntry(new ConfigEntry.TextFieldConfigEntry(new TranslatableTextComponent("text.rei.config.max_recipes_per_page"), new ConfigEntry.TextFieldConfigEntry.ConfigEntryTextFieldProvider() {
             @Override
             public void onInitWidget(TextFieldWidget widget) {

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

@@ -1,18 +1,45 @@
 package me.shedaniel.rei.gui.widget;
 
 
+import com.google.common.collect.Lists;
+import me.shedaniel.rei.client.ClientHelper;
+
 import java.awt.*;
 import java.util.LinkedList;
 import java.util.List;
 
 public class QueuedTooltip {
     
-    public Point mouse;
-    public List<String> text;
+    private Point location;
+    private List<String> text;
     
-    public QueuedTooltip(Point mouse, List<String> text) {
-        this.mouse = mouse;
+    protected QueuedTooltip(Point location, List<String> text) {
+        this.location = location;
         this.text = new LinkedList<>(text);
     }
     
+    public static QueuedTooltip create(Point location, List<String> text) {
+        return new QueuedTooltip(location, text);
+    }
+    
+    public static QueuedTooltip create(Point location, String... text) {
+        return QueuedTooltip.create(location, Lists.newArrayList(text));
+    }
+    
+    public static QueuedTooltip create(List<String> text) {
+        return QueuedTooltip.create(ClientHelper.getMouseLocation(), text);
+    }
+    
+    public static QueuedTooltip create(String... text) {
+        return QueuedTooltip.create(ClientHelper.getMouseLocation(), text);
+    }
+    
+    public Point getLocation() {
+        return location;
+    }
+    
+    public List<String> getText() {
+        return text;
+    }
+    
 }

+ 1 - 3
src/main/java/me/shedaniel/rei/listeners/IMixinContainerScreen.java → src/main/java/me/shedaniel/rei/listeners/ContainerScreenHooks.java

@@ -3,7 +3,7 @@ package me.shedaniel.rei.listeners;
 import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
 
-public interface IMixinContainerScreen {
+public interface ContainerScreenHooks {
     
     public int rei_getContainerLeft();
     
@@ -13,8 +13,6 @@ public interface IMixinContainerScreen {
     
     public int rei_getContainerHeight();
     
-    public ItemStack rei_getDraggedStack();
-    
     public Slot rei_getHoveredSlot();
     
 }

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

@@ -1,9 +0,0 @@
-package me.shedaniel.rei.listeners;
-
-import net.minecraft.client.gui.widget.RecipeBookGhostSlots;
-
-public interface IMixinRecipeBookGui {
-    
-    public RecipeBookGhostSlots rei_getGhostSlots();
-    
-}

+ 0 - 7
src/main/java/me/shedaniel/rei/listeners/IMixinTabGetter.java

@@ -1,7 +0,0 @@
-package me.shedaniel.rei.listeners;
-
-public interface IMixinTabGetter {
-    
-    public int rei_getSelectedTab();
-    
-}

+ 14 - 0
src/main/java/me/shedaniel/rei/mixin/GhostSlotsHook.java

@@ -0,0 +1,14 @@
+package me.shedaniel.rei.mixin;
+
+import net.minecraft.client.gui.recipebook.RecipeBookGui;
+import net.minecraft.client.gui.widget.RecipeBookGhostSlots;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(RecipeBookGui.class)
+public interface GhostSlotsHook {
+    
+    @Accessor("ghostSlots")
+    RecipeBookGhostSlots rei_getGhostSlots();
+    
+}

+ 7 - 14
src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java

@@ -1,10 +1,10 @@
 package me.shedaniel.rei.mixin;
 
+import me.shedaniel.rei.api.TabGetter;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
-import me.shedaniel.rei.listeners.IMixinContainerScreen;
-import me.shedaniel.rei.listeners.IMixinTabGetter;
+import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.Screen;
@@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
 @Mixin(ContainerScreen.class)
-public class MixinContainerScreen extends Screen implements IMixinContainerScreen {
+public class MixinContainerScreen extends Screen implements ContainerScreenHooks {
     
     @Shadow
     protected int left;
@@ -32,8 +32,6 @@ public class MixinContainerScreen extends Screen implements IMixinContainerScree
     protected int height;
     @Shadow
     protected Slot focusedSlot;
-    @Shadow
-    private ItemStack field_2782;
     
     @Override
     public int rei_getContainerLeft() {
@@ -58,7 +56,7 @@ public class MixinContainerScreen extends Screen implements IMixinContainerScree
     @Inject(method = "onInitialized()V", at = @At("RETURN"))
     protected void onInitialized(CallbackInfo info) {
         if (MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen) {
-            IMixinTabGetter tabGetter = (IMixinTabGetter) MinecraftClient.getInstance().currentScreen;
+            TabGetter tabGetter = (TabGetter) MinecraftClient.getInstance().currentScreen;
             if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                 return;
         }
@@ -69,18 +67,13 @@ public class MixinContainerScreen extends Screen implements IMixinContainerScree
     @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().currentScreen instanceof CreativePlayerInventoryScreen) {
-            IMixinTabGetter tabGetter = (IMixinTabGetter) MinecraftClient.getInstance().currentScreen;
+            TabGetter tabGetter = (TabGetter) MinecraftClient.getInstance().currentScreen;
             if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                 return;
         }
         GuiHelper.getLastOverlay().drawOverlay(int_1, int_2, float_1);
     }
     
-    @Override
-    public ItemStack rei_getDraggedStack() {
-        return this.field_2782;
-    }
-    
     @Override
     public Slot rei_getHoveredSlot() {
         return focusedSlot;
@@ -89,7 +82,7 @@ public class MixinContainerScreen extends Screen implements IMixinContainerScree
     @Override
     public boolean mouseScrolled(double double_1) {
         if (MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen) {
-            IMixinTabGetter tabGetter = (IMixinTabGetter) MinecraftClient.getInstance().currentScreen;
+            TabGetter tabGetter = (TabGetter) MinecraftClient.getInstance().currentScreen;
             if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                 return super.mouseScrolled(double_1);
         }
@@ -103,7 +96,7 @@ public class MixinContainerScreen extends Screen implements IMixinContainerScree
     @Inject(method = "keyPressed(III)Z", at = @At("HEAD"), cancellable = true)
     public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
         if (MinecraftClient.getInstance().currentScreen instanceof CreativePlayerInventoryScreen) {
-            IMixinTabGetter tabGetter = (IMixinTabGetter) MinecraftClient.getInstance().currentScreen;
+            TabGetter tabGetter = (TabGetter) MinecraftClient.getInstance().currentScreen;
             if (tabGetter.rei_getSelectedTab() != ItemGroup.INVENTORY.getIndex())
                 return;
         }

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

@@ -1,7 +1,7 @@
 package me.shedaniel.rei.mixin;
 
+import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.GuiHelper;
-import me.shedaniel.rei.listeners.IMixinTabGetter;
 import net.minecraft.client.gui.ingame.AbstractPlayerInventoryScreen;
 import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
 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;
 
 @Mixin(CreativePlayerInventoryScreen.class)
-public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerInventoryScreen<CreativePlayerInventoryScreen.CreativeContainer> implements IMixinTabGetter {
+public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerInventoryScreen<CreativePlayerInventoryScreen.CreativeContainer> {
     
     @Shadow
     private static int selectedTab;
@@ -28,15 +28,10 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
     @Shadow
     protected abstract boolean doRenderScrollBar();
     
-    @Override
-    public int rei_getSelectedTab() {
-        return selectedTab;
-    }
-    
     @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true)
     public void mouseScrolled(double amount, CallbackInfoReturnable<Boolean> ci) {
-        if (!doRenderScrollBar())
-            if (super.mouseScrolled(amount)) {
+        if (!doRenderScrollBar() && selectedTab == ItemGroup.INVENTORY.getIndex())
+            if (GuiHelper.isOverlayVisible() && GuiHelper.getLastOverlay().getRectangle().contains(ClientHelper.getMouseLocation()) && GuiHelper.getLastOverlay().mouseScrolled(amount)) {
                 ci.setReturnValue(true);
                 ci.cancel();
             }
@@ -45,7 +40,7 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
     @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true)
     public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
         if (selectedTab == ItemGroup.INVENTORY.getIndex())
-            if (super.keyPressed(int_1, int_2, int_3)) {
+            if (GuiHelper.getLastOverlay().keyPressed(int_1, int_2, int_3)) {
                 ci.setReturnValue(true);
                 ci.cancel();
             }
@@ -54,7 +49,7 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
     @Inject(method = "charTyped", at = @At("HEAD"), cancellable = true)
     public void charTyped(char char_1, int int_1, CallbackInfoReturnable<Boolean> ci) {
         if (!this.field_2888 && selectedTab == ItemGroup.INVENTORY.getIndex())
-            if (super.charTyped(char_1, int_1)) {
+            if (GuiHelper.isOverlayVisible() && GuiHelper.getLastOverlay().charTyped(char_1, int_1)) {
                 ci.setReturnValue(true);
                 ci.cancel();
             }
@@ -62,10 +57,11 @@ public abstract class MixinCreativePlayerInventoryScreen extends AbstractPlayerI
     
     @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
     public void mouseClicked(double i, double j, int k, CallbackInfoReturnable<Boolean> ci) {
-        if (GuiHelper.getLastOverlay().mouseClicked(i, j, k)) {
-            ci.setReturnValue(true);
-            ci.cancel();
-        }
+        if (selectedTab == ItemGroup.INVENTORY.getIndex())
+            if (GuiHelper.isOverlayVisible() && GuiHelper.getLastOverlay().mouseClicked(i, j, k)) {
+                ci.setReturnValue(true);
+                ci.cancel();
+            }
     }
     
 }

+ 0 - 22
src/main/java/me/shedaniel/rei/mixin/MixinRecipeBookGui.java

@@ -1,22 +0,0 @@
-package me.shedaniel.rei.mixin;
-
-import me.shedaniel.rei.listeners.IMixinRecipeBookGui;
-import net.minecraft.client.gui.recipebook.RecipeBookGui;
-import net.minecraft.client.gui.widget.RecipeBookGhostSlots;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-
-@Mixin(RecipeBookGui.class)
-public class MixinRecipeBookGui implements IMixinRecipeBookGui {
-    
-    @Shadow
-    @Final
-    protected RecipeBookGhostSlots ghostSlots;
-    
-    @Override
-    public RecipeBookGhostSlots rei_getGhostSlots() {
-        return ghostSlots;
-    }
-    
-}

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

@@ -0,0 +1,18 @@
+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;
+    }
+    
+}

+ 6 - 6
src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -3,7 +3,7 @@ package me.shedaniel.rei.plugin;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
-import me.shedaniel.rei.listeners.IMixinRecipeBookGui;
+import me.shedaniel.rei.mixin.GhostSlotsHook;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.container.BlastFurnaceScreen;
@@ -137,9 +137,9 @@ public class DefaultPlugin implements REIPlugin {
                 if (!recipe.getRecipe().isPresent())
                     return false;
                 if (screen.getClass().isAssignableFrom(CraftingTableScreen.class))
-                    ((IMixinRecipeBookGui) (((CraftingTableScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
+                    ((GhostSlotsHook) (((CraftingTableScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
                 else if (screen.getClass().isAssignableFrom(PlayerInventoryScreen.class))
-                    ((IMixinRecipeBookGui) (((PlayerInventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
+                    ((GhostSlotsHook) (((PlayerInventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
                 else
                     return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
@@ -162,7 +162,7 @@ public class DefaultPlugin implements REIPlugin {
                 if (!recipe.getRecipe().isPresent())
                     return false;
                 if (screen instanceof FurnaceScreen)
-                    ((IMixinRecipeBookGui) (((FurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
+                    ((GhostSlotsHook) (((FurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
                 else
                     return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
@@ -185,7 +185,7 @@ public class DefaultPlugin implements REIPlugin {
                 if (!recipe.getRecipe().isPresent())
                     return false;
                 if (screen instanceof SmokerScreen)
-                    ((IMixinRecipeBookGui) (((SmokerScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
+                    ((GhostSlotsHook) (((SmokerScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
                 else
                     return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
@@ -213,7 +213,7 @@ public class DefaultPlugin implements REIPlugin {
                 if (!recipe.getRecipe().isPresent())
                     return false;
                 if (screen instanceof BlastFurnaceScreen)
-                    ((IMixinRecipeBookGui) (((BlastFurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
+                    ((GhostSlotsHook) (((BlastFurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
                 else
                     return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());

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

@@ -22,7 +22,7 @@
   "text.rei.config_tooltip": "Open Config Screen\n§7Shift-Click to toggle cheat mode",
   "text.rei.config.side_search_box": "Side Search Box: ",
   "text.rei.config.mirror_rei": "Mirror REI Widgets: ",
-  "text.rei.cheat_items": "Gave [{item_name}] x{item_count} to {player_name}.",
+  "text.rei.cheat_items": "Gave [{item_name}§f] x{item_count} to {player_name}.",
   "text.rei.failed_cheat_items": "§cFailed to give items.",
   "text.rei.config.list_ordering": "Item List Ordering:",
   "text.rei.config.list_ordering_button": "%s [%s]",
@@ -38,15 +38,14 @@
   "text.rei.showing_all": "Showing All",
   "text.rei.delete_items": "§cDelete Item",
   "text.rei.check_updates": "Check Updates: ",
-  "text.rei.update_outdated": "§6REI is outdated!\n§6Current: §a%s §6Latest: §a%s\n§6Update Priority: §a%s",
-  "text.rei.update_changelog_line": "§6- %s",
   "text.rei.config.load_default_plugin": "Load Default Plugin: ",
   "text.rei.config.load_default_plugin.restart_tooltip": "You probably never want to disable this.\nRestart Minecraft to apply this setting.",
   "text.rei.credits": "Credits",
   "text.rei.left_arrow": "<",
   "text.rei.right_arrow": ">",
   "text.rei.give_command": "Cheat Give Command:",
-  "text.rei.gamemode_command": "Cheat Give Command:",
+  "text.rei.gamemode_command": "GameMode Command:",
+  "text.rei.weather_command": "Weather Command:",
   "text.rei.give_command.tooltip": "This command is only used in servers when cheating.",
   "text.rei.give_command.suggestion": "Enter command.",
   "text.rei.view_all_categories": "View All Categories",

+ 26 - 5
src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json

@@ -3,8 +3,9 @@
   "key.roughlyenoughitems.recipe_keybind": "显示配方",
   "key.roughlyenoughitems.hide_keybind": "隐藏/显示 REI",
   "key.roughlyenoughitems.usage_keybind": "显示用途",
-  "text.rei.cheat": "作弊",
-  "text.rei.nocheat": "§c§m作弊",
+  "text.rei.config.general": "一般",
+  "text.rei.config.cheating": "作弊:",
+  "text.rei.cheating": "作弊",
   "category.rei.crafting": "合成",
   "category.rei.smelting": "冶炼",
   "category.rei.smelting.fuel": "§e燃料",
@@ -18,9 +19,10 @@
   "category.rei.brewing.reactant": "§e材料",
   "category.rei.brewing.result": "§e输出药水",
   "text.rei.config": "设置",
+  "text.rei.config_tooltip": "打开设置\n§7按住Shift键单击以切换作弊模式",
   "text.rei.config.side_search_box": "不置中搜索栏: ",
   "text.rei.config.mirror_rei": "右置 REI 小工具: ",
-  "text.rei.cheat_items": "已将 {item_count} 个 [{item_name}] 给予 {player_name}",
+  "text.rei.cheat_items": "已将 {item_count} 个 [{item_name}§f] 给予 {player_name}",
   "text.rei.failed_cheat_items": "§c不能给予物品.",
   "text.rei.config.list_ordering": "物品清单排序",
   "text.rei.config.list_ordering_button": "%s [%s]",
@@ -36,6 +38,25 @@
   "text.rei.showing_all": "显示所有物品",
   "text.rei.delete_items": "§c删除物品",
   "text.rei.check_updates": "检查更新: ",
-  "text.rei.update_outdated": "§6REI 需要更新!\n§6当前版本: §a%s §6最新版本: §a%s\n§6重要性: §a%s",
-  "text.rei.update_changelog_line": "§6- %s"
+  "text.rei.config.load_default_plugin": "加载默认插件: ",
+  "text.rei.config.load_default_plugin.restart_tooltip": "如果你不知道这是做什么的,\n你可能永远不想禁用它.\n重启 Minecraft 来使用这设置。",
+  "text.rei.credits": "感谢",
+  "text.rei.left_arrow": "<",
+  "text.rei.right_arrow": ">",
+  "text.rei.give_command": "作弊给予指令:",
+  "text.rei.gamemode_command": "游戏模式指令:",
+  "text.rei.weather_command": "天气指令:",
+  "text.rei.give_command.tooltip": "此命令仅在服务器上作弊时用.",
+  "text.rei.give_command.suggestion": "输入指令.",
+  "text.rei.view_all_categories": "查看全部类别",
+  "text.rei.go_back_first_page": "回到第 1 页",
+  "text.rei.config.appearance": "外貌",
+  "text.rei.config.modules": "组件",
+  "text.rei.config.advanced": "高级",
+  "text.rei.choose_page": "选择页面",
+  "text.rei.config.disable_credits_button": "禁用感谢按钮:",
+  "text.rei.config.max_recipes_per_page": "每页最多配方:",
+  "text.rei.config.enable_util_buttons": "启用实用按钮:",
+  "text.rei.gamemode_button.tooltip": "切换游戏模式\n§7切换至 %s 模式。",
+  "text.rei.weather_button.tooltip": "切换天气\n§7切换至 %s。"
 }

+ 26 - 5
src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json

@@ -3,8 +3,9 @@
   "key.roughlyenoughitems.recipe_keybind": "顯示配方",
   "key.roughlyenoughitems.hide_keybind": "隱藏/顯示 REI",
   "key.roughlyenoughitems.usage_keybind": "顯示用途",
-  "text.rei.cheat": "作弊",
-  "text.rei.nocheat": "§c§m作弊",
+  "text.rei.config.general": "一般",
+  "text.rei.config.cheating": "作弊:",
+  "text.rei.cheating": "作弊",
   "category.rei.crafting": "合成",
   "category.rei.smelting": "冶煉",
   "category.rei.smelting.fuel": "§e燃料",
@@ -18,9 +19,10 @@
   "category.rei.brewing.reactant": "§e材料",
   "category.rei.brewing.result": "§e輸出藥水",
   "text.rei.config": "設置",
+  "text.rei.config_tooltip": "打開設置\n§7按住Shift鍵單擊以切換作弊模式",
   "text.rei.config.side_search_box": "不置中搜索欄: ",
   "text.rei.config.mirror_rei": "右置 REI 小工具: ",
-  "text.rei.cheat_items": "已將 {item_count} 個 [{item_name}] 給予 {player_name}",
+  "text.rei.cheat_items": "已將 {item_count} 個 [{item_name}§f] 給予 {player_name}",
   "text.rei.failed_cheat_items": "§c不能給予物品.",
   "text.rei.config.list_ordering": "物品清單排序",
   "text.rei.config.list_ordering_button": "%s [%s]",
@@ -36,6 +38,25 @@
   "text.rei.showing_all": "顯示所有物品",
   "text.rei.delete_items": "§c刪除物品",
   "text.rei.check_updates": "檢查更新: ",
-  "text.rei.update_outdated": "§6REI 需要更新!\n§6當前版本: §a%s §6最新版本: §a%s\n§6重要性: §a%s",
-  "text.rei.update_changelog_line": "§6- %s"
+  "text.rei.config.load_default_plugin": "加載默認插件: ",
+  "text.rei.config.load_default_plugin.restart_tooltip": "如果你不知道這是做什麼的,\n你可能永遠不想禁用它.\n重啟 Minecraft 來使用這設置。",
+  "text.rei.credits": "感謝",
+  "text.rei.left_arrow": "<",
+  "text.rei.right_arrow": ">",
+  "text.rei.give_command": "作弊給予指令:",
+  "text.rei.gamemode_command": "遊戲模式指令:",
+  "text.rei.weather_command": "天氣指令:",
+  "text.rei.give_command.tooltip": "此命令僅在服務器上作弊時用.",
+  "text.rei.give_command.suggestion": "輸入指令.",
+  "text.rei.view_all_categories": "查看全部類別",
+  "text.rei.go_back_first_page": "回到第 1 頁",
+  "text.rei.config.appearance": "外貌",
+  "text.rei.config.modules": "組件",
+  "text.rei.config.advanced": "高級",
+  "text.rei.choose_page": "選擇頁面",
+  "text.rei.config.disable_credits_button": "禁用感謝按鈕:",
+  "text.rei.config.max_recipes_per_page": "每頁最多配方:",
+  "text.rei.config.enable_util_buttons": "啟用實用按鈕:",
+  "text.rei.gamemode_button.tooltip": "切換遊戲模式\n§7切換至 %s 模式。",
+  "text.rei.weather_button.tooltip": "切換天氣\n§7切換至 %s。"
 }

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

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

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

@@ -10,7 +10,8 @@
     "MixinCraftingTableScreen",
     "MixinCreativePlayerInventoryScreen",
     "MixinBrewingRecipeRegistry",
-    "MixinRecipeBookGui"
+    "MixinTabGetter",
+    "GhostSlotsHook"
   ],
   "injectors": {
     "defaultRequire": 1