فهرست منبع

Crafting Display

Unknown 6 سال پیش
والد
کامیت
3dd1ea9403
21فایلهای تغییر یافته به همراه325 افزوده شده و 34 حذف شده
  1. 1 1
      build.gradle
  2. 0 9
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  3. 19 0
      src/main/java/me/shedaniel/rei/api/IRecipeCategory.java
  4. 3 3
      src/main/java/me/shedaniel/rei/client/RecipeHelper.java
  5. 3 1
      src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java
  6. 1 1
      src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java
  7. 7 0
      src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java
  8. 36 0
      src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java
  9. 45 6
      src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java
  10. 7 2
      src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
  11. 0 9
      src/main/java/me/shedaniel/rei/listeners/ClientTick.java
  12. 75 0
      src/main/java/me/shedaniel/rei/plugin/DefaultCraftingCategory.java
  13. 8 0
      src/main/java/me/shedaniel/rei/plugin/DefaultCraftingDisplay.java
  14. 6 1
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  15. 10 0
      src/main/java/me/shedaniel/rei/plugin/DefaultShapedDisplay.java
  16. 14 0
      src/main/java/me/shedaniel/rei/plugin/DefaultShapelessDisplay.java
  17. 26 0
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingCategory.java
  18. 63 0
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingDisplay.java
  19. BIN
      src/main/resources/assets/roughlyenoughitems/textures/gui/display.png
  20. BIN
      src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png
  21. 1 1
      src/main/resources/fabric.mod.json

+ 1 - 1
build.gradle

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

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

@@ -4,12 +4,10 @@ import me.shedaniel.rei.api.IRecipePlugin;
 import me.shedaniel.rei.client.ClientHelper;
 import me.shedaniel.rei.client.ConfigManager;
 import me.shedaniel.rei.client.RecipeHelper;
-import me.shedaniel.rei.listeners.ClientTick;
 import me.shedaniel.rei.listeners.IListener;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.api.ModInitializer;
-import net.fabricmc.fabric.events.client.ClientTickEvent;
 import net.fabricmc.fabric.networking.CustomPayloadPacketRegistry;
 import net.minecraft.item.ItemStack;
 import net.minecraft.server.network.ServerPlayerEntity;
@@ -46,7 +44,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
     @Override
     public void onInitializeClient() {
         registerREIListeners();
-        registerFabricEvents();
         registerDefaultPlugin();
         configManager = new ConfigManager();
     }
@@ -77,12 +74,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali
         return true;
     }
     
