瀏覽代碼

more internal changes

Fix #56
Unknown 6 年之前
父節點
當前提交
6a4010d2f5

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

@@ -20,7 +20,7 @@ public interface RecipeCategory<T extends RecipeDisplay> {
     
     ItemStack getCategoryIcon();
     
-    default Renderable getIcon() {
+    default Renderer getIcon() {
         return Renderable.fromItemStackSupplier(this::getCategoryIcon);
     }
     

+ 12 - 7
src/main/java/me/shedaniel/rei/api/Renderable.java

@@ -1,29 +1,34 @@
 package me.shedaniel.rei.api;
 
-import me.shedaniel.rei.gui.renderables.ItemStackRenderable;
+import me.shedaniel.rei.gui.renderables.EmptyRenderer;
+import me.shedaniel.rei.gui.renderables.ItemStackRenderer;
 import net.minecraft.item.ItemStack;
 
 import java.util.function.Supplier;
 
 public interface Renderable {
     
-    static ItemStackRenderable fromItemStackSupplier(Supplier<ItemStack> supplier) {
-        return new ItemStackRenderable() {
+    static ItemStackRenderer fromItemStackSupplier(Supplier<ItemStack> supplier) {
+        return new ItemStackRenderer() {
             @Override
-            protected ItemStack getItemStack() {
+            public ItemStack getItemStack() {
                 return supplier.get();
             }
         };
     }
     
-    static ItemStackRenderable fromItemStack(ItemStack stack) {
-        return new ItemStackRenderable() {
+    static ItemStackRenderer fromItemStack(ItemStack stack) {
+        return new ItemStackRenderer() {
             @Override
-            protected ItemStack getItemStack() {
+            public ItemStack getItemStack() {
                 return stack;
             }
         };
     }
     
+    static EmptyRenderer empty() {
+        return EmptyRenderer.INSTANCE;
+    }
+    
     void render(int x, int y, double mouseX, double mouseY, float delta);
 }

+ 13 - 0
src/main/java/me/shedaniel/rei/api/Renderer.java

@@ -0,0 +1,13 @@
+package me.shedaniel.rei.api;
+
+import net.minecraft.client.gui.DrawableHelper;
+
+public abstract class Renderer extends DrawableHelper implements Renderable {
+    public int getBlitOffset() {
+        return this.blitOffset;
+    }
+    
+    public void setBlitOffset(int offset) {
+        this.blitOffset = offset;
+    }
+}

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

@@ -249,7 +249,7 @@ public class RecipeViewingScreen extends Screen {
                         return false;
                     }
                 });
-                tab.setRenderable(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory));
+                tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory));
             }
         }
         Optional<ButtonAreaSupplier> supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory);

+ 13 - 0
src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java

@@ -0,0 +1,13 @@
+package me.shedaniel.rei.gui.renderables;
+
+import me.shedaniel.rei.api.Renderer;
+
+public class EmptyRenderer extends Renderer {
+    
+    public static final EmptyRenderer INSTANCE = new EmptyRenderer();
+    
+    @Override
+    public void render(int x, int y, double mouseX, double mouseY, float delta) {
+    
+    }
+}

+ 8 - 7
src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java → src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java

@@ -1,15 +1,14 @@
 package me.shedaniel.rei.gui.renderables;
 
 import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.rei.api.Renderable;
+import me.shedaniel.rei.api.Renderer;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;
 
-public abstract class ItemStackRenderable extends DrawableHelper implements Renderable {
+public abstract class ItemStackRenderer extends Renderer {
     
     public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     
@@ -17,17 +16,19 @@ public abstract class ItemStackRenderable extends DrawableHelper implements Rend
     public void render(int x, int y, double mouseX, double mouseY, float delta) {
         int l = x - 8, i1 = y - 6;
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        this.blitOffset = 100;
         ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
-        itemRenderer.zOffset = 100.0F;
+        itemRenderer.zOffset = blitOffset;
         GuiLighting.enableForItems();
+        GlStateManager.colorMask(true, true, true, true);
+        GlStateManager.enableLighting();
+        GlStateManager.enableRescaleNormal();
+        GlStateManager.enableDepthTest();
         itemRenderer.renderGuiItem(getItemStack(), l, i1);
         itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, getItemStack(), l, i1);
-        GlStateManager.disableLighting();
         itemRenderer.zOffset = 0.0F;
         this.blitOffset = 0;
     }
     
-    protected abstract ItemStack getItemStack();
+    public abstract ItemStack getItemStack();
     
 }

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

