aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUnknown <shekwancheung0528@gmail.com>2019-05-09 22:38:34 +0800
committerUnknown <shekwancheung0528@gmail.com>2019-05-09 22:38:34 +0800
commitc1b0219e8d5458ddf1eccc194d34893f698b7d88 (patch)
treea0ed116ad122b66721c5fe9345925e04f3c73a47 /src
parent6017255b2b2704031a784eafd2bd720f1e7b8fc2 (diff)
downloadRoughlyEnoughItems-c1b0219e8d5458ddf1eccc194d34893f698b7d88.tar.gz
RoughlyEnoughItems-c1b0219e8d5458ddf1eccc194d34893f698b7d88.tar.bz2
RoughlyEnoughItems-c1b0219e8d5458ddf1eccc194d34893f698b7d88.zip
VillagerRecipeViewingScreen done
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/zeitheron/hammercore/client/utils/Scissors.java38
-rw-r--r--src/main/java/me/shedaniel/rei/api/RecipeCategory.java5
-rw-r--r--src/main/java/me/shedaniel/rei/api/Renderable.java18
-rw-r--r--src/main/java/me/shedaniel/rei/client/RecipeScreenType.java2
-rw-r--r--src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java20
-rw-r--r--src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java2
-rw-r--r--src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java206
-rw-r--r--src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java35
-rw-r--r--src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java13
-rw-r--r--src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java104
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java4
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/CategoryBaseWidget.java5
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java12
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/RecipeBaseWidget.java64
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java5
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java4
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultBlastingCategory.java7
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java2
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingCategory.java7
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultSmokingCategory.java7
-rwxr-xr-xsrc/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.pngbin7000 -> 7332 bytes
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 itemStackRe