瀏覽代碼

Updated to 19w04a & Campfire Category

Unknown 6 年之前
父節點
當前提交
179890a17e
共有 47 個文件被更改,包括 247 次插入218 次删除
  1. 3 3
      build.gradle
  2. 7 31
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  3. 11 14
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugins.java
  4. 0 1
      src/main/java/me/shedaniel/rei/api/IRecipeCategoryCraftable.java
  5. 0 2
      src/main/java/me/shedaniel/rei/api/IRecipePlugin.java
  6. 0 1
      src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java
  7. 11 19
      src/main/java/me/shedaniel/rei/client/ClientHelper.java
  8. 1 1
      src/main/java/me/shedaniel/rei/client/GuiHelper.java
  9. 1 5
      src/main/java/me/shedaniel/rei/client/REIConfig.java
  10. 1 3
      src/main/java/me/shedaniel/rei/client/REIItemListOrdering.java
  11. 1 3
      src/main/java/me/shedaniel/rei/client/RecipeHelper.java
  12. 4 3
      src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java
  13. 2 3
      src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java
  14. 3 5
      src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java
  15. 1 3
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  16. 0 1
      src/main/java/me/shedaniel/rei/gui/widget/IWidget.java
  17. 4 5
      src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java
  18. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java
  19. 0 1
      src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java
  20. 0 1
      src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java
  21. 3 3
      src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java
  22. 2 2
      src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
  23. 0 7
      src/main/java/me/shedaniel/rei/listeners/ClientLoaded.java
  24. 0 4
      src/main/java/me/shedaniel/rei/listeners/IListener.java
  25. 0 2
      src/main/java/me/shedaniel/rei/listeners/IMixinContainerGui.java
  26. 0 9
      src/main/java/me/shedaniel/rei/listeners/RecipeSync.java
  27. 2 4
      src/main/java/me/shedaniel/rei/mixin/MixinBrewingRecipeRegistry.java
  28. 1 8
      src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java
  29. 12 13
      src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java
  30. 3 1
      src/main/java/me/shedaniel/rei/mixin/MixinCraftingTableGui.java
  31. 3 1
      src/main/java/me/shedaniel/rei/mixin/MixinPlayerInventoryGui.java
  32. 3 1
      src/main/java/me/shedaniel/rei/mixin/MixinRecipeBookGui.java
  33. 3 10
      src/main/java/me/shedaniel/rei/plugin/DefaultBlastingCategory.java
  34. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultBlastingDisplay.java
  35. 0 1
      src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java
  36. 66 0
      src/main/java/me/shedaniel/rei/plugin/DefaultCampfireCategory.java
  37. 61 0
      src/main/java/me/shedaniel/rei/plugin/DefaultCampfireDisplay.java
  38. 3 10
      src/main/java/me/shedaniel/rei/plugin/DefaultCraftingCategory.java
  39. 0 1
      src/main/java/me/shedaniel/rei/plugin/DefaultCraftingDisplay.java
  40. 20 10
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  41. 3 9
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingCategory.java
  42. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingDisplay.java
  43. 3 10
      src/main/java/me/shedaniel/rei/plugin/DefaultSmokingCategory.java
  44. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultSmokingDisplay.java
  45. 2 0
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  46. 二進制
      src/main/resources/assets/roughlyenoughitems/textures/gui/display.png
  47. 1 1
      src/main/resources/fabric.mod.json

+ 3 - 3
build.gradle

@@ -8,9 +8,9 @@ targetCompatibility = 1.8
 archivesBaseName = "RoughlyEnoughItems"
 version = "2.1.0.44"
 
-def minecraftVersion = "19w03c"
-def yarnVersion = "19w03c.4"
-def fabricVersion = "0.1.4.76"
+def minecraftVersion = "19w04a"
+def yarnVersion = "19w04a.1"
+def fabricVersion = "0.1.4.79"
 def pluginLoaderVersion = "1.14-1.0.6-8"
 
 minecraft {

+ 7 - 31
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -1,12 +1,10 @@
 package me.shedaniel.rei;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import me.shedaniel.rei.api.IRecipePlugin;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ConfigHelper;
 import me.shedaniel.rei.client.RecipeHelper;
-import me.shedaniel.rei.listeners.IListener;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.api.ModInitializer;
@@ -25,32 +23,27 @@ import org.apache.logging.log4j.Logger;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitializer {
     
     public static final Logger LOGGER = LogManager.getFormatterLogger("REI");
     public static final Identifier DELETE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "delete_item");
     public static final Identifier CREATE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "create_item");
-    private static final List<IListener> listeners = Lists.newArrayList();
+    private static final RecipeHelper RECIPE_HELPER = new RecipeHelper();
+    private static final ClientHelper CLIENT_HELPER = new ClientHelper();
     private static final Map<Identifier, IRecipePlugin> plugins = Maps.newHashMap();
     private static ConfigHelper configHelper;
     