@@ -109,7 +109,7 @@ public class ItemListOverlay extends Widget {
                 j++;
                 if (j > currentDisplayed.size())
                     break;
-                widgets.add(new ItemSlotWidget(x, y, Collections.singletonList(currentDisplayed.get(j - 1)), false, true, true) {
+                widgets.add(new SlotWidget(x, y, Collections.singletonList(currentDisplayed.get(j - 1)), false, true, true) {
                     @Override
                     protected void queueTooltip(ItemStack itemStack, float delta) {
                         ClientPlayerEntity player = minecraft.player;
@@ -119,10 +119,10 @@ public class ItemListOverlay extends Widget {
                     
                     @Override
                     public boolean mouseClicked(double mouseX, double mouseY, int button) {
-                        if (isHighlighted(mouseX, mouseY)) {
+                        if (isCurrentRendererItem() && isHighlighted(mouseX, mouseY)) {
                             if (ClientHelper.getInstance().isCheating()) {
-                                if (getCurrentStack() != null && !getCurrentStack().isEmpty()) {
-                                    ItemStack cheatedStack = getCurrentStack().copy();
+                                if (getCurrentItemStack() != null && !getCurrentItemStack().isEmpty()) {
+                                    ItemStack cheatedStack = getCurrentItemStack().copy();
                                     if (RoughlyEnoughItemsCore.getConfigManager().getConfig().itemCheatingMode == ItemCheatingMode.REI_LIKE)
                                         cheatedStack.setAmount(button != 1 ? 1 : cheatedStack.getMaxAmount());
                                     else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().itemCheatingMode == ItemCheatingMode.JEI_LIKE)
@@ -132,9 +132,9 @@ public class ItemListOverlay extends Widget {
                                     return ClientHelper.getInstance().tryCheatingStack(cheatedStack);
                                 }
                             } else if (button == 0)
-                                return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentStack().copy());
+                                return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack().copy());
                             else if (button == 1)
-                                return ClientHelper.getInstance().executeUsageKeyBind(getCurrentStack().copy());
+                                return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack().copy());
                         }
                         return false;
                     }

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

@@ -1,158 +1,25 @@
 package me.shedaniel.rei.gui.widget;
 
-import com.google.common.collect.Lists;
-import com.mojang.blaze3d.platform.GlStateManager;
-import me.shedaniel.cloth.api.ClientUtils;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.ClientHelper;
-import me.shedaniel.rei.client.ScreenHelper;
-import net.minecraft.client.gui.Element;
-import net.minecraft.client.render.GuiLighting;
-import net.minecraft.client.render.item.ItemRenderer;
+import me.shedaniel.rei.api.Renderer;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.math.MathHelper;
 
-import java.awt.*;
-import java.util.Collections;
-import java.util.LinkedList;
+import java.util.Collection;
 import java.util.List;
 
-public class ItemSlotWidget extends HighlightableWidget {
-    
-    private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
-    private List<ItemStack> itemList = new LinkedList<>();
-    private boolean drawBackground, showToolTips, clickToMoreRecipes, drawHighlightedBackground;
-    private int x, y;
-    
+public class ItemSlotWidget extends SlotWidget {
     public ItemSlotWidget(int x, int y, ItemStack itemStack, boolean drawBackground, boolean showToolTips) {
-        this(x, y, Collections.singletonList(itemStack), drawBackground, showToolTips);
-    }
-    
-    public ItemSlotWidget(int x, int y, List<ItemStack> itemList, boolean drawBackground, boolean showToolTips) {
-        this.itemList = itemList;
-        this.drawBackground = drawBackground;
-        this.showToolTips = showToolTips;
-        this.x = x;
-        this.y = y;
-        this.clickToMoreRecipes = false;
-        this.drawHighlightedBackground = true;
-    }
-    
-    public ItemSlotWidget(int x, int y, List<ItemStack> itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) {
-        this(x, y, itemList, drawBackground, showToolTips);
-        this.clickToMoreRecipes = clickToMoreRecipes;
-    }
-    
-    @Override
-    public List<? extends Element> children() {
-        return Collections.emptyList();
-    }
-    
-    public void setDrawHighlightedBackground(boolean drawHighlightedBackground) {
-        this.drawHighlightedBackground = drawHighlightedBackground;
-    }
-    
-    public boolean isDrawBackground() {
-        return drawBackground;
-    }
-    
-    @Override
-    public void render(int mouseX, int mouseY, float delta) {
-        ItemStack itemStack = getCurrentStack().copy();
-        if (drawBackground) {
-            minecraft.getTextureManager().bindTexture(RECIPE_GUI);
-            blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
-        }
-        boolean highlighted = isHighlighted(mouseX, mouseY);
-        if (drawHighlightedBackground && highlighted) {
-            GlStateManager.disableLighting();
-            GlStateManager.disableDepthTest();
-            GlStateManager.colorMask(true, true, true, false);
-            fillGradient(x, y, x + 16, y + 16, -2130706433, -2130706433);
-            GlStateManager.colorMask(true, true, true, true);
-            GlStateManager.enableLighting();
-            GlStateManager.enableDepthTest();
-        }
-        if (!itemStack.isEmpty()) {
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().aprilFoolsFish2019 && !highlighted)
-                itemStack = Items.TROPICAL_FISH.getDefaultStack();
-            GuiLighting.enableForItems();
-            ItemRenderer itemRenderer = minecraft.getItemRenderer();
-            itemRenderer.zOffset = 200.0F;
-            itemRenderer.renderGuiItem(itemStack, x, y);
-            itemRenderer.renderGuiItemOverlay(font, itemStack, x, y, getItemCountOverlay(itemStack));
-            itemRenderer.zOffset = 0.0F;
-        }
-        if (!itemStack.isEmpty() && highlighted && showToolTips)
-            queueTooltip(itemStack, delta);
+        super(x, y, itemStack, drawBackground, showToolTips);
     }
     
-    protected void queueTooltip(ItemStack itemStack, float delta) {
-        ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack)));
+    public ItemSlotWidget(int x, int y, Collection<ItemStack> itemList, boolean drawBackground, boolean showToolTips) {
+        super(x, y, itemList, drawBackground, showToolTips);
     }
     
-    protected List<String> getTooltip(ItemStack itemStack) {
-        final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem());
-        List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true));
-        toolTip.addAll(getExtraToolTips(itemStack));
-        boolean alreadyHasMod = false;
-        for(String s : toolTip)
-            if (s.equalsIgnoreCase(modString)) {
-                alreadyHasMod = true;
-                break;
-            }
-        if (!alreadyHasMod)
-            toolTip.add(modString);
-        return toolTip;
+    public ItemSlotWidget(int x, int y, List<Renderer> renderers, boolean drawBackground, boolean showToolTips) {
+        super(x, y, renderers, drawBackground, showToolTips);
     }
     
-    protected List<String> getExtraToolTips(ItemStack stack) {
-        return Collections.emptyList();
-    }
-    
-    protected String getItemCountOverlay(ItemStack currentStack) {
-        return "";
-    }
-    
-    public ItemStack getCurrentStack() {
-        if (itemList.size() == 0)
-            return new ItemStack(Items.AIR);
-        return itemList.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) itemList.size()) / 1f));
-    }
-    
-    public void setItemList(List<ItemStack> itemList) {
-        this.itemList = itemList;
-    }
-    
-    @Override
-    public Rectangle getBounds() {
-        return new Rectangle(this.x - 1, this.y - 1, 18, 18);
-    }
-    
-    @Override
-    public boolean mouseClicked(double mouseX, double mouseY, int button) {
-        if (!clickToMoreRecipes)
-            return false;
-        if (getBounds().contains(mouseX, mouseY))
-            if (button == 0)
-                return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentStack());
-            else if (button == 1)
-                return ClientHelper.getInstance().executeUsageKeyBind(getCurrentStack());
-        return false;
-    }
-    
-    @Override
-    public boolean keyPressed(int int_1, int int_2, int int_3) {
-        if (!clickToMoreRecipes)
-            return false;
-        if (getBounds().contains(ClientUtils.getMouseLocation()))
-            if (ClientHelper.getInstance().getRecipeKeyBinding().matchesKey(int_1, int_2))
-                return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentStack());
-            else if (ClientHelper.getInstance().getUsageKeyBinding().matchesKey(int_1, int_2))
-                return ClientHelper.getInstance().executeUsageKeyBind(getCurrentStack());
-        return false;
+    public ItemSlotWidget(int x, int y, List<ItemStack> itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) {
+        super(x, y, itemList, drawBackground, showToolTips, clickToMoreRecipes);
     }
