From eb075596d26ad53c63adbec75bae8da4ff1e9851 Mon Sep 17 00:00:00 2001 From: Danielshe Date: Sun, 3 Nov 2019 00:10:19 +0800 Subject: 3.2 --- .../java/me/shedaniel/rei/api/ClientHelper.java | 24 +-- src/main/java/me/shedaniel/rei/api/Entry.java | 11 ++ .../java/me/shedaniel/rei/api/EntryRegistry.java | 76 ++++++-- src/main/java/me/shedaniel/rei/api/EntryStack.java | 148 ++++++++++++++++ .../me/shedaniel/rei/api/LiveRecipeGenerator.java | 4 +- .../java/me/shedaniel/rei/api/ObjectHolder.java | 17 ++ .../java/me/shedaniel/rei/api/RecipeCategory.java | 16 +- .../java/me/shedaniel/rei/api/RecipeDisplay.java | 36 ++-- .../java/me/shedaniel/rei/api/RecipeHelper.java | 35 +++- src/main/java/me/shedaniel/rei/api/Renderer.java | 17 +- .../shedaniel/rei/api/TransferRecipeDisplay.java | 26 ++- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 7 +- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 2 +- .../rei/gui/VillagerRecipeViewingScreen.java | 2 +- .../rei/gui/renderers/SimpleRecipeRenderer.java | 94 +++++++--- .../shedaniel/rei/gui/widget/EntryListWidget.java | 194 +++++++++------------ .../me/shedaniel/rei/gui/widget/EntryWidget.java | 186 ++++++++++++++++++++ .../me/shedaniel/rei/gui/widget/SlotWidget.java | 23 +-- .../me/shedaniel/rei/gui/widget/TabWidget.java | 20 +-- .../me/shedaniel/rei/impl/AbstractEntryStack.java | 73 ++++++++ .../me/shedaniel/rei/impl/ClientHelperImpl.java | 18 +- .../me/shedaniel/rei/impl/EmptyEntryStack.java | 91 ++++++++++ .../me/shedaniel/rei/impl/EntryRegistryImpl.java | 30 +--- .../java/me/shedaniel/rei/impl/FluidEntry.java | 3 + .../me/shedaniel/rei/impl/FluidEntryStack.java | 181 +++++++++++++++++++ .../java/me/shedaniel/rei/impl/ItemEntryStack.java | 153 ++++++++++++++++ .../java/me/shedaniel/rei/impl/ItemStackEntry.java | 5 +- .../me/shedaniel/rei/impl/ObjectHolderImpl.java | 46 +++++ .../me/shedaniel/rei/impl/RecipeHelperImpl.java | 49 +++--- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 52 +++--- .../autocrafting/DefaultCategoryHandler.java | 22 ++- .../plugin/blasting/DefaultBlastingCategory.java | 92 ---------- .../plugin/blasting/DefaultBlastingDisplay.java | 67 +------ .../rei/plugin/brewing/DefaultBrewingCategory.java | 17 +- .../rei/plugin/brewing/DefaultBrewingDisplay.java | 45 +++-- .../plugin/campfire/DefaultCampfireCategory.java | 15 +- .../plugin/campfire/DefaultCampfireDisplay.java | 31 ++-- .../composting/DefaultCompostingCategory.java | 28 +-- .../composting/DefaultCompostingDisplay.java | 32 ++-- .../rei/plugin/cooking/DefaultCookingCategory.java | 91 ++++++++++ .../rei/plugin/cooking/DefaultCookingDisplay.java | 79 +++++++++ .../plugin/crafting/DefaultCraftingCategory.java | 14 +- .../plugin/crafting/DefaultCraftingDisplay.java | 10 +- .../rei/plugin/crafting/DefaultCustomDisplay.java | 28 ++- .../rei/plugin/crafting/DefaultShapedDisplay.java | 28 ++- .../plugin/crafting/DefaultShapelessDisplay.java | 28 ++- .../plugin/smelting/DefaultSmeltingCategory.java | 91 ---------- .../plugin/smelting/DefaultSmeltingDisplay.java | 67 +------ .../rei/plugin/smoking/DefaultSmokingCategory.java | 91 ---------- .../rei/plugin/smoking/DefaultSmokingDisplay.java | 68 +------- .../stonecutting/DefaultStoneCuttingCategory.java | 6 +- .../stonecutting/DefaultStoneCuttingDisplay.java | 28 +-- .../plugin/stripping/DefaultStrippingCategory.java | 13 +- .../plugin/stripping/DefaultStrippingDisplay.java | 20 +-- 54 files changed, 1738 insertions(+), 912 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/EntryStack.java create mode 100644 src/main/java/me/shedaniel/rei/api/ObjectHolder.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java create mode 100644 src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java create mode 100644 src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java create mode 100644 src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java create mode 100644 src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java create mode 100644 src/main/java/me/shedaniel/rei/impl/ObjectHolderImpl.java delete mode 100644 src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java delete mode 100644 src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java delete mode 100644 src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.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 160777fee..b72e86ea0 100644 --- a/src/main/java/me/shedaniel/rei/api/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/api/ClientHelper.java @@ -55,39 +55,39 @@ public interface ClientHelper { void registerFabricKeyBinds(); /** - * Tries to cheat entry using either packets or commands. + * Tries to cheat stack using either packets or commands. * - * @param stack the entry to cheat in + * @param stack the stack to cheat in * @return whether it failed */ - boolean tryCheatingEntry(Entry entry); + boolean tryCheatingEntry(EntryStack stack); default boolean tryCheatingStack(ItemStack stack) { - return tryCheatingEntry(Entry.create(stack)); + return tryCheatingEntry(EntryStack.create(stack)); } /** - * Finds recipe for the entry and opens the recipe screen. + * Finds recipe for the stack and opens the recipe screen. * - * @param entry the entry to find recipe for + * @param stack the stack to find recipe for * @return whether the stack has any recipes to show */ - boolean executeRecipeKeyBind(Entry entry); + boolean executeRecipeKeyBind(EntryStack stack); default boolean executeRecipeKeyBind(ItemStack stack) { - return executeRecipeKeyBind(Entry.create(stack)); + return executeRecipeKeyBind(EntryStack.create(stack)); } /** - * Finds usage for the entry and opens the recipe screen. + * Finds usage for the stack and opens the recipe screen. * - * @param entry the entry to find usage for + * @param stack the stack to find usage for * @return whether the stack has any usages to show */ - boolean executeUsageKeyBind(Entry entry); + boolean executeUsageKeyBind(EntryStack stack); default boolean executeUsageKeyBind(ItemStack stack) { - return executeUsageKeyBind(Entry.create(stack)); + return executeUsageKeyBind(EntryStack.create(stack)); } FabricKeyBinding getFocusSearchFieldKeyBinding(); diff --git a/src/main/java/me/shedaniel/rei/api/Entry.java b/src/main/java/me/shedaniel/rei/api/Entry.java index 9c494558b..c0eb609bb 100644 --- a/src/main/java/me/shedaniel/rei/api/Entry.java +++ b/src/main/java/me/shedaniel/rei/api/Entry.java @@ -5,6 +5,7 @@ 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; @@ -12,6 +13,8 @@ import net.minecraft.item.ItemStack; import javax.annotation.Nullable; +@Deprecated +@ToBeRemoved public interface Entry extends Cloneable { @SuppressWarnings("deprecation") static Entry create(ItemStack itemStack) { @@ -33,6 +36,14 @@ public interface Entry extends Cloneable { 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 { diff --git a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java index effd1c8a4..dfa320bc9 100644 --- a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java +++ b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java @@ -5,11 +5,14 @@ package me.shedaniel.rei.api; +import me.shedaniel.rei.api.annotations.ToBeRemoved; import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public interface EntryRegistry { @@ -18,7 +21,17 @@ public interface EntryRegistry { * * @return an unmodifiable item list */ - List getEntryList(); + @Deprecated + default List getEntryList() { + return Collections.unmodifiableList(getModifiableEntryList()); + } + + /** + * Gets the current modifiable stacks list + * + * @return a stacks list + */ + List getStacksList(); /** * Gets the current modifiable item list @@ -26,7 +39,9 @@ public interface EntryRegistry { * @return an modifiable item list */ @Deprecated - List getModifiableEntryList(); + default List getModifiableEntryList() { + return getStacksList().stream().map(EntryStack::toEntry).collect(Collectors.toList()); + } /** * Gets all possible stacks from an item @@ -42,31 +57,66 @@ public interface EntryRegistry { * @param afterItem the stack to put after * @param stack the stack to register */ - void registerItemStack(Item afterItem, ItemStack stack); + @Deprecated + default void registerItemStack(Item afterItem, ItemStack stack) { + registerEntryAfter(EntryStack.create(afterItem), EntryStack.create(stack)); + } - void registerFluid(Fluid fluid); + @Deprecated + default void registerFluid(Fluid fluid) { + registerEntry(EntryStack.create(fluid)); + } + + default void registerEntry(EntryStack stack) { + registerEntryAfter(null, stack); + } + + 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 * - * @param afterItem the stack to put after - * @param stacks the stacks to register + * @param afterStack the stack to put after + * @param stacks the stacks to register */ - default void registerItemStack(Item afterItem, ItemStack... stacks) { + default void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) { for (int i = stacks.length - 1; i >= 0; i--) { - ItemStack stack = stacks[i]; + EntryStack stack = stacks[i]; if (stack != null && !stack.isEmpty()) - registerItemStack(afterItem, stack); + registerEntryAfter(afterStack, stack); } } + @ToBeRemoved + @Deprecated + default void registerItemStack(ItemStack... stacks) { + registerItemStack(null, stacks); + } + /** * Registers multiple stacks to the item list * * @param stacks the stacks to register */ - default void registerItemStack(ItemStack... stacks) { - registerItemStack(null, stacks); + default void registerEntries(EntryStack... stacks) { + registerEntriesAfter(null, stacks); + } + + @ToBeRemoved + @Deprecated + default boolean alreadyContain(ItemStack stack) { + return alreadyContain(EntryStack.create(stack)); } /** @@ -75,8 +125,8 @@ public interface EntryRegistry { * @param stack the stack to check * @return whether the stack has been registered */ - default boolean alreadyContain(ItemStack stack) { - return getEntryList().stream().filter(entry -> entry.getEntryType() == Entry.Type.ITEM).anyMatch(entry -> ItemStack.areEqualIgnoreDamage(stack, entry.getItemStack())); + default boolean alreadyContain(EntryStack stack) { + return getStacksList().stream().anyMatch(entry -> stack.equalsAll(entry)); } } diff --git a/src/main/java/me/shedaniel/rei/api/EntryStack.java b/src/main/java/me/shedaniel/rei/api/EntryStack.java new file mode 100644 index 000000000..ef145a2d8 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/EntryStack.java @@ -0,0 +1,148 @@ +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; +import me.shedaniel.rei.impl.ItemEntryStack; +import net.minecraft.block.Block; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; + +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; + +public interface EntryStack { + + static EntryStack empty() { + return EmptyEntryStack.EMPTY; + } + + static EntryStack create(Fluid fluid) { + return create(fluid, 1000); + } + + static EntryStack create(Fluid fluid, int amount) { + return new FluidEntryStack(fluid, amount); + } + + static EntryStack create(ItemStack stack) { + return new ItemEntryStack(stack); + } + + static EntryStack create(ItemConvertible item) { + return new ItemEntryStack(new ItemStack(item)); + } + + static EntryStack create(Block block) { + return new ItemEntryStack(new ItemStack(block)); + } + + Optional getIdentifier(); + + EntryStack.Type getType(); + + int getAmount(); + + void setAmount(int amount); + + boolean isEmpty(); + + @ToBeRemoved + @Deprecated + Entry toEntry(); + + EntryStack copy(); + + Object getObject(); + + boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount); + + boolean equalsIgnoreTagsAndAmount(EntryStack stack); + + boolean equalsIgnoreTags(EntryStack stack); + + boolean equalsIgnoreAmount(EntryStack stack); + + boolean equalsAll(EntryStack stack); + + int getZ(); + + void setZ(int z); + + default ItemStack getItemStack() { + if (getType() == Type.ITEM) + return (ItemStack) getObject(); + return null; + } + + default Item getItem() { + if (getType() == Type.ITEM) + return ((ItemStack) getObject()).getItem(); + return null; + } + + default Fluid getFluid() { + if (getType() == Type.FLUID) + return (Fluid) getObject(); + return null; + } + + EntryStack setting(Settings settings, T value); + + EntryStack removeSetting(Settings settings); + + EntryStack clearSettings(); + + default EntryStack addSetting(Settings settings, T value) { + return setting(settings, value); + } + + ObjectHolder getSetting(Settings settings); + + @Nullable + QueuedTooltip getTooltip(int mouseX, int mouseY); + + void render(Rectangle bounds, int mouseX, int mouseY, float delta); + + public static enum Type { + ITEM, FLUID, EMPTY + } + + public static class Settings { + public static final Supplier TRUE = () -> true; + public static final Supplier FALSE = () -> false; + public static final Settings> RENDER = new Settings(TRUE); + public static final Settings> CHECK_TAGS = new Settings(FALSE); + public static final Settings> TOOLTIP_ENABLED = new Settings(TRUE); + public static final Settings> TOOLTIP_APPEND_MOD = new Settings(TRUE); + public static final Settings> RENDER_COUNTS = new Settings(TRUE); + public static final Settings>> TOOLTIP_APPEND_EXTRA = new Settings>>(stack -> Collections.emptyList()); + public static final Settings> COUNTS = new Settings>(stack -> null); + + private T defaultValue; + + public Settings(T defaultValue) { + this.defaultValue = defaultValue; + } + + public T getDefaultValue() { + return defaultValue; + } + + public static class Item { + public static final Settings> RENDER_OVERLAY = new Settings(TRUE); + + private Item() { + } + } + } +} diff --git a/src/main/java/me/shedaniel/rei/api/LiveRecipeGenerator.java b/src/main/java/me/shedaniel/rei/api/LiveRecipeGenerator.java index 3d197f1cf..8200fcdc0 100644 --- a/src/main/java/me/shedaniel/rei/api/LiveRecipeGenerator.java +++ b/src/main/java/me/shedaniel/rei/api/LiveRecipeGenerator.java @@ -20,7 +20,7 @@ public interface LiveRecipeGenerator { return Optional.empty(); } - default Optional> getRecipeFor(Entry entry) { + default Optional> getRecipeFor(EntryStack entry) { return Optional.empty(); } @@ -29,7 +29,7 @@ public interface LiveRecipeGenerator { return Optional.empty(); } - default Optional> getUsageFor(Entry entry) { + default Optional> getUsageFor(EntryStack entry) { return Optional.empty(); } diff --git a/src/main/java/me/shedaniel/rei/api/ObjectHolder.java b/src/main/java/me/shedaniel/rei/api/ObjectHolder.java new file mode 100644 index 000000000..f77fde6b9 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/ObjectHolder.java @@ -0,0 +1,17 @@ +package me.shedaniel.rei.api; + +public interface ObjectHolder { + int intValue(); + + long longValue(); + + boolean booleanValue(); + + float floatValue(); + + double doubleValue(); + + String stringValue(); + + T value(); +} \ No newline at end of file diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index 233cf4553..4cecb6fce 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -6,6 +6,7 @@ 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.widget.CategoryBaseWidget; @@ -32,9 +33,18 @@ 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 */ - Renderer getIcon(); + @ToBeRemoved + @Deprecated + default Renderer getIcon() { + return Renderer.empty(); + } + + default EntryStack getLogo() { + return getIcon().getEntry(); + } /** * Gets the category name @@ -51,7 +61,7 @@ public interface RecipeCategory { */ @SuppressWarnings("unchecked") default RecipeRenderer getSimpleRenderer(T recipe) { - return Renderer.fromRecipe(recipe::getInput, recipe::getOutput); + return Renderer.fromRecipeEntries(recipe::getInputEntries, recipe::getOutputEntries); } /** @@ -126,7 +136,9 @@ public interface RecipeCategory { * Gets whether the category will check tags, useful for potions * * @return whether the category will check tags + * @deprecated no longer used */ + @Deprecated default boolean checkTags() { return false; } diff --git a/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java b/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java index 501ecb08f..dd563f01a 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeDisplay.java @@ -5,7 +5,6 @@ package me.shedaniel.rei.api; -import com.google.common.collect.Lists; import me.shedaniel.rei.api.annotations.ToBeRemoved; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; @@ -19,7 +18,7 @@ public interface RecipeDisplay { /** * @return a list of items - * @see RecipeDisplay#getInputEntries() + * @see RecipeDisplay#getInputStacks() */ @ToBeRemoved @Deprecated @@ -30,15 +29,15 @@ public interface RecipeDisplay { /** * @return a list of inputs */ - default List> getInputEntries() { + default List> getInputEntries() { List> input = getInput(); if (input.isEmpty()) return Collections.emptyList(); - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); for (List stacks : input) { - List entries = new ArrayList<>(); + List entries = new ArrayList<>(); for (ItemStack stack : stacks) { - entries.add(Entry.create(stack)); + entries.add(EntryStack.create(stack)); } list.add(entries); } @@ -57,13 +56,13 @@ public interface RecipeDisplay { /** * @return a list of outputs */ - default List getOutputEntry() { + default List getOutputEntries() { List input = getOutput(); if (input.isEmpty()) return Collections.emptyList(); - List entries = new ArrayList<>(); + List entries = new ArrayList<>(); for (ItemStack stack : input) { - entries.add(Entry.create(stack)); + entries.add(EntryStack.create(stack)); } return entries; } @@ -73,8 +72,25 @@ 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 Lists.newArrayList(); + 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 4014993f8..9c66a6eb4 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java @@ -7,12 +7,14 @@ 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; @@ -50,7 +52,22 @@ public interface RecipeHelper { * @param inventoryItems the materials * @return the list of craftable items */ - List findCraftableByItems(List inventoryItems); + 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); /** * Registers a category @@ -88,13 +105,15 @@ public interface RecipeHelper { /** * Gets a map of recipes for an itemstack * - * @param entry the entry to be crafted + * @param stack the stack to be crafted * @return the map of recipes */ - Map, List> getRecipesFor(Entry entry); + Map, List> getRecipesFor(EntryStack stack); + @ToBeRemoved + @Deprecated default Map, List> getRecipesFor(ItemStack stack) { - return getRecipesFor(Entry.create(stack)); + return getRecipesFor(EntryStack.create(stack)); } RecipeCategory getCategory(Identifier identifier); @@ -116,13 +135,15 @@ public interface RecipeHelper { /** * Gets a map of usages for an itemstack * - * @param entry the entry to be used + * @param stack the stack to be used * @return the map of recipes */ - Map, List> getUsagesFor(Entry entry); + Map, List> getUsagesFor(EntryStack stack); + @ToBeRemoved + @Deprecated default Map, List> getUsagesFor(ItemStack stack) { - return getUsagesFor(Entry.create(stack)); + return getUsagesFor(EntryStack.create(stack)); } /** diff --git a/src/main/java/me/shedaniel/rei/api/Renderer.java b/src/main/java/me/shedaniel/rei/api/Renderer.java index 69e919ee0..f2e8964be 100644 --- a/src/main/java/me/shedaniel/rei/api/Renderer.java +++ b/src/main/java/me/shedaniel/rei/api/Renderer.java @@ -5,6 +5,7 @@ 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; @@ -24,6 +25,7 @@ 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 @@ -104,10 +106,16 @@ public abstract class Renderer extends DrawableHelper { * @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); } @@ -185,13 +193,12 @@ public abstract class Renderer extends DrawableHelper { */ public abstract void render(int x, int y, double mouseX, double mouseY, float delta); - @NotNull - public Optional getEntry() { + public EntryStack getEntry() { if (this instanceof ItemStackRenderer) - return Optional.of(Entry.create(((ItemStackRenderer) this).getItemStack())); + return EntryStack.create(((ItemStackRenderer) this).getItemStack()); if (this instanceof FluidRenderer) - return Optional.of(Entry.create(((FluidRenderer) this).getFluid())); - return Optional.empty(); + return EntryStack.create(((FluidRenderer) this).getFluid()); + return EntryStack.empty(); } @Nullable diff --git a/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java b/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java index 3e7ed1bc8..f7d509f17 100644 --- a/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java +++ b/src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java @@ -5,10 +5,13 @@ package me.shedaniel.rei.api; +import com.google.common.collect.Lists; import me.shedaniel.rei.server.ContainerInfo; import net.minecraft.container.Container; import net.minecraft.item.ItemStack; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; public interface TransferRecipeDisplay extends RecipeDisplay { @@ -17,6 +20,27 @@ public interface TransferRecipeDisplay extends RecipeDisplay { int getHeight(); - List> getOrganisedInput(ContainerInfo containerInfo, Container container); + 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; + } } diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 11bc510e8..7a120ec60 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -11,10 +11,7 @@ import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.compat.RenderHelper; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.ClientHelper; -import me.shedaniel.rei.api.DisplayHelper; -import me.shedaniel.rei.api.Entry; -import me.shedaniel.rei.api.RecipeHelper; +import me.shedaniel.rei.api.*; import me.shedaniel.rei.gui.config.SearchFieldLocation; import me.shedaniel.rei.gui.widget.*; import me.shedaniel.rei.impl.RecipeHelperImpl; @@ -409,7 +406,7 @@ public class ContainerScreenOverlay extends Widget { ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen; int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop(); for (Slot slot : ((AbstractContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList) - if (!slot.hasStack() || !entryListWidget.filterEntry(Entry.create(slot.getStack()), entryListWidget.getLastSearchArgument())) + if (!slot.hasStack() || !entryListWidget.filterEntry(EntryStack.create(slot.getStack()), entryListWidget.getLastSearchArgument())) fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400); } blitOffset = 0; diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index ac53cd35a..9c1e63a08 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -272,7 +272,7 @@ public class RecipeViewingScreen extends Screen { return false; } }); - tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * TABS_PER_PAGE == categories.indexOf(selectedCategory)); + tab.setRenderer(categories.get(j), categories.get(j).getLogo(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * TABS_PER_PAGE == categories.indexOf(selectedCategory)); } } Optional supplier = RecipeHelper.getInstance().getAutoCraftButtonArea(selectedCategory); diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index 85b6ff504..6e62f8113 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -185,7 +185,7 @@ public class VillagerRecipeViewingScreen extends Screen { return false; } }); - tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + tabsPage * TABS_PER_PAGE == selectedCategoryIndex); + tab.setRenderer(categories.get(j), categories.get(j).getLogo(), categories.get(j).getCategoryName(), tab.getId() + tabsPage * TABS_PER_PAGE == selectedCategoryIndex); } } ButtonWidget w, w2; diff --git a/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java index 1aa45aa3f..db124a3b2 100644 --- a/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java +++ b/src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java @@ -6,11 +6,13 @@ package me.shedaniel.rei.gui.renderers; import com.google.common.collect.Lists; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.Renderer; import me.shedaniel.rei.gui.VillagerRecipeViewingScreen; import me.shedaniel.rei.gui.widget.QueuedTooltip; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.GuiLighting; +import net.minecraft.fluid.Fluid; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.Pair; @@ -26,54 +28,94 @@ 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.getCount() != o2.getCount()) - return o1.getCount() - o2.getCount(); - int compare = Boolean.compare(o1.hasTag(), o2.hasTag()); + 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() - i2.getCount(); + int compare = Boolean.compare(i1.hasTag(), i2.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(); + if (i1.getTag().getSize() != i2.getTag().getSize()) + return i1.getTag().getSize() - i2.getTag().getSize(); + return i1.getTag().hashCode() - i2.getTag().hashCode(); } - return o1.getItem().hashCode() - o2.getItem().hashCode(); + return i1.getItem().hashCode() - i2.getItem().hashCode(); }; private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); - private List inputRenderer; - private ItemStackRenderer outputRenderer; + private List inputRenderer; + private Renderer outputRenderer; private QueuedTooltip lastTooltip; + @Deprecated 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::getCount).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(); + this(() -> (List>) input.get().stream().map(s -> s.stream().map(EntryStack::create).collect(Collectors.toList())).collect(Collectors.toList()), + () -> output.get().stream().map(EntryStack::create).collect(Collectors.toList()), 0); + } + + public SimpleRecipeRenderer(Supplier>> input, Supplier> output, int forDifferentConstructor) { + List, AtomicInteger>> newList = Lists.newArrayList(); + List, Integer>> a = input.get().stream().map(stacks -> new Pair<>(stacks, stacks.stream().map(EntryStack::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) + List> b = Lists.newArrayList(); + for (Pair, AtomicInteger> pair : newList) b.add(pair.getLeft().stream().map(stack -> { - ItemStack s = stack.copy(); - s.setCount(pair.getRight().get()); + EntryStack 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())); + this.inputRenderer = b.stream().filter(stacks -> !stacks.isEmpty()).map(stacks -> fromEntries(stacks)).collect(Collectors.toList()); + this.outputRenderer = fromEntries(output.get().stream().filter(stack -> !stack.isEmpty()).collect(Collectors.toList())); + } + + @Deprecated + private static Renderer fromEntries(List entries) { + boolean isItem = true; + for (EntryStack entry : entries) { + if (entry.getType() != EntryStack.Type.ITEM) + isItem = false; + } + if (isItem) + return Renderer.fromItemStacks(entries.stream().map(EntryStack::getItemStack).collect(Collectors.toList())); + boolean isFluid = true; + for (EntryStack entry : entries) { + if (entry.getType() != EntryStack.Type.FLUID) + isFluid = false; + } + + if (isFluid) { + List fluids = entries.stream().map(EntryStack::getFluid).collect(Collectors.toList()); + if (!fluids.isEmpty()) + return Renderer.fromFluid(fluids.get(0)); + } + return Renderer.empty(); } - 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()); + public static boolean equalsList(List list_1, List list_2) { + List stacks_1 = list_1.stream().distinct().sorted(ENTRY_COMPARATOR).collect(Collectors.toList()); + List stacks_2 = list_2.stream().distinct().sorted(ENTRY_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).isItemEqualIgnoreDamage(stacks_2.get(i))) + if (!stacks_1.get(i).equalsIgnoreTagsAndAmount(stacks_2.get(i))) return false; return true; } @@ -84,7 +126,7 @@ public class SimpleRecipeRenderer extends RecipeRenderer { int xx = x + 4, yy = y + 2; int j = 0; int itemsPerLine = getItemsPerLine(); - for (ItemStackRenderer itemStackRenderer : inputRenderer) { + for (Renderer itemStackRenderer : inputRenderer) { itemStackRenderer.setBlitOffset(getBlitOffset() + 50); if (lastTooltip == null && MinecraftClient.getInstance().currentScreen instanceof VillagerRecipeViewingScreen && mouseX >= xx && mouseX <= xx + 16 && mouseY >= yy && mouseY <= yy + 16) { lastTooltip = itemStackRenderer.getQueuedTooltip(delta); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 898b68639..331285393 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -15,10 +15,9 @@ import me.shedaniel.math.compat.RenderHelper; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.annotations.ToBeRemoved; import me.shedaniel.rei.gui.config.ItemCheatingMode; import me.shedaniel.rei.gui.config.ItemListOrdering; -import me.shedaniel.rei.gui.renderers.FluidRenderer; -import me.shedaniel.rei.gui.renderers.ItemStackRenderer; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.impl.SearchArgument; import net.minecraft.client.MinecraftClient; @@ -35,23 +34,23 @@ import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; import org.apache.commons.lang3.StringUtils; -import javax.annotation.Nullable; import java.util.*; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", "rawtypes"}) public class EntryListWidget extends Widget { + private static final Supplier RENDER_EXTRA_CONFIG = () -> RoughlyEnoughItemsCore.getConfigManager().getConfig().doesRenderEntryExtraOverlay(); private static final String SPACE = " ", EMPTY = ""; - private static final Comparator ASCENDING_COMPARATOR; + private static final Comparator ASCENDING_COMPARATOR; private static List searchBlacklisted = Lists.newArrayList(); private static float scroll; private static float target; @@ -66,9 +65,9 @@ public class EntryListWidget extends Widget { static { ASCENDING_COMPARATOR = (entry, entry1) -> { if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.name)) - return tryGetEntryName(entry).compareToIgnoreCase(tryGetEntryName(entry1)); + return tryGetEntryStackName(entry).compareToIgnoreCase(tryGetEntryStackName(entry1)); if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.item_groups)) { - if (entry.getEntryType() == Entry.Type.ITEM && entry1.getEntryType() == Entry.Type.ITEM) { + if (entry.getType() == EntryStack.Type.ITEM && entry1.getType() == EntryStack.Type.ITEM) { ItemStack stack0 = entry.getItemStack(); ItemStack stack1 = entry1.getItemStack(); List itemGroups = Arrays.asList(ItemGroup.GROUPS); @@ -80,7 +79,7 @@ public class EntryListWidget extends Widget { } private final List lastSearchArgument; - private List currentDisplayed; + private List currentDisplayed; private List widgets; private int width, height, page; private Rectangle rectangle, listArea; @@ -104,6 +103,8 @@ public class EntryListWidget extends Widget { return Collections.singletonList(tryGetItemStackName(itemStack)); } + @ToBeRemoved + @Deprecated public static String tryGetEntryName(Entry stack) { if (stack.getEntryType() == Entry.Type.ITEM) return tryGetItemStackName(stack.getItemStack()); @@ -112,6 +113,14 @@ public class EntryListWidget extends Widget { return ""; } + public static String tryGetEntryStackName(EntryStack stack) { + if (stack.getType() == EntryStack.Type.ITEM) + return tryGetItemStackName(stack.getItemStack()); + else if (stack.getType() == EntryStack.Type.FLUID) + return tryGetFluidName(stack.getFluid()); + return ""; + } + public static String tryGetFluidName(Fluid fluid) { Identifier id = Registry.FLUID.getId(fluid); if (I18n.hasTranslation("block." + id.toString().replaceFirst(":", "."))) @@ -135,7 +144,7 @@ public class EntryListWidget extends Widget { return "ERROR"; } - public static boolean filterEntry(Entry entry, List arguments) { + public static boolean filterEntry(EntryStack entry, List arguments) { if (arguments.isEmpty()) return true; AtomicReference mod = new AtomicReference<>(), tooltips = new AtomicReference<>(), name = new AtomicReference<>(); @@ -144,21 +153,27 @@ public class EntryListWidget extends Widget { for (SearchArgument argument : arguments1) { if (argument.getArgumentType() == (SearchArgument.ArgumentType.ALWAYS)) return true; - if (argument.getArgumentType() == SearchArgument.ArgumentType.MOD) - if (argument.getFunction(!argument.isInclude()).apply(fillMod(entry, mod).get())) { + if (argument.getArgumentType() == SearchArgument.ArgumentType.MOD) { + fillMod(entry, mod); + if (mod.get() != null && !mod.get().isEmpty() && argument.getFunction(!argument.isInclude()).apply(mod.get())) { b = false; break; } - if (argument.getArgumentType() == SearchArgument.ArgumentType.TOOLTIP) - if (argument.getFunction(!argument.isInclude()).apply(fillTooltip(entry, tooltips).get())) { + } + if (argument.getArgumentType() == SearchArgument.ArgumentType.TOOLTIP) { + fillTooltip(entry, tooltips); + if (tooltips.get() != null && !tooltips.get().isEmpty() && argument.getFunction(!argument.isInclude()).apply(tooltips.get())) { b = false; break; } - if (argument.getArgumentType() == SearchArgument.ArgumentType.TEXT) - if (argument.getFunction(!argument.isInclude()).apply(fillName(entry, name).get())) { + } + if (argument.getArgumentType() == SearchArgument.ArgumentType.TEXT) { + fillName(entry, name); + if (name.get() != null && !name.get().isEmpty() && argument.getFunction(!argument.isInclude()).apply(name.get())) { b = false; break; } + } } if (b) return true; @@ -166,30 +181,28 @@ public class EntryListWidget extends Widget { return false; } - private static AtomicReference fillMod(Entry entry, AtomicReference mod) { - if (mod.get() == null) - if (entry.getEntryType() == Entry.Type.ITEM) - mod.set(ClientHelper.getInstance().getModFromItem(entry.getItemStack().getItem()).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); - else if (entry.getEntryType() == Entry.Type.FLUID) - mod.set(ClientHelper.getInstance().getModFromIdentifier(Registry.FLUID.getId(entry.getFluid())).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); + private static AtomicReference fillMod(EntryStack entry, AtomicReference mod) { + if (mod.get() == null) { + Optional identifier = entry.getIdentifier(); + if (identifier.isPresent()) + mod.set(ClientHelper.getInstance().getModFromIdentifier(identifier.get()).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); + else mod.set(""); + } return mod; } - private static AtomicReference fillTooltip(Entry entry, AtomicReference mod) { + private static AtomicReference fillTooltip(EntryStack entry, AtomicReference mod) { if (mod.get() == null) - if (entry.getEntryType() == Entry.Type.ITEM) + if (entry.getType() == EntryStack.Type.ITEM) mod.set(tryGetItemStackToolTip(entry.getItemStack(), false).stream().collect(Collectors.joining("")).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); else - mod.set(tryGetFluidName(entry.getFluid()).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); + mod.set(tryGetEntryStackName(entry).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); return mod; } - private static AtomicReference fillName(Entry entry, AtomicReference mod) { + private static AtomicReference fillName(EntryStack entry, AtomicReference mod) { if (mod.get() == null) - if (entry.getEntryType() == Entry.Type.ITEM) - mod.set(tryGetItemStackName(entry.getItemStack()).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); - else - mod.set(tryGetFluidName(entry.getFluid()).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); + mod.set(tryGetEntryStackName(entry).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT)); return mod; } @@ -345,7 +358,7 @@ public class EntryListWidget extends Widget { this.widgets = Lists.newCopyOnWriteArrayList(); calculateListSize(rectangle); if (currentDisplayed.isEmpty() || processSearchTerm) - currentDisplayed = processSearchTerm(searchTerm, RoughlyEnoughItemsCore.getEntryRegistry().getEntryList(), new ArrayList<>(ScreenHelper.inventoryStacks)); + currentDisplayed = processSearchTerm(searchTerm, RoughlyEnoughItemsCore.getEntryRegistry().getStacksList(), new ArrayList<>(ScreenHelper.inventoryStacks)); int startX = rectangle.getCenterX() - width * 9; int startY = rectangle.getCenterY() - height * 9; this.listArea = new Rectangle(startX, startY, width * 18, height * 18); @@ -364,67 +377,11 @@ public class EntryListWidget extends Widget { j++; if (j > currentDisplayed.size()) break; - final Entry entry = currentDisplayed.get(j - 1); + final EntryStack stack = currentDisplayed.get(j - 1).copy() + .setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE) + .setting(EntryStack.Settings.Item.RENDER_OVERLAY, RENDER_EXTRA_CONFIG); maxScroll = y + 18; - widgets.add(new Slot(entry, xx, yy, x, y, entry.getEntryType() == Entry.Type.ITEM ? new ItemStackRenderer() { - @Override - public ItemStack getItemStack() { - return entry.getItemStack(); - } - - @Override - protected String getCounts() { - return ""; - } - - @Override - protected boolean renderOverlay() { - return RoughlyEnoughItemsCore.getConfigManager().getConfig().doesRenderEntryExtraOverlay(); - } - - @Nullable - @Override - public QueuedTooltip getQueuedTooltip(float delta) { - ClientPlayerEntity player = minecraft.player; - if (!ClientHelper.getInstance().isCheating() || player.inventory.getCursorStack().isEmpty()) - return super.getQueuedTooltip(delta); - return null; - } - } : new FluidRenderer() { - @Override - public Fluid getFluid() { - return entry.getFluid(); - } - - @Override - protected List getExtraToolTips(Fluid fluid) { - if (MinecraftClient.getInstance().options.advancedItemTooltips) - return Collections.singletonList(Formatting.DARK_GRAY.toString() + Registry.FLUID.getId(fluid).toString()); - return super.getExtraToolTips(fluid); - } - }, false, true, true) { - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - Optional entryOptional = getCurrentRenderer().getEntry(); - if (entryOptional.isPresent() && containsMouse(mouseX, mouseY)) { - if (ClientHelper.getInstance().isCheating()) { - Entry entry = entryOptional.get().clone(); - if (entry.getEntryType() == Entry.Type.ITEM) { - if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.REI_LIKE) - entry.getItemStack().setCount(button != 1 ? 1 : entry.getItemStack().getMaxCount()); - else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.JEI_LIKE) - entry.getItemStack().setCount(button != 0 ? 1 : entry.getItemStack().getMaxCount()); - else - entry.getItemStack().setCount(1); - } - } else if (button == 0) { - return ClientHelper.getInstance().executeRecipeKeyBind(entryOptional.get()); - } else if (button == 1) - return ClientHelper.getInstance().executeUsageKeyBind(entryOptional.get()); - } - return false; - } - }); + widgets.add((Slot) new Slot(xx, yy, x, y).entry(stack).noBackground()); } if (j > currentDisplayed.size()) break; @@ -486,13 +443,13 @@ public class EntryListWidget extends Widget { return false; } - public List getCurrentDisplayed() { + public List getCurrentDisplayed() { return currentDisplayed; } - private List processSearchTerm(String searchTerm, List ol, List inventoryItems) { + private List processSearchTerm(String searchTerm, List ol, List inventoryItems) { lastSearchArgument.clear(); - List os = new LinkedList<>(ol); + List os = new LinkedList<>(ol); if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering() != ItemListOrdering.registry) os = ol.stream().sorted(ASCENDING_COMPARATOR).collect(Collectors.toList()); if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isItemListAscending()) @@ -521,17 +478,17 @@ public class EntryListWidget extends Widget { else lastSearchArgument.add(new SearchArgument[]{SearchArgument.ALWAYS}); }); - List stacks = Collections.emptyList(); + List stacks = Collections.emptyList(); if (lastSearchArgument.isEmpty()) stacks = os; else stacks = os.stream().filter(entry -> filterEntry(entry, lastSearchArgument)).collect(Collectors.toList()); if (!RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() || stacks.isEmpty() || inventoryItems.isEmpty()) return Collections.unmodifiableList(stacks); - List workingItems = RecipeHelper.getInstance().findCraftableByItems(inventoryItems); - List newList = Lists.newLinkedList(); - for (ItemStack workingItem : workingItems) { - Optional any = stacks.stream().filter(i -> i.getItemStack() != null && i.getItemStack().isItemEqualIgnoreDamage(workingItem)).findAny(); + List workingItems = RecipeHelper.getInstance().findCraftableEntriesByItems(inventoryItems); + List newList = Lists.newLinkedList(); + for (EntryStack workingItem : workingItems) { + Optional any = stacks.stream().filter(i -> i.getItemStack() != null && i.equals(workingItem)).findAny(); if (any.isPresent()) newList.add(any.get()); } @@ -596,27 +553,21 @@ public class EntryListWidget extends Widget { return widgets; } - public class Slot extends SlotWidget { + private class Slot extends EntryWidget { private final int backupY; private int xx, yy; - private Entry entry; - public Slot(Entry entry, int xx, int yy, int x, int y, Renderer renderer, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) { - super(x, y, renderer, drawBackground, showToolTips, clickToMoreRecipes); + public Slot(int xx, int yy, int x, int y) { + super(x, y); this.xx = xx; this.yy = yy; this.backupY = y; - this.entry = entry; } public int getBackupY() { return backupY; } - public Entry getEntry() { - return entry; - } - public int getXx() { return xx; } @@ -629,6 +580,33 @@ public class EntryListWidget extends Widget { public boolean containsMouse(double mouseX, double mouseY) { return super.containsMouse(mouseX, mouseY) && rectangle.contains(mouseX, mouseY); } + + @Override + protected void queueTooltip(int mouseX, int mouseY, float delta) { + ClientPlayerEntity player = minecraft.player; + if (!ClientHelper.getInstance().isCheating() || player.inventory.getCursorStack().isEmpty()) + super.queueTooltip(mouseX, mouseY, delta); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!interactable) + return super.mouseClicked(mouseX, mouseY, button); + if (ClientHelper.getInstance().isCheating()) { + EntryStack entry = getCurrentEntry().copy(); + if (entry.getType() == EntryStack.Type.ITEM) { + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.REI_LIKE) + entry.setAmount(button != 1 ? 1 : entry.getItemStack().getMaxCount()); + else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.JEI_LIKE) + entry.setAmount(button != 0 ? 1 : entry.getItemStack().getMaxCount()); + else + entry.setAmount(1); + } + ClientHelper.getInstance().tryCheatingEntry(entry); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } } } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java new file mode 100644 index 000000000..5beae5f87 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -0,0 +1,186 @@ +package me.shedaniel.rei.gui.widget; + +import me.shedaniel.math.api.Rectangle; +import me.shedaniel.math.compat.RenderHelper; +import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.ClientHelper; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.annotations.Experimental; +import me.shedaniel.rei.impl.ScreenHelper; +import net.minecraft.client.gui.Element; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +@Experimental +public class EntryWidget extends WidgetWithBounds { + + protected static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + protected static final Identifier RECIPE_GUI_DARK = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer_dark.png"); + + protected boolean highlight = true; + protected boolean tooltips = true; + protected boolean background = true; + protected boolean interactable = true; + private Rectangle bounds; + private List entryStacks; + + protected EntryWidget(int x, int y) { + this.bounds = new Rectangle(x - 1, y - 1, 18, 18); + this.entryStacks = new ArrayList<>(); + } + +