Răsfoiți Sursa

Guess this works

Unknown 6 ani în urmă
părinte
comite
55fb26865a

+ 3 - 3
build.gradle

@@ -6,15 +6,15 @@ sourceCompatibility = 1.8
 targetCompatibility = 1.8
 
 archivesBaseName = "RoughlyEnoughItems"
-version = "2.0.0.36"
+version = "2.0.0.37"
 
 minecraft {
 }
 
 dependencies {
 	minecraft "com.mojang:minecraft:19w02a"
-	mappings "net.fabricmc:yarn:19w02a.12"
-	modCompile "net.fabricmc:fabric-loader:0.3.2.92"
+	mappings "net.fabricmc:yarn:19w02a.20"
+	modCompile "net.fabricmc:fabric-loader:0.3.2.95"
 
 	// Fabric API. This is technically optional, but you probably want it anyway.
 	modCompile "net.fabricmc:fabric:0.1.4.71"

+ 19 - 0
src/main/java/me/shedaniel/rei/api/IRecipeCategoryCraftable.java

@@ -0,0 +1,19 @@
+package me.shedaniel.rei.api;
+
+import me.shedaniel.rei.gui.widget.IWidget;
+import me.shedaniel.rei.gui.widget.RecipeViewingWidget;
+import me.shedaniel.rei.listeners.IMixinContainerGui;
+import net.minecraft.client.gui.Gui;
+
+import java.awt.*;
+import java.util.List;
+
+public interface IRecipeCategoryCraftable<T extends IRecipeDisplay> {
+    
+    public boolean canAutoCraftHere(Class<? extends Gui> guiClass, T recipe);
+    
+    public boolean performAutoCraft(Gui gui, T recipe);
+    
+    public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, T recipe);
+    
+}

+ 2 - 0
src/main/java/me/shedaniel/rei/api/IRecipePlugin.java

@@ -8,4 +8,6 @@ public interface IRecipePlugin extends IListener {
     
     public void registerRecipes();
     
+    public void registerAutoCraftingGui();
+    
 }

+ 27 - 4
src/main/java/me/shedaniel/rei/client/RecipeHelper.java

@@ -4,9 +4,11 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.IRecipeCategory;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
 import me.shedaniel.rei.api.IRecipeDisplay;
 import me.shedaniel.rei.api.IRecipePlugin;
 import me.shedaniel.rei.listeners.RecipeSync;
+import net.minecraft.client.gui.Gui;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.RecipeManager;
 import net.minecraft.util.Identifier;
@@ -19,10 +21,12 @@ public class RecipeHelper implements RecipeSync {
     private static Map<Identifier, List<IRecipeDisplay>> recipeCategoryListMap;
     private static List<IRecipeCategory> categories;
     private static RecipeManager recipeManager;
+    private static Map<Class, IRecipeCategoryCraftable> craftables;
     
     public RecipeHelper() {
         this.recipeCategoryListMap = Maps.newHashMap();
         this.categories = Lists.newArrayList();
+        this.craftables = Maps.newHashMap();
     }
     
     public static List<ItemStack> findCraftableByItems(List<ItemStack> inventoryItems) {
@@ -113,20 +117,39 @@ public class RecipeHelper implements RecipeSync {
         return recipeCategoryListMap;
     }
     
+    public static List<IRecipeCategory> getCategories() {
+        return categories;
+    }
+    
+    public static void registerCategoryCraftable(Class<? extends IRecipeDisplay> guiClass, IRecipeCategoryCraftable categoryCraftable) {
+        craftables.put(guiClass, categoryCraftable);
+    }
+    
+    public static void registerCategoryCraftable(Class<? extends IRecipeDisplay>[] guiClasses, IRecipeCategoryCraftable categoryCraftable) {
+        for(Class<? extends IRecipeDisplay> guiClass : guiClasses) craftables.put(guiClass, categoryCraftable);
+    }
+    
+    public static IRecipeCategoryCraftable getCategoryCraftable(IRecipeDisplay gui) {
+        if (!craftables.containsKey(gui.getClass()))
+            return null;
+        return craftables.get(gui.getClass());
+    }
+    
     @Override
     public void recipesLoaded(RecipeManager recipeManager) {
         this.recipeManager = recipeManager;
         this.recipeCategoryListMap.clear();
         this.categories.clear();
+        this.craftables.clear();
         RoughlyEnoughItemsCore.getListeners(IRecipePlugin.class).forEach(plugin -> {
             plugin.registerPluginCategories();
             plugin.registerRecipes();
+            plugin.registerAutoCraftingGui();
         });
         Collections.reverse(categories);
-        RoughlyEnoughItemsCore.LOGGER.info("Registered REI Categories: " + String.join(", ", categories.stream().map(category -> {return category.getCategoryName();}).collect(Collectors.toList())));
+        RoughlyEnoughItemsCore.LOGGER.info("Registered REI Categories: " + String.join(", ", categories.stream().map(category -> {
+            return category.getCategoryName();
+        }).collect(Collectors.toList())));
     }
     
-    public static List<IRecipeCategory> getCategories() {
-        return categories;
-    }
 }

+ 9 - 0
src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.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.api.IRecipeCategory;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
 import me.shedaniel.rei.api.IRecipeDisplay;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.GuiHelper;
@@ -177,9 +178,17 @@ public class RecipeViewingWidget extends Gui {
         if (page * getRecipesPerPage() < categoriesMap.get(selectedCategory).size()) {
             IRecipeDisplay topDisplay = categoriesMap.get(selectedCategory).get(page * getRecipesPerPage());
             widgets.addAll(selectedCategory.setupDisplay(getParent(), topDisplay, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 40, 150, selectedCategory.usesFullPage() ? 118 : 66)));
+            IRecipeCategoryCraftable craftable = RecipeHelper.getCategoryCraftable(topDisplay);
+            if (craftable != null)
+                craftable.registerAutoCraftButton(widgets, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 40, 150, selectedCategory.usesFullPage() ? 118 : 66),
+                        getParent(), topDisplay);
             if (!selectedCategory.usesFullPage() && page * getRecipesPerPage() + 1 < categoriesMap.get(selectedCategory).size()) {
                 IRecipeDisplay middleDisplay = categoriesMap.get(selectedCategory).get(page * getRecipesPerPage() + 1);
                 widgets.addAll(selectedCategory.setupDisplay(getParent(), middleDisplay, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 108, 150, 66)));
+                craftable = RecipeHelper.getCategoryCraftable(middleDisplay);
+                if (craftable != null)
+                    craftable.registerAutoCraftButton(widgets, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 108, 150, 66),
+                            getParent(), middleDisplay);
             }
         }
         

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

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

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