-    
 }

+ 203 - 0
src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java

@@ -0,0 +1,203 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.google.common.collect.Lists;
+import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.cloth.api.ClientUtils;
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ClientHelper;
+import me.shedaniel.rei.api.Renderable;
+import me.shedaniel.rei.api.Renderer;
+import me.shedaniel.rei.client.ScreenHelper;
+import me.shedaniel.rei.gui.renderables.ItemStackRenderer;
+import net.minecraft.client.gui.Element;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
+
+import java.awt.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SlotWidget extends HighlightableWidget {
+    
+    private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    private List<Renderer> renderers = new LinkedList<>();
+    private boolean drawBackground, showToolTips, clickToMoreRecipes, drawHighlightedBackground;
+    private int x, y;
+    private static final ItemStackRenderer TROPICAL_FISH_RENDERABLE = Renderable.fromItemStack(Items.TROPICAL_FISH.getDefaultStack());
+    
+    public SlotWidget(int x, int y, ItemStack itemStack, boolean drawBackground, boolean showToolTips) {
+        this(x, y, Collections.singletonList(itemStack), drawBackground, showToolTips);
+    }
+    
+    public SlotWidget(int x, int y, Collection<ItemStack> itemList, boolean drawBackground, boolean showToolTips) {
+        this(x, y, itemList.stream().map(Renderable::fromItemStack).collect(Collectors.toList()), drawBackground, showToolTips);
+    }
+    
+    public SlotWidget(int x, int y, List<Renderer> renderers, boolean drawBackground, boolean showToolTips) {
+        this.renderers = renderers;
+        this.drawBackground = drawBackground;
+        this.showToolTips = showToolTips;
+        this.x = x;
+        this.y = y;
+        this.clickToMoreRecipes = false;
+        this.drawHighlightedBackground = true;
+    }
+    
+    public SlotWidget(int x, int y, List<ItemStack> itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) {
+        this(x, y, itemList, drawBackground, showToolTips);
+        this.clickToMoreRecipes = clickToMoreRecipes;
+    }
+    
+    public boolean isShowToolTips() {
+        return showToolTips;
+    }
+    
+    public void setShowToolTips(boolean showToolTips) {
+        this.showToolTips = showToolTips;
+    }
+    
+    public boolean isClickToMoreRecipes() {
+        return clickToMoreRecipes;
+    }
+    
+    public void setClickToMoreRecipes(boolean clickToMoreRecipes) {
+        this.clickToMoreRecipes = clickToMoreRecipes;
+    }
+    
+    public boolean isDrawHighlightedBackground() {
+        return drawHighlightedBackground;
+    }
+    
+    public void setDrawHighlightedBackground(boolean drawHighlightedBackground) {
+        this.drawHighlightedBackground = drawHighlightedBackground;
+    }
+    
+    @Override
+    public List<? extends Element> children() {
+        return Collections.emptyList();
+    }
+    
+    public boolean isDrawBackground() {
+        return drawBackground;
+    }
+    
+    public void setDrawBackground(boolean drawBackground) {
+        this.drawBackground = drawBackground;
+    }
+    
+    @Override
+    public void render(int mouseX, int mouseY, float delta) {
+        Renderer renderer = getCurrentRenderer();
+        if (drawBackground) {
+            minecraft.getTextureManager().bindTexture(RECIPE_GUI);
+            blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
+        }
+        boolean highlighted = isHighlighted(mouseX, mouseY);
+        if (drawHighlightedBackground && highlighted) {
+            GlStateManager.disableLighting();
+            GlStateManager.disableDepthTest();
+            GlStateManager.colorMask(true, true, true, false);
+            fillGradient(x, y, x + 16, y + 16, -2130706433, -2130706433);
+            GlStateManager.colorMask(true, true, true, true);
+            GlStateManager.enableLighting();
+            GlStateManager.enableDepthTest();
+        }
+        if (isCurrentRendererItem() && !getCurrentItemStack().isEmpty()) {
+            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().aprilFoolsFish2019 && !highlighted)
+                renderer = TROPICAL_FISH_RENDERABLE;
+            renderer.setBlitOffset(200);
+            renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
+            if (!getCurrentItemStack().isEmpty() && highlighted && showToolTips)
+                queueTooltip(getCurrentItemStack(), delta);
+        } else {
+            renderer.setBlitOffset(200);
+            renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
+        }
+    }
+    
+    protected void queueTooltip(ItemStack itemStack, float delta) {
+        ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack)));
+    }
+    
+    protected List<String> getTooltip(ItemStack itemStack) {
+        final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem());
+        List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true));
+        toolTip.addAll(getExtraToolTips(itemStack));
+        boolean alreadyHasMod = false;
+        for(String s : toolTip)
+            if (s.equalsIgnoreCase(modString)) {
+                alreadyHasMod = true;
+                break;
+            }
+        if (!alreadyHasMod)
+            toolTip.add(modString);
+        return toolTip;
+    }
+    
+    protected List<String> getExtraToolTips(ItemStack stack) {
+        return Collections.emptyList();
+    }
+    
+    protected String getItemCountOverlay(ItemStack currentStack) {
+        return "";
+    }
+    
+    public ItemStack getCurrentItemStack() {
+        if (getCurrentRenderer() instanceof ItemStackRenderer)
+            return ((ItemStackRenderer) getCurrentRenderer()).getItemStack();
+        return ItemStack.EMPTY;
+    }
+    
+    public Renderer getCurrentRenderer() {
+        if (renderers.size() == 0)
+            return Renderable.empty();
+        return renderers.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) renderers.size()) / 1f));
+    }
+    
+    public void setItemList(List<ItemStack> itemList) {
+        this.setRenderers(itemList.stream().map(Renderable::fromItemStack).collect(Collectors.toList()));
+    }
+    
+    public void setRenderers(List<Renderer> renderers) {
+        this.renderers = renderers;
+    }
+    
+    @Override
+    public Rectangle getBounds() {
+        return new Rectangle(this.x - 1, this.y - 1, 18, 18);
+    }
+    
+    @Override
+    public boolean mouseClicked(double mouseX, double mouseY, int button) {
+        if (!clickToMoreRecipes)
+            return false;
+        if (isCurrentRendererItem() && getBounds().contains(mouseX, mouseY))
+            if (button == 0)
+                return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
+            else if (button == 1)
+                return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
+        return false;
+    }
+    
+    public boolean isCurrentRendererItem() {
+        return getCurrentRenderer() instanceof ItemStackRenderer;
+    }
+    
+    @Override
+    public boolean keyPressed(int int_1, int int_2, int int_3) {
+        if (!clickToMoreRecipes)
+            return false;
+        if (isCurrentRendererItem() && getBounds().contains(ClientUtils.getMouseLocation()))
+            if (ClientHelper.getInstance().getRecipeKeyBinding().matchesKey(int_1, int_2))
+                return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
+            else if (ClientHelper.getInstance().getUsageKeyBinding().matchesKey(int_1, int_2))
+                return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
+        return false;
+    }
+    
+}

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

