diff options
| author | Unknown <shekwancheung0528@gmail.com> | 2019-05-09 22:38:34 +0800 |
|---|---|---|
| committer | Unknown <shekwancheung0528@gmail.com> | 2019-05-09 22:38:34 +0800 |
| commit | c1b0219e8d5458ddf1eccc194d34893f698b7d88 (patch) | |
| tree | a0ed116ad122b66721c5fe9345925e04f3c73a47 | |
| parent | 6017255b2b2704031a784eafd2bd720f1e7b8fc2 (diff) | |
| download | RoughlyEnoughItems-c1b0219e8d5458ddf1eccc194d34893f698b7d88.tar.gz RoughlyEnoughItems-c1b0219e8d5458ddf1eccc194d34893f698b7d88.tar.bz2 RoughlyEnoughItems-c1b0219e8d5458ddf1eccc194d34893f698b7d88.zip | |
VillagerRecipeViewingScreen done
21 files changed, 485 insertions, 75 deletions
diff --git a/src/main/java/com/zeitheron/hammercore/client/utils/Scissors.java b/src/main/java/com/zeitheron/hammercore/client/utils/Scissors.java new file mode 100644 index 000000000..36d56329d --- /dev/null +++ b/src/main/java/com/zeitheron/hammercore/client/utils/Scissors.java @@ -0,0 +1,38 @@ +package com.zeitheron.hammercore.client.utils; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.util.Window; +import org.lwjgl.opengl.GL11; + +/** + * This is originally the part of Hammer Lib, repacked in REI with permission. + * Adapted GL scissor for minecraft pixel resolution and adjusts (0;0) as left-top corner. + * + * @author Zeitheron + */ +public class Scissors { + public static void begin() { + GL11.glEnable(GL11.GL_SCISSOR_TEST); + } + + public static void scissor(int x, int y, int width, int height) { + Window window = MinecraftClient.getInstance().window; + + int sw = window.getWidth(); + int sh = window.getHeight(); + float dw = window.getScaledWidth(); + float dh = window.getScaledHeight(); + + x = Math.round(sw * (x / dw)); + y = Math.round(sh * (y / dh)); + + width = Math.round(sw * (width / dw)); + height = Math.round(sh * (height / dh)); + + GL11.glScissor(x, sh - height - y, width, height); + } + + public static void end() { + GL11.glDisable(GL11.GL_SCISSOR_TEST); + } +}
\ No newline at end of file diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index 415984068..8304fde90 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -1,6 +1,7 @@ package me.shedaniel.rei.api; import me.shedaniel.rei.gui.RecipeViewingScreen; +import me.shedaniel.rei.gui.renderables.RecipeRenderer; import me.shedaniel.rei.gui.widget.CategoryBaseWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.Widget; @@ -26,6 +27,10 @@ public interface RecipeCategory<T extends RecipeDisplay> { String getCategoryName(); + default RecipeRenderer getSimpleRenderer(T recipe) { + return Renderable.fromRecipe(recipe::getInput, recipe::getOutput); + } + default List<Widget> setupDisplay(Supplier<T> recipeDisplaySupplier, Rectangle bounds) { return Collections.singletonList(new RecipeBaseWidget(bounds)); } diff --git a/src/main/java/me/shedaniel/rei/api/Renderable.java b/src/main/java/me/shedaniel/rei/api/Renderable.java index 35c9890b8..9059af798 100644 --- a/src/main/java/me/shedaniel/rei/api/Renderable.java +++ b/src/main/java/me/shedaniel/rei/api/Renderable.java @@ -2,8 +2,11 @@ package me.shedaniel.rei.api; import me.shedaniel.rei.gui.renderables.EmptyRenderer; import me.shedaniel.rei.gui.renderables.ItemStackRenderer; +import me.shedaniel.rei.gui.renderables.SimpleRecipeRenderer; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import java.util.List; import java.util.function.Supplier; public interface Renderable { @@ -30,5 +33,20 @@ public interface Renderable { return EmptyRenderer.INSTANCE; } + static SimpleRecipeRenderer fromRecipe(Supplier<List<List<ItemStack>>> input, Supplier<List<ItemStack>> output) { + return new SimpleRecipeRenderer(input, output); + } + + static ItemStackRenderer fromItemStacks(List<ItemStack> stacks) { + return new ItemStackRenderer() { + @Override + public ItemStack getItemStack() { + if (stacks.isEmpty()) + return ItemStack.EMPTY; + return stacks.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) stacks.size()) / 1f)); + } + }; + } + void render(int x, int y, double mouseX, double mouseY, float delta); } diff --git a/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java b/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java index 8e558aaf0..4975e3576 100644 --- a/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java +++ b/src/main/java/me/shedaniel/rei/client/RecipeScreenType.java @@ -11,6 +11,6 @@ public enum RecipeScreenType { @Override public String toString() { - return I18n.translate("text.rei.config.recipe_screen_type." + name().toLowerCase(Locale.ROOT)); + return I18n.translate("text.rei.config.recipe_screen_type." + name().toLowerCase()); } } diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index f1b6fb700..df677c13f 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -27,8 +27,10 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.GameMode; import java.awt.*; -import java.util.*; +import java.util.LinkedList; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; public class ContainerScreenOverlay extends AbstractParentElement implements Drawable { @@ -43,7 +45,6 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra private Window window; private CraftableToggleButtonWidget toggleButtonWidget; private ButtonWidget buttonLeft, buttonRight; - private int lastLeft; public static ItemListOverlay getItemListOverlay() { return itemListOverlay; @@ -59,7 +60,6 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra this.window = MinecraftClient.getInstance().window; DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass()); this.rectangle = RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen); - this.lastLeft = getLeft(); widgets.add(itemListOverlay = new ItemListOverlay(page)); itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); @@ -306,6 +306,10 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra RecipeViewingScreen widget = (RecipeViewingScreen) MinecraftClient.getInstance().currentScreen; return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18); } + if (MinecraftClient.getInstance().currentScreen instanceof VillagerRecipeViewingScreen) { + VillagerRecipeViewingScreen widget = (VillagerRecipeViewingScreen) MinecraftClient.getInstance().currentScreen; + return new Rectangle(widget.bounds.x, window.getScaledHeight() - 22, widget.bounds.width - widthRemoved, 18); + } return new Rectangle(ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft(), window.getScaledHeight() - 22, ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() - widthRemoved, 18); } @@ -427,16 +431,6 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra GuiLighting.disable(); } - private int getLeft() { - if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingScreen) { - RecipeViewingScreen widget = (RecipeViewingScreen) MinecraftClient.getInstance().currentScreen; - return widget.getBounds().x; - } - if (MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen()) - return ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 147 - 30; - return ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft(); - } - private int getTotalPage() { return itemListOverlay.getTotalPage(); } diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index c56c2c7cb..2bb1b4486 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -234,7 +234,7 @@ public class RecipeViewingScreen extends Screen { int j = i + categoryPages * 6; if (categories.size() > j) { TabWidget tab; - tabs.add(tab = new TabWidget(i, this, new Rectangle(bounds.x + 4 + 28 * i, bounds.y - 28, 28, 28)) { + tabs.add(tab = new TabWidget(i, new Rectangle(bounds.x + 4 + 28 * i, bounds.y - 28, 28, 28)) { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (getBounds().contains(mouseX, mouseY)) { diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index 8bc1d65ec..1263e03c3 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -3,31 +3,46 @@ 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 com.zeitheron.hammercore.client.utils.Scissors; +import me.shedaniel.rei.api.*; 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 me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.widget.*; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.audio.PositionedSoundInstance; +import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Screen; import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.sound.SoundEvents; import net.minecraft.text.StringTextComponent; import net.minecraft.util.math.MathHelper; +import org.lwjgl.BufferUtils; +import org.lwjgl.glfw.GLFW; +import org.lwjgl.opengl.GL11; import java.awt.*; +import java.nio.IntBuffer; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import static me.shedaniel.rei.gui.RecipeViewingScreen.getSpeedCraftFunctionalByCategory; public class VillagerRecipeViewingScreen extends Screen { private final Map<RecipeCategory, List<RecipeDisplay>> categoryMap; private final List<RecipeCategory> categories; private final List<Widget> widgets; + private final List<ButtonWidget> buttonWidgets; + private final List<Renderer> recipeRenderers; + private final List<TabWidget> tabs; public Rectangle bounds, scrollListBounds; private int selectedCategoryIndex, selectedRecipeIndex; + private double scroll; + private int tabsPage; + private static final int TABS_PER_PAGE = 9; public VillagerRecipeViewingScreen(Map<RecipeCategory, List<RecipeDisplay>> map) { super(new StringTextComponent("")); @@ -35,7 +50,12 @@ public class VillagerRecipeViewingScreen extends Screen { this.categoryMap = Maps.newLinkedHashMap(); this.selectedCategoryIndex = 0; this.selectedRecipeIndex = 0; + this.scroll = 0; + this.tabsPage = 0; this.categories = Lists.newArrayList(); + this.buttonWidgets = Lists.newArrayList(); + this.tabs = Lists.newArrayList(); + this.recipeRenderers = Lists.newArrayList(); RecipeHelper.getInstance().getAllCategories().forEach(category -> { if (map.containsKey(category)) { categories.add(category); @@ -49,6 +69,9 @@ public class VillagerRecipeViewingScreen extends Screen { super.init(); this.children.clear(); this.widgets.clear(); + this.buttonWidgets.clear(); + this.recipeRenderers.clear(); + this.tabs.clear(); int largestWidth = width - 100; int largestHeight = height - 40; RecipeCategory category = categories.get(selectedCategoryIndex); @@ -57,34 +80,153 @@ public class VillagerRecipeViewingScreen extends Screen { 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.scrollListBounds = new Rectangle(bounds.x + 4, bounds.y + 17, 97 + 5, 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)); + Optional<ButtonAreaSupplier> supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(category); + final SpeedCraftFunctional functional = getSpeedCraftFunctionalByCategory(ScreenHelper.getLastContainerScreen(), category); + if (supplier.isPresent()) + widgets.add(new SpeedCraftingButtonWidget(supplier.get().get(recipeBounds), supplier.get().getButtonText(), functional, () -> display)); + + int index = 0; + for(RecipeDisplay recipeDisplay : categoryMap.get(category)) { + int finalIndex = index; + RecipeRenderer recipeRenderer; + recipeRenderers.add(recipeRenderer = category.getSimpleRenderer(recipeDisplay)); + buttonWidgets.add(new ButtonWidget(bounds.x + 5, 0, recipeRenderer.getWidth(), recipeRenderer.getHeight(), "") { + @Override + public void onPressed() { + selectedRecipeIndex = finalIndex; + VillagerRecipeViewingScreen.this.init(); + } + }); + index++; + } + for(int i = 0; i < TABS_PER_PAGE; i++) { + int j = i + tabsPage * TABS_PER_PAGE; + if (categories.size() > j) { + TabWidget tab; + tabs.add(tab = new TabWidget(i, new Rectangle(bounds.x + bounds.width / 2 - Math.min(categories.size() - tabsPage * TABS_PER_PAGE, TABS_PER_PAGE) * 14 + i * 28, bounds.y - 28, 28, 28)) { + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (getBounds().contains(mouseX, mouseY)) { + MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + if (getId() + tabsPage * TABS_PER_PAGE == selectedCategoryIndex) + return false; + selectedCategoryIndex = getId() + tabsPage * TABS_PER_PAGE; + scroll = 0; + VillagerRecipeViewingScreen.this.init(); + return true; + } + return false; + } + }); + tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + tabsPage * TABS_PER_PAGE == selectedCategoryIndex); + } + } + + this.widgets.add(new ClickableLabelWidget(bounds.x + 4 + scrollListBounds.width / 2, bounds.y + 6, categories.get(selectedCategoryIndex).getCategoryName()) { + @Override + public void onLabelClicked() { + MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + ClientHelper.getInstance().executeViewAllRecipesKeyBind(); + } + + @Override + public Optional<String> getTooltips() { + return Optional.ofNullable(I18n.translate("text.rei.view_all_categories")); + } + + @Override + public void render(int mouseX, int mouseY, float delta) { + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + int colour = getDefaultColor(); + if (clickable && isHovered(mouseX, mouseY)) + colour = getHoveredColor(); + font.draw((isHovered(mouseX, mouseY) ? "§n" : "") + text, x - font.getStringWidth(text) / 2, y, colour); + if (clickable && getTooltips().isPresent()) + if (!focused && isHighlighted(mouseX, mouseY)) + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltips().get().split("\n"))); + else if (focused) + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x, y), getTooltips().get().split("\n"))); + } + + @Override + public int getHoveredColor() { + return -1; + } + + @Override + public int getDefaultColor() { + return 4210752; + } + }); + this.children.addAll(buttonWidgets); + this.widgets.addAll(tabs); this.children.addAll(widgets); this.children.add(ScreenHelper.getLastOverlay(true, false)); + ScreenHelper.getLastOverlay().init(); + } + + @Override + public boolean mouseScrolled(double double_1, double double_2, double double_3) { + double height = buttonWidgets.stream().map(ButtonWidget::getBounds).collect(Collectors.summingDouble(Rectangle::getHeight)); + if (scrollListBounds.contains(double_1, double_2) && height > scrollListBounds.height - 2) { + if (double_3 > 0) + scroll -= 16; + else + scroll += 16; + scroll = MathHelper.clamp(scroll, 0, height - scrollListBounds.height + 2); + return true; + } + return super.mouseScrolled(double_1, double_2, double_3); } @Override public void render(int mouseX, int mouseY, float delta) { this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680); + int yOffset = 0; 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(); + GL11.glPushMatrix(); + Scissors.begin(); + Scissors.scissor(0, scrollListBounds.y + 1, width, scrollListBounds.height - 2); + for(int i = 0; i < buttonWidgets.size(); i++) { + ButtonWidget buttonWidget = buttonWidgets.get(i); + buttonWidget.getBounds().y = scrollListBounds.y + 1 + yOffset - (int) scroll; + if (buttonWidget.getBounds().getMaxY() > scrollListBounds.getMinY() && buttonWidget.getBounds().getMinY() < scrollListBounds.getMaxY()) { + GuiLighting.disable(); + buttonWidget.render(mouseX, mouseY, delta); + } + yOffset += buttonWidget.getBounds().height; + } + for(int i = 0; i < buttonWidgets.size(); i++) { + if (buttonWidgets.get(i).getBounds().getMaxY() > scrollListBounds.getMinY() && buttonWidgets.get(i).getBounds().getMinY() < scrollListBounds.getMaxY()) { + GuiLighting.disable(); + recipeRenderers.get(i).setBlitOffset(1); + recipeRenderers.get(i).render(buttonWidgets.get(i).getBounds().x, buttonWidgets.get(i).getBounds().y, mouseX, mouseY, delta); + } + } + Scissors.end(); + GL11.glPopMatrix(); ScreenHelper.getLastOverlay().lateRender(mouseX, mouseY, delta); } + private int getTitleBarHeight() { + IntBuffer useless = BufferUtils.createIntBuffer(3), top = BufferUtils.createIntBuffer(1); + GLFW.glfwGetWindowFrameSize(minecraft.window.getHandle(), useless, top, useless, useless); + System.out.println(top.get(0)); + return top.get(0) / 3 * 2; + } + + private int getReal(int i) { + return (int) (i / ((double) minecraft.window.getScaledWidth() / (double) minecraft.window.getWidth())); + } + @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()) { @@ -92,6 +234,34 @@ public class VillagerRecipeViewingScreen extends Screen { ScreenHelper.getLastOverlay().init(); return true; } + if (int_1 == 258) { + boolean boolean_1 = !hasShiftDown(); + if (!this.changeFocus(boolean_1)) + this.changeFocus(boolean_1); + return true; + } + if (ClientHelper.getInstance().getNextPageKeyBinding().matchesKey(int_1, int_2)) { + if (categoryMap.get(categories.get(selectedCategoryIndex)).size() > 1) { + selectedCategoryIndex++; + if (selectedCategoryIndex >= categoryMap.get(categories.get(selectedCategoryIndex)).size()) + selectedCategoryIndex = 0; + init(); + return true; + } + return false; + } else if (ClientHelper.getInstance().getPreviousPageKeyBinding().matchesKey(int_1, int_2)) { + if (categoryMap.get(categories.get(selectedCategoryIndex)).size() > 1) { + selectedCategoryIndex--; + if (selectedCategoryIndex < 0) + selectedCategoryIndex = categoryMap.get(categories.get(selectedCategoryIndex)).size() - 1; + init(); + return true; + } + return false; + } + for(Element element : children()) + if (element.keyPressed(int_1, int_2, int_3)) + return true; return super.keyPressed(int_1, int_2, int_3); } diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java index 139e88a19..a64196311 100644 --- a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java +++ b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java @@ -1,16 +1,25 @@ package me.shedaniel.rei.gui.renderables; +import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.Renderer; +import me.shedaniel.rei.client.ScreenHelper; +import me.shedaniel.rei.gui.widget.ItemListOverlay; +import me.shedaniel.rei.gui.widget.QueuedTooltip; 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; +import java.util.Collections; +import java.util.List; + public abstract class ItemStackRenderer extends Renderer { public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + public boolean drawTooltip = false; @Override public void render(int x, int y, double mouseX, double mouseY, float delta) { @@ -27,6 +36,32 @@ public abstract class ItemStackRenderer extends Renderer { itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, getItemStack(), l, i1); itemRenderer.zOffset = 0.0F; this.blitOffset = 0; + if (drawTooltip && mouseX >= x - 8 && mouseX <= x + 8 && mouseY >= y - 6 && mouseY <= y + 10) + queueTooltip(getItemStack(), delta); + this.drawTooltip = false; + } + + 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(); } public abstract ItemStack getItemStack(); diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java new file mode 100644 index 000000000..1c3a861c1 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java @@ -0,0 +1,13 @@ +package me.shedaniel.rei.gui.renderables; + +import me.shedaniel.rei.api.Renderer; + +public abstract class RecipeRenderer extends Renderer { + + public abstract int getHeight(); + + public final int getWidth() { + return 100; + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java new file mode 100644 index 000000000..6067993a9 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java @@ -0,0 +1,104 @@ +package me.shedaniel.rei.gui.renderables; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.Renderable; +import me.shedaniel.rei.gui.VillagerRecipeViewingScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.Pair; +import net.minecraft.util.math.MathHelper; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class SimpleRecipeRenderer extends RecipeRenderer { + + private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + private List<ItemStackRenderer> inputRenderer; + private ItemStackRenderer outputRenderer; + + public SimpleRecipeRenderer(Supplier<List<List<ItemStack>>> input, Supplier<List<ItemStack>> output) { + List<Pair<List<ItemStack>, AtomicInteger>> newList = Lists.newArrayList(); + List<Pair<List<ItemStack>, Integer>> a = input.get().stream().map(stacks -> new Pair<>(stacks, stacks.stream().map(ItemStack::getAmount).max(Integer::compareTo).orElse(1))).collect(Collectors.toList()); + for(Pair<List<ItemStack>, Integer> pair : a) { + Optional<Pair<List<ItemStack>, AtomicInteger>> any = newList.stream().filter(pairr -> pair.getLeft().equals(pairr.getLeft())).findAny(); + if (any.isPresent()) { + any.get().getRight().addAndGet(pair.getRight()); + } else + newList.add(new Pair<>(pair.getLeft(), new AtomicInteger(pair.getRight()))); + } + List<List<ItemStack>> b = Lists.newArrayList(); + for(Pair<List<ItemStack>, AtomicInteger> pair : newList) + b.add(pair.getLeft().stream().map(stack -> { + ItemStack s = stack.copy(); + s.setAmount(pair.getRight().get()); + return s; + }).collect(Collectors.toList())); + this.inputRenderer = b.stream().filter(stacks -> !stacks.isEmpty()).map(stacks -> Renderable.fromItemStacks(stacks)).collect(Collectors.toList()); + this.outputRenderer = Renderable.fromItemStacks(output.get().stream().filter(stack -> !stack.isEmpty()).collect(Collectors.toList())); + } + + @Override + public void render(int x, int y, double mouseX, double mouseY, float delta) { + int xx = x + 5, yy = y + 5; + int j = 0; + int itemsPerLine = getItemsPerLine(); + for(ItemStackRenderer itemStackRenderer : inputRenderer) { + itemStackRenderer.setBlitOffset(getBlitOffset() + 50); + itemStackRenderer.drawTooltip = MinecraftClient.getInstance().currentScreen instanceof VillagerRecipeViewingScreen; + itemStackRenderer.render(xx + 8, yy + 6, mouseX, mouseY, delta); + xx += 18; + j++; + if (j >= getItemsPerLine()) { + yy += 18; + xx = x + 5; + j = 0; + } + } + if (itemsPerLine - j + 1 < 3) { + j = 0; + xx = x + 5; + yy += 18; + } + GuiLighting.disable(); + MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE); + blit(xx, yy, 0, 28, 36, 18); + xx += 36; + j += 2; + if (j >= getItemsPerLine()) { + yy += 18; < |