-    public static <T> List<T> getListeners(Class<T> listenerClass) {
-        return listeners.stream().filter(listener -> {
-            return listenerClass.isAssignableFrom(listener.getClass());
-        }).map(listener -> {
-            return listenerClass.cast(listener);
-        }).collect(Collectors.toList());
+    public static RecipeHelper getRecipeHelper() {
+        return RECIPE_HELPER;
     }
     
     public static ConfigHelper getConfigHelper() {
         return configHelper;
     }
     
-    private static IListener registerListener(IListener listener) {
-        listeners.add(listener);
-        return listener;
+    public static ClientHelper getClientHelper() {
+        return CLIENT_HELPER;
     }
     
     public static IRecipePlugin registerPlugin(Identifier identifier, IRecipePlugin plugin) {
@@ -72,7 +65,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
     
     @Override
     public void onInitializeClient() {
-        registerREIListeners();
         // If pluginloader is not installed, base functionality should still remain
         if (!Loader.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!");
@@ -81,18 +73,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
         configHelper = new ConfigHelper();
     }
     
-    private void registerREIListeners() {
-        registerListener(new ClientHelper());
-        registerListener(new RecipeHelper());
-    }
-    
-    private boolean removeListener(IListener listener) {
-        if (!listeners.contains(listener))
-            return false;
-        listeners.remove(listener);
-        return true;
-    }
-    
     @Override
     public void onInitialize() {
         registerFabricPackets();
@@ -108,11 +88,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
             ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
             ItemStack stack = packetByteBuf.readItemStack();
             if (player.inventory.insertStack(stack.copy()))
-                player.sendChatMessage(new StringTextComponent(I18n.translate("text.rei.cheat_items")
-                        .replaceAll("\\{item_name}", stack.copy().getDisplayName().getFormattedText())
-                        .replaceAll("\\{item_count}", stack.copy().getAmount() + "")
-                        .replaceAll("\\{player_name}", player.getEntityName())
-                ), ChatMessageType.SYSTEM);
+                player.sendChatMessage(new StringTextComponent(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", stack.copy().getDisplayName().getFormattedText()).replaceAll("\\{item_count}", stack.copy().getAmount() + "").replaceAll("\\{player_name}", player.getEntityName())), ChatMessageType.SYSTEM);
             else
                 player.sendChatMessage(new TranslatableTextComponent("text.rei.failed_cheat_items"), ChatMessageType.SYSTEM);
         });

+ 11 - 14
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugins.java

@@ -9,22 +9,19 @@ import net.fabricmc.loader.language.LanguageAdapterException;
 import net.minecraft.util.Identifier;
 
 public class RoughlyEnoughItemsPlugins implements LoaderCreator {
-
+    
     @Override
     public void createLoaders() {
         LanguageAdapter.Options instantiationOptions = new LanguageAdapter.Options();
-
-        new PluginLoaderBuilder("roughlyenoughitems")
-                .withValidator(ValidationStrategy.hasInterface(IRecipePlugin.class))
-                .withInitializer((aClass, container) -> {
-                    Identifier id = new Identifier(container.getOwner().getInfo().getId(), container.getInfo().getId());
-                    try {
-                        IRecipePlugin plugin = (IRecipePlugin) container.getOwner().getAdapter().createInstance(aClass, instantiationOptions);
-                        RoughlyEnoughItemsCore.registerPlugin(id, plugin);
-                    } catch (LanguageAdapterException e) {
-                        RoughlyEnoughItemsCore.LOGGER.error("REI: Error loading plugin %s", id, e);
-                    }
-                })
-                .build();
+        
+        new PluginLoaderBuilder("roughlyenoughitems").withValidator(ValidationStrategy.hasInterface(IRecipePlugin.class)).withInitializer((aClass, container) -> {
+            Identifier id = new Identifier(container.getOwner().getInfo().getId(), container.getInfo().getId());
+            try {
+                IRecipePlugin plugin = (IRecipePlugin) container.getOwner().getAdapter().createInstance(aClass, instantiationOptions);
+                RoughlyEnoughItemsCore.registerPlugin(id, plugin);
+            } catch (LanguageAdapterException e) {
+                RoughlyEnoughItemsCore.LOGGER.error("REI: Error loading plugin %s", id, e);
+            }
+        }).build();
     }
 }

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

@@ -1,7 +1,6 @@
 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;
 

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

@@ -1,7 +1,5 @@
 package me.shedaniel.rei.api;
 
-import me.shedaniel.rei.listeners.IListener;
-
 public interface IRecipePlugin {
     
     public void registerPluginCategories();

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

@@ -1,6 +1,5 @@
 package me.shedaniel.rei.api;
 
-import me.shedaniel.rei.plugin.DefaultCraftingDisplay;
 import net.minecraft.client.gui.Gui;
 
 public interface SpeedCraftFunctional<T extends IRecipeDisplay> {

+ 11 - 19
src/main/java/me/shedaniel/rei/client/ClientHelper.java

@@ -9,7 +9,6 @@ import me.shedaniel.rei.api.IRecipeDisplay;
 import me.shedaniel.rei.gui.ContainerGuiOverlay;
 import me.shedaniel.rei.gui.widget.ConfigWidget;
 import me.shedaniel.rei.gui.widget.RecipeViewingWidget;
-import me.shedaniel.rei.listeners.ClientLoaded;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
@@ -36,7 +35,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class ClientHelper implements ClientLoaded, ClientModInitializer {
+public class ClientHelper implements ClientModInitializer {
     
     private static final Identifier RECIPE_KEYBIND = new Identifier("roughlyenoughitems", "recipe_keybind");
     private static final Identifier USAGE_KEYBIND = new Identifier("roughlyenoughitems", "usage_keybind");
@@ -56,16 +55,13 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer {
             String modid = location.getNamespace();
             if (modid.equalsIgnoreCase("minecraft"))
                 return "Minecraft";
-            return FabricLoader.INSTANCE.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.INSTANCE.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 "";
     }
@@ -112,11 +108,9 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer {
         } else {
             Identifier location = Registry.ITEM.getId(cheatedStack.getItem());
             String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().asString() : "";
-            String madeUpCommand = RoughlyEnoughItemsCore.getConfigHelper().getGiveCommandPrefix() + " " + MinecraftClient.getInstance().player.getEntityName() + " " +
-                    location.toString() + tagMessage + (cheatedStack.getAmount() != 1 ? " " + cheatedStack.getAmount() : "");
+            String madeUpCommand = RoughlyEnoughItemsCore.getConfigHelper().getGiveCommandPrefix() + " " + MinecraftClient.getInstance().player.getEntityName() + " " + location.toString() + tagMessage + (cheatedStack.getAmount() != 1 ? " " + cheatedStack.getAmount() : "");
             if (madeUpCommand.length() > 256)
-                madeUpCommand = RoughlyEnoughItemsCore.getConfigHelper().getGiveCommandPrefix() + " " + MinecraftClient.getInstance().player.getEntityName() + " " +
-                        location.toString() + (cheatedStack.getAmount() != 1 ? " " + cheatedStack.getAmount() : "");
+                madeUpCommand = RoughlyEnoughItemsCore.getConfigHelper().getGiveCommandPrefix() + " " + MinecraftClient.getInstance().player.getEntityName() + " " + location.toString() + (cheatedStack.getAmount() != 1 ? " " + cheatedStack.getAmount() : "");
             MinecraftClient.getInstance().player.sendChatMessage(madeUpCommand);
             return true;
         }
@@ -141,8 +135,7 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer {
     }
     
     public static List<ItemStack> getInventoryItemsTypes() {
-        List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor
-                , MinecraftClient.getInstance().player.inventory.offHand);
+        List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor, MinecraftClient.getInstance().player.inventory.offHand);
         List<ItemStack> inventoryStacks = new ArrayList<>();
         field_7543.forEach(itemStacks -> itemStacks.forEach(itemStack -> {
             if (!itemStack.getItem().equals(Items.AIR))
@@ -151,7 +144,6 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer {
         return inventoryStacks;
     }
     
-    @Override
     public void clientLoaded() {
         Registry.ITEM.forEach(item -> {
             if (!item.equals(Items.ENCHANTED_BOOK))

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

@@ -24,7 +24,7 @@ public class GuiHelper {
         overlayVisible = !overlayVisible;
     }
     
-    public static ContainerGuiOverlay getOverlay(ContainerGui lastGui) {
+    public static ContainerGuiOverlay getOverlay(IMixinContainerGui lastGui) {
         if (overlay == null) {
             overlay = new ContainerGuiOverlay(lastGui);
             overlay.onInitialized();

+ 1 - 5
src/main/java/me/shedaniel/rei/client/REIConfig.java

@@ -3,13 +3,9 @@ package me.shedaniel.rei.client;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
-import java.awt.event.KeyEvent;
-
 public class REIConfig {
     
-    public static Gson GSON = new GsonBuilder()
-            .setPrettyPrinting()
-            .create();
+    public static Gson GSON = new GsonBuilder().setPrettyPrinting().create();
     
     public REIItemListOrdering itemListOrdering = REIItemListOrdering.REGISTRY;
     public boolean isAscending = true;

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

@@ -4,9 +4,7 @@ import com.google.gson.annotations.SerializedName;
 
 public enum REIItemListOrdering {
     
-    @SerializedName("registry") REGISTRY("ordering.rei.registry"),
-    @SerializedName("name") NAME("ordering.rei.name"),
-    @SerializedName("item_groups") ITEM_GROUPS("ordering.rei.item_groups");
+    @SerializedName("registry") REGISTRY("ordering.rei.registry"), @SerializedName("name") NAME("ordering.rei.name"), @SerializedName("item_groups") ITEM_GROUPS("ordering.rei.item_groups");
     
     private String nameTranslationKey;
     

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

@@ -4,7 +4,6 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
-import me.shedaniel.rei.listeners.RecipeSync;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.RecipeManager;
 import net.minecraft.util.Identifier;
@@ -14,7 +13,7 @@ import java.util.*;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class RecipeHelper implements RecipeSync {
+public class RecipeHelper {
     
     private static Map<Identifier, List<IRecipeDisplay>> recipeCategoryListMap;
     private static List<IRecipeCategory> categories;
@@ -145,7 +144,6 @@ public class RecipeHelper implements RecipeSync {
         speedCraftFunctionalMap.put(category, list);
     }
     
-    @Override
     public void recipesLoaded(RecipeManager recipeManager) {
         this.recipeManager = recipeManager;
         this.recipeCategoryListMap.clear();

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

@@ -36,9 +36,9 @@ public class ContainerGuiOverlay extends Gui {
     private ButtonWidget buttonLeft, buttonRight;
     private int lastLeft;
     
-    public ContainerGuiOverlay(ContainerGui containerGui) {
+    public ContainerGuiOverlay(IMixinContainerGui containerGui) {
         this.queuedTooltips = new ArrayList<>();
-        this.containerGui = (IMixinContainerGui) containerGui;
+        this.containerGui = containerGui;
         this.widgets = new ArrayList<>();
     }
     
@@ -242,7 +242,8 @@ public class ContainerGuiOverlay extends Gui {
                 buttonLeft.onPressed(0, 0, 0);
             else if (amount < 0 && buttonRight.enabled)
                 buttonRight.onPressed(0, 0, 0);
-            else return false;
+            else
+                return false;
             return true;
         }
         for(IWidget widget : widgets)

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

@@ -5,7 +5,6 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.font.FontRenderer;
 import net.minecraft.client.gui.Drawable;
-import net.minecraft.client.render.GuiLighting;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
@@ -76,8 +75,8 @@ public abstract class ButtonWidget extends Drawable implements IWidget {
             this.hovered = bounds.contains(mouseX, mouseY);
             int textureOffset = this.getTextureId(this.hovered);
             GlStateManager.enableBlend();
-            GlStateManager.blendFuncSeparate(GlStateManager.class_1033.SRC_ALPHA, GlStateManager.class_1027.ONE_MINUS_SRC_ALPHA, GlStateManager.class_1033.ONE, GlStateManager.class_1027.ZERO);
-            GlStateManager.blendFunc(GlStateManager.class_1033.SRC_ALPHA, GlStateManager.class_1027.ONE_MINUS_SRC_ALPHA);
+            GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
+            GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
             //Four Corners
             this.drawTexturedRect(this.x, this.y, 0, 46 + textureOffset * 20, 4, 4);
             this.drawTexturedRect(this.x + this.width - 4, this.y, 196, 46 + textureOffset * 20, 4, 4);

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

@@ -9,7 +9,6 @@ import net.minecraft.client.gui.GuiEventListener;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
-import org.apache.logging.log4j.core.Core;
 
 import java.io.IOException;
 import java.util.Arrays;
@@ -51,7 +50,7 @@ public class ConfigWidget extends Gui {
                     e.printStackTrace();
                 }
             }
-        
+            
             @Override
             public void draw(int mouseX, int mouseY, float partialTicks) {
                 text = getTrueFalseText(RoughlyEnoughItemsCore.getConfigHelper().sideSearchField());
@@ -97,12 +96,11 @@ public class ConfigWidget extends Gui {
                     e.printStackTrace();
                 }
             }
-        
+            
             @Override
             public void draw(int int_1, int int_2, float float_1) {
                 GuiLighting.disable();
-                this.text = I18n.translate("text.rei.list_ordering_button", I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().getItemListOrdering().getNameTranslationKey()),
-                        I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().isAscending() ? "ordering.rei.ascending" : "ordering.rei.descending"));
+                this.text = I18n.translate("text.rei.list_ordering_button", I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().getItemListOrdering().getNameTranslationKey()), I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().isAscending() ? "ordering.rei.ascending" : "ordering.rei.descending"));
                 String t = I18n.translate("text.rei.list_ordering") + ": ";
                 drawString(MinecraftClient.getInstance().fontRenderer, t, parent.width / 2 - 95 - MinecraftClient.getInstance().fontRenderer.getStringWidth(t), 90 + 6, -1);
                 super.draw(int_1, int_2, float_1);

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

@@ -51,9 +51,7 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget {
     }
     
     private void drawTooltip() {
-        GuiHelper.getLastOverlay()
-                .addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().craftableOnly()
-                        ? "text.rei.showing_craftable" : "text.rei.showing_all"))));
+        GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() ? "text.rei.showing_craftable" : "text.rei.showing_all"))));
     }
     
 }

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

@@ -1,6 +1,5 @@
 package me.shedaniel.rei.gui.widget;
 
-import com.google.common.collect.Lists;
 import net.minecraft.client.gui.GuiEventListener;
 
 import java.util.List;

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

@@ -3,7 +3,6 @@ package me.shedaniel.rei.gui.widget;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.*;
-import me.shedaniel.rei.listeners.ClientLoaded;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Drawable;
@@ -47,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() && MinecraftClient.getInstance().isInSingleplayer())
-            GuiHelper.getOverlay(containerGui.getContainerGui()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.rei.delete_items"))));
+            GuiHelper.getOverlay(containerGui).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate("text.rei.delete_items"))));
     }
     
     public void updateList(int page, String searchTerm) {
@@ -57,7 +56,7 @@ public class ItemListOverlay extends Drawable implements IWidget {
     public void updateList(Rectangle rect, int page, String searchTerm) {
         this.rectangle = rect;
         if (ClientHelper.getItemList().isEmpty())
-            RoughlyEnoughItemsCore.getListeners(ClientLoaded.class).forEach(ClientLoaded::clientLoaded);
+            RoughlyEnoughItemsCore.getClientHelper().clientLoaded();
         currentDisplayed = processSearchTerm(searchTerm, ClientHelper.getItemList(), GuiHelper.inventoryStacks);
         this.widgets.clear();
         this.page = page;
@@ -87,9 +86,9 @@ public class ItemListOverlay extends Drawable implements IWidget {
                             }
                         } else {
                             if (button == 0)
-                                return ClientHelper.executeRecipeKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
+                                return ClientHelper.executeRecipeKeyBind(GuiHelper.getOverlay(containerGui), getCurrentStack().copy(), containerGui);
                             else if (button == 1)
-                                return ClientHelper.executeUsageKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
+                                return ClientHelper.executeUsageKeyBind(GuiHelper.getOverlay(containerGui), getCurrentStack().copy(), containerGui);
                         }
                     }
                     return false;

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

@@ -81,7 +81,7 @@ public class ItemSlotWidget extends Drawable implements HighlightableWidget {
     
     protected void drawToolTip(ItemStack itemStack) {
         List<String> toolTip = getTooltip(itemStack);
-        GuiHelper.getOverlay(containerGui.getContainerGui()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), toolTip));
+        GuiHelper.getOverlay(containerGui).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), toolTip));
     }
     
     protected List<String> getTooltip(ItemStack itemStack) {
@@ -127,9 +127,9 @@ public class ItemSlotWidget extends Drawable implements HighlightableWidget {
             return false;
         if (getBounds().contains(mouseX, mouseY)) {
             if (button == 0)
-                return ClientHelper.executeRecipeKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
+                return ClientHelper.executeRecipeKeyBind(GuiHelper.getOverlay(containerGui), getCurrentStack().copy(), containerGui);
             else if (button == 1)
-                return ClientHelper.executeUsageKeyBind(GuiHelper.getOverlay(containerGui.getContainerGui()), getCurrentStack().copy(), containerGui);
+                return ClientHelper.executeUsageKeyBind(GuiHelper.getOverlay(containerGui), getCurrentStack().copy(), containerGui);
         }
         return false;
     }

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

@@ -2,7 +2,6 @@ package me.shedaniel.rei.gui.widget;
 
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Drawable;
-import net.minecraft.client.gui.GuiEventListener;
 
 import java.util.ArrayList;
 import java.util.List;

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

@@ -1,7 +1,6 @@
 package me.shedaniel.rei.gui.widget;
 
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.render.GuiLighting;

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

@@ -239,9 +239,9 @@ public class RecipeViewingWidget extends Gui {
             }
         }
         
-        GuiHelper.getOverlay(parent.getContainerGui()).onInitialized();
+        GuiHelper.getOverlay(parent).onInitialized();
         listeners.addAll(tabs);
-        listeners.add(GuiHelper.getOverlay(parent.getContainerGui()));
+        listeners.add(GuiHelper.getOverlay(parent));
         listeners.addAll(widgets);
     }
     
@@ -266,7 +266,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));
-        GuiHelper.getOverlay(parent.getContainerGui()).render(mouseX, mouseY, partialTicks);
+        GuiHelper.getOverlay(parent).render(mouseX, mouseY, partialTicks);
     }
     
     @Override

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

@@ -71,7 +71,7 @@ public class TabWidget extends Drawable implements HighlightableWidget {
     public void draw(int mouseX, int mouseY, float partialTicks) {
         if (shown) {
             int l = (int) this.bounds.getCenterX() - 8, i1 = (int) this.bounds.getCenterY() - 6;
-    
+            
             GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
             GuiLighting.disable();
             MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
@@ -90,7 +90,7 @@ public class TabWidget extends Drawable implements HighlightableWidget {
     }
     
     private void drawTooltip() {
-        GuiHelper.getOverlay(recipeViewingWidget.getParent().getContainerGui()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(categoryName)));
+        GuiHelper.getOverlay(recipeViewingWidget.getParent()).addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(categoryName)));
     }
     
     @Override

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

@@ -1,7 +0,0 @@
-package me.shedaniel.rei.listeners;
-
-public interface ClientLoaded extends IListener {
-    
-    public void clientLoaded();
-    
-}

+ 0 - 4
src/main/java/me/shedaniel/rei/listeners/IListener.java

@@ -1,4 +0,0 @@
-package me.shedaniel.rei.listeners;
-
-public interface IListener {
-}

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

@@ -5,8 +5,6 @@ import net.minecraft.client.gui.ContainerGui;
 import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
 
-import java.util.List;
-
 public interface IMixinContainerGui {
     
     public int getContainerLeft();

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

@@ -1,9 +0,0 @@
-package me.shedaniel.rei.listeners;
-
-import net.minecraft.recipe.RecipeManager;
-
-public interface RecipeSync extends IListener {
-    
-    public void recipesLoaded(RecipeManager recipeManager);
-    
-}

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

@@ -48,8 +48,7 @@ public class MixinBrewingRecipeRegistry {
             registerPotionType(potion_2);
         SELF_POTION_TYPES.forEach(ingredient -> {
             for(ItemStack stack : ingredient.getStackArray()) {
-                DefaultPlugin.registerBrewingDisplay(new DefaultBrewingDisplay(PotionUtil.setPotion(stack.copy(), potion_1), Ingredient.ofItems(new ItemProvider[]{item_1}),
-                        PotionUtil.setPotion(stack.copy(), potion_2)));
+                DefaultPlugin.registerBrewingDisplay(new DefaultBrewingDisplay(PotionUtil.setPotion(stack.copy(), potion_1), Ingredient.ofItems(new ItemProvider[]{item_1}), PotionUtil.setPotion(stack.copy(), potion_2)));
             }
         });
     }
@@ -57,8 +56,7 @@ public class MixinBrewingRecipeRegistry {
     private static void registerPotionType(Potion potion) {
         REGISTERED_POTION_TYPES.add(potion);
         SELF_ITEM_RECIPES.forEach(recipe -> {
-            DefaultPlugin.registerBrewingDisplay(new DefaultBrewingDisplay(PotionUtil.setPotion(recipe.input.getDefaultStack(), potion), recipe.ingredient,
-                    PotionUtil.setPotion(recipe.output.getDefaultStack(), potion)));
+            DefaultPlugin.registerBrewingDisplay(new DefaultBrewingDisplay(PotionUtil.setPotion(recipe.input.getDefaultStack(), potion), recipe.ingredient, PotionUtil.setPotion(recipe.output.getDefaultStack(), potion)));
         });
     }
     

+ 1 - 8
src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java

@@ -1,14 +1,9 @@
 package me.shedaniel.rei.mixin;
 
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.listeners.RecipeSync;
 import net.minecraft.client.network.ClientPlayNetworkHandler;
 import net.minecraft.client.network.packet.SynchronizeRecipesClientPacket;
-import net.minecraft.recipe.RecipeManager;
-import org.apache.logging.log4j.core.Core;
-import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -16,11 +11,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 @Mixin(ClientPlayNetworkHandler.class)
 public class MixinClientPlayNetworkHandler {
     
-    @Shadow @Final private RecipeManager recipeManager;
-    
     @Inject(method = "onSynchronizeRecipes", at = @At("RETURN"))
     private void onUpdateRecipes(SynchronizeRecipesClientPacket packetIn, CallbackInfo ci) {
-        RoughlyEnoughItemsCore.getListeners(RecipeSync.class).forEach(recipeSync -> recipeSync.recipesLoaded(this.recipeManager));
+        RoughlyEnoughItemsCore.getRecipeHelper().recipesLoaded(((ClientPlayNetworkHandler) ((Object) this)).getRecipeManager());
     }
     
 }

+ 12 - 13
src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java

@@ -1,6 +1,5 @@
 package me.shedaniel.rei.mixin;
 
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.GuiHelper;
 import me.shedaniel.rei.gui.ContainerGuiOverlay;
@@ -66,7 +65,7 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
     @Inject(method = "onInitialized()V", at = @At("RETURN"))
     protected void onInitialized(CallbackInfo info) {
         GuiHelper.resetOverlay();
-        this.listeners.add(GuiHelper.getOverlay(lastGui));
+        this.listeners.add(GuiHelper.getOverlay((IMixinContainerGui) lastGui));
     }
     
     @Inject(method = "draw(IIF)V", at = @At("RETURN"))
@@ -78,7 +77,7 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
         }
         if (MinecraftClient.getInstance().currentGui instanceof ContainerGui)
             this.lastGui = (ContainerGui) MinecraftClient.getInstance().currentGui;
-        GuiHelper.getOverlay(lastGui).render(int_1, int_2, float_1);
+        GuiHelper.getOverlay((IMixinContainerGui) lastGui).render(int_1, int_2, float_1);
     }
     
     @Override
@@ -91,15 +90,6 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
         return lastGui;
     }
     
