From ad7f945d6f724d51ee843b334838fda84c6197f2 Mon Sep 17 00:00:00 2001 From: Danielshe Date: Sun, 3 Nov 2019 19:02:00 +0800 Subject: API Changes --- src/main/java/me/shedaniel/rei/api/Entry.java | 52 ---- .../java/me/shedaniel/rei/api/EntryRegistry.java | 68 +---- src/main/java/me/shedaniel/rei/api/EntryStack.java | 7 +- .../java/me/shedaniel/rei/api/RecipeCategory.java | 17 +- .../java/me/shedaniel/rei/api/RecipeDisplay.java | 65 +---- .../java/me/shedaniel/rei/api/RecipeHelper.java | 42 +-- src/main/java/me/shedaniel/rei/api/Renderer.java | 211 -------------- .../shedaniel/rei/api/TransferRecipeDisplay.java | 23 +- .../me/shedaniel/rei/gui/OverlaySearchField.java | 8 +- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 9 +- .../rei/gui/VillagerRecipeViewingScreen.java | 125 +++++--- .../me/shedaniel/rei/gui/entries/RecipeEntry.java | 117 ++++++++ .../shedaniel/rei/gui/renderers/EmptyRenderer.java | 23 -- .../shedaniel/rei/gui/renderers/FluidRenderer.java | 122 -------- .../rei/gui/renderers/ItemStackRenderer.java | 106 ------- .../rei/gui/renderers/RecipeRenderer.java | 18 -- .../rei/gui/renderers/SimpleRecipeEntry.java | 157 ++++++++++ .../rei/gui/renderers/SimpleRecipeRenderer.java | 175 ------------ .../rei/gui/toast/CopyRecipeIdentifierToast.java | 1 - .../me/shedaniel/rei/gui/widget/ButtonWidget.java | 1 - .../rei/gui/widget/ClickableLabelWidget.java | 14 +- .../gui/widget/CraftableToggleButtonWidget.java | 2 +- .../rei/gui/widget/DetailedButtonWidget.java | 48 ---- .../shedaniel/rei/gui/widget/EntryListWidget.java | 22 +- .../me/shedaniel/rei/gui/widget/EntryWidget.java | 29 +- .../me/shedaniel/rei/gui/widget/LabelWidget.java | 5 + .../me/shedaniel/rei/gui/widget/PanelWidget.java | 11 +- .../rei/gui/widget/RecipeArrowWidget.java | 2 +- .../shedaniel/rei/gui/widget/RecipeBaseWidget.java | 8 - .../me/shedaniel/rei/gui/widget/SlotWidget.java | 318 --------------------- .../me/shedaniel/rei/gui/widget/TabWidget.java | 2 +- .../java/me/shedaniel/rei/gui/widget/Widget.java | 4 +- .../me/shedaniel/rei/impl/AbstractEntryStack.java | 4 +- .../shedaniel/rei/impl/BaseBoundsHandlerImpl.java | 1 + .../me/shedaniel/rei/impl/EmptyEntryStack.java | 6 - .../java/me/shedaniel/rei/impl/FluidEntry.java | 53 ---- .../me/shedaniel/rei/impl/FluidEntryStack.java | 6 - .../java/me/shedaniel/rei/impl/ItemEntryStack.java | 19 +- .../java/me/shedaniel/rei/impl/ItemStackEntry.java | 53 ---- .../me/shedaniel/rei/impl/RecipeHelperImpl.java | 20 +- .../rei/mixin/MixinBrewingRecipeRegistry.java | 2 +- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 16 +- .../autocrafting/DefaultRecipeBookHandler.java | 33 +-- .../rei/plugin/brewing/DefaultBrewingCategory.java | 2 +- .../rei/plugin/brewing/DefaultBrewingDisplay.java | 2 +- .../plugin/campfire/DefaultCampfireCategory.java | 2 +- .../plugin/campfire/DefaultCampfireDisplay.java | 2 +- .../composting/DefaultCompostingCategory.java | 20 +- .../rei/plugin/cooking/DefaultCookingCategory.java | 17 +- .../rei/plugin/cooking/DefaultCookingDisplay.java | 13 +- .../plugin/crafting/DefaultCraftingCategory.java | 10 +- .../rei/plugin/crafting/DefaultShapedDisplay.java | 2 +- .../plugin/crafting/DefaultShapelessDisplay.java | 2 +- .../stonecutting/DefaultStoneCuttingCategory.java | 4 +- .../stonecutting/DefaultStoneCuttingDisplay.java | 2 +- .../plugin/stripping/DefaultStrippingCategory.java | 2 +- .../me/shedaniel/rei/utils/CollectionUtils.java | 21 ++ 57 files changed, 520 insertions(+), 1606 deletions(-) delete mode 100644 src/main/java/me/shedaniel/rei/api/Entry.java delete mode 100644 src/main/java/me/shedaniel/rei/api/Renderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeEntry.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/widget/DetailedButtonWidget.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java delete mode 100644 src/main/java/me/shedaniel/rei/impl/FluidEntry.java delete mode 100644 src/main/java/me/shedaniel/rei/impl/ItemStackEntry.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/rei/api/Entry.java b/src/main/java/me/shedaniel/rei/api/Entry.java deleted file mode 100644 index c0eb609bb..000000000 --- a/src/main/java/me/shedaniel/rei/api/Entry.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.api; - -import me.shedaniel.rei.api.annotations.ToBeRemoved; -import me.shedaniel.rei.impl.FluidEntry; -import me.shedaniel.rei.impl.ItemStackEntry; -import net.minecraft.fluid.Fluid; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nullable; - -@Deprecated -@ToBeRemoved -public interface Entry extends Cloneable { - @SuppressWarnings("deprecation") - static Entry create(ItemStack itemStack) { - return new ItemStackEntry(itemStack); - } - - @SuppressWarnings("deprecation") - static Entry create(Fluid fluid) { - return new FluidEntry(fluid); - } - - Type getEntryType(); - - @Nullable - ItemStack getItemStack(); - - @Nullable - Fluid getFluid(); - - Entry clone(); - - default EntryStack toEntryStack() { - if (getEntryType() == Type.ITEM) - return EntryStack.create(getItemStack()); - if (getEntryType() == Type.FLUID) - return EntryStack.create(getFluid()); - return EntryStack.empty(); - } - - boolean equalsEntry(Entry other, boolean checkTags); - - public static enum Type { - ITEM, FLUID - } -} diff --git a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java index 9a811a127..338986578 100644 --- a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java +++ b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java @@ -5,27 +5,14 @@ package me.shedaniel.rei.api; -import me.shedaniel.rei.api.annotations.ToBeRemoved; import me.shedaniel.rei.utils.CollectionUtils; -import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import java.util.Collections; import java.util.List; public interface EntryRegistry { - /** - * Gets the current unmodifiable item list - * - * @return an unmodifiable item list - */ - @Deprecated - default List getEntryList() { - return Collections.unmodifiableList(getModifiableEntryList()); - } - /** * Gets the current modifiable stacks list * @@ -33,16 +20,6 @@ public interface EntryRegistry { */ List getStacksList(); - /** - * Gets the current modifiable item list - * - * @return an modifiable item list - */ - @Deprecated - default List getModifiableEntryList() { - return CollectionUtils.map(getStacksList(), EntryStack::toEntry); - } - /** * Gets all possible stacks from an item * @@ -51,39 +28,18 @@ public interface EntryRegistry { */ ItemStack[] getAllStacksFromItem(Item item); - /** - * Registers an new stack to the item list - * - * @param afterItem the stack to put after - * @param stack the stack to register - */ - @Deprecated - default void registerItemStack(Item afterItem, ItemStack stack) { - registerEntryAfter(EntryStack.create(afterItem), EntryStack.create(stack)); - } - - @Deprecated - default void registerFluid(Fluid fluid) { - registerEntry(EntryStack.create(fluid)); - } - default void registerEntry(EntryStack stack) { registerEntryAfter(null, stack); } + /** + * Registers an new stack to the entry list + * + * @param afterEntry the stack to put after + * @param stack the stack to register + */ void registerEntryAfter(EntryStack afterEntry, EntryStack stack); - @ToBeRemoved - @Deprecated - default void registerItemStack(Item afterItem, ItemStack... stacks) { - EntryStack afterStack = EntryStack.create(afterItem); - for (int i = stacks.length - 1; i >= 0; i--) { - ItemStack stack = stacks[i]; - if (stack != null && !stack.isEmpty()) - registerEntryAfter(afterStack, EntryStack.create(stack)); - } - } - /** * Registers multiple stacks to the item list * @@ -98,12 +54,6 @@ public interface EntryRegistry { } } - @ToBeRemoved - @Deprecated - default void registerItemStack(ItemStack... stacks) { - registerItemStack(null, stacks); - } - /** * Registers multiple stacks to the item list * @@ -113,12 +63,6 @@ public interface EntryRegistry { registerEntriesAfter(null, stacks); } - @ToBeRemoved - @Deprecated - default boolean alreadyContain(ItemStack stack) { - return alreadyContain(EntryStack.create(stack)); - } - /** * Checks if a stack is already registered * diff --git a/src/main/java/me/shedaniel/rei/api/EntryStack.java b/src/main/java/me/shedaniel/rei/api/EntryStack.java index 3baa4e5e0..01fc901b4 100644 --- a/src/main/java/me/shedaniel/rei/api/EntryStack.java +++ b/src/main/java/me/shedaniel/rei/api/EntryStack.java @@ -6,7 +6,6 @@ package me.shedaniel.rei.api; import me.shedaniel.math.api.Rectangle; -import me.shedaniel.rei.api.annotations.ToBeRemoved; import me.shedaniel.rei.gui.widget.QueuedTooltip; import me.shedaniel.rei.impl.EmptyEntryStack; import me.shedaniel.rei.impl.FluidEntryStack; @@ -61,10 +60,6 @@ public interface EntryStack { boolean isEmpty(); - @ToBeRemoved - @Deprecated - Entry toEntry(); - EntryStack copy(); Object getObject(); @@ -119,7 +114,7 @@ public interface EntryStack { void render(Rectangle bounds, int mouseX, int mouseY, float delta); public static enum Type { - ITEM, FLUID, EMPTY + ITEM, FLUID, EMPTY, RENDER } public static class Settings { diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index 4cecb6fce..82ed70eca 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -6,9 +6,9 @@ package me.shedaniel.rei.api; import me.shedaniel.math.api.Rectangle; -import me.shedaniel.rei.api.annotations.ToBeRemoved; import me.shedaniel.rei.gui.RecipeViewingScreen; -import me.shedaniel.rei.gui.renderers.RecipeRenderer; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.renderers.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.CategoryBaseWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.Widget; @@ -33,17 +33,10 @@ public interface RecipeCategory { /** * Gets the renderer of the icon, allowing developers to render things other than items * - * @see RecipeCategory#getLogo() * @return the renderer of the icon */ - @ToBeRemoved - @Deprecated - default Renderer getIcon() { - return Renderer.empty(); - } - default EntryStack getLogo() { - return getIcon().getEntry(); + return EntryStack.empty(); } /** @@ -60,8 +53,8 @@ public interface RecipeCategory { * @return the recipe renderer */ @SuppressWarnings("unchecked") - default RecipeRenderer getSimpleRenderer(T recipe) { - return Renderer.fromRecipeEntries(recipe::getInputEntries, recipe::getOutputEntries); + default RecipeEntry getSimpleRenderer(T recipe) { + return SimpleRecipeEntry.create(recipe::getInputEntries, recipe::getOutputEntries); } /** diff --git a/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java b/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java index dd563f01a..328d28973 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java @@ -5,67 +5,23 @@ package me.shedaniel.rei.api; -import me.shedaniel.rei.api.annotations.ToBeRemoved; -import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; public interface RecipeDisplay { - /** - * @return a list of items - * @see RecipeDisplay#getInputStacks() - */ - @ToBeRemoved - @Deprecated - default List> getInput() { - return Collections.emptyList(); - } - /** * @return a list of inputs */ - default List> getInputEntries() { - List> input = getInput(); - if (input.isEmpty()) - return Collections.emptyList(); - List> list = new ArrayList<>(); - for (List stacks : input) { - List entries = new ArrayList<>(); - for (ItemStack stack : stacks) { - entries.add(EntryStack.create(stack)); - } - list.add(entries); - } - return list; - } + List> getInputEntries(); /** * @return a list of outputs */ - @ToBeRemoved - @Deprecated - default List getOutput() { - return Collections.emptyList(); - } - - /** - * @return a list of outputs - */ - default List getOutputEntries() { - List input = getOutput(); - if (input.isEmpty()) - return Collections.emptyList(); - List entries = new ArrayList<>(); - for (ItemStack stack : input) { - entries.add(EntryStack.create(stack)); - } - return entries; - } + List getOutputEntries(); /** * Gets the required items used in craftable filters @@ -73,23 +29,6 @@ public interface RecipeDisplay { * @return the list of required items */ default List> getRequiredEntries() { - List> input = getRequiredItems(); - if (input.isEmpty()) - return Collections.emptyList(); - List> list = new ArrayList<>(); - for (List stacks : input) { - List entries = new ArrayList<>(); - for (ItemStack stack : stacks) { - entries.add(EntryStack.create(stack)); - } - list.add(entries); - } - return list; - } - - @ToBeRemoved - @Deprecated - default List> getRequiredItems() { return Collections.emptyList(); } diff --git a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java index 9c66a6eb4..30915a794 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java @@ -7,14 +7,11 @@ package me.shedaniel.rei.api; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.annotations.ToBeRemoved; 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.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -46,28 +43,13 @@ public interface RecipeHelper { */ List getAllSortedRecipes(); - /** - * Gets all craftable items from materials. - * - * @param inventoryItems the materials - * @return the list of craftable items - */ - default List findCraftableByItems(List inventoryItems) { - List itemStacks = new ArrayList<>(); - for (EntryStack item : findCraftableEntriesByItems(inventoryItems)) { - if (item.getItemStack() != null) - itemStacks.add(item.getItemStack()); - } - return itemStacks; - } - /** * Gets all craftable items from materials. * * @param inventoryItems the materials * @return the list of craftable entries */ - List findCraftableEntriesByItems(List inventoryItems); + List findCraftableEntriesByItems(List inventoryItems); /** * Registers a category @@ -82,7 +64,7 @@ public interface RecipeHelper { * @param category the category * @param workingStations the working stations */ - void registerWorkingStations(Identifier category, List... workingStations); + void registerWorkingStations(Identifier category, List... workingStations); /** * Registers the working stations of a category @@ -90,9 +72,9 @@ public interface RecipeHelper { * @param category the category * @param workingStations the working stations */ - void registerWorkingStations(Identifier category, ItemStack... workingStations); + void registerWorkingStations(Identifier category, EntryStack... workingStations); - List> getWorkingStations(Identifier category); + List> getWorkingStations(Identifier category); /** * Registers a recipe display @@ -103,19 +85,13 @@ public interface RecipeHelper { void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display); /** - * Gets a map of recipes for an itemstack + * Gets a map of recipes for an entry * * @param stack the stack to be crafted * @return the map of recipes */ Map, List> getRecipesFor(EntryStack stack); - @ToBeRemoved - @Deprecated - default Map, List> getRecipesFor(ItemStack stack) { - return getRecipesFor(EntryStack.create(stack)); - } - RecipeCategory getCategory(Identifier identifier); /** @@ -133,19 +109,13 @@ public interface RecipeHelper { List getAllCategories(); /** - * Gets a map of usages for an itemstack + * Gets a map of usages for an entry * * @param stack the stack to be used * @return the map of recipes */ Map, List> getUsagesFor(EntryStack stack); - @ToBeRemoved - @Deprecated - default Map, List> getUsagesFor(ItemStack stack) { - return getUsagesFor(EntryStack.create(stack)); - } - /** * Gets the optional of the speed crafting button area from a category * diff --git a/src/main/java/me/shedaniel/rei/api/Renderer.java b/src/main/java/me/shedaniel/rei/api/Renderer.java deleted file mode 100644 index 823a9ceb5..000000000 --- a/src/main/java/me/shedaniel/rei/api/Renderer.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.api; - -import me.shedaniel.rei.api.annotations.ToBeRemoved; -import me.shedaniel.rei.gui.renderers.EmptyRenderer; -import me.shedaniel.rei.gui.renderers.FluidRenderer; -import me.shedaniel.rei.gui.renderers.ItemStackRenderer; -import me.shedaniel.rei.gui.renderers.SimpleRecipeRenderer; -import me.shedaniel.rei.gui.widget.QueuedTooltip; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.fluid.Fluid; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -@Deprecated -public abstract class Renderer extends DrawableHelper { - /** - * Gets an item stack renderer by an item stack supplier - * - * @param supplier the supplier for getting the item stack - * @return the item stack renderer - */ - public static ItemStackRenderer fromItemStackSupplier(Supplier supplier) { - return fromItemStacks(() -> Collections.singletonList(supplier.get()), true, null); - } - - /** - * Gets an item stack renderer by an item stack supplier - * - * @param supplier the supplier for getting the item stack - * @return the item stack renderer - */ - public static ItemStackRenderer fromItemStackSupplierNoCounts(Supplier supplier) { - return fromItemStacks(() -> Collections.singletonList(supplier.get()), false, null); - } - - /** - * Gets an item stack renderer by an item stack - * - * @param stack the item stack to be displayed - * @return the item stack renderer - */ - public static ItemStackRenderer fromItemStack(ItemStack stack) { - return fromItemStacks(() -> Collections.singletonList(stack), true, null); - } - - public static FluidRenderer fromFluid(Fluid fluid) { - return fromFluid(() -> fluid, null); - } - - public static FluidRenderer fromFluid(Supplier fluidSupplier, @Nullable Function> extraTooltipSupplier) { - return new FluidRenderer() { - @Override - public Fluid getFluid() { - return fluidSupplier.get(); - } - - @Override - protected List getExtraToolTips(Fluid fluid) { - if (extraTooltipSupplier == null) - return super.getExtraToolTips(fluid); - List apply = extraTooltipSupplier.apply(fluid); - if (apply == null) - return super.getExtraToolTips(fluid); - return apply; - } - }; - } - - /** - * Gets an item stack renderer by an item stack - * - * @param stack the item stack to be displayed - * @return the item stack renderer - */ - public static ItemStackRenderer fromItemStackNoCounts(ItemStack stack) { - return fromItemStacks(() -> Collections.singletonList(stack), false, null); - } - - /** - * Gets an empty renderer - * - * @return an empty renderer - */ - public static EmptyRenderer empty() { - return EmptyRenderer.INSTANCE; - } - - /** - * Gets a simple recipe renderer from inputs and outputs - * - * @param input the list of input items - * @param output the list of output items - * @return the recipe renderer - */ - @ToBeRemoved - @Deprecated - public static SimpleRecipeRenderer fromRecipe(Supplier>> input, Supplier> output) { - return new SimpleRecipeRenderer(input, output); - } - - public static SimpleRecipeRenderer fromRecipeEntries(Supplier>> input, Supplier> output) { - return new SimpleRecipeRenderer(input, output, 0); - } - - public static ItemStackRenderer fromItemStacks(List stacks) { - return fromItemStacks(() -> stacks, true, null); - } - - public static ItemStackRenderer fromItemStacks(Supplier> stacksSupplier, boolean renderCounts, @Nullable Function> extraTooltipSupplier) { - return fromItemStacks(stacksSupplier, stack -> renderCounts ? null : "", extraTooltipSupplier); - } - - public static ItemStackRenderer fromItemStacks(Supplier> stacksSupplier, @Nullable Function countsFunction, @Nullable Function> extraTooltipSupplier) { - return fromItemStacks(stacksSupplier, countsFunction, extraTooltipSupplier, true); - } - - public static ItemStackRenderer fromItemStacks(Supplier> stacksSupplier, @Nullable Function countsFunction, @Nullable Function> extraTooltipSupplier, boolean renderOverlay) { - List stacks = stacksSupplier.get().stream().map(ItemStack::copy).collect(Collectors.toList()); - 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)); - } - - @Override - protected String getCounts() { - return countsFunction == null ? null : countsFunction.apply(getItemStack()); - } - - @Override - protected boolean renderOverlay() { - return renderOverlay; - } - - @Override - protected List getExtraToolTips(ItemStack stack) { - if (extraTooltipSupplier == null) - return super.getExtraToolTips(stack); - List apply = extraTooltipSupplier.apply(stack); - if (apply == null) - return super.getExtraToolTips(stack); - return apply; - } - }; - } - - public static ItemStackRenderer fromItemStacksNoCounts(List stacks) { - return fromItemStacks(() -> stacks, false, null); - } - - /** - * Gets the current blit offset - * - * @return the blit offset - */ - @Override - public int getBlitOffset() { - return super.getBlitOffset(); - } - - /** - * Sets the current blit offset - * - * @param offset the new blit offset - */ - @Override - public void setBlitOffset(int offset) { - super.setBlitOffset(offset); - } - - /** - * Renders of the renderable - * - * @param x the x coordinate of the renderable - * @param y the y coordinate of the renderable - * @param mouseX the x coordinate of the mouse - * @param mouseY the y coordinate of the mouse - * @param delta the delta - */ - public abstract void render(int x, int y, double mouseX, double mouseY, float delta); - - public EntryStack getEntry() { - if (this instanceof ItemStackRenderer) - return EntryStack.create(((ItemStackRenderer) this).getItemStack()); - if (this instanceof FluidRenderer) - return EntryStack.create(((FluidRenderer) this).getFluid()); - return EntryStack.empty(); - } - - @Nullable - public QueuedTooltip getQueuedTooltip(float delta) { - return null; - } - -} diff --git a/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java b/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java index f7d509f17..94f337bc5 100644 --- a/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java +++ b/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java @@ -20,27 +20,6 @@ public interface TransferRecipeDisplay extends RecipeDisplay { int getHeight(); - default List> getOrganisedInput(ContainerInfo containerInfo, Container container) { - List> list = Lists.newArrayListWithCapacity(containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container)); - for (int i = 0; i < containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container); i++) { - list.add(Lists.newArrayList()); - } - return list; - } - - default List> getOrganisedInputEntries(ContainerInfo containerInfo, Container container) { - List> input = getOrganisedInput(containerInfo, container); - if (input.isEmpty()) - return Collections.emptyList(); - List> list = new ArrayList<>(); - for (List stacks : input) { - List entries = new ArrayList<>(); - for (ItemStack stack : stacks) { - entries.add(EntryStack.create(stack)); - } - list.add(entries); - } - return list; - } + List> getOrganisedInputEntries(ContainerInfo containerInfo, Container container); } diff --git a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java index eeb782220..869b401b2 100644 --- a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java +++ b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java @@ -5,7 +5,7 @@ package me.shedaniel.rei.gui; -import me.shedaniel.math.compat.RenderHelper; +import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.rei.gui.widget.TextFieldWidget; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.MinecraftClient; @@ -29,11 +29,11 @@ public class OverlaySearchField extends TextFieldWidget { public void laterRender(int int_1, int int_2, float float_1) { GuiLighting.disable(); - RenderHelper.disableDepthTest(); + RenderSystem.disableDepthTest(); setEditableColor(ContainerScreenOverlay.getEntryListWidget().children().isEmpty() && !getText().isEmpty() ? 16733525 : isSearching ? -1313241 : 14737632); setSuggestion(!isFocused() && getText().isEmpty() ? I18n.translate("text.rei.search.field.suggestion") : null); super.render(int_1, int_2, float_1); - RenderHelper.enableDepthTest(); + RenderSystem.enableDepthTest(); } @Override @@ -76,7 +76,7 @@ public class OverlaySearchField extends TextFieldWidget { @Override public boolean charTyped(char char_1, int int_1) { - if (System.currentTimeMillis() - keybindFocusTime < 1000 && InputUtil.isKeyPressed(MinecraftClient.getInstance().window.getHandle(), keybindFocusKey)) { + if (System.currentTimeMillis() - keybindFocusTime < 1000 && InputUtil.isKeyPressed(MinecraftClient.getInstance().getWindow().getHandle(), keybindFocusKey)) { keybindFocusTime = -1; keybindFocusKey = -1; return true; diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index 3a8f1a6cc..3c840d676 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -21,7 +21,6 @@ import net.minecraft.client.render.GuiLighting; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.util.Window; -import net.minecraft.item.ItemStack; import net.minecraft.sound.SoundEvents; import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; @@ -125,7 +124,7 @@ public class RecipeViewingScreen extends Screen { this.largestWidth = width - 100; this.largestHeight = height - 40; int maxWidthDisplay = CollectionUtils.mapAndMax(getCurrentDisplayed(), display -> selectedCategory.getDisplayWidth((RecipeDisplay) display), (Comparator) Comparator.naturalOrder()).orElse(150); - this.guiWidth = MathHelper.clamp(maxWidthDisplay, 0, largestWidth); + this.guiWidth = MathHelper.clamp(maxWidthDisplay + 30, 0, largestWidth); this.guiHeight = MathHelper.floor(MathHelper.clamp((selectedCategory.getDisplayHeight() + 7d) * (getRecipesPerPage() + 1d) + 40d, 186d, (double) largestHeight)); this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); this.page = MathHelper.clamp(page, 0, getTotalPages(selectedCategory) - 1); @@ -295,7 +294,7 @@ public class RecipeViewingScreen extends Screen { else recipeChoosePageWidget = null; - List> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(selectedCategory.getIdentifier()); + List> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(selectedCategory.getIdentifier()); if (!workingStations.isEmpty()) { int hh = MathHelper.floor((bounds.height - 16) / 18f); int actualHeight = Math.min(hh, workingStations.size()); @@ -306,8 +305,8 @@ public class RecipeViewingScreen extends Screen { int index = 0; List list = Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("text.rei.working_station")); xx += (innerWidth - 1) * 18; - for (List workingStation : workingStations) { - preWidgets.add(new SlotWidget(xx, yy, Renderer.fromItemStacks(() -> workingStation, true, stack -> list), true, true, true)); + for (List workingStation : workingStations) { + preWidgets.add(EntryWidget.create(xx, yy).entries(CollectionUtils.map(workingStation, stack -> stack.copy().setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, s -> list)))); index++; yy += 18; if (index >= hh) { diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index e212e22bd..98968340b 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -7,14 +7,16 @@ package me.shedaniel.rei.gui; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import me.shedaniel.clothconfig2.api.ScissorsHandler; import com.mojang.blaze3d.systems.RenderSystem; -import me.shedaniel.math.api.Point; +import me.shedaniel.clothconfig2.ClothConfigInitializer; +import me.shedaniel.clothconfig2.api.ScissorsHandler; +import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.Interpolation; +import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.Precision; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; -import me.shedaniel.rei.gui.renderers.RecipeRenderer; +import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.widget.*; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; @@ -27,7 +29,6 @@ import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexFormats; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.item.ItemStack; import net.minecraft.sound.SoundEvents; import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; @@ -46,11 +47,14 @@ public class VillagerRecipeViewingScreen extends Screen { private final List> categories; private final List widgets; private final List buttonWidgets; - private final List recipeRenderers; + private final List recipeRenderers; private final List tabs; public Rectangle bounds, scrollListBounds; private int selectedCategoryIndex, selectedRecipeIndex; private double scroll; + private double target; + private long start; + private long duration; private float scrollBarAlpha = 0; private float scrollBarAlphaFuture = 0; private long scrollBarAlphaFutureTime = -1; @@ -97,7 +101,7 @@ 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); - List> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(category.getIdentifier()); + List> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(category.getIdentifier()); if (!workingStations.isEmpty()) { int ww = MathHelper.floor((bounds.width - 16) / 18f); int w = Math.min(ww, workingStations.size()); @@ -107,8 +111,8 @@ public class VillagerRecipeViewingScreen extends Screen { widgets.add(new CategoryBaseWidget(new Rectangle(xx - 6, bounds.y + bounds.height - 5, 11 + w * 18, 15 + h * 18))); int index = 0; List list = Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("text.rei.working_station")); - for (List workingStation : workingStations) { - widgets.add(new SlotWidget(xx, yy, Renderer.fromItemStacks(() -> workingStation, true, stack -> list), true, true, true)); + for (List workingStation : workingStations) { + widgets.add(EntryWidget.create(xx, yy).entries(CollectionUtils.map(workingStation, stack -> stack.copy().setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, s -> list)))); index++; xx += 18; if (index >= ww) { @@ -133,9 +137,9 @@ public class VillagerRecipeViewingScreen extends Screen { 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(), "") { + RecipeEntry recipeEntry; + recipeRenderers.add(recipeEntry = category.getSimpleRenderer(recipeDisplay)); + buttonWidgets.add(new ButtonWidget(bounds.x + 5, 0, recipeEntry.getWidth(), recipeEntry.getHeight(), "") { @Override public void onPressed() { selectedRecipeIndex = finalIndex; @@ -220,22 +224,6 @@ public class VillagerRecipeViewingScreen extends Screen { public Optional getTooltips() { return Optional.ofNullable(I18n.translate("text.rei.view_all_categories")); } - - @Override - public void render(int mouseX, int mouseY, float delta) { - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - font.draw((isHovered(mouseX, mouseY) ? Formatting.UNDERLINE.toString() : "") + text, x - font.getStringWidth(text) / 2, y, getDefaultColor()); - if (clickable && getTooltips().isPresent()) - if (!focused && containsMouse(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 getDefaultColor() { - return ScreenHelper.isDarkModeEnabled() ? 0xFFBBBBBB : 4210752; - } }); this.children.addAll(buttonWidgets); @@ -245,9 +233,21 @@ public class VillagerRecipeViewingScreen extends Screen { ScreenHelper.getLastOverlay().init(); } + private final double clamp(double v) { + return clamp(v, 200); + } + + private final double clamp(double v, double clampExtension) { + return MathHelper.clamp(v, -clampExtension, getMaxScroll() + clampExtension); + } + + private double getMaxScroll() { + return Math.max(0, this.getMaxScrollPosition() - (scrollListBounds.height - 2)); + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int int_1) { - double height = CollectionUtils.sumInt(buttonWidgets, b -> b.getBounds().getHeight()); + double height = getMaxScrollPosition(); int actualHeight = scrollListBounds.height - 2; if (height > actualHeight && scrollBarAlpha > 0 && mouseY >= scrollListBounds.y + 1 && mouseY <= scrollListBounds.getMaxY() - 1) { double scrollbarPositionMinX = scrollListBounds.getMaxX() - 6; @@ -269,15 +269,29 @@ public class VillagerRecipeViewingScreen extends Screen { return super.charTyped(char_1, int_1); } + public void offset(double value, boolean animated) { + scrollTo(target + value, animated); + } + + public void scrollTo(double value, boolean animated) { + scrollTo(value, animated, ClothConfigInitializer.getScrollDuration()); + } + + public void scrollTo(double value, boolean animated, long duration) { + target = clamp(value); + + if (animated) { + start = System.currentTimeMillis(); + this.duration = duration; + } else + scroll = target; + } + @Override public boolean mouseScrolled(double double_1, double double_2, double double_3) { double height = CollectionUtils.sumInt(buttonWidgets, b -> b.getBounds().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); + offset(ClothConfigInitializer.getScrollStep() * -double_3, true); if (scrollBarAlphaFuture == 0) scrollBarAlphaFuture = 1f; if (System.currentTimeMillis() - scrollBarAlphaFutureTime > 300f) @@ -304,6 +318,10 @@ public class VillagerRecipeViewingScreen extends Screen { return super.mouseScrolled(double_1, double_2, double_3); } + private double getMaxScrollPosition() { + return CollectionUtils.sumInt(buttonWidgets, b -> b.getBounds().getHeight()); + } + @Override public void render(int mouseX, int mouseY, float delta) { if (RoughlyEnoughItemsCore.getConfigManager().getConfig().doesVillagerScreenHavePermanentScrollBar()) { @@ -328,6 +346,7 @@ public class VillagerRecipeViewingScreen extends Screen { scrollBarAlpha = Math.max(Math.min(1f, l / 300f), scrollBarAlpha); } } + updatePosition(delta); this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680); int yOffset = 0; this.widgets.forEach(widget -> { @@ -350,21 +369,20 @@ public class VillagerRecipeViewingScreen extends Screen { 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); - ScreenHelper.getLastOverlay().addTooltip(recipeRenderers.get(i).getQueuedTooltip(delta)); + recipeRenderers.get(i).setZ(1); + recipeRenderers.get(i).render(buttonWidgets.get(i).getBounds(), mouseX, mouseY, delta); + ScreenHelper.getLastOverlay().addTooltip(recipeRenderers.get(i).getTooltip(mouseX, mouseY)); } } - double height = CollectionUtils.sumInt(buttonWidgets, b -> b.getBounds().getHeight()); - if (height > scrollListBounds.height - 2) { + double maxScroll = getMaxScrollPosition(); + if (maxScroll > scrollListBounds.height - 2) { Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBufferBuilder(); - double maxScroll = height - scrollListBounds.height + 2; - int scrollBarHeight = MathHelper.floor((scrollListBounds.height - 2) * (scrollListBounds.height - 2) / maxScroll); - scrollBarHeight = MathHelper.clamp(scrollBarHeight, 32, scrollListBounds.height - 2 - 8); - int minY = (int) (scroll * (scrollListBounds.height - 2 - scrollBarHeight) / maxScroll) + scrollListBounds.y + 1; - if (minY < this.scrollListBounds.y + 1) - minY = this.scrollListBounds.y + 1; + int height = (int) (((scrollListBounds.height - 2) * (scrollListBounds.height - 2)) / this.getMaxScrollPosition()); + height = MathHelper.clamp(height, 32, scrollListBounds.height - 2 - 8); + height -= Math.min((scroll < 0 ? (int) -scroll : scroll > getMaxScroll() ? (int) scroll - getMaxScroll() : 0), height * .95); + height = Math.max(10, height); + int minY = (int) Math.min(Math.max((int) scroll * (scrollListBounds.height - 2 - height) / getMaxScroll() + scrollListBounds.y + 1, scrollListBounds.y + 1), scrollListBounds.getMaxY() - 1 - height); double scrollbarPositionMinX = scrollListBounds.getMaxX() - 6, scrollbarPositionMaxX = scrollListBounds.getMaxX() - 2; GuiLighting.disable(); RenderSystem.disableTexture(); @@ -374,8 +392,8 @@ public class VillagerRecipeViewingScreen extends Screen { RenderSystem.shadeModel(7425); buffer.begin(7, VertexFormats.POSITION_COLOR); float b = ScreenHelper.isDarkModeEnabled() ? 0.37f : 1f; - buffer.vertex(scrollbarPositionMinX, minY + scrollBarHeight, 1000D).color(b, b, b, scrollBarAlpha).next(); - buffer.vertex(scrollbarPositionMaxX, minY + scrollBarHeight, 1000D).color(b, b, b, scrollBarAlpha).next(); + buffer.vertex(scrollbarPositionMinX, minY + height, 1000D).color(b, b, b, scrollBarAlpha).next(); + buffer.vertex(scrollbarPositionMaxX, minY + height, 1000D).color(b, b, b, scrollBarAlpha).next(); buffer.vertex(scrollbarPositionMaxX, minY, 1000D).color(b, b, b, scrollBarAlpha).next(); buffer.vertex(scrollbarPositionMinX, minY, 1000D).color(b, b, b, scrollBarAlpha).next(); tessellator.draw(); @@ -389,6 +407,19 @@ public class VillagerRecipeViewingScreen extends Screen { ScreenHelper.getLastOverlay().lateRender(mouseX, mouseY, delta); } + private void updatePosition(float delta) { + target = clamp(target); + if (target < 0) { + target -= target * (1 - ClothConfigInitializer.getBounceBackMultiplier()) * delta / 3; + } else if (target > getMaxScroll()) { + target = (target - getMaxScroll()) * (1 - (1 - ClothConfigInitializer.getBounceBackMultiplier()) * delta / 3) + getMaxScroll(); + } + if (!Precision.almostEquals(scroll, target, Precision.FLOAT_EPSILON)) + scroll = (float) Interpolation.expoEase(scroll, target, Math.min((System.currentTimeMillis() - start) / ((double) duration), 1)); + else + scroll = target; + } + @Override public boolean mouseDragged(double mouseX, double mouseY, int int_1, double double_3, double double_4) { if (int_1 == 0 && scrollBarAlpha > 0 && draggingScrollBar) { @@ -399,7 +430,7 @@ public class VillagerRecipeViewingScreen extends Screen { double double_6 = Math.max(1.0D, Math.max(1d, height) / (double) (actualHeight - int_3)); scrollBarAlphaFutureTime = System.currentTimeMillis(); scrollBarAlphaFuture = 1f; - scroll = MathHelper.clamp(scroll + double_4 * double_6, 0, height - scrollListBounds.height + 2); + scroll = target = MathHelper.clamp(scroll + double_4 * double_6, 0, height - scrollListBounds.height + 2); return true; } } diff --git a/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java b/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java new file mode 100644 index 000000000..58ff880f7 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java @@ -0,0 +1,117 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.entries; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.ObjectHolder; +import me.shedaniel.rei.impl.ObjectHolderImpl; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.util.Identifier; + +import java.util.Optional; + +public abstract class RecipeEntry extends DrawableHelper implements EntryStack { + @Override + public Optional getIdentifier() { + return Optional.empty(); + } + + @Override + public Type getType() { + return Type.RENDER; + } + + @Override + public int getAmount() { + return 0; + } + + @Override + public void setAmount(int amount) { + + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public EntryStack copy() { + return this; + } + + @Override + public Object getObject() { + return null; + } + + @Override + public boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount) { + return stack == this; + } + + @Override + public boolean equalsIgnoreTagsAndAmount(EntryStack stack) { + return stack == this; + } + + @Override + public boolean equalsIgnoreTags(EntryStack stack) { + return stack == this; + } + + @Override + public boolean equalsIgnoreAmount(EntryStack stack) { + return stack == this; + } + + @Override + public boolean equalsAll(EntryStack stack) { + return stack == this; + } + + @Override + public int getZ() { + return getBlitOffset(); + } + + @Override + public void setZ(int z) { + setBlitOffset(z); + } + + @Override + public EntryStack setting(Settings settings, T value) { + return this; + } + + @Override + public EntryStack removeSetting(Settings settings) { + return this; + } + + @Override + public EntryStack clearSettings() { + return this; + } + + @Override + public EntryStack addSetting(Settings settings, T value) { + return this; + } + + @Override + public ObjectHolder getSetting(Settings settings) { + return new ObjectHolderImpl<>(settings.getDefaultValue()); + } + + public abstract int getHeight(); + + public final int getWidth() { + return 100; + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java deleted file mode 100644 index 18e41ad07..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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(); - - private 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/FluidRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java deleted file mode 100644 index 972545ec1..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.ClientHelper; -import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.gui.widget.EntryListWidget; -import me.shedaniel.rei.gui.widget.QueuedTooltip; -import me.shedaniel.rei.impl.ScreenHelper; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.GuiLighting; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.fluid.Fluid; -import net.minecraft.util.Lazy; -import net.minecraft.util.Pair; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; - -public abstract class FluidRenderer extends Renderer { - /** - * @deprecated This boolean is no longer used - */ - @Deprecated - public boolean drawTooltip = false; - public Lazy> sprite = new Lazy<>(() -> { - try { - FluidRenderHandler fluidRenderHandler = FluidRenderHandlerRegistry.INSTANCE.get(getFluid()); - if (fluidRenderHandler == null) - return null; - Sprite[] sprites = fluidRenderHandler.getFluidSprites(MinecraftClient.getInstance().world, MinecraftClient.getInstance().world == null ? null : BlockPos.ORIGIN, getFluid().getDefaultState()); - int color = -1; - if (MinecraftClient.getInstance().world != null) - color = fluidRenderHandler.getFluidColor(MinecraftClient.getInstance().world, BlockPos.ORIGIN, getFluid().getDefaultState()); - return new Pair<>(sprites[0], color); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - }); - - @Override - public void render(int x, int y, double mouseX, double mouseY, float delta) { - x = x - 8; - y = y - 6; - Pair pair = this.sprite.get(); - if (pair != null) { - Sprite sprite = pair.getLeft(); - Integer int_5 = pair.getRight(); - int a = 255; - int r = (int_5 >> 16 & 255); - int g = (int_5 >> 8 & 255); - int b = (int_5 & 255); - MinecraftClient.getInstance().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX); - GuiLighting.disable(); - Tessellator tess = Tessellator.getInstance(); - BufferBuilder bb = tess.getBufferBuilder(); - bb.begin(7, VertexFormats.POSITION_UV_COLOR); - bb.vertex(x + 16, y, getBlitOffset()).texture(sprite.getMaxU(), sprite.getMinV()).color(r, g, b, a).next(); - bb.vertex(x, y, getBlitOffset()).texture(sprite.getMinU(), sprite.getMinV()).color(r, g, b, a).next(); - bb.vertex(x, y + 16, getBlitOffset()).texture(sprite.getMinU(), sprite.getMaxV()).color(r, g, b, a).next(); - bb.vertex(x + 16, y + 16, getBlitOffset()).texture(sprite.getMaxU(), sprite.getMaxV()).color(r, g, b, a).next(); - tess.draw(); - } - setBlitOffset(0); - } - - @Nullable - @Override - public QueuedTooltip getQueuedTooltip(float delta) { - return QueuedTooltip.create(getTooltip(getFluid())); - } - - /** - * Queue a tooltip to the REI overlay - * - * @param fluid the fluid to queue - * @param delta the delta - * @deprecated Use {@link Renderer#getQueuedTooltip(float)} instead and queue manually - */ - @Deprecated - protected void queueTooltip(Fluid fluid, float delta) { - ScreenHelper.getLastOverlay().addTooltip(getQueuedTooltip(delta)); - } - - protected List getTooltip(Fluid fluid) { - List toolTip = Lists.newArrayList(EntryListWidget.tryGetFluidName(fluid)); - toolTip.addAll(getExtraToolTips(fluid)); - if (RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) { - final String modString = ClientHelper.getInstance().getFormattedModFromIdentifier(Registry.FLUID.getId(fluid)); - boolean alreadyHasMod = false; - for (String s : toolTip) - if (s.equalsIgnoreCase(modString)) { - alreadyHasMod = true; - break; - } - if (!alreadyHasMod) - toolTip.add(modString); - } - return toolTip; - } - - protected List getExtraToolTips(Fluid fluid) { - return Collections.emptyList(); - } - - public abstract Fluid getFluid(); -} diff --git a/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java deleted file mode 100644 index a83664630..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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.systems.RenderSystem; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.ClientHelper; -import me.shedaniel.rei.api.ItemStackRenderOverlayHook; -import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.gui.widget.EntryListWidget; -import me.shedaniel.rei.gui.widget.QueuedTooltip; -import me.shedaniel.rei.impl.ScreenHelper; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; - -import javax.annotation.Nullable; -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"); - /** - * @deprecated This boolean is no longer used - */ - @Deprecated - 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; - ItemStack stack = getItemStack(); - ((ItemStackRenderOverlayHook) (Object) stack).rei_setRenderOverlay(renderOverlay()); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); - itemRenderer.zOffset = getBlitOffset(); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableLighting(); - RenderSystem.enableRescaleNormal(); - RenderSystem.enableDepthTest(); - itemRenderer.renderGuiItem(stack, l, i1); - itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, stack, l, i1, getCounts()); - itemRenderer.zOffset = 0.0F; - setBlitOffset(0); - } - - /** - * Queue a tooltip to the REI overlay - * - * @param itemStack the stack to queue - * @param delta the delta - * @deprecated Use {@link Renderer#getQueuedTooltip(float)} instead and queue manually - */ - @Deprecated - protected void queueTooltip(ItemStack itemStack, float delta) { - ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack))); - } - - @Nullable - @Override - public QueuedTooltip getQueuedTooltip(float delta) { - return QueuedTooltip.create(getTooltip(getItemStack())); - } - - protected boolean renderCounts() { - return true; - } - - protected boolean renderOverlay() { - return true; - } - - protected String getCounts() { - return renderCounts() ? null : ""; - } - - protected List getTooltip(ItemStack itemStack) { - List toolTip = Lists.newArrayList(EntryListWidget.tryGetItemStackToolTip(itemStack, true)); - toolTip.addAll(getExtraToolTips(itemStack)); - if (RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) { - final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem()); - 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 deleted file mode 100644 index 288c4b1de..000000000 --- a/src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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/SimpleRecipeEntry.java b/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeEntry.java new file mode 100644 index 000000000..c0682b226 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeEntry.java @@ -0,0 +1,157 @@ +/* + * 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.math.api.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.widget.EntryWidget; +import me.shedaniel.rei.gui.widget.QueuedTooltip; +import me.shedaniel.rei.utils.CollectionUtils; +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 javax.annotation.Nullable; +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 SimpleRecipeEntry extends RecipeEntry { + + private static final Comparator ENTRY_COMPARATOR = (o1, o2) -> { + if (o1.getType() == EntryStack.Type.FLUID) { + if (o2.getType() == EntryStack.Type.ITEM) + return -1; + return o1.getFluid().hashCode() - o2.getFluid().hashCode(); + } else if (o2.getType() == EntryStack.Type.FLUID) { + if (o1.getType() == EntryStack.Type.ITEM) + return 1; + return o1.getFluid().hashCode() - o2.getFluid().hashCode(); + } + ItemStack i1 = o1.getItemStack(); + ItemStack i2 = o2.getItemStack(); + if (i1.getItem() == i2.getItem()) { + if (i1.getCount() != i2.getCount()) + return i1.getCount