-    private void registerFabricEvents() {
-        ClientTickEvent.CLIENT.register(minecraftClient -> {
-            getListeners(ClientTick.class).forEach(clientTick -> clientTick.onTick(minecraftClient));
-        });
-    }
-    
     @Override
     public void onInitialize() {
         registerFabricPackets();

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

@@ -1,8 +1,23 @@
 package me.shedaniel.rei.api;
 
+import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.rei.gui.widget.IWidget;
+import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.listeners.IMixinContainerGui;
+import net.minecraft.client.gui.Drawable;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexFormats;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
 public interface IRecipeCategory<T extends IRecipeDisplay> {
     
     public Identifier getIdentifier();
@@ -15,4 +30,8 @@ public interface IRecipeCategory<T extends IRecipeDisplay> {
         return false;
     }
     
+    default public List<IWidget> setupDisplay(IMixinContainerGui containerGui, T recipeDisplay, Rectangle bounds) {
+        return Arrays.asList(new RecipeBaseWidget(bounds));
+    }
+    
 }

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

@@ -55,7 +55,7 @@ public class RecipeHelper implements RecipeSync {
     }
     
     public static void registerCategory(IRecipeCategory category) {
-        categories.add(category);
+        categories.add(0, category);
         recipeCategoryListMap.put(category.getIdentifier(), Lists.newArrayList());
     }
     
@@ -96,8 +96,8 @@ public class RecipeHelper implements RecipeSync {
                     for(ItemStack itemStack : input) {
                         if (ItemStack.areEqualIgnoreTags(itemStack, stack)) {
                             categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay);
-                            if (found)
-                                break;
+                            found = true;
+                            break;
                         }
                     }
                     if (found)

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

@@ -81,6 +81,7 @@ public class ContainerGuiOverlay extends Gui {
         this.widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") {
             @Override
             public void draw(int mouseX, int mouseY, float partialTicks) {
+                page = MathHelper.clamp(page, 0, getTotalPage());
                 this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
                 super.draw(mouseX, mouseY, partialTicks);
             }
@@ -148,7 +149,8 @@ public class ContainerGuiOverlay extends Gui {
         int width = window.getScaledWidth() - startX;
         if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) {
             RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui;
-            width = window.getScaledWidth() - (widget.getBounds().x + widget.getBounds().width + 10);
+            startX = widget.getBounds().x + widget.getBounds().width + 10;
+            width = window.getScaledWidth() - startX;
         }
         return new Rectangle(startX, 0, width, window.getScaledHeight());
     }

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

@@ -101,7 +101,7 @@ public class ItemListOverlay extends Drawable implements IWidget {
                             if (button == 0)
                                 return ClientHelper.executeRecipeKeyBind(containerGuiOverlay, getCurrentStack().copy(), containerGui);
                             else if (button == 1)
-                                return ClientHelper.executeUsageKeyBind();
+                                return ClientHelper.executeUsageKeyBind(containerGuiOverlay, getCurrentStack().copy(), containerGui);
                         }
                     }
                     return false;

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

@@ -9,6 +9,7 @@ import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
@@ -90,9 +91,15 @@ public class ItemSlotWidget extends Drawable implements HighlightableWidget {
     }
     
     protected ItemStack getCurrentStack() {
+        if (itemList.size() == 0)
+            return new ItemStack(Items.AIR);
         return itemList.get(MathHelper.clamp((int) (System.currentTimeMillis() / 500) % itemList.size(), 0, itemList.size() - 1));
     }
     
+    public void setItemList(List<ItemStack> itemList) {
+        this.itemList = itemList;
+    }
+    
     @Override
     public Rectangle getBounds() {
         return new Rectangle(this.x, this.y, 18, 18);

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

@@ -0,0 +1,36 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.mojang.blaze3d.platform.GlStateManager;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Drawable;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.util.Identifier;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecipeBaseWidget extends Drawable implements IWidget {
+    
+    private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    
+    private Rectangle bounds;
+    
+    public RecipeBaseWidget(Rectangle bounds) {
+        this.bounds = bounds;
+    }
+    
+    @Override
+    public List<IWidget> getListeners() {
+        return new ArrayList<>();
+    }
+    
+    @Override
+    public void draw(int mouseX, int mouseY, float partialTicks) {
+        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        GuiLighting.disable();
+        MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
+        drawTexturedRect(bounds.x, bounds.y, 106, 190, bounds.width, bounds.height);
+    }
+    
+}

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

@@ -27,7 +27,7 @@ public class RecipeViewingWidget extends Gui {
     private static final Identifier CREATIVE_INVENTORY_TABS = new Identifier("textures/gui/container/creative_inventory/tabs.png");
     private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     public final int guiWidth = 176;
-    public final int guiHeight = 158;
+    public final int guiHeight = 186;
     
     private List<IWidget> widgets;
     private List<TabWidget> tabs;
@@ -84,11 +84,25 @@ public class RecipeViewingWidget extends Gui {
         widgets.add(categoryBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 5, 12, 12, "<") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
+                int currentCategoryIndex = categories.indexOf(selectedCategory);
+                currentCategoryIndex--;
+                if (currentCategoryIndex < 0)
+                    currentCategoryIndex = categories.size() - 1;
+                selectedCategory = categories.get(currentCategoryIndex);
+                categoryPages = MathHelper.floor(currentCategoryIndex / 6d);
+                RecipeViewingWidget.this.onInitialized();
             }
         });
         widgets.add(categoryNext = new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 5, 12, 12, ">") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