-    @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) {
-        for(GuiEventListener entry : this.getEntries())
-            if (entry.keyPressed(int_1, int_2, int_3)) {
-                ci.cancel();
-                ci.setReturnValue(true);
-            }
-    }
-    
     @Override
     public Slot getHoveredSlot() {
         return focusedSlot;
@@ -107,7 +97,7 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
     
     @Override
     public boolean mouseScrolled(double double_1) {
-        ContainerGuiOverlay overlay = GuiHelper.getOverlay(lastGui);
+        ContainerGuiOverlay overlay = GuiHelper.getOverlay((IMixinContainerGui) lastGui);
         if (GuiHelper.isOverlayVisible() && overlay.getRectangle().contains(ClientHelper.getMouseLocation()))
             for(GuiEventListener entry : this.getEntries())
                 if (entry.mouseScrolled(double_1))
@@ -115,4 +105,13 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
         return super.mouseScrolled(double_1);
     }
     
+    @Inject(method = "keyPressed(III)Z", at = @At("HEAD"), cancellable = true)
+    public void keyPressed(int int_1, int int_2, int int_3, CallbackInfoReturnable<Boolean> ci) {
+        for(GuiEventListener entry : this.getEntries())
+            if (entry.keyPressed(int_1, int_2, int_3)) {
+                ci.setReturnValue(true);
+                ci.cancel();
+            }
+    }
+    
 }