@@ -3,7 +3,7 @@ package me.shedaniel.rei.gui.widget;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.ClientHelper;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.api.Renderable;
+import me.shedaniel.rei.api.Renderer;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import net.minecraft.client.render.GuiLighting;
@@ -18,7 +18,7 @@ public class TabWidget extends HighlightableWidget {
     public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     
     public boolean shown = false, selected = false;
-    public Renderable renderable;
+    public Renderer renderer;
     public int id;
     public RecipeViewingScreen recipeViewingWidget;
     public String categoryName;
@@ -31,13 +31,13 @@ public class TabWidget extends HighlightableWidget {
         this.bounds = bounds;
     }
     
-    public void setRenderable(RecipeCategory category, Renderable renderable, String categoryName, boolean selected) {
+    public void setRenderer(RecipeCategory category, Renderer renderable, String categoryName, boolean selected) {
         if (renderable == null) {
             shown = false;
-            this.renderable = null;
+            this.renderer = null;
         } else {
             shown = true;
-            this.renderable = renderable;
+            this.renderer = renderable;
         }
         this.category = category;
         this.selected = selected;
@@ -56,8 +56,8 @@ public class TabWidget extends HighlightableWidget {
         return shown;
     }
     
-    public Renderable getRenderable() {
-        return renderable;
+    public Renderer getRenderer() {
+        return renderer;
     }
     
     @Override
@@ -72,7 +72,8 @@ public class TabWidget extends HighlightableWidget {
             GuiLighting.disable();
             minecraft.getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
             this.blit(bounds.x, bounds.y + 2, selected ? 28 : 0, 192, 28, (selected ? 30 : 27));
-            renderable.render((int) bounds.getCenterX(), (int) bounds.getCenterY(), mouseX, mouseY, delta);
+            renderer.setBlitOffset(100);
+            renderer.render((int) bounds.getCenterX(), (int) bounds.getCenterY(), mouseX, mouseY, delta);
             if (isHighlighted(mouseX, mouseY))
                 drawTooltip();
         }

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -57,14 +57,14 @@ public class DefaultBlastingCategory implements RecipeCategory<DefaultBlastingDi
             }
         }));
         List<List<ItemStack>> input = recipeDisplay.getInput();
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 1, input.get(0), true, true, true));
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 37, recipeDisplay.getFuel(), true, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 1, input.get(0), true, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 37, recipeDisplay.getFuel(), true, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.smelting.fuel"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplay.getOutput(), false, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplay.getOutput(), false, true, true));
         return widgets;
     }
     