+                int currentCategoryIndex = categories.indexOf(selectedCategory);
+                currentCategoryIndex++;
+                if (currentCategoryIndex >= categories.size())
+                    currentCategoryIndex = 0;
+                selectedCategory = categories.get(currentCategoryIndex);
+                categoryPages = MathHelper.floor(currentCategoryIndex / 6d);
+                RecipeViewingWidget.this.onInitialized();
             }
         });
         categoryBack.enabled = categories.size() > 1;
@@ -97,11 +111,19 @@ public class RecipeViewingWidget extends Gui {
         widgets.add(recipeBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 21, 12, 12, "<") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
+                page--;
+                if (page < 0)
+                    page = getTotalPages(selectedCategory) - 1;
+                RecipeViewingWidget.this.onInitialized();
             }
         });
         widgets.add(recipeNext = new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 21, 12, 12, ">") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
+                page++;
+                if (page >= getTotalPages(selectedCategory))
+                    page = 0;
+                RecipeViewingWidget.this.onInitialized();
             }
         });
         recipeBack.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage();
@@ -140,7 +162,15 @@ public class RecipeViewingWidget extends Gui {
                         return false;
                     }
                 });
-                tab.setItem(selectedCategory.getCategoryIcon(), selectedCategory.getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory));
+                tab.setItem(categories.get(j).getCategoryIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory));
+            }
+        }
+        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)));
+            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)));
             }
         }
         
@@ -159,7 +189,9 @@ public class RecipeViewingWidget extends Gui {
     @Override
     public void draw(int mouseX, int mouseY, float partialTicks) {
         drawBackground();
-        tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
+        tabs.stream().filter(tabWidget -> {
+            return !tabWidget.isSelected();
+        }).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
         GuiLighting.disable();
         super.draw(mouseX, mouseY, partialTicks);
         widgets.forEach(widget -> {
@@ -168,10 +200,8 @@ public class RecipeViewingWidget extends Gui {
         });
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
+        tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
         overlay.render(mouseX, mouseY, partialTicks);
-        tabs.stream().filter(tabWidget -> {
-            return !tabWidget.isSelected();
-        }).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
     }
     
     @Override
@@ -199,6 +229,14 @@ public class RecipeViewingWidget extends Gui {
         return super.charTyped(char_1, int_1);
     }
     
+    @Override
+    public boolean mouseScrolled(double amount) {
+        for(GuiEventListener listener : listeners)
+            if (listener.mouseScrolled(amount))
+                return true;
+        return super.mouseScrolled(amount);
+    }
+    
     @Override
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
         for(GuiEventListener entry : getEntries())
@@ -210,4 +248,5 @@ public class RecipeViewingWidget extends Gui {
             }
         return false;
     }
+    
 }

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

@@ -8,6 +8,7 @@ import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
 
 import java.awt.*;
 import java.util.Arrays;