+ 3 - 1
src/main/java/me/shedaniel/rei/mixin/MixinCraftingTableGui.java

@@ -17,7 +17,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 @Mixin(CraftingTableGui.class)
 public abstract class MixinCraftingTableGui extends ContainerGui {
     
-    @Shadow @Final private RecipeBookGui recipeBookGui;
+    @Shadow
+    @Final
+    private RecipeBookGui recipeBookGui;
     
     public MixinCraftingTableGui(Container container_1, PlayerInventory playerInventory_1, TextComponent textComponent_1) {
         super(container_1, playerInventory_1, textComponent_1);

+ 3 - 1
src/main/java/me/shedaniel/rei/mixin/MixinPlayerInventoryGui.java

@@ -18,7 +18,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 @Mixin(PlayerInventoryGui.class)
 public abstract class MixinPlayerInventoryGui extends AbstractPlayerInventoryGui<PlayerContainer> implements RecipeBookProvider {
     
-    @Shadow @Final private RecipeBookGui recipeBook;
+    @Shadow
+    @Final
+    private RecipeBookGui recipeBook;
     
     public MixinPlayerInventoryGui(PlayerContainer container_1, PlayerInventory playerInventory_1, TextComponent textComponent_1) {
         super(container_1, playerInventory_1, textComponent_1);

+ 3 - 1
src/main/java/me/shedaniel/rei/mixin/MixinRecipeBookGui.java

@@ -10,7 +10,9 @@ import org.spongepowered.asm.mixin.Shadow;
 @Mixin(RecipeBookGui.class)
 public class MixinRecipeBookGui implements IMixinRecipeBookGui {
     
-    @Shadow @Final protected RecipeBookGhostSlots ghostSlots;
+    @Shadow
+    @Final
+    protected RecipeBookGhostSlots ghostSlots;
     
     @Override
     public RecipeBookGhostSlots getGhostSlots() {

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

@@ -1,20 +1,13 @@
 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.api.IRecipeCategoryCraftable;
-import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.client.GuiHelper;
-import me.shedaniel.rei.gui.widget.*;
+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.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;

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

@@ -22,7 +22,7 @@ public class DefaultBlastingDisplay implements IRecipeDisplay<BlastingRecipe> {
         this.display = recipe;
         List<ItemStack> fuel = Lists.newArrayList();
         this.input = Lists.newArrayList();
-        fuel.addAll(FurnaceBlockEntity.createBurnableMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
+        fuel.addAll(FurnaceBlockEntity.createFuelTimeMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
         recipe.getPreviewInputs().forEach(ingredient -> {
             input.add(Arrays.asList(ingredient.getStackArray()));
         });

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

@@ -1,6 +1,5 @@
 package me.shedaniel.rei.plugin;
 
-import com.google.common.collect.Lists;
 import me.shedaniel.rei.api.IRecipeDisplay;
 import net.minecraft.block.Blocks;
 import net.minecraft.item.ItemStack;

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

@@ -0,0 +1,66 @@
+package me.shedaniel.rei.plugin;
+
+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.listeners.IMixinContainerGui;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
+
+import java.awt.*;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class DefaultCampfireCategory implements IRecipeCategory<DefaultCampfireDisplay> {
+    
+    private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png");
+    
+    @Override
+    public Identifier getIdentifier() {
+        return DefaultPlugin.CAMPFIRE;
+    }
+    
+    @Override
+    public ItemStack getCategoryIcon() {
+        return new ItemStack(Blocks.CAMPFIRE);
+    }
+    
+    @Override
+    public String getCategoryName() {
+        return I18n.translate("category.rei.campfire");
+    }
+    
+    @Override
+    public List<IWidget> setupDisplay(IMixinContainerGui containerGui, DefaultCampfireDisplay recipeDisplay, Rectangle bounds) {
+        Point startPoint = new Point((int) bounds.getCenterX() - 41, (int) bounds.getCenterY() - 27);
+        List<IWidget> widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) {
+            @Override
+            public void draw(int mouseX, int mouseY, float partialTicks) {
+                super.draw(mouseX, mouseY, partialTicks);
+                GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+                GuiLighting.disable();
+                MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE);
+                drawTexturedRect(startPoint.x, startPoint.y, 0, 167, 82, 54);
+                int height = MathHelper.ceil((System.currentTimeMillis() / 250 % 14d) / 1f);
+                drawTexturedRect(startPoint.x + 2, startPoint.y + 31 + (14 - height), 82, 77 + (14 - height), 14, height);
+                int width = MathHelper.ceil((System.currentTimeMillis() / 250 % 24d) / 1f);
+                drawTexturedRect(startPoint.x + 24, startPoint.y + 19, 82, 92, width, 17);
+                String text = I18n.translate("category.rei.campfire.time", MathHelper.floor(recipeDisplay.getCookTime() / 20d));
+                int length = MinecraftClient.getInstance().fontRenderer.getStringWidth(text);
+                MinecraftClient.getInstance().fontRenderer.drawWithShadow(text, bounds.x + bounds.width - length - 4, startPoint.y + 54 - 8, -1);
+            }
+        }));
+        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 11, recipeDisplay.getInput().get(0), true, true, containerGui, true));
+        widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplay.getOutput(), false, true, containerGui, true));
+        return widgets;
+    }
+    
+}

+ 61 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultCampfireDisplay.java

@@ -0,0 +1,61 @@
+package me.shedaniel.rei.plugin;
+
+import com.google.common.collect.Lists;
+import me.shedaniel.rei.api.IRecipeDisplay;
+import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.recipe.Recipe;
+import net.minecraft.recipe.cooking.CampfireCookingRecipe;
+import net.minecraft.util.DefaultedList;
+import net.minecraft.util.Identifier;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class DefaultCampfireDisplay implements IRecipeDisplay {
+    
+    private List<ItemStack> inputs, output;
+    private int cookTime;
+    
+    public DefaultCampfireDisplay(CampfireCookingRecipe recipe) {
+        this(recipe.getPreviewInputs(), recipe.getOutput(), recipe.getCookTime());
+    }
+    
+    public DefaultCampfireDisplay(DefaultedList<Ingredient> ingredients, ItemStack output, int cookTime) {
+        this.inputs = Lists.newArrayList();
+        ingredients.stream().map(ingredient -> ingredient.getStackArray()).forEach(itemStacks -> Collections.addAll(inputs, itemStacks));
+        this.output = Arrays.asList(output);
+        this.cookTime = cookTime;
+    }
+    
+    public int getCookTime() {
+        return cookTime;
+    }
+    
+    @Override
+    public Recipe getRecipe() {
+        return null;
+    }
+    
+    @Override
+    public List<List<ItemStack>> getInput() {
+        return Arrays.asList(inputs);
+    }
+    
+    @Override
+    public List<ItemStack> getOutput() {
+        return this.output;
+    }
+    
+    @Override
+    public Identifier getRecipeCategory() {
+        return DefaultPlugin.CAMPFIRE;
+    }
+    
+    @Override
+    public List<List<ItemStack>> getRequiredItems() {
+        return getInput();
+    }
+    
+}

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

@@ -2,20 +2,13 @@ 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.api.IRecipeCategoryCraftable;
-import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.client.GuiHelper;
-import me.shedaniel.rei.gui.widget.*;
+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.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;

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

@@ -2,7 +2,6 @@ package me.shedaniel.rei.plugin;
 
 import me.shedaniel.rei.api.IRecipeDisplay;
 import net.minecraft.recipe.Recipe;
-import net.minecraft.recipe.crafting.ShapelessRecipe;
 import net.minecraft.util.Identifier;
 
 public interface DefaultCraftingDisplay<T> extends IRecipeDisplay<Recipe> {

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

@@ -14,6 +14,7 @@ import net.minecraft.client.gui.container.SmokerGui;
 import net.minecraft.client.gui.ingame.PlayerInventoryGui;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.cooking.BlastingRecipe;
+import net.minecraft.recipe.cooking.CampfireCookingRecipe;
 import net.minecraft.recipe.cooking.SmeltingRecipe;
 import net.minecraft.recipe.cooking.SmokingRecipe;
 import net.minecraft.recipe.crafting.ShapedRecipe;
@@ -24,13 +25,14 @@ import java.util.List;
 
 public class DefaultPlugin implements IRecipePlugin {
     
-    static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugins/crafting");
-    static final Identifier SMELTING = new Identifier("roughlyenoughitems", "plugins/smelting");
-    static final Identifier SMOKING = new Identifier("roughlyenoughitems", "plugins/smoking");
-    static final Identifier BLASTING = new Identifier("roughlyenoughitems", "plugins/blasting");
-    static final Identifier BREWING = new Identifier("roughlyenoughitems", "plugins/brewing");
+    public static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugins/crafting");
+    public static final Identifier SMELTING = new Identifier("roughlyenoughitems", "plugins/smelting");
+    public static final Identifier SMOKING = new Identifier("roughlyenoughitems", "plugins/smoking");
+    public static final Identifier BLASTING = new Identifier("roughlyenoughitems", "plugins/blasting");
+    public static final Identifier CAMPFIRE = new Identifier("roughlyenoughitems", "plugins/campfire");
+    public static final Identifier BREWING = new Identifier("roughlyenoughitems", "plugins/brewing");
     
-    static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
+    private static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
     
     public static void registerBrewingDisplay(DefaultBrewingDisplay display) {
         BREWING_DISPLAYS.add(display);
@@ -42,6 +44,7 @@ public class DefaultPlugin implements IRecipePlugin {
         RecipeHelper.registerCategory(new DefaultSmeltingCategory());
         RecipeHelper.registerCategory(new DefaultSmokingCategory());
         RecipeHelper.registerCategory(new DefaultBlastingCategory());
+        RecipeHelper.registerCategory(new DefaultCampfireCategory());
         RecipeHelper.registerCategory(new DefaultBrewingCategory());
     }
     
@@ -58,11 +61,14 @@ public class DefaultPlugin implements IRecipePlugin {
                 RecipeHelper.registerRecipe(SMOKING, new DefaultSmokingDisplay((SmokingRecipe) value));
             else if (value instanceof BlastingRecipe)
                 RecipeHelper.registerRecipe(BLASTING, new DefaultBlastingDisplay((BlastingRecipe) value));
+            else if (value instanceof CampfireCookingRecipe)
+                RecipeHelper.registerRecipe(CAMPFIRE, new DefaultCampfireDisplay((CampfireCookingRecipe) value));
         BREWING_DISPLAYS.forEach(display -> RecipeHelper.registerRecipe(BREWING, display));
     }
     
     @Override
     public void registerSpeedCraft() {
+        RecipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, null);
         RecipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.BREWING, null);
         RecipeHelper.registerSpeedCraftFunctional(DefaultPlugin.CRAFTING, new SpeedCraftFunctional<DefaultCraftingDisplay>() {
             @Override
@@ -76,7 +82,8 @@ public class DefaultPlugin implements IRecipePlugin {
                     ((IMixinRecipeBookGui) (((CraftingTableGui) gui).getRecipeBookGui())).getGhostSlots().reset();
                 else if (gui.getClass().isAssignableFrom(PlayerInventoryGui.class))
                     ((IMixinRecipeBookGui) (((PlayerInventoryGui) gui).getRecipeBookGui())).getGhostSlots().reset();
-                else return false;
+                else
+                    return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
                 return true;
             }
@@ -96,7 +103,8 @@ public class DefaultPlugin implements IRecipePlugin {
             public boolean performAutoCraft(Gui gui, DefaultSmeltingDisplay recipe) {
                 if (gui instanceof FurnaceGui)
                     ((IMixinRecipeBookGui) (((FurnaceGui) gui).getRecipeBookGui())).getGhostSlots().reset();
-                else return false;
+                else
+                    return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
                 return true;
             }
@@ -116,7 +124,8 @@ public class DefaultPlugin implements IRecipePlugin {
             public boolean performAutoCraft(Gui gui, DefaultSmokingDisplay recipe) {
                 if (gui instanceof SmokerGui)
                     ((IMixinRecipeBookGui) (((SmokerGui) gui).getRecipeBookGui())).getGhostSlots().reset();
-                else return false;
+                else
+                    return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
                 return true;
             }
@@ -136,7 +145,8 @@ public class DefaultPlugin implements IRecipePlugin {
             public boolean performAutoCraft(Gui gui, DefaultBlastingDisplay recipe) {
                 if (gui instanceof BlastFurnaceGui)
                     ((IMixinRecipeBookGui) (((BlastFurnaceGui) gui).getRecipeBookGui())).getGhostSlots().reset();
-                else return false;
+                else
+                    return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
                 return true;
             }

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

@@ -1,19 +1,13 @@
 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.api.IRecipeCategoryCraftable;
-import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.client.GuiHelper;
-import me.shedaniel.rei.gui.widget.*;
+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.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;

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

@@ -22,7 +22,7 @@ public class DefaultSmeltingDisplay implements IRecipeDisplay<SmeltingRecipe> {
         this.display = recipe;
         List<ItemStack> fuel = Lists.newArrayList();
         this.input = Lists.newArrayList();
-        fuel.addAll(FurnaceBlockEntity.createBurnableMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
+        fuel.addAll(FurnaceBlockEntity.createFuelTimeMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
         recipe.getPreviewInputs().forEach(ingredient -> {
             input.add(Arrays.asList(ingredient.getStackArray()));
         });

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

@@ -1,20 +1,13 @@
 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.api.IRecipeCategoryCraftable;
-import me.shedaniel.rei.client.ClientHelper;
-import me.shedaniel.rei.client.GuiHelper;
-import me.shedaniel.rei.gui.widget.*;
+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.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;

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

@@ -22,7 +22,7 @@ public class DefaultSmokingDisplay implements IRecipeDisplay<SmokingRecipe> {
         this.display = recipe;
         List<ItemStack> fuel = Lists.newArrayList();
         this.input = Lists.newArrayList();
-        fuel.addAll(FurnaceBlockEntity.createBurnableMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
+        fuel.addAll(FurnaceBlockEntity.createFuelTimeMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
         recipe.getPreviewInputs().forEach(ingredient -> {
             input.add(Arrays.asList(ingredient.getStackArray()));
         });

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

@@ -10,6 +10,8 @@
   "category.rei.smelting.fuel": "§eFuel",
   "category.rei.smoking": "Smoking",
   "category.rei.blasting": "Blasting",
+  "category.rei.campfire": "Campfire",
+  "category.rei.campfire.time": "%d Seconds",
   "category.rei.brewing": "Brewing",
   "category.rei.brewing.input": "§eOriginal Potion",
   "category.rei.brewing.reactant": "§eIngredient",

二進制
src/main/resources/assets/roughlyenoughitems/textures/gui/display.png


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

@@ -12,7 +12,7 @@
     "me.shedaniel.rei.client.ClientHelper"
   ],
   "requires": {
-    "fabric": "0.1.4.76"
+    "fabric": "0.1.4.79"
   },
   "recommended": {
     "pluginloader": "1.0.6"