+ 7 - 7
src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java

@@ -2,7 +2,7 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -55,32 +55,32 @@ public class DefaultBrewingCategory implements RecipeCategory<DefaultBrewingDisp
                 blit(startPoint.x + 44, startPoint.y + 28, 103, 163, width, 4);
             }
         }));
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 1, Arrays.asList(new ItemStack(Items.BLAZE_POWDER)), false, true, true));
-        widgets.add(new ItemSlotWidget(startPoint.x + 63, startPoint.y + 1, recipeDisplay.getInput().get(0), false, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 1, Arrays.asList(new ItemStack(Items.BLAZE_POWDER)), false, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 63, startPoint.y + 1, recipeDisplay.getInput().get(0), false, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.brewing.input"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 40, startPoint.y + 1, recipeDisplay.getInput().get(1), false, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 40, startPoint.y + 1, recipeDisplay.getInput().get(1), false, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.brewing.reactant"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 40, startPoint.y + 35, recipeDisplay.getOutput(0), false, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 40, startPoint.y + 35, recipeDisplay.getOutput(0), false, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.brewing.result"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 63, startPoint.y + 42, recipeDisplay.getOutput(1), false, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 63, startPoint.y + 42, recipeDisplay.getOutput(1), false, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.brewing.result"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 86, startPoint.y + 35, recipeDisplay.getOutput(2), false, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 86, startPoint.y + 35, recipeDisplay.getOutput(2), false, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.brewing.result"));

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -58,8 +58,8 @@ public class DefaultCampfireCategory implements RecipeCategory<DefaultCampfireDi
                 MinecraftClient.getInstance().textRenderer.draw(text, bounds.x + bounds.width - length - 5, startPoint.y + 54 - 8, 4210752);
             }
         }));
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 11, recipeDisplaySupplier.get().getInput().get(0), true, true, true));
-        widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 11, recipeDisplaySupplier.get().getInput().get(0), true, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true));
         return widgets;
     }
     

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