@@ -15,6 +16,8 @@ import java.util.List;
 
 public class TabWidget extends Drawable implements HighlightableWidget {
     
+    private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    
     private boolean shown = false, selected = false;
     private ItemStack item;
     private int id;
@@ -67,9 +70,11 @@ 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();
-            this.drawTexturedRect(bounds.x, bounds.y, selected ? 28 : 0, 158, 28, (selected ? 31 : 28));
+            MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
+            this.drawTexturedRect(bounds.x, bounds.y + 2, selected ? 28 : 0, 192, 28, (selected ? 30 : 27));
             this.zOffset = 100.0F;
             this.itemRenderer.zOffset = 100.0F;
             GuiLighting.enableForItems();

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

@@ -1,9 +0,0 @@
-package me.shedaniel.rei.listeners;
-
-import net.minecraft.client.MinecraftClient;
-
-public interface ClientTick extends IListener {
-    
-    public void onTick(MinecraftClient minecraftClient);
-    
-}

+ 75 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultCraftingCategory.java

@@ -1,13 +1,28 @@
 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.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 java.awt.*;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
 public class DefaultCraftingCategory implements IRecipeCategory<DefaultCraftingDisplay> {
     
+    private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png");
+    
     @Override
     public Identifier getIdentifier() {
         return DefaultPlugin.CRAFTING;
@@ -23,4 +38,64 @@ public class DefaultCraftingCategory implements IRecipeCategory<DefaultCraftingD
         return I18n.translate("category.rei.crafting");
     }
     
+    @Override
+    public List<IWidget> setupDisplay(IMixinContainerGui containerGui, DefaultCraftingDisplay recipeDisplay, Rectangle bounds) {
+        Point startPoint = new Point((int) bounds.getCenterX() - 58, (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, 0, 116, 54);
+            }
+        }));
+        List<List<ItemStack>> input = recipeDisplay.getInput();
+        List<ItemSlotWidget> slots = Lists.newArrayList();
+        for(int y = 0; y < 3; y++)
+            for(int x = 0; x < 3; x++)
+                slots.add(new ItemSlotWidget(startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18, Lists.newArrayList(), true, true, containerGui));
+        for(int i = 0; i < input.size(); i++) {
+            if (recipeDisplay instanceof DefaultShapedDisplay) {
+                if (!input.get(i).isEmpty())
+                    slots.get(getSlotWithSize(recipeDisplay, i)).setItemList(input.get(i));
+            } else if (!input.get(i).isEmpty())
+                slots.get(i).setItemList(input.get(i));
+        }
+        widgets.addAll(slots);
+        widgets.add(new ItemSlotWidget(startPoint.x + 95, startPoint.y + 19, recipeDisplay.getOutput(), false, true, containerGui) {
+            @Override
+            protected String getItemCountOverlay(ItemStack currentStack) {
+                if (currentStack.getAmount() == 1)
+                    return "";
+                if (currentStack.getAmount() < 1)
+                    return "§c" + currentStack.getAmount();
+                return currentStack.getAmount() + "";
+            }
+        });
+        return widgets;
+    }
+    
+    private int getSlotWithSize(DefaultCraftingDisplay recipeDisplay, int num) {
+        if (recipeDisplay.getWidth() == 1) {
+            if (num == 1)
+                return 3;
+            if (num == 2)
+                return 6;
+        }
+        
+        if (recipeDisplay.getWidth() == 2) {
+            if (num == 2)
+                return 3;
+            if (num == 3)
+                return 4;
+            if (num == 4)
+                return 6;
+            if (num == 5)
+                return 7;
+        }
+        return num;
+    }
+    
 }

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

@@ -12,4 +12,12 @@ public interface DefaultCraftingDisplay<T> extends IRecipeDisplay<Recipe> {
         return DefaultPlugin.CRAFTING;
     }
     
+    default public int getWidth() {
+        return 2;
+    }
+    
+    default public int getHeight() {
+        return 2;
+    }
+    
 }

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

@@ -5,15 +5,18 @@ import me.shedaniel.rei.client.RecipeHelper;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.crafting.ShapedRecipe;
 import net.minecraft.recipe.crafting.ShapelessRecipe;
+import net.minecraft.recipe.smelting.SmeltingRecipe;
 import net.minecraft.util.Identifier;
 
 public class DefaultPlugin implements IRecipePlugin {
     
-    static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugin/crafting");
+    static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugins/crafting");
+    static final Identifier SMELTING = new Identifier("roughlyenoughitems", "plugins/smelting");
     
     @Override
     public void registerPluginCategories() {
         RecipeHelper.registerCategory(new DefaultCraftingCategory());
+        RecipeHelper.registerCategory(new DefaultSmeltingCategory());
     }
     
     @Override
@@ -23,6 +26,8 @@ public class DefaultPlugin implements IRecipePlugin {
                 RecipeHelper.registerRecipe(CRAFTING, new DefaultShapelessDisplay((ShapelessRecipe) value));
             else if (value instanceof ShapedRecipe)
                 RecipeHelper.registerRecipe(CRAFTING, new DefaultShapedDisplay((ShapedRecipe) value));
+            else if (value instanceof SmeltingRecipe)
+                RecipeHelper.registerRecipe(SMELTING, new DefaultSmeltingDisplay((SmeltingRecipe) value));
     }
     
 }