@@ -0,0 +1,20 @@
+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 getGhostSlots() {
+        return ghostSlots;
+    }
+    
+}

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

@@ -1,13 +1,20 @@
 package me.shedaniel.rei.plugin;
 
+import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.IRecipeCategory;
-import me.shedaniel.rei.gui.widget.IWidget;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
-import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
+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 me.shedaniel.rei.listeners.IMixinRecipeBookGui;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.container.BlastFurnaceGui;
+import net.minecraft.client.gui.container.FurnaceGui;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;

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

@@ -2,13 +2,20 @@ package me.shedaniel.rei.plugin;
 
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.IRecipeCategory;
-import me.shedaniel.rei.gui.widget.IWidget;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
-import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
+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 me.shedaniel.rei.listeners.IMixinRecipeBookGui;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.container.CraftingTableGui;
+import net.minecraft.client.gui.ingame.PlayerInventoryGui;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;

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

@@ -1,9 +1,25 @@
 package me.shedaniel.rei.plugin;
 
 import com.google.common.collect.Lists;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
 import me.shedaniel.rei.api.IRecipePlugin;
+import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.client.RecipeHelper;
+import me.shedaniel.rei.gui.widget.ButtonWidget;
+import me.shedaniel.rei.gui.widget.IWidget;
+import me.shedaniel.rei.gui.widget.QueuedTooltip;
+import me.shedaniel.rei.listeners.IMixinContainerGui;
+import me.shedaniel.rei.listeners.IMixinRecipeBookGui;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.container.BlastFurnaceGui;
+import net.minecraft.client.gui.container.CraftingTableGui;
+import net.minecraft.client.gui.container.FurnaceGui;
+import net.minecraft.client.gui.container.SmokerGui;
+import net.minecraft.client.gui.ingame.PlayerInventoryGui;
+import net.minecraft.client.resource.language.I18n;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.crafting.ShapedRecipe;
 import net.minecraft.recipe.crafting.ShapelessRecipe;
@@ -12,6 +28,8 @@ import net.minecraft.recipe.smelting.SmeltingRecipe;
 import net.minecraft.recipe.smelting.SmokingRecipe;
 import net.minecraft.util.Identifier;
 