@@ -3,7 +3,7 @@ package me.shedaniel.rei.plugin;
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -52,10 +52,10 @@ public class DefaultCraftingCategory implements RecipeCategory<DefaultCraftingDi
             }
         }));
         List<List<ItemStack>> input = recipeDisplaySupplier.get().getInput();
-        List<ItemSlotWidget> slots = Lists.newArrayList();
+        List<SlotWidget> 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, true));
+                slots.add(new SlotWidget(startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18, Lists.newArrayList(), true, true, true));
         for(int i = 0; i < input.size(); i++) {
             if (recipeDisplaySupplier.get() instanceof DefaultShapedDisplay) {
                 if (!input.get(i).isEmpty())
@@ -64,7 +64,7 @@ public class DefaultCraftingCategory implements RecipeCategory<DefaultCraftingDi
                 slots.get(i).setItemList(input.get(i));
         }
         widgets.addAll(slots);
-        widgets.add(new ItemSlotWidget(startPoint.x + 95, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 95, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true) {
             @Override
             protected String getItemCountOverlay(ItemStack currentStack) {
                 if (currentStack.getAmount() == 1)

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -56,14 +56,14 @@ public class DefaultSmeltingCategory implements RecipeCategory<DefaultSmeltingDi
             }
         }));
         List<List<ItemStack>> input = recipeDisplaySupplier.get().getInput();
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 1, input.get(0), true, true, true));
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 37, recipeDisplaySupplier.get().getFuel(), true, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 1, input.get(0), true, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 37, recipeDisplaySupplier.get().getFuel(), true, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.smelting.fuel"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true));
         return widgets;
     }
     

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