+ 10 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultShapedDisplay.java

@@ -42,4 +42,14 @@ public class DefaultShapedDisplay implements DefaultCraftingDisplay<ShapedRecipe
         return input;
     }
     
+    @Override
+    public int getHeight() {
+        return display.getHeight();
+    }
+    
+    @Override
+    public int getWidth() {
+        return display.getWidth();
+    }
+    
 }

+ 14 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultShapelessDisplay.java

@@ -42,4 +42,18 @@ public class DefaultShapelessDisplay implements DefaultCraftingDisplay {
         return input;
     }
     
+    @Override
+    public int getWidth() {
+        if (display.getPreviewInputs().size() > 4)
+            return 3;
+        return 2;
+    }
+    
+    @Override
+    public int getHeight() {
+        if (display.getPreviewInputs().size() > 4)
+            return 3;
+        return 2;
+    }
+    
 }

+ 26 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingCategory.java

@@ -0,0 +1,26 @@
+package me.shedaniel.rei.plugin;
+
+import me.shedaniel.rei.api.IRecipeCategory;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+
+public class DefaultSmeltingCategory implements IRecipeCategory<DefaultSmeltingDisplay> {
+    
+    @Override
+    public Identifier getIdentifier() {
+        return DefaultPlugin.SMELTING;
+    }
+    
+    @Override
+    public ItemStack getCategoryIcon() {
+        return new ItemStack(Blocks.FURNACE.getItem());
+    }
+    
+    @Override
+    public String getCategoryName() {
+        return I18n.translate("category.rei.smelting");
+    }
+    
+}

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

@@ -0,0 +1,63 @@
+package me.shedaniel.rei.plugin;
+
+import com.google.common.collect.Lists;
+import me.shedaniel.rei.api.IRecipeDisplay;
+import net.minecraft.block.entity.FurnaceBlockEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.Recipe;
+import net.minecraft.recipe.crafting.ShapelessRecipe;
+import net.minecraft.recipe.smelting.SmeltingRecipe;
+import net.minecraft.util.Identifier;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class DefaultSmeltingDisplay implements IRecipeDisplay<SmeltingRecipe> {
+    
+    private SmeltingRecipe display;
+    private List<List<ItemStack>> input;
+    private List<ItemStack> fuel, output;
+    
+    public DefaultSmeltingDisplay(SmeltingRecipe recipe) {
+        this.display = recipe;
+        this.fuel = Lists.newArrayList();
+        this.input = Lists.newArrayList();
+        fuel.addAll(FurnaceBlockEntity.createBurnableMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList()));
+        recipe.getPreviewInputs().forEach(ingredient -> {
+            input.add(Arrays.asList(ingredient.getStackArray()));
+        });
+        this.output = Arrays.asList(recipe.getOutput());
+    }
+    
+    @Override
+    public SmeltingRecipe getRecipe() {
+        return display;
+    }
+    
+    @Override
+    public List<List<ItemStack>> getInput() {
+        return input;
+    }
+    
+    public List<ItemStack> getFuel() {
+        return fuel;
+    }
+    
+    @Override
+    public List<ItemStack> getOutput() {
+        return output;
+    }
+    
+    @Override
+    public Identifier getRecipeCategory() {
+        return DefaultPlugin.SMELTING;
+    }
+    
+    @Override
+    public List<List<ItemStack>> getRequiredItems() {
+        return input;
+    }
+    
+}

BIN
src/main/resources/assets/roughlyenoughitems/textures/gui/display.png


BIN
src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png


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

@@ -2,7 +2,7 @@
   "id": "roughlyenoughitems",
   "name": "RoughlyEnoughItems",
   "description": "To allow players to view items and recipes.",
-  "version": "2.0.0.26",
+  "version": "2.0.0.27",
   "side": "client",
   "authors": [
     "Danielshe"