+import java.awt.*;
+import java.util.Arrays;
 import java.util.List;
 
 public class DefaultPlugin implements IRecipePlugin {
@@ -53,4 +71,188 @@ public class DefaultPlugin implements IRecipePlugin {
         BREWING_DISPLAYS.forEach(display -> RecipeHelper.registerRecipe(BREWING, display));
     }
     
+    @Override
+    public void registerAutoCraftingGui() {
+        RecipeHelper.registerCategoryCraftable(new Class[]{DefaultShapelessDisplay.class, DefaultShapedDisplay.class}, new IRecipeCategoryCraftable<DefaultCraftingDisplay>() {
+            @Override
+            public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultCraftingDisplay recipe) {
+                return guiClass.isAssignableFrom(CraftingTableGui.class) || (guiClass.isAssignableFrom(PlayerInventoryGui.class) && recipe.getHeight() < 3 && recipe.getWidth() < 3);
+            }
+            
+            @Override
+            public boolean performAutoCraft(Gui gui, DefaultCraftingDisplay recipe) {
+                if (gui.getClass().isAssignableFrom(CraftingTableGui.class))
+                    ((IMixinRecipeBookGui) (((CraftingTableGui) gui).getRecipeBookGui())).getGhostSlots().reset();
+                else if (gui.getClass().isAssignableFrom(PlayerInventoryGui.class))
+                    ((IMixinRecipeBookGui) (((PlayerInventoryGui) gui).getRecipeBookGui())).getGhostSlots().reset();
+                else return false;
+                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
+                return true;
+            }
+            
+            @Override
+            public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultCraftingDisplay recipe) {
+                Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
+                ButtonWidget widget;
+                widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
+                    @Override
+                    public void onPressed(int button, double mouseX, double mouseY) {
+                        MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
+                        if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
+                            performAutoCraft(parentGui.getContainerGui(), recipe);
+                    }
+                    
+                    @Override
+                    public void draw(int mouseX, int mouseY, float partialTicks) {
+                        super.draw(mouseX, mouseY, partialTicks);
+                        List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
+                        if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
+                            GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
+                    }
+                });
+                widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
+            }
+            
+            private List<String> getToolTip(ContainerGui parentGui, DefaultCraftingDisplay recipe) {
+                if (!(parentGui instanceof CraftingTableGui || parentGui instanceof PlayerInventoryGui))
+                    return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
+                if (parentGui instanceof PlayerInventoryGui && !(recipe.getHeight() < 3 && recipe.getWidth() < 3))
+                    return Arrays.asList(I18n.translate("text.auto_craft.crafting.too_small"));
+                return Lists.newArrayList();
+            }
+        });
+        RecipeHelper.registerCategoryCraftable(DefaultSmeltingDisplay.class, new IRecipeCategoryCraftable<DefaultSmeltingDisplay>() {
+            @Override
+            public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultSmeltingDisplay recipe) {
+                return guiClass.isAssignableFrom(FurnaceGui.class);
+            }
+            
+            @Override
+            public boolean performAutoCraft(Gui gui, DefaultSmeltingDisplay recipe) {
+                if (gui.getClass().isAssignableFrom(FurnaceGui.class))
+                    ((IMixinRecipeBookGui) (((FurnaceGui) gui).getRecipeBookGui())).getGhostSlots().reset();
+                else return false;
+                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
+                return true;
+            }
+            
+            @Override
+            public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultSmeltingDisplay recipe) {
+                Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
+                ButtonWidget widget;
+                widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
+                    @Override
+                    public void onPressed(int button, double mouseX, double mouseY) {
+                        MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
+                        if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
+                            performAutoCraft(parentGui.getContainerGui(), recipe);
+                    }
+                    
+                    @Override
+                    public void draw(int mouseX, int mouseY, float partialTicks) {
+                        super.draw(mouseX, mouseY, partialTicks);
+                        List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
+                        if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
+                            GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
+                    }
+                });
+                widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
+            }
+            
+            private List<String> getToolTip(ContainerGui parentGui, DefaultSmeltingDisplay recipe) {
+                if (!(parentGui instanceof FurnaceGui))
+                    return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
+                return Lists.newArrayList();
+            }
+        });
+        RecipeHelper.registerCategoryCraftable(DefaultSmokingDisplay.class, new IRecipeCategoryCraftable<DefaultSmokingDisplay>() {
+            @Override
+            public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultSmokingDisplay recipe) {
+                return guiClass.isAssignableFrom(SmokerGui.class);
+            }
+            
+            @Override
+            public boolean performAutoCraft(Gui gui, DefaultSmokingDisplay recipe) {
+                if (gui.getClass().isAssignableFrom(SmokerGui.class))
+                    ((IMixinRecipeBookGui) (((SmokerGui) gui).getRecipeBookGui())).getGhostSlots().reset();
+                else return false;
+                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
+                return true;
+            }
+            
+            @Override
+            public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultSmokingDisplay recipe) {
+                Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
+                ButtonWidget widget;
+                widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
+                    @Override
+                    public void onPressed(int button, double mouseX, double mouseY) {
+                        MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
+                        if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
+                            performAutoCraft(parentGui.getContainerGui(), recipe);
+                    }
+                    
+                    @Override
+                    public void draw(int mouseX, int mouseY, float partialTicks) {
+                        super.draw(mouseX, mouseY, partialTicks);
+                        List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
+                        if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
+                            GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
+                    }
+                });
+                widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
+            }
+            
+            private List<String> getToolTip(ContainerGui parentGui, DefaultSmokingDisplay recipe) {
+                if (!(parentGui instanceof SmokerGui))
+                    return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
+                return Lists.newArrayList();
+            }
+        });
+        RecipeHelper.registerCategoryCraftable(DefaultBlastingDisplay.class, new IRecipeCategoryCraftable<DefaultBlastingDisplay>() {
+            @Override
+            public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultBlastingDisplay recipe) {
+                return guiClass.isAssignableFrom(BlastFurnaceGui.class);
+            }
+            
+            @Override
+            public boolean performAutoCraft(Gui gui, DefaultBlastingDisplay recipe) {
+                if (gui.getClass().isAssignableFrom(BlastFurnaceGui.class))
+                    ((IMixinRecipeBookGui) (((BlastFurnaceGui) gui).getRecipeBookGui())).getGhostSlots().reset();
+                else return false;
+                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
+                return true;
+            }
+            
+            @Override
+            public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultBlastingDisplay recipe) {
+                Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
+                ButtonWidget widget;
+                widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
+                    @Override
+                    public void onPressed(int button, double mouseX, double mouseY) {
+                        MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
+                        if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
+                            performAutoCraft(parentGui.getContainerGui(), recipe);
+                    }
+                    
+                    @Override
+                    public void draw(int mouseX, int mouseY, float partialTicks) {
+                        super.draw(mouseX, mouseY, partialTicks);
+                        List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
+                        if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
+                            GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
+                    }
+                });
+                widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
+            }
+            
+            private List<String> getToolTip(ContainerGui parentGui, DefaultBlastingDisplay recipe) {
+                if (!(parentGui instanceof BlastFurnaceGui))
+                    return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
+                return Lists.newArrayList();
+            }
+        });
+    }
+    
 }

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