@@ -2,7 +2,7 @@ package me.shedaniel.rei.plugin;
 
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -56,14 +56,14 @@ public class DefaultSmokingCategory implements RecipeCategory<DefaultSmokingDisp
             }
         }));
         List<List<ItemStack>> input = recipeDisplaySupplier.get().getInput();
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 1, input.get(0), true, true, true));
-        widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 37, recipeDisplaySupplier.get().getFuel(), true, true, true) {
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 1, input.get(0), true, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 37, recipeDisplaySupplier.get().getFuel(), true, true, true) {
             @Override
             protected List<String> getExtraToolTips(ItemStack stack) {
                 return Arrays.asList(I18n.translate("category.rei.smelting.fuel"));
             }
         });
-        widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 61, startPoint.y + 19, recipeDisplaySupplier.get().getOutput(), false, true, true));
         return widgets;
     }
     

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

@@ -3,7 +3,7 @@ package me.shedaniel.rei.plugin;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.DisplaySettings;
 import me.shedaniel.rei.api.RecipeCategory;
-import me.shedaniel.rei.gui.widget.ItemSlotWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.block.Blocks;
@@ -51,8 +51,8 @@ public class DefaultStoneCuttingCategory implements RecipeCategory<DefaultStoneC
                 blit(startPoint.x, startPoint.y, 0, 221, 82, 26);
             }
         }));
-        widgets.add(new ItemSlotWidget(startPoint.x + 4, startPoint.y + 5, recipeDisplaySupplier.get().getInput().get(0), true, true, true));
-        widgets.add(new ItemSlotWidget(startPoint.x + 61, startPoint.y + 5, recipeDisplaySupplier.get().getOutput(), false, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 4, startPoint.y + 5, recipeDisplaySupplier.get().getInput().get(0), true, true, true));
+        widgets.add(new SlotWidget(startPoint.x + 61, startPoint.y + 5, recipeDisplaySupplier.get().getOutput(), false, true, true));
         return widgets;
     }