From 5a75d9d47c41cacc7dc7c695ce7f7cd840f51991 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 18 Jun 2019 23:04:37 +0800 Subject: click on arrows --- .../java/me/shedaniel/rei/api/ClientHelper.java | 1 + .../java/me/shedaniel/rei/api/RecipeCategory.java | 2 +- .../java/me/shedaniel/rei/api/RecipeHelper.java | 10 ++ src/main/java/me/shedaniel/rei/api/Renderer.java | 6 +- .../me/shedaniel/rei/client/ClientHelperImpl.java | 15 +++ .../me/shedaniel/rei/client/RecipeHelperImpl.java | 40 ++++++- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 26 ++++- .../rei/gui/VillagerRecipeViewingScreen.java | 2 +- .../rei/gui/renderables/EmptyRenderer.java | 19 ---- .../rei/gui/renderables/ItemStackRenderer.java | 74 ------------- .../rei/gui/renderables/RecipeRenderer.java | 18 ---- .../rei/gui/renderables/SimpleRecipeRenderer.java | 119 --------------------- .../shedaniel/rei/gui/renderers/EmptyRenderer.java | 19 ++++ .../rei/gui/renderers/ItemStackRenderer.java | 74 +++++++++++++ .../rei/gui/renderers/RecipeRenderer.java | 18 ++++ .../rei/gui/renderers/SimpleRecipeRenderer.java | 119 +++++++++++++++++++++ .../me/shedaniel/rei/gui/widget/SlotWidget.java | 2 +- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 10 +- .../plugin/blasting/DefaultBlastingCategory.java | 2 +- .../composting/DefaultCompostingCategory.java | 2 +- .../plugin/smelting/DefaultSmeltingCategory.java | 2 +- .../rei/plugin/smoking/DefaultSmokingCategory.java | 2 +- 22 files changed, 336 insertions(+), 246 deletions(-) delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java (limited to 'src/main/java/me') diff --git a/src/main/java/me/shedaniel/rei/api/ClientHelper.java b/src/main/java/me/shedaniel/rei/api/ClientHelper.java index 3900e24ae..bd377c2ba 100644 --- a/src/main/java/me/shedaniel/rei/api/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/api/ClientHelper.java @@ -149,4 +149,5 @@ public interface ClientHelper { boolean executeViewAllRecipesFromCategory(Identifier category); + boolean executeViewAllRecipesFromCategories(List categories); } diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index 73d1367c1..5204fcbc8 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -7,7 +7,7 @@ package me.shedaniel.rei.api; import me.shedaniel.rei.client.ScreenHelper; import me.shedaniel.rei.gui.RecipeViewingScreen; -import me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; import me.shedaniel.rei.gui.widget.CategoryBaseWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.Widget; diff --git a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java index 70373ca51..d6f2f80fa 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java @@ -6,11 +6,14 @@ package me.shedaniel.rei.api; import me.shedaniel.rei.RoughlyEnoughItemsCore; +import me.shedaniel.rei.client.RecipeHelperImpl; +import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; import net.minecraft.item.ItemStack; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeManager; import net.minecraft.util.Identifier; +import java.awt.*; import java.util.List; import java.util.Map; import java.util.Optional; @@ -91,6 +94,8 @@ public interface RecipeHelper { */ Map> getRecipesFor(ItemStack stack); + RecipeCategory getCategory(Identifier identifier); + /** * Gets the vanilla recipe manager * @@ -204,7 +209,12 @@ public interface RecipeHelper { */ void registerLiveRecipeGenerator(LiveRecipeGenerator liveRecipeGenerator); + void registerScreenClickArea(Rectangle rectangle, Class screenClass, Identifier... categories); + > void registerRecipes(Identifier category, Class recipeClass, Function mappingFunction); > void registerRecipes(Identifier category, Function recipeFilter, Function mappingFunction); + + List getScreenClickAreas(); + } diff --git a/src/main/java/me/shedaniel/rei/api/Renderer.java b/src/main/java/me/shedaniel/rei/api/Renderer.java index 43d4c55b3..cbedb6ccf 100644 --- a/src/main/java/me/shedaniel/rei/api/Renderer.java +++ b/src/main/java/me/shedaniel/rei/api/Renderer.java @@ -5,9 +5,9 @@ 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 me.shedaniel.rei.gui.renderers.EmptyRenderer; +import me.shedaniel.rei.gui.renderers.ItemStackRenderer; +import me.shedaniel.rei.gui.renderers.SimpleRecipeRenderer; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java b/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java index 0b4c4f821..268cbf578 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java @@ -218,6 +218,21 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer { return map.keySet().size() > 0; } + @Override + public boolean executeViewAllRecipesFromCategories(List categories) { + Map> map = Maps.newLinkedHashMap(); + for(Identifier category : categories) { + Optional any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny(); + if (!any.isPresent()) + continue; + RecipeCategory recipeCategory = any.get(); + map.put(recipeCategory, RecipeHelper.getInstance().getAllRecipesFromCategory(recipeCategory)); + } + if (map.keySet().size() > 0) + openRecipeViewingScreen(map); + return map.keySet().size() > 0; + } + @Override public void openRecipeViewingScreen(Map> map) { if (RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType == RecipeScreenType.VILLAGER) diff --git a/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java index 679d327e8..9a9415d9b 100644 --- a/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; import net.minecraft.item.ItemStack; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeManager; @@ -40,6 +41,7 @@ public class RecipeHelperImpl implements RecipeHelper { private final List autoCraftingHandlers = Lists.newArrayList(); private final List recipeFunctions = Lists.newArrayList(); + private final List screenClickAreas = Lists.newArrayList(); private final AtomicInteger recipeCount = new AtomicInteger(); private final Map> recipeCategoryListMap = Maps.newHashMap(); private final List categories = Lists.newArrayList(); @@ -140,7 +142,8 @@ public class RecipeHelperImpl implements RecipeHelper { return recipeCategoryListMap; } - private RecipeCategory getCategory(Identifier identifier) { + @Override + public RecipeCategory getCategory(Identifier identifier) { return categories.stream().filter(category -> category.getIdentifier().equals(identifier)).findFirst().orElse(null); } @@ -217,6 +220,7 @@ public class RecipeHelperImpl implements RecipeHelper { this.recipeCategoryListMap.clear(); this.categories.clear(); this.speedCraftAreaSupplierMap.clear(); + this.screenClickAreas.clear(); this.categoryWorkingStations.clear(); this.recipeFunctions.clear(); this.displayVisibilityHandlers.clear(); @@ -360,6 +364,11 @@ public class RecipeHelperImpl implements RecipeHelper { return true; } + @Override + public void registerScreenClickArea(Rectangle rectangle, Class screenClass, Identifier... categories) { + this.screenClickAreas.add(new ScreenClickArea(screenClass, rectangle, categories)); + } + @Override public > void registerRecipes(Identifier category, Class recipeClass, Function mappingFunction) { recipeFunctions.add(new RecipeFunction(category, recipe -> recipeClass.isAssignableFrom(recipe.getClass()), mappingFunction)); @@ -380,6 +389,35 @@ public class RecipeHelperImpl implements RecipeHelper { liveRecipeGenerators.add(liveRecipeGenerator); } + @Override + public List getScreenClickAreas() { + return screenClickAreas; + } + + public class ScreenClickArea { + Class screenClass; + Rectangle rectangle; + Identifier[] categories; + + private ScreenClickArea(Class screenClass, Rectangle rectangle, Identifier[] categories) { + this.screenClass = screenClass; + this.rectangle = rectangle; + this.categories = categories; + } + + public Class getScreenClass() { + return screenClass; + } + + public Rectangle getRectangle() { + return rectangle; + } + + public Identifier[] getCategories() { + return categories; + } + } + private class RecipeFunction { Identifier category; Predicate recipeFilter; diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index e9de741f3..67ef5e30c 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -11,6 +11,8 @@ import me.shedaniel.cloth.api.ClientUtils; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.DisplayHelper; +import me.shedaniel.rei.api.RecipeHelper; +import me.shedaniel.rei.client.RecipeHelperImpl; import me.shedaniel.rei.client.ScreenHelper; import me.shedaniel.rei.client.Weather; import me.shedaniel.rei.gui.widget.*; @@ -351,7 +353,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra init(true); else if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && (!hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks) || (currentStacks.size() != ScreenHelper.inventoryStacks.size()))) { ScreenHelper.inventoryStacks = ClientHelper.getInstance().getInventoryItemsTypes(); - DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass()); + DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass()); itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); } if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && SearchFieldWidget.isSearching) { @@ -359,7 +361,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra blitOffset = 200; ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen; int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop(); - for(Slot slot : ((AbstractContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList) + for(Slot slot : ((AbstractContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList) if (!slot.hasStack() || !itemListOverlay.filterItem(slot.getStack(), itemListOverlay.getLastSearchArgument())) fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400); blitOffset = 0; @@ -367,6 +369,16 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GuiLighting.disable(); this.renderWidgets(mouseX, mouseY, delta); + if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen) { + ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen; + for(RecipeHelperImpl.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas()) + if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass())) + if (area.getRectangle().contains(mouseX - hooks.rei_getContainerLeft(), mouseY - hooks.rei_getContainerTop())) { + String collect = Arrays.asList(area.getCategories()).stream().map(identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName()).collect(Collectors.joining(", ")); + QUEUED_TOOLTIPS.add(QueuedTooltip.create(I18n.translate("text.rei.view_recipes_for", collect))); + break; + } + } } public void lateRender(int mouseX, int mouseY, float delta) { @@ -510,6 +522,16 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra public boolean mouseClicked(double double_1, double double_2, int int_1) { if (!ScreenHelper.isOverlayVisible()) return false; + if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen) { + ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen; + for(RecipeHelperImpl.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas()) + if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass())) + if (area.getRectangle().contains(double_1 - hooks.rei_getContainerLeft(), double_2 - hooks.rei_getContainerTop())) { + ClientHelper.getInstance().executeViewAllRecipesFromCategories(Arrays.asList(area.getCategories())); + MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + return true; + } + } for(Element element : widgets) if (element.mouseClicked(double_1, double_2, int_1)) { this.setFocused(element); diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index f6958c5be..a657c49b4 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -13,7 +13,7 @@ import me.shedaniel.cloth.api.ClientUtils; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; import me.shedaniel.rei.client.ScreenHelper; -import me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; import me.shedaniel.rei.gui.widget.*; import net.minecraft.ChatFormat; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java deleted file mode 100644 index 06becf832..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -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/ItemStackRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java deleted file mode 100644 index de18479db..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -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) { - 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; - 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 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(); - } - - 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 deleted file mode 100644 index 851db3053..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -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 deleted file mode 100644 index 7d40f4b8f..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.gui.renderables; - -import com.google.common.collect.Lists; -import me.shedaniel.rei.api.Renderer; -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.Comparator; -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 { - - public static final Comparator ITEM_STACK_COMPARATOR = (o1, o2) -> { - if (o1.getItem() == o2.getItem()) { - if (o1.getAmount() != o2.getAmount()) - return o1.getAmount() - o2.getAmount(); - int compare = Boolean.compare(o1.hasTag(), o2.hasTag()); - if (compare != 0) - return compare; - if (o1.getTag().getSize() != o2.getTag().getSize()) - return o1.getTag().getSize() - o2.getTag().getSize(); - return o1.getTag().hashCode() - o2.getTag().hashCode(); - } - return o1.getItem().hashCode() - o2.getItem().hashCode(); - }; - private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); - private List inputRenderer; - private ItemStackRenderer outputRenderer; - - public SimpleRecipeRenderer(Supplier>> input, Supplier> output) { - List, AtomicInteger>> newList = Lists.newArrayList(); - List, 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, Integer> pair : a) { - Optional, AtomicInteger>> any = newList.stream().filter(pairr -> equalsList(pair.getLeft(), pairr.getLeft())).findAny(); - if (any.isPresent()) { - any.get().getRight().addAndGet(pair.getRight()); - } else - newList.add(new Pair<>(pair.getLeft(), new AtomicInteger(pair.getRight()))); - } - List> b = Lists.newArrayList(); - for(Pair, 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 -> Renderer.fromItemStacks(stacks)).collect(Collectors.toList()); - this.outputRenderer = Renderer.fromItemStacks(output.get().stream().filter(stack -> !stack.isEmpty()).collect(Collectors.toList())); - } - - public static boolean equalsList(List list_1, List list_2) { - List stacks_1 = list_1.stream().distinct().sorted(ITEM_STACK_COMPARATOR).collect(Collectors.toList()); - List stacks_2 = list_2.stream().distinct().sorted(ITEM_STACK_COMPARATOR).collect(Collectors.toList()); - if (stacks_1.equals(stacks_2)) - return true; - if (stacks_1.size() != stacks_2.size()) - return false; - for(int i = 0; i < stacks_1.size(); i++) - if (!stacks_1.get(i).isEqualIgnoreTags(stacks_2.get(i))) - return false; - return true; - } - - @Override - public void render(int x, int y, double mouseX, double mouseY, float delta) { - int xx = x + 4, yy = y + 2; - 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() - 2) { - yy += 18; - xx = x + 5; - j = 0; - } - } - xx = x + 5 + 18 * (getItemsPerLine() - 2); - yy = y + getHeight() / 2 - 8; - GuiLighting.disable(); - MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE); - blit(xx, yy, 0, 28, 18, 18); - xx += 18; - outputRenderer.setBlitOffset(getBlitOffset() + 50); - outputRenderer.drawTooltip = MinecraftClient.getInstance().currentScreen instanceof VillagerRecipeViewingScreen; - outputRenderer.render(xx + 8, yy + 6, mouseX, mouseY, delta); - } - - @Override - public int getHeight() { - return 4 + getItemsHeight() * 18; - } - - public int getItemsHeight() { - return MathHelper.ceil(((float) inputRenderer.size()) / (getItemsPerLine() - 2)); - } - - public int getItemsPerLine() { - return MathHelper.floor((getWidth() - 4f) / 18f); - } - -} diff --git a/src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java new file mode 100644 index 000000000..cc63910a8 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java @@ -0,0 +1,19 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.renderers; + +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/renderers/ItemStackRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java new file mode 100644 index 000000000..8f7fe1a50 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java @@ -0,0 +1,74 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.renderers; + +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) { + 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; + 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 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(); + } + + public abstract ItemStack getItemStack(); + +} diff --git a/src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java new file mode 100644 index 000000000..288c4b1de --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java @@ -0,0 +1,18 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.renderers; + +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/renderers/SimpleRecipeRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java new file mode 100644 index 000000000..5b97f68fe --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java @@ -0,0 +1,119 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.renderers; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.Renderer; +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.Comparator; +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 { + + public static final Comparator ITEM_STACK_COMPARATOR = (o1, o2) -> { + if (o1.getItem() == o2.getItem()) { + if (o1.getAmount() != o2.getAmount()) + return o1.getAmount() - o2.getAmount(); + int compare = Boolean.compare(o1.hasTag(), o2.hasTag()); + if (compare != 0) + return compare; + if (o1.getTag().getSize() != o2.getTag().getSize()) + return o1.getTag().getSize() - o2.getTag().getSize(); + return o1.getTag().hashCode() - o2.getTag().hashCode(); + } + return o1.getItem().hashCode() - o2.getItem().hashCode(); + }; + private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + private List inputRenderer; + private ItemStackRenderer outputRenderer; + + public SimpleRecipeRenderer(Supplier>> input, Supplier> output) { + List, AtomicInteger>> newList = Lists.newArrayList(); + List, 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, Integer> pair : a) { + Optional, AtomicInteger>> any = newList.stream().filter(pairr -> equalsList(pair.getLeft(), pairr.getLeft())).findAny(); + if (any.isPresent()) { + any.get().getRight().addAndGet(pair.getRight()); + } else + newList.add(new Pair<>(pair.getLeft(), new AtomicInteger(pair.getRight()))); + } + List> b = Lists.newArrayList(); + for(Pair, 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 -> Renderer.fromItemStacks(stacks)).collect(Collectors.toList()); + this.outputRenderer = Renderer.fromItemStacks(output.get().stream().filter(stack -> !stack.isEmpty()).collect(Collectors.toList())); + } + + public static boolean equalsList(List list_1, List list_2) { + List stacks_1 = list_1.stream().distinct().sorted(ITEM_STACK_COMPARATOR).collect(Collectors.toList()); + List stacks_2 = list_2.stream().distinct().sorted(ITEM_STACK_COMPARATOR).collect(Collectors.toList()); + if (stacks_1.equals(stacks_2)) + return true; + if (stacks_1.size() != stacks_2.size()) + return false; + for(int i = 0; i < stacks_1.size(); i++) + if (!stacks_1.get(i).isEqualIgnoreTags(stacks_2.get(i))) + return false; + return true; + } + + @Override + public void render(int x, int y, double mouseX, double mouseY, float delta) { + int xx = x + 4, yy = y + 2; + 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() - 2) { + yy += 18; + xx = x + 5; + j = 0; + } + } + xx = x + 5 + 18 * (getItemsPerLine() - 2); + yy = y + getHeight() / 2 - 8; + GuiLighting.disable(); + MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE); + blit(xx, yy, 0, 28, 18, 18); + xx += 18; + outputRenderer.setBlitOffset(getBlitOffset() + 50); + outputRenderer.drawTooltip = MinecraftClient.getInstance().currentScreen instanceof VillagerRecipeViewingScreen; + outputRenderer.render(xx + 8, yy + 6, mouseX, mouseY, delta); + } + + @Override + public int getHeight() { + return 4 + getItemsHeight() * 18; + } + + public int getItemsHeight() { + return MathHelper.ceil(((float) inputRenderer.size()) / (getItemsPerLine() - 2)); + } + + public int getItemsPerLine() { + return MathHelper.floor((getWidth() - 4f) / 18f); + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java index e1708478f..6d83e1e59 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java @@ -12,7 +12,7 @@ import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.Renderer; import me.shedaniel.rei.client.ClientHelperImpl; import me.shedaniel.rei.client.ScreenHelper; -import me.shedaniel.rei.gui.renderables.ItemStackRenderer; +import me.shedaniel.rei.gui.renderers.ItemStackRenderer; import net.minecraft.client.gui.Element; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index bf22ed09b..6c8fefca4 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -32,9 +32,7 @@ import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingCategory; import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingDisplay; import net.minecraft.block.ComposterBlock; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; -import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; -import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; +import net.minecraft.client.gui.screen.ingame.*; import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; @@ -277,6 +275,12 @@ public class DefaultPlugin implements REIPluginEntry { recipeHelper.registerWorkingStations(COMPOSTING, new ItemStack(Items.COMPOSTER)); recipeHelper.registerSpeedCraftButtonArea(COMPOSTING, bounds -> null); recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, bounds -> new Rectangle((int) bounds.getMaxX() - 16, bounds.y + 6, 10, 10)); + recipeHelper.registerScreenClickArea(new Rectangle(88, 32, 28, 23), CraftingTableScreen.class, CRAFTING); + recipeHelper.registerScreenClickArea(new Rectangle(137, 29, 10, 13), InventoryScreen.class, CRAFTING); + recipeHelper.registerScreenClickArea(new Rectangle(97, 16, 14, 30), BrewingStandScreen.class, BREWING); + recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING); + recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING); + recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING); } @Override diff --git a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java index 0a975151f..5fb37e6fa 100644 --- a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java @@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin.blasting; import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; diff --git a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java index 93ae4bce9..a71ac5063 100644 --- a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java @@ -9,7 +9,7 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; diff --git a/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java b/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java index eb4596e68..a5c86ceea 100644 --- a/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java @@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin.smelting; import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; diff --git a/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java b/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java index 9edba769d..609af3fda 100644 --- a/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java @@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin.smoking; import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.gui.renderables.RecipeRenderer; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; -- cgit