@@ -1,13 +1,19 @@
 package me.shedaniel.rei.plugin;
 
+import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.IRecipeCategory;
-import me.shedaniel.rei.gui.widget.IWidget;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
-import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
+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 me.shedaniel.rei.listeners.IMixinRecipeBookGui;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.container.FurnaceGui;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;
@@ -66,4 +72,5 @@ public class DefaultSmeltingCategory implements IRecipeCategory<DefaultSmeltingD
         widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplay.getOutput(), false, true, containerGui, true));
         return widgets;
     }
+    
 }

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

@@ -1,13 +1,20 @@
 package me.shedaniel.rei.plugin;
 
+import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.IRecipeCategory;
-import me.shedaniel.rei.gui.widget.IWidget;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
-import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.api.IRecipeCategoryCraftable;
+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 me.shedaniel.rei.listeners.IMixinRecipeBookGui;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.container.FurnaceGui;
+import net.minecraft.client.gui.container.SmokerGui;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;

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

@@ -16,7 +16,6 @@
   "category.rei.brewing.reactant": "§eIngredient",
   "category.rei.brewing.result": "§eResulted Potion",
   "text.rei.config": "Config",
-  "text.rei.listeningkey": "Listening Key",
   "text.rei.centre_searchbox": "Right Search Box: ",
   "text.rei.cheat_items": "Given [%s] x%d to %s.",
   "text.rei.failed_cheat_items": "§cFailed to give items.",

+ 2 - 2
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.36",
+  "version": "2.0.0.37",
   "side": "client",
   "authors": [
     "Danielshe"
@@ -12,7 +12,7 @@
     "me.shedaniel.rei.client.ClientHelper"
   ],
   "requires": {
-    "fabric": "*"
+    "fabric": "0.1.4.71"
   },
   "mixins": {
     "client": "roughlyenoughitems.client.json"

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

@@ -8,7 +8,8 @@
     "MixinPlayerInventoryGui",
     "MixinCraftingTableGui",
     "MixinCreativePlayerInventoryGui",
-    "MixinBrewingRecipeRegistry"
+    "MixinBrewingRecipeRegistry",
+    "MixinRecipeBookGui"
   ],
   "injectors": {
     "defaultRequire": 1