From a5c90bb7d4748ba2da024ce468ffeeda99bf4a0f Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 8 May 2019 00:55:25 +0800 Subject: start of 2.9 update beta --- .../java/me/shedaniel/rei/api/ClientHelper.java | 5 ++ .../java/me/shedaniel/rei/api/RecipeCategory.java | 4 + src/main/java/me/shedaniel/rei/api/Renderable.java | 29 ++++++ .../me/shedaniel/rei/client/ClientHelperImpl.java | 24 ++++- .../java/me/shedaniel/rei/client/ConfigObject.java | 2 + .../me/shedaniel/rei/client/RecipeScreenType.java | 16 ++++ .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 13 ++- .../rei/gui/VillagerRecipeViewingScreen.java | 98 +++++++++++++++++++++ .../rei/gui/renderables/ItemStackRenderable.java | 33 +++++++ .../shedaniel/rei/gui/widget/RecipeBaseWidget.java | 62 ++++++++----- .../shedaniel/rei/gui/widget/SlotBaseWidget.java | 21 +++++ .../me/shedaniel/rei/gui/widget/TabWidget.java | 38 ++++---- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 37 ++++++-- .../shedaniel/rei/utils/ClothScreenRegistry.java | 2 + .../assets/roughlyenoughitems/lang/en_us.json | 1 + .../textures/gui/recipecontainer.png | Bin 6419 -> 7000 bytes src/main/resources/fabric.mod.json | 2 +- 17 files changed, 324 insertions(+), 63 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/Renderable.java create mode 100644 src/main/java/me/shedaniel/rei/client/RecipeScreenType.java create mode 100644 src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java (limited to 'src') diff --git a/src/main/java/me/shedaniel/rei/api/ClientHelper.java b/src/main/java/me/shedaniel/rei/api/ClientHelper.java index 86c234872..ce96836cd 100644 --- a/src/main/java/me/shedaniel/rei/api/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/api/ClientHelper.java @@ -5,6 +5,7 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; import java.util.List; @@ -33,6 +34,10 @@ public interface ClientHelper extends ClientModInitializer { String getFormattedModFromItem(Item item); + String getFormattedModFromIdentifier(Identifier identifier); + + String getModFromIdentifier(Identifier identifier); + FabricKeyBinding getRecipeKeyBinding(); FabricKeyBinding getUsageKeyBinding(); diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index 80b7aa167..edd215848 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -20,6 +20,10 @@ public interface RecipeCategory { ItemStack getCategoryIcon(); + default Renderable getIcon() { + return Renderable.fromItemStackSupplier(this::getCategoryIcon); + } + String getCategoryName(); default List setupDisplay(Supplier recipeDisplaySupplier, Rectangle bounds) { diff --git a/src/main/java/me/shedaniel/rei/api/Renderable.java b/src/main/java/me/shedaniel/rei/api/Renderable.java new file mode 100644 index 000000000..b4781d563 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/Renderable.java @@ -0,0 +1,29 @@ +package me.shedaniel.rei.api; + +import me.shedaniel.rei.gui.renderables.ItemStackRenderable; +import net.minecraft.item.ItemStack; + +import java.util.function.Supplier; + +public interface Renderable { + + static ItemStackRenderable fromItemStackSupplier(Supplier supplier) { + return new ItemStackRenderable() { + @Override + protected ItemStack getItemStack() { + return supplier.get(); + } + }; + } + + static ItemStackRenderable fromItemStack(ItemStack stack) { + return new ItemStackRenderable() { + @Override + protected ItemStack getItemStack() { + return stack; + } + }; + } + + void render(int x, int y, double mouseX, double mouseY, float delta); +} diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java b/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java index febe35b4e..5a05f0e74 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java @@ -10,6 +10,7 @@ import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.api.RecipeDisplay; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.gui.RecipeViewingScreen; +import me.shedaniel.rei.gui.VillagerRecipeViewingScreen; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; @@ -53,6 +54,14 @@ public class ClientHelperImpl implements ClientHelper { return "§9§o" + mod; } + @Override + public String getFormattedModFromIdentifier(Identifier identifier) { + String mod = getModFromIdentifier(identifier); + if (mod.equalsIgnoreCase("")) + return ""; + return "§9§o" + mod; + } + @Override public FabricKeyBinding getRecipeKeyBinding() { return recipe; @@ -78,12 +87,14 @@ public class ClientHelperImpl implements ClientHelper { return nextPage; } + @Override public String getModFromItem(Item item) { if (item.equals(Items.AIR)) return ""; return getModFromIdentifier(Registry.ITEM.getId(item)); } + @Override public String getModFromIdentifier(Identifier identifier) { if (identifier == null) return ""; @@ -147,7 +158,7 @@ public class ClientHelperImpl implements ClientHelper { public boolean executeRecipeKeyBind(ItemStack stack) { Map> map = RecipeHelper.getInstance().getRecipesFor(stack); if (map.keySet().size() > 0) - MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(MinecraftClient.getInstance().window, map)); + openRecipeViewingScreen(map); return map.keySet().size() > 0; } @@ -155,7 +166,7 @@ public class ClientHelperImpl implements ClientHelper { public boolean executeUsageKeyBind(ItemStack stack) { Map> map = RecipeHelper.getInstance().getUsagesFor(stack); if (map.keySet().size() > 0) - MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(MinecraftClient.getInstance().window, map)); + openRecipeViewingScreen(map); return map.keySet().size() > 0; } @@ -174,10 +185,17 @@ public class ClientHelperImpl implements ClientHelper { public boolean executeViewAllRecipesKeyBind() { Map> map = RecipeHelper.getInstance().getAllRecipes(); if (map.keySet().size() > 0) - MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(MinecraftClient.getInstance().window, map)); + openRecipeViewingScreen(map); return map.keySet().size() > 0; } + public void openRecipeViewingScreen(Map> map) { + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType == RecipeScreenType.VILLAGER) + MinecraftClient.getInstance().openScreen(new VillagerRecipeViewingScreen(map)); + else + MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(map)); + } + @Override public void onInitializeClient() { ClientHelperImpl.instance = (ClientHelperImpl) this; diff --git a/src/main/java/me/shedaniel/rei/client/ConfigObject.java b/src/main/java/me/shedaniel/rei/client/ConfigObject.java index af100f3fc..3522b6f3b 100644 --- a/src/main/java/me/shedaniel/rei/client/ConfigObject.java +++ b/src/main/java/me/shedaniel/rei/client/ConfigObject.java @@ -48,6 +48,8 @@ public class ConfigObject { public boolean lightGrayRecipeBorder = false; + public RecipeScreenType screenType = RecipeScreenType.UNSET; + @Comment( "The location of choose page dialog, will automatically be set to your last location so there is no need to change this.") public RelativePoint choosePageDialogPoint = new RelativePoint(.5, .5); diff --git a/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java b/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java new file mode 100644 index 000000000..8e558aaf0 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java @@ -0,0 +1,16 @@ +package me.shedaniel.rei.client; + +import net.minecraft.client.resource.language.I18n; + +import java.util.Locale; + +public enum RecipeScreenType { + UNSET, + ORIGINAL, + VILLAGER; + + @Override + public String toString() { + return I18n.translate("text.rei.config.recipe_screen_type." + name().toLowerCase(Locale.ROOT)); + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index 16af460f4..c35c31a5b 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -43,16 +43,15 @@ public class RecipeViewingScreen extends Screen { public int largestWidth, largestHeight; public boolean choosePageActivated; public RecipeChoosePageWidget recipeChoosePageWidget; - private Window window; private Rectangle bounds; private RecipeCategory selectedCategory; private ButtonWidget recipeBack, recipeNext, categoryBack, categoryNext; - public RecipeViewingScreen(Window window, Map> categoriesMap) { + public RecipeViewingScreen(Map> categoriesMap) { super(new StringTextComponent("")); this.categoryPages = 0; - this.window = window; this.widgets = Lists.newArrayList(); + Window window = MinecraftClient.getInstance().window; this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, 176, 186); this.categoriesMap = categoriesMap; this.categories = Lists.newArrayList(); @@ -119,11 +118,11 @@ public class RecipeViewingScreen extends Screen { this.children.clear(); this.tabs.clear(); this.widgets.clear(); - this.largestWidth = window.getScaledWidth() - 100; - this.largestHeight = window.getScaledHeight() - 40; + this.largestWidth = width - 100; + this.largestHeight = height - 40; this.guiWidth = MathHelper.clamp(getCurrentDisplayed().stream().map(display -> selectedCategory.getDisplayWidth(display)).max(Integer::compareTo).orElse(150) + 30, 0, largestWidth); this.guiHeight = MathHelper.floor(MathHelper.clamp((selectedCategory.getDisplayHeight() + 7d) * (getRecipesPerPage() + 1d) + 40d, 186d, (double) largestHeight)); - this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, guiWidth, guiHeight); + this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); this.page = MathHelper.clamp(page, 0, getTotalPages(selectedCategory) - 1); widgets.add(categoryBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 5, 12, 12, new TranslatableTextComponent("text.rei.left_arrow")) { @@ -250,7 +249,7 @@ public class RecipeViewingScreen extends Screen { return false; } }); - tab.setItem(categories.get(j).getCategoryIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory)); + tab.setRenderable(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory)); } } Optional supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory); diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java new file mode 100644 index 000000000..8bc1d65ec --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -0,0 +1,98 @@ +package me.shedaniel.rei.gui; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.api.RecipeCategory; +import me.shedaniel.rei.api.RecipeDisplay; +import me.shedaniel.rei.api.RecipeHelper; +import me.shedaniel.rei.client.ScreenHelper; +import me.shedaniel.rei.gui.widget.CategoryBaseWidget; +import me.shedaniel.rei.gui.widget.RecipeBaseWidget; +import me.shedaniel.rei.gui.widget.SlotBaseWidget; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.Screen; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.text.StringTextComponent; +import net.minecraft.util.math.MathHelper; + +import java.awt.*; +import java.util.List; +import java.util.Map; + +public class VillagerRecipeViewingScreen extends Screen { + + private final Map> categoryMap; + private final List categories; + private final List widgets; + public Rectangle bounds, scrollListBounds; + private int selectedCategoryIndex, selectedRecipeIndex; + + public VillagerRecipeViewingScreen(Map> map) { + super(new StringTextComponent("")); + this.widgets = Lists.newArrayList(); + this.categoryMap = Maps.newLinkedHashMap(); + this.selectedCategoryIndex = 0; + this.selectedRecipeIndex = 0; + this.categories = Lists.newArrayList(); + RecipeHelper.getInstance().getAllCategories().forEach(category -> { + if (map.containsKey(category)) { + categories.add(category); + categoryMap.put(category, map.get(category)); + } + }); + } + + @Override + protected void init() { + super.init(); + this.children.clear(); + this.widgets.clear(); + int largestWidth = width - 100; + int largestHeight = height - 40; + RecipeCategory category = categories.get(selectedCategoryIndex); + RecipeDisplay display = categoryMap.get(category).get(selectedRecipeIndex); + int guiWidth = MathHelper.clamp(category.getDisplayWidth(display) + 30, 0, largestWidth) + 100; + int guiHeight = MathHelper.clamp(category.getDisplayHeight() + 40, 166, largestHeight); + this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); + this.widgets.add(new CategoryBaseWidget(bounds)); + this.scrollListBounds = new Rectangle(bounds.x + 4, bounds.y + 17, 97, guiHeight - 17 - 7); + this.widgets.add(new SlotBaseWidget(scrollListBounds)); + Rectangle recipeBounds = new Rectangle(bounds.x + 100 + (guiWidth - 100) / 2 - category.getDisplayWidth(display) / 2, bounds.y + bounds.height / 2 - category.getDisplayHeight() / 2, category.getDisplayWidth(display), category.getDisplayHeight()); + this.widgets.addAll(category.setupDisplay(() -> display, recipeBounds)); + this.children.addAll(widgets); + this.children.add(ScreenHelper.getLastOverlay(true, false)); + } + + @Override + public void render(int mouseX, int mouseY, float delta) { + this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680); + this.widgets.forEach(widget -> { + GuiLighting.disable(); + widget.render(mouseX, mouseY, delta); + }); + GuiLighting.disable(); + ScreenHelper.getLastOverlay().render(mouseX, mouseY, delta); + GlStateManager.pushMatrix(); + GlStateManager.translatef((float) bounds.x, (float) bounds.y, 0.0F); + GuiLighting.disable(); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + String categoryName = categories.get(selectedCategoryIndex).getCategoryName(); + font.draw(categoryName, 4 + scrollListBounds.width / 2 - font.getStringWidth(categoryName) / 2, 6, 4210752); + GlStateManager.popMatrix(); + GuiLighting.disable(); + ScreenHelper.getLastOverlay().lateRender(mouseX, mouseY, delta); + } + + @Override + public boolean keyPressed(int int_1, int int_2, int int_3) { + if ((int_1 == 256 || this.minecraft.options.keyInventory.matchesKey(int_1, int_2)) && this.shouldCloseOnEsc()) { + MinecraftClient.getInstance().openScreen(ScreenHelper.getLastContainerScreen()); + ScreenHelper.getLastOverlay().init(); + return true; + } + return super.keyPressed(int_1, int_2, int_3); + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java new file mode 100644 index 000000000..c3904357d --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java @@ -0,0 +1,33 @@ +package me.shedaniel.rei.gui.renderables; + +import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.api.Renderable; +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 static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + + @Override + 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; + GuiLighting.enableForItems(); + 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(); + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java index 57dbd5e89..a139d7d34 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java @@ -12,9 +12,9 @@ import java.util.List; public class RecipeBaseWidget extends HighlightableWidget { private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); - private static final Color INNER_COLOR = new Color(198, 198, 198); private Rectangle bounds; + protected boolean render = true; public RecipeBaseWidget(Rectangle bounds) { this.bounds = bounds; @@ -22,6 +22,14 @@ public class RecipeBaseWidget extends HighlightableWidget { throw new IllegalArgumentException("Base too small, at least 8x8!"); } + public boolean isRender() { + return render; + } + + public void setRender(boolean render) { + this.render = render; + } + @Override public Rectangle getBounds() { return bounds; @@ -38,30 +46,36 @@ public class RecipeBaseWidget extends HighlightableWidget { @Override public void render(int mouseX, int mouseY, float delta) { - GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - GuiLighting.disable(); - minecraft.getTextureManager().bindTexture(CHEST_GUI_TEXTURE); - int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height; - int textureOffset = getTextureOffset(); - - //Four Corners - this.blit(x, y, 106, 124 + textureOffset, 4, 4); - this.blit(x + width - 4, y, 252, 124 + textureOffset, 4, 4); - this.blit(x, y + height - 4, 106, 186 + textureOffset, 4, 4); - this.blit(x + width - 4, y + height - 4, 252, 186 + textureOffset, 4, 4); - - //Sides - for(int xx = 4; xx < width - 4; xx += 128) { - int thisWidth = Math.min(128, width - 4 - xx); - this.blit(x + xx, y, 110, 124 + textureOffset, thisWidth, 4); - this.blit(x + xx, y + height - 4, 110, 186 + textureOffset, thisWidth, 4); - } - for(int yy = 4; yy < height - 4; yy += 50) { - int thisHeight = Math.min(50, height - 4 - yy); - this.blit(x, y + yy, 106, 128 + textureOffset, 4, thisHeight); - this.blit(x + width - 4, y + yy, 252, 128 + textureOffset, 4, thisHeight); + if (render) { + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiLighting.disable(); + minecraft.getTextureManager().bindTexture(CHEST_GUI_TEXTURE); + int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height; + int textureOffset = getTextureOffset(); + + //Four Corners + this.blit(x, y, 106, 124 + textureOffset, 4, 4); + this.blit(x + width - 4, y, 252, 124 + textureOffset, 4, 4); + this.blit(x, y + height - 4, 106, 186 + textureOffset, 4, 4); + this.blit(x + width - 4, y + height - 4, 252, 186 + textureOffset, 4, 4); + + //Sides + for(int xx = 4; xx < width - 4; xx += 128) { + int thisWidth = Math.min(128, width - 4 - xx); + this.blit(x + xx, y, 110, 124 + textureOffset, thisWidth, 4); + this.blit(x + xx, y + height - 4, 110, 186 + textureOffset, thisWidth, 4); + } + for(int yy = 4; yy < height - 4; yy += 50) { + int thisHeight = Math.min(50, height - 4 - yy); + this.blit(x, y + yy, 106, 128 + textureOffset, 4, thisHeight); + this.blit(x + width - 4, y + yy, 252, 128 + textureOffset, 4, thisHeight); + } + fillGradient(x + 4, y + 4, x + width - 4, y + height - 4, getInnerColor(), getInnerColor()); } - fillGradient(x + 4, y + 4, x + width - 4, y + height - 4, INNER_COLOR.getRGB(), INNER_COLOR.getRGB()); + } + + protected int getInnerColor() { + return -3750202; } protected int getTextureOffset() { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java new file mode 100644 index 000000000..8ab19cfd3 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java @@ -0,0 +1,21 @@ +package me.shedaniel.rei.gui.widget; + +import java.awt.*; + +public class SlotBaseWidget extends RecipeBaseWidget { + + public SlotBaseWidget(Rectangle bounds) { + super(bounds); + } + + @Override + public int getInnerColor() { + return -7631989; + } + + @Override + protected int getTextureOffset() { + return -66; + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java index 07493792c..b86be1927 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java @@ -1,11 +1,12 @@ 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.client.ScreenHelper; import me.shedaniel.rei.gui.RecipeViewingScreen; 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.*; @@ -17,28 +18,28 @@ 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 ItemStack item; + public Renderable renderable; public int id; public RecipeViewingScreen recipeViewingWidget; public String categoryName; public Rectangle bounds; - private ItemRenderer itemRenderer; + public RecipeCategory category; public TabWidget(int id, RecipeViewingScreen recipeViewingWidget, Rectangle bounds) { this.id = id; this.recipeViewingWidget = recipeViewingWidget; this.bounds = bounds; - this.itemRenderer = minecraft.getItemRenderer(); } - public void setItem(ItemStack item, String categoryName, boolean selected) { - if (item == null) { + public void setRenderable(RecipeCategory category, Renderable renderable, String categoryName, boolean selected) { + if (renderable == null) { shown = false; - this.item = null; + this.renderable = null; } else { shown = true; - this.item = item; + this.renderable = renderable; } + this.category = category; this.selected = selected; this.categoryName = categoryName; } @@ -55,8 +56,8 @@ public class TabWidget extends HighlightableWidget { return shown; } - public ItemStack getItemStack() { - return item; + public Renderable getRenderable() { + return renderable; } @Override @@ -67,26 +68,21 @@ public class TabWidget extends HighlightableWidget { @Override public void render(int mouseX, int mouseY, float delta) { 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(); minecraft.getTextureManager().bindTexture(CHEST_GUI_TEXTURE); this.blit(bounds.x, bounds.y + 2, selected ? 28 : 0, 192, 28, (selected ? 30 : 27)); - this.blitOffset = 100; - this.itemRenderer.zOffset = 100.0F; - GuiLighting.enableForItems(); - this.itemRenderer.renderGuiItem(getItemStack(), l, i1); - this.itemRenderer.renderGuiItemOverlay(minecraft.textRenderer, getItemStack(), l, i1); - GlStateManager.disableLighting(); - this.itemRenderer.zOffset = 0.0F; - this.blitOffset = 0; + renderable.render((int) bounds.getCenterX(), (int) bounds.getCenterY(), mouseX, mouseY, delta); if (isHighlighted(mouseX, mouseY)) drawTooltip(); } } private void drawTooltip() { - ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(categoryName)); + if (this.minecraft.options.advancedItemTooltips) + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(categoryName, "§8" + category.getIdentifier().toString(), ClientHelper.getInstance().getFormattedModFromIdentifier(category.getIdentifier()))); + else + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(categoryName, ClientHelper.getInstance().getFormattedModFromIdentifier(category.getIdentifier()))); } @Override diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index 98e0d2e40..0adabf43f 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -5,6 +5,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; import me.shedaniel.rei.client.ScreenHelper; import me.shedaniel.rei.gui.RecipeViewingScreen; +import me.shedaniel.rei.gui.VillagerRecipeViewingScreen; import me.shedaniel.rei.listeners.ContainerScreenHooks; import me.shedaniel.rei.listeners.RecipeBookGuiHooks; import net.minecraft.client.MinecraftClient; @@ -41,13 +42,13 @@ import java.util.List; public class DefaultPlugin implements REIPluginEntry { - 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 STONE_CUTTING = new Identifier("roughlyenoughitems", "plugins/stone_cutting"); - public static final Identifier BREWING = new Identifier("roughlyenoughitems", "plugins/brewing"); + public static final Identifier CRAFTING = new Identifier("minecraft", "plugins/crafting"); + public static final Identifier SMELTING = new Identifier("minecraft", "plugins/smelting"); + public static final Identifier SMOKING = new Identifier("minecraft", "plugins/smoking"); + public static final Identifier BLASTING = new Identifier("minecraft", "plugins/blasting"); + public static final Identifier CAMPFIRE = new Identifier("minecraft", "plugins/campfire"); + public static final Identifier STONE_CUTTING = new Identifier("minecraft", "plugins/stone_cutting"); + public static final Identifier BREWING = new Identifier("minecraft", "plugins/brewing"); public static final Identifier PLUGIN = new Identifier("roughlyenoughitems", "default_plugin"); private static final List BREWING_DISPLAYS = Lists.newArrayList(); @@ -192,6 +193,28 @@ public class DefaultPlugin implements REIPluginEntry { return -1.0f; } }); + displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler() { + @Override + public Class getBaseSupportedClass() { + return VillagerRecipeViewingScreen.class; + } + + @Override + public Rectangle getLeftBounds(VillagerRecipeViewingScreen screen) { + return new Rectangle(2, 0, ((VillagerRecipeViewingScreen) screen).bounds.x - 4, MinecraftClient.getInstance().window.getScaledHeight()); + } + + @Override + public Rectangle getRightBounds(VillagerRecipeViewingScreen screen) { + int startX = ((VillagerRecipeViewingScreen) screen).bounds.x + ((VillagerRecipeViewingScreen) screen).bounds.width + 2; + return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight()); + } + + @Override + public float getPriority() { + return -1.0f; + } + }); displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler() { @Override public Class getBaseSupportedClass() { diff --git a/src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java b/src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java index 45feb4fc9..0bc54ba87 100644 --- a/src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java +++ b/src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java @@ -8,6 +8,7 @@ import me.shedaniel.cloth.gui.entries.StringListEntry; import me.shedaniel.cloth.hooks.ScreenHooks; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.ItemCheatingMode; +import me.shedaniel.rei.client.RecipeScreenType; import me.shedaniel.rei.gui.config.ItemListOrderingConfig; import me.shedaniel.rei.gui.credits.CreditsScreen; import net.minecraft.client.MinecraftClient; @@ -47,6 +48,7 @@ public class ClothScreenRegistry { } }); ConfigScreenBuilder.CategoryBuilder appearance = builder.addCategory("text.rei.config.appearance"); + appearance.addOption(new EnumListEntry<>("text.rei.config.recipe_screen_type", RecipeScreenType.class, RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType, RESET, () -> RecipeScreenType.UNSET, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType = bool, EnumListEntry.DEFAULT_NAME_PROVIDER, () -> getConfigTooltip("recipe_screen_type"))); appearance.addOption(new BooleanListEntry("text.rei.config.side_search_box", RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField = bool, () -> getConfigTooltip("side_search_box"))); appearance.addOption(new EnumListEntry<>("text.rei.config.list_ordering", ItemListOrderingConfig.class, ItemListOrderingConfig.from(RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering, RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending), RESET, () -> ItemListOrderingConfig.REGISTRY_ASCENDING, config -> { RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering = config.getOrdering(); diff --git a/src/main/resources/assets/roughlyenoughitems/lang/en_us.json b/src/main/resources/assets/roughlyenoughitems/lang/en_us.json index ebc19ccad..a4d76ff46 100755 --- a/src/main/resources/assets/roughlyenoughitems/lang/en_us.json +++ b/src/main/resources/assets/roughlyenoughitems/lang/en_us.json @@ -93,6 +93,7 @@ "text.rei.config.light_gray_recipe_border": "Light Gray Recipe Border:", "text.rei.config_api_failed": "You arrived here either if Cloth Config API failed or you don't have it installed!\nUpdate / Install the API and report to the bug tracker.", "text.rei.back": "Back", + "text.rei.config.recipe_screen_type": "Screen Type", "_comment": "Config Tooltips", "tooltip.rei.config.side_search_box": "Declares the location of the search field:\nYes: Left / Right\nNo: Center\n \nDefaulted: No", diff --git a/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png b/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png index 8f8bdc874..a233c36e8 100755 Binary files a/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png and b/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8ff017fdc..b80d634b3 100755 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "roughlyenoughitems", - "name": "RoughlyEnoughItems", + "name": "Roughly Enough Items", "description": "To allow players to view items and recipes. Version: ${version}", "version": "${version}", "authors": [ -- cgit From 33ed36eff27c1a533dacb2fa73510687f119c12b Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 8 May 2019 01:24:22 +0800 Subject: more internal changes Fix #56 --- .../java/me/shedaniel/rei/api/RecipeCategory.java | 2 +- src/main/java/me/shedaniel/rei/api/Renderable.java | 19 +- src/main/java/me/shedaniel/rei/api/Renderer.java | 13 ++ .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 2 +- .../rei/gui/renderables/EmptyRenderer.java | 13 ++ .../rei/gui/renderables/ItemStackRenderable.java | 33 ---- .../rei/gui/renderables/ItemStackRenderer.java | 34 ++++ .../shedaniel/rei/gui/widget/ItemListOverlay.java | 12 +- .../shedaniel/rei/gui/widget/ItemSlotWidget.java | 153 +--------------- .../me/shedaniel/rei/gui/widget/SlotWidget.java | 203 +++++++++++++++++++++ .../me/shedaniel/rei/gui/widget/TabWidget.java | 17 +- .../rei/plugin/DefaultBlastingCategory.java | 8 +- .../rei/plugin/DefaultBrewingCategory.java | 14 +- .../rei/plugin/DefaultCampfireCategory.java | 6 +- .../rei/plugin/DefaultCraftingCategory.java | 8 +- .../rei/plugin/DefaultSmeltingCategory.java | 8 +- .../rei/plugin/DefaultSmokingCategory.java | 8 +- .../rei/plugin/DefaultStoneCuttingCategory.java | 6 +- 18 files changed, 331 insertions(+), 228 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/Renderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java (limited to 'src') diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index edd215848..415984068 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -20,7 +20,7 @@ public interface RecipeCategory { ItemStack getCategoryIcon(); - default Renderable getIcon() { + default Renderer getIcon() { return Renderable.fromItemStackSupplier(this::getCategoryIcon); } diff --git a/src/main/java/me/shedaniel/rei/api/Renderable.java b/src/main/java/me/shedaniel/rei/api/Renderable.java index b4781d563..35c9890b8 100644 --- a/src/main/java/me/shedaniel/rei/api/Renderable.java +++ b/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 supplier) { - return new ItemStackRenderable() { + static ItemStackRenderer fromItemStackSupplier(Supplier 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); } diff --git a/src/main/java/me/shedaniel/rei/api/Renderer.java b/src/main/java/me/shedaniel/rei/api/Renderer.java new file mode 100644 index 000000000..569285d84 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index c35c31a5b..c56c2c7cb 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/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 supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory); diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java new file mode 100644 index 000000000..0c2f9bbfa --- /dev/null +++ b/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) { + + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java deleted file mode 100644 index c3904357d..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderable.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.shedaniel.rei.gui.renderables; - -import com.mojang.blaze3d.platform.GlStateManager; -import me.shedaniel.rei.api.Renderable; -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 static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); - - @Override - 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; - GuiLighting.enableForItems(); - 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(); - -} diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java new file mode 100644 index 000000000..139e88a19 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java @@ -0,0 +1,34 @@ +package me.shedaniel.rei.gui.renderables; + +import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.api.Renderer; +import net.minecraft.client.MinecraftClient; +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 ItemStackRenderer extends Renderer { + + public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + + @Override + 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); + ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); + 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); + itemRenderer.zOffset = 0.0F; + this.blitOffset = 0; + } + + public abstract ItemStack getItemStack(); + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java index a04956e8d..f819b6281 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java +++ b/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; } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java index 5081cc00a..7509c45df 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java +++ b/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 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 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 itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) { - this(x, y, itemList, drawBackground, showToolTips); - this.clickToMoreRecipes = clickToMoreRecipes; - } - - @Override - public List 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 itemList, boolean drawBackground, boolean showToolTips) { + super(x, y, itemList, drawBackground, showToolTips); } - protected List getTooltip(ItemStack itemStack) { - final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem()); - List 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 renderers, boolean drawBackground, boolean showToolTips) { + super(x, y, renderers, drawBackground, showToolTips); } - protected List 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 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 itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) { + super(x, y, itemList, drawBackground, showToolTips, clickToMoreRecipes); } - } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java new file mode 100644 index 000000000..bbf0c6c08 --- /dev/null +++ b/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 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 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 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 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 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 getTooltip(ItemStack itemStack) { + final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem()); + List 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 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 itemList) { + this.setRenderers(itemList.stream().map(Renderable::fromItemStack).collect(Collectors.toList())); + } + + public void setRenderers(List 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; + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java index b86be1927..9616922d3 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java