From 019aa13875ca639dda2f34c66e3160f72b923cfd Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 9 Aug 2019 20:47:52 +0800 Subject: Fluid? --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 10 +- src/main/java/me/shedaniel/rei/api/Entry.java | 32 ++ .../java/me/shedaniel/rei/api/EntryRegistry.java | 82 +++++ .../java/me/shedaniel/rei/api/ItemRegistry.java | 79 ----- src/main/java/me/shedaniel/rei/api/Renderer.java | 10 + .../me/shedaniel/rei/api/plugins/REIPluginV0.java | 6 +- .../me/shedaniel/rei/client/ConfigObjectImpl.java | 15 +- .../me/shedaniel/rei/client/EntryRegistryImpl.java | 66 ++++ .../java/me/shedaniel/rei/client/FluidEntry.java | 33 ++ .../me/shedaniel/rei/client/ItemRegistryImpl.java | 59 ---- .../me/shedaniel/rei/client/ItemStackEntry.java | 33 ++ .../me/shedaniel/rei/client/RecipeHelperImpl.java | 6 +- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 43 +-- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 2 +- .../rei/gui/VillagerRecipeViewingScreen.java | 2 +- .../shedaniel/rei/gui/renderers/FluidRenderer.java | 54 +++ .../rei/gui/renderers/ItemStackRenderer.java | 27 +- .../shedaniel/rei/gui/widget/EntryListOverlay.java | 383 +++++++++++++++++++++ .../shedaniel/rei/gui/widget/ItemListOverlay.java | 348 ------------------- .../me/shedaniel/rei/gui/widget/SlotWidget.java | 43 ++- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 22 +- .../plugin/blasting/DefaultBlastingCategory.java | 2 +- .../rei/plugin/brewing/DefaultBrewingCategory.java | 10 +- .../composting/DefaultCompostingCategory.java | 4 +- .../plugin/smelting/DefaultSmeltingCategory.java | 2 +- .../rei/plugin/smoking/DefaultSmokingCategory.java | 2 +- 26 files changed, 814 insertions(+), 561 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/Entry.java create mode 100644 src/main/java/me/shedaniel/rei/api/EntryRegistry.java delete mode 100644 src/main/java/me/shedaniel/rei/api/ItemRegistry.java create mode 100644 src/main/java/me/shedaniel/rei/client/EntryRegistryImpl.java create mode 100644 src/main/java/me/shedaniel/rei/client/FluidEntry.java delete mode 100644 src/main/java/me/shedaniel/rei/client/ItemRegistryImpl.java create mode 100644 src/main/java/me/shedaniel/rei/client/ItemStackEntry.java create mode 100644 src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/EntryListOverlay.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java (limited to 'src/main/java/me') diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 0f882570a..b5e259553 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -13,7 +13,7 @@ import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.client.*; import me.shedaniel.rei.gui.ContainerScreenOverlay; -import me.shedaniel.rei.gui.widget.ItemListOverlay; +import me.shedaniel.rei.gui.widget.EntryListOverlay; import me.shedaniel.rei.listeners.RecipeBookButtonWidgetHooks; import me.shedaniel.rei.listeners.RecipeBookGuiHooks; import net.fabricmc.api.ClientModInitializer; @@ -57,7 +57,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { public static final Logger LOGGER; private static final RecipeHelper RECIPE_HELPER = new RecipeHelperImpl(); - private static final ItemRegistry ITEM_REGISTRY = new ItemRegistryImpl(); + private static final EntryRegistry ENTRY_REGISTRY = new EntryRegistryImpl(); private static final DisplayHelper DISPLAY_HELPER = new DisplayHelperImpl(); private static final Map plugins = Maps.newHashMap(); private static final ExecutorService SYNC_RECIPES = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "REI-SyncRecipes")); @@ -75,8 +75,8 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { return configManager; } - public static ItemRegistry getItemRegisterer() { - return ITEM_REGISTRY; + public static EntryRegistry getEntryRegistry() { + return ENTRY_REGISTRY; } public static DisplayHelper getDisplayHelper() { @@ -143,7 +143,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (packetContext, packetByteBuf) -> { ItemStack stack = packetByteBuf.readItemStack(); String player = packetByteBuf.readString(32767); - packetContext.getPlayer().addChatMessage(new LiteralText(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", ItemListOverlay.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); + packetContext.getPlayer().addChatMessage(new LiteralText(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", EntryListOverlay.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); }); ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (packetContext, packetByteBuf) -> { Screen currentScreen = MinecraftClient.getInstance().currentScreen; diff --git a/src/main/java/me/shedaniel/rei/api/Entry.java b/src/main/java/me/shedaniel/rei/api/Entry.java new file mode 100644 index 000000000..148c0c242 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/Entry.java @@ -0,0 +1,32 @@ +package me.shedaniel.rei.api; + +import me.shedaniel.rei.client.FluidEntry; +import me.shedaniel.rei.client.ItemStackEntry; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +public interface Entry { + @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(); + + 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 new file mode 100644 index 000000000..effd1c8a4 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java @@ -0,0 +1,82 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.api; + +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public interface EntryRegistry { + + /** + * Gets the current unmodifiable item list + * + * @return an unmodifiable item list + */ + List getEntryList(); + + /** + * Gets the current modifiable item list + * + * @return an modifiable item list + */ + @Deprecated + List getModifiableEntryList(); + + /** + * Gets all possible stacks from an item + * + * @param item the item to find + * @return the array of possible stacks + */ + 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 + */ + void registerItemStack(Item afterItem, ItemStack stack); + + void registerFluid(Fluid fluid); + + /** + * Registers multiple stacks to the item list + * + * @param afterItem the stack to put after + * @param stacks the stacks to register + */ + default void registerItemStack(Item afterItem, ItemStack... stacks) { + for (int i = stacks.length - 1; i >= 0; i--) { + ItemStack stack = stacks[i]; + if (stack != null && !stack.isEmpty()) + registerItemStack(afterItem, stack); + } + } + + /** + * Registers multiple stacks to the item list + * + * @param stacks the stacks to register + */ + default void registerItemStack(ItemStack... stacks) { + registerItemStack(null, stacks); + } + + /** + * Checks if a stack is already registered + * + * @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())); + } + +} diff --git a/src/main/java/me/shedaniel/rei/api/ItemRegistry.java b/src/main/java/me/shedaniel/rei/api/ItemRegistry.java deleted file mode 100644 index 5c55ae3ac..000000000 --- a/src/main/java/me/shedaniel/rei/api/ItemRegistry.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.api; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import java.util.List; - -public interface ItemRegistry { - - /** - * Gets the current unmodifiable item list - * - * @return an unmodifiable item list - */ - List getItemList(); - - /** - * Gets the current modifiable item list - * - * @return an modifiable item list - */ - @Deprecated - List getModifiableItemList(); - - /** - * Gets all possible stacks from an item - * - * @param item the item to find - * @return the array of possible stacks - */ - 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 - */ - void registerItemStack(Item afterItem, ItemStack stack); - - /** - * Registers multiple stacks to the item list - * - * @param afterItem the stack to put after - * @param stacks the stacks to register - */ - default void registerItemStack(Item afterItem, ItemStack... stacks) { - for (int i = stacks.length - 1; i >= 0; i--) { - ItemStack stack = stacks[i]; - if (stack != null && !stack.isEmpty()) - registerItemStack(afterItem, stack); - } - } - - /** - * Registers multiple stacks to the item list - * - * @param stacks the stacks to register - */ - default void registerItemStack(ItemStack... stacks) { - registerItemStack(null, stacks); - } - - /** - * Checks if a stack is already registered - * - * @param stack the stack to check - * @return whether the stack has been registered - */ - default boolean alreadyContain(ItemStack stack) { - return getItemList().stream().anyMatch(stack1 -> ItemStack.areEqualIgnoreDamage(stack, stack1)); - } - -} diff --git a/src/main/java/me/shedaniel/rei/api/Renderer.java b/src/main/java/me/shedaniel/rei/api/Renderer.java index 87c3ef174..322e45106 100644 --- a/src/main/java/me/shedaniel/rei/api/Renderer.java +++ b/src/main/java/me/shedaniel/rei/api/Renderer.java @@ -6,9 +6,11 @@ package me.shedaniel.rei.api; 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 net.minecraft.client.gui.DrawableHelper; +import net.minecraft.fluid.Fluid; import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; @@ -60,6 +62,14 @@ public abstract class Renderer extends DrawableHelper { public static ItemStackRenderer fromItemStack(ItemStack stack) { return fromItemStackSupplier(() -> stack); } + public static FluidRenderer fromFluid(Fluid fluid) { + return new FluidRenderer() { + @Override + public Fluid getFluid() { + return fluid; + } + }; + } /** * Gets an item stack renderer by an item stack diff --git a/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java b/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java index 3b71a30f5..3a728adb7 100644 --- a/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java +++ b/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java @@ -6,7 +6,7 @@ package me.shedaniel.rei.api.plugins; import me.shedaniel.rei.api.DisplayHelper; -import me.shedaniel.rei.api.ItemRegistry; +import me.shedaniel.rei.api.EntryRegistry; import me.shedaniel.rei.api.REIPluginEntry; import me.shedaniel.rei.api.RecipeHelper; import net.fabricmc.loader.api.SemanticVersion; @@ -25,9 +25,9 @@ public interface REIPluginV0 extends REIPluginEntry { /** * Registers items on the item panel * - * @param itemRegistry the helper class + * @param entryRegistry the helper class */ - default void registerItems(ItemRegistry itemRegistry) { + default void registerItems(EntryRegistry entryRegistry) { } /** diff --git a/src/main/java/me/shedaniel/rei/client/ConfigObjectImpl.java b/src/main/java/me/shedaniel/rei/client/ConfigObjectImpl.java index 8fac22090..a4f308bca 100644 --- a/src/main/java/me/shedaniel/rei/client/ConfigObjectImpl.java +++ b/src/main/java/me/shedaniel/rei/client/ConfigObjectImpl.java @@ -165,11 +165,11 @@ public class ConfigObjectImpl implements ConfigObject { .withName("registerRecipesInAnotherThread") .build(); - private ConfigValue choosePageDialogPoint = ConfigValue.builder(RelativePoint.class) - .withParent(technical) - .withDefaultValue(new RelativePoint(.5, .5)) - .withName("choosePageDialogPoint") - .build(); + // private ConfigValue choosePageDialogPoint = ConfigValue.builder(RelativePoint.class) + // .withParent(technical) + // .withDefaultValue(new RelativePoint(.5, .5)) + // .withName("choosePageDialogPoint") + // .build(); public ConfigObjectImpl() throws FiberException { @@ -297,11 +297,12 @@ public class ConfigObjectImpl implements ConfigObject { @Override public RelativePoint getChoosePageDialogPoint() { - return choosePageDialogPoint.getValue(); + // return choosePageDialogPoint.getValue(); + return new RelativePoint(.5, .5); } @Override public void setChoosePageDialogPoint(RelativePoint choosePageDialogPoint) { - this.choosePageDialogPoint.setValue(choosePageDialogPoint); + // this.choosePageDialogPoint.setValue(choosePageDialogPoint); } } diff --git a/src/main/java/me/shedaniel/rei/client/EntryRegistryImpl.java b/src/main/java/me/shedaniel/rei/client/EntryRegistryImpl.java new file mode 100644 index 000000000..9e4f72ff3 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/EntryRegistryImpl.java @@ -0,0 +1,66 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.client; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.Entry; +import me.shedaniel.rei.api.EntryRegistry; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.DefaultedList; + +import java.util.Collections; +import java.util.List; +import java.util.TreeSet; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; + +public class EntryRegistryImpl implements EntryRegistry { + + private final CopyOnWriteArrayList entries = Lists.newCopyOnWriteArrayList(); + + @Override + public List getEntryList() { + return Collections.unmodifiableList(entries); + } + + @SuppressWarnings("deprecation") + @Override + public List getModifiableEntryList() { + return entries; + } + + @Override + public ItemStack[] getAllStacksFromItem(Item item) { + DefaultedList list = DefaultedList.create(); + list.add(item.getStackForRender()); + item.appendStacks(item.getGroup(), list); + TreeSet stackSet = list.stream().collect(Collectors.toCollection(() -> new TreeSet((p1, p2) -> ItemStack.areEqualIgnoreDamage(p1, p2) ? 0 : 1))); + return Lists.newArrayList(stackSet).toArray(new ItemStack[0]); + } + + @Override + public void registerItemStack(Item afterItem, ItemStack stack) { + if (!stack.isEmpty() && !alreadyContain(stack)) + if (afterItem == null || afterItem.equals(Items.AIR)) + entries.add(Entry.create(stack)); + else { + int last = entries.size(); + for (int i = 0; i < entries.size(); i++) + if (entries.get(i).getEntryType() == Entry.Type.ITEM && entries.get(i).getItemStack().getItem().equals(afterItem)) + last = i + 1; + entries.add(last, Entry.create(stack)); + } + } + + @Override + public void registerFluid(Fluid fluid) { + entries.add(Entry.create(fluid)); + } + +} diff --git a/src/main/java/me/shedaniel/rei/client/FluidEntry.java b/src/main/java/me/shedaniel/rei/client/FluidEntry.java new file mode 100644 index 000000000..27c37fae2 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/FluidEntry.java @@ -0,0 +1,33 @@ +package me.shedaniel.rei.client; + +import me.shedaniel.rei.api.Entry; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +public class FluidEntry implements Entry { + private Fluid fluid; + + @Deprecated + public FluidEntry(Fluid fluid) { + this.fluid = fluid; + } + + @Override + public Type getEntryType() { + return Type.FLUID; + } + + @Nullable + @Override + public ItemStack getItemStack() { + return null; + } + + @Nullable + @Override + public Fluid getFluid() { + return fluid; + } +} diff --git a/src/main/java/me/shedaniel/rei/client/ItemRegistryImpl.java b/src/main/java/me/shedaniel/rei/client/ItemRegistryImpl.java deleted file mode 100644 index 81bdffad1..000000000 --- a/src/main/java/me/shedaniel/rei/client/ItemRegistryImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.client; - -import com.google.common.collect.Lists; -import me.shedaniel.rei.api.ItemRegistry; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.DefaultedList; - -import java.util.Collections; -import java.util.List; -import java.util.TreeSet; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.stream.Collectors; - -public class ItemRegistryImpl implements ItemRegistry { - - private final CopyOnWriteArrayList itemList = Lists.newCopyOnWriteArrayList(); - - @Override - public List getItemList() { - return Collections.unmodifiableList(itemList); - } - - @SuppressWarnings("deprecation") - @Override - public List getModifiableItemList() { - return itemList; - } - - @Override - public ItemStack[] getAllStacksFromItem(Item item) { - DefaultedList list = DefaultedList.create(); - list.add(item.getStackForRender()); - item.appendStacks(item.getGroup(), list); - TreeSet stackSet = list.stream().collect(Collectors.toCollection(() -> new TreeSet((p1, p2) -> ItemStack.areEqualIgnoreDamage(p1, p2) ? 0 : 1))); - return Lists.newArrayList(stackSet).toArray(new ItemStack[0]); - } - - @Override - public void registerItemStack(Item afterItem, ItemStack stack) { - if (!stack.isEmpty() && !alreadyContain(stack)) - if (afterItem == null || afterItem.equals(Items.AIR)) - itemList.add(stack); - else { - int last = itemList.size(); - for (int i = 0; i < itemList.size(); i++) - if (itemList.get(i).getItem().equals(afterItem)) - last = i + 1; - itemList.add(last, stack); - } - } - -} diff --git a/src/main/java/me/shedaniel/rei/client/ItemStackEntry.java b/src/main/java/me/shedaniel/rei/client/ItemStackEntry.java new file mode 100644 index 000000000..49855fb7d --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/ItemStackEntry.java @@ -0,0 +1,33 @@ +package me.shedaniel.rei.client; + +import me.shedaniel.rei.api.Entry; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +public class ItemStackEntry implements Entry { + private ItemStack itemStack; + + @Deprecated + public ItemStackEntry(ItemStack itemStack) { + this.itemStack = itemStack; + } + + @Override + public Type getEntryType() { + return Type.ITEM; + } + + @Nullable + @Override + public ItemStack getItemStack() { + return itemStack; + } + + @Nullable + @Override + public Fluid getFluid() { + return null; + } +} diff --git a/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java index 74322ce44..92f7299ff 100644 --- a/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java @@ -241,7 +241,7 @@ public class RecipeHelperImpl implements RecipeHelper { }); RoughlyEnoughItemsCore.LOGGER.info("[REI] Loading %d plugins: %s", plugins.size(), plugins.stream().map(REIPluginEntry::getPluginIdentifier).map(Identifier::toString).collect(Collectors.joining(", "))); Collections.reverse(plugins); - RoughlyEnoughItemsCore.getItemRegisterer().getModifiableItemList().clear(); + RoughlyEnoughItemsCore.getEntryRegistry().getModifiableEntryList().clear(); Version reiVersion = FabricLoader.getInstance().getModContainer("roughlyenoughitems").get().getMetadata().getVersion(); if (!(reiVersion instanceof SemanticVersion)) RoughlyEnoughItemsCore.LOGGER.warn("[REI] Roughly Enough Items is not using semantic versioning, will be ignoring plugins' minimum versions!"); @@ -257,7 +257,7 @@ public class RecipeHelperImpl implements RecipeHelper { ((REIPluginV0) plugin).registerRecipeDisplays(this); ((REIPluginV0) plugin).registerBounds(RoughlyEnoughItemsCore.getDisplayHelper()); ((REIPluginV0) plugin).registerOthers(this); - ((REIPluginV0) plugin).registerItems(RoughlyEnoughItemsCore.getItemRegisterer()); + ((REIPluginV0) plugin).registerItems(RoughlyEnoughItemsCore.getEntryRegistry()); } else { throw new IllegalStateException("Invaild Plugin Class!"); } @@ -293,7 +293,7 @@ public class RecipeHelperImpl implements RecipeHelper { ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true); long usedTime = System.currentTimeMillis() - startTime; - RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", RoughlyEnoughItemsCore.getItemRegisterer().getItemList().size(), recipeCount.get(), RoughlyEnoughItemsCore.getDisplayHelper().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime); + RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", RoughlyEnoughItemsCore.getEntryRegistry().getEntryList().size(), recipeCount.get(), RoughlyEnoughItemsCore.getDisplayHelper().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime); } @Override diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 4a9c5258a..d81871eca 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -11,6 +11,7 @@ import me.shedaniel.cloth.api.ClientUtils; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.DisplayHelper; +import me.shedaniel.rei.api.Entry; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.client.RecipeHelperImpl; import me.shedaniel.rei.client.ScreenHelper; @@ -19,8 +20,6 @@ import me.shedaniel.rei.gui.widget.*; import me.shedaniel.rei.listeners.ContainerScreenHooks; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.AbstractParentElement; -import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; @@ -49,7 +48,7 @@ public class ContainerScreenOverlay extends Widget { private static final List QUEUED_TOOLTIPS = Lists.newArrayList(); public static String searchTerm = ""; private static int page = 0; - private static ItemListOverlay itemListOverlay; + private static EntryListOverlay entryListOverlay; private final List widgets = Lists.newLinkedList(); public boolean shouldReInit = false; private Rectangle rectangle; @@ -57,8 +56,8 @@ public class ContainerScreenOverlay extends Widget { private CraftableToggleButtonWidget toggleButtonWidget; private ButtonWidget buttonLeft, buttonRight; - public static ItemListOverlay getItemListOverlay() { - return itemListOverlay; + public static EntryListOverlay getEntryListOverlay() { + return entryListOverlay; } public void init() { @@ -72,8 +71,8 @@ public class ContainerScreenOverlay extends Widget { this.window = MinecraftClient.getInstance().window; DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass()); this.rectangle = RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel() ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen); - widgets.add(itemListOverlay = new ItemListOverlay(page)); - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); + widgets.add(entryListOverlay = new EntryListOverlay(page)); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + 5, 16, 16, new TranslatableText("text.rei.left_arrow")) { @Override @@ -81,7 +80,7 @@ public class ContainerScreenOverlay extends Widget { page--; if (page < 0) page = getTotalPage(); - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); } @Override @@ -100,7 +99,7 @@ public class ContainerScreenOverlay extends Widget { page++; if (page > getTotalPage()) page = 0; - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); } @Override @@ -232,7 +231,7 @@ public class ContainerScreenOverlay extends Widget { public void onLabelClicked() { MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); page = 0; - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); } @Override @@ -248,14 +247,14 @@ public class ContainerScreenOverlay extends Widget { ScreenHelper.searchField.setText(searchTerm); ScreenHelper.searchField.setChangedListener(s -> { searchTerm = s; - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); }); if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isCraftableFilterEnabled()) this.widgets.add(toggleButtonWidget = new CraftableToggleButtonWidget(getCraftableToggleArea()) { @Override public void onPressed() { RoughlyEnoughItemsCore.getConfigManager().toggleCraftableOnly(); - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); } @Override @@ -266,7 +265,7 @@ public class ContainerScreenOverlay extends Widget { }); else toggleButtonWidget = null; - this.itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); + this.entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false); } private Weather getNextWeather() { @@ -358,16 +357,18 @@ public class ContainerScreenOverlay extends Widget { else if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && ((currentStacks.size() != ScreenHelper.inventoryStacks.size()) || !hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks))) { ScreenHelper.inventoryStacks = currentStacks; DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass()); - itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); + entryListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true); } - if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && SearchFieldWidget.isSearching) { + if (SearchFieldWidget.isSearching) { GuiLighting.disable(); blitOffset = 200; - ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen; - int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop(); - for (Slot slot : ((AbstractContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList) - if (!slot.hasStack() || !itemListOverlay.filterItem(slot.getStack(), itemListOverlay.getLastSearchArgument())) - fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400); + if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen) { + 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() || !entryListOverlay.filterEntry(Entry.create(slot.getStack()), entryListOverlay.getLastSearchArgument())) + fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400); + } blitOffset = 0; } GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); @@ -461,7 +462,7 @@ public class ContainerScreenOverlay extends Widget { } private int getTotalPage() { - return itemListOverlay.getTotalPage(); + return entryListOverlay.getTotalPage(); } @Override diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index bfe92d0d0..1863495bc 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -301,7 +301,7 @@ public class RecipeViewingScreen extends Screen { for (List workingStation : workingStations) { preWidgets.add(new SlotWidget(xx, yy, Renderer.fromItemStacks(workingStation), true, true, true) { @Override - protected List getExtraToolTips(ItemStack stack) { + protected List getExtraItemToolTips(ItemStack stack) { return list; } }); diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index 887915a50..1e3af26b3 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -109,7 +109,7 @@ public class VillagerRecipeViewingScreen extends Screen { for (List workingStation : workingStations) { widgets.add(new SlotWidget(xx, yy, Renderer.fromItemStacks(workingStation), true, true, true) { @Override - protected List getExtraToolTips(ItemStack stack) { + protected List getExtraItemToolTips(ItemStack stack) { return list; } }); diff --git a/src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java b/src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java new file mode 100644 index 000000000..2a777afad --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/renderers/FluidRenderer.java @@ -0,0 +1,54 @@ +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.client.ScreenHelper; +import me.shedaniel.rei.gui.widget.EntryListOverlay; +import me.shedaniel.rei.gui.widget.QueuedTooltip; +import net.minecraft.fluid.Fluid; +import net.minecraft.util.registry.Registry; + +import java.util.Collections; +import java.util.List; + +public abstract class FluidRenderer extends Renderer { + 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; + // TODO: Render Fluid + if (drawTooltip && mouseX >= x - 8 && mouseX <= x + 8 && mouseY >= y - 6 && mouseY <= y + 10) + queueTooltip(getFluid(), delta); + this.drawTooltip = false; + } + + protected void queueTooltip(Fluid fluid, float delta) { + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(fluid))); + } + + private List getTooltip(Fluid fluid) { + List toolTip = Lists.newArrayList(EntryListOverlay.tryGetFluidName(fluid)); + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) { + final String modString = ClientHelper.getInstance().getFormattedModFromIdentifier(Registry.FLUID.getId(fluid)); + toolTip.addAll(getExtraToolTips(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 stack) { + 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 index ea39ebcec..c6f0d2f8d 100644 --- a/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java +++ b/src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java @@ -7,10 +7,11 @@ package me.shedaniel.rei.gui.renderers; import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.Renderer; import me.shedaniel.rei.client.ScreenHelper; -import me.shedaniel.rei.gui.widget.ItemListOverlay; +import me.shedaniel.rei.gui.widget.EntryListOverlay; import me.shedaniel.rei.gui.widget.QueuedTooltip; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.GuiLighting; @@ -55,17 +56,19 @@ public abstract class ItemStackRenderer extends Renderer { } protected List getTooltip(ItemStack itemStack) { - final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem()); - List toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true)); - toolTip.addAll(getExtraToolTips(itemStack)); - boolean alreadyHasMod = false; - for (String s : toolTip) - if (s.equalsIgnoreCase(modString)) { - alreadyHasMod = true; - break; - } - if (!alreadyHasMod) - toolTip.add(modString); + List toolTip = Lists.newArrayList(EntryListOverlay.tryGetItemStackToolTip(itemStack, true)); + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) { + final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem()); + toolTip.addAll(getExtraToolTips(itemStack)); + boolean alreadyHasMod = false; + for (String s : toolTip) + if (s.equalsIgnoreCase(modString)) { + alreadyHasMod = true; + break; + } + if (!alreadyHasMod) + toolTip.add(modString); + } return toolTip; } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListOverlay.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListOverlay.java new file mode 100644 index 000000000..ed3c10b0b --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListOverlay.java @@ -0,0 +1,383 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.widget; + +import com.google.common.collect.Lists; +import me.shedaniel.cloth.api.ClientUtils; +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import me.shedaniel.rei.api.*; +import me.shedaniel.rei.client.ScreenHelper; +import me.shedaniel.rei.client.SearchArgument; +import me.shedaniel.rei.gui.config.ItemCheatingMode; +import me.shedaniel.rei.gui.config.ItemListOrdering; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.registry.Registry; +import org.apache.commons.lang3.StringUtils; + +import java.awt.*; +import java.util.List; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class EntryListOverlay extends Widget { + + private static final String SPACE = " ", EMPTY = ""; + private static final Comparator ASCENDING_COMPARATOR; + private static List searchBlacklisted = Lists.newArrayList(); + + static { + ASCENDING_COMPARATOR = (entry, entry1) -> { + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.name)) + return tryGetEntryName(entry).compareToIgnoreCase(tryGetEntryName(entry1)); + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.item_groups)) { + if (entry.getEntryType() == Entry.Type.ITEM && entry1.getEntryType() == Entry.Type.ITEM) { + ItemStack stack0 = entry.getItemStack(); + ItemStack stack1 = entry1.getItemStack(); + List itemGroups = Arrays.asList(ItemGroup.GROUPS); + return itemGroups.indexOf(stack0.getItem().getGroup()) - itemGroups.indexOf(stack1.getItem().getGroup()); + } + } + return 0; + }; + } + + private final List lastSearchArgument; + private List currentDisplayed; + private List widgets; + private int width, height, page; + private Rectangle rectangle, listArea; + + public EntryListOverlay(int page) { + this.currentDisplayed = Lists.newArrayList(); + this.width = 0; + this.height = 0; + this.page = page; + this.lastSearchArgument = Lists.newArrayList(); + } + + public static List tryGetItemStackToolTip(ItemStack itemStack, boolean careAboutAdvanced) { + if (!searchBlacklisted.contains(itemStack.getItem())) + try { + return itemStack.getTooltip(MinecraftClient.getInstance().player, MinecraftClient.getInstance().options.advancedItemTooltips && careAboutAdvanced ? TooltipContext.Default.ADVANCED : TooltipContext.Default.NORMAL).stream().map(Text::asFormattedString).collect(Collectors.toList()); + } catch (Throwable e) { + e.printStackTrace(); + searchBlacklisted.add(itemStack.getItem()); + } + return Collections.singletonList(tryGetItemStackName(itemStack)); + } + + public static String tryGetEntryName(Entry stack) { + if (stack.getEntryType() == Entry.Type.ITEM) + return tryGetItemStackName(stack.getItemStack()); + else if (stack.getEntryType() == Entry.Type.FLUID) + return tryGetFluidName(stack.getFluid()); + return ""; + } + + public static String tryGetFluidName(Fluid fluid) { + return Stream.of(Registry.FLUID.getId(fluid).getPath().split("_")).map(StringUtils::capitalize).collect(Collectors.joining(" ")); + } + + public static String tryGetItemStackName(ItemStack stack) { + if (!searchBlacklisted.contains(stack.getItem())) + try { + return stack.getName().asFormattedString(); + } catch (Throwable e) { + e.printStackTrace(); + searchBlacklisted.add(stack.getItem()); + } + try { + return I18n.translate("item." + Registry.ITEM.getId(stack.getItem()).toString().replace(":", ".")); + } catch (Throwable e) { + e.printStackTrace(); + } + return "ERROR"; + } + + public static boolean filterEntry(Entry entry, List arguments) { + if (arguments.isEmpty()) + return true; + AtomicReference mod = new AtomicReference<>(), tooltips = new AtomicReference<>(), name = new AtomicReference<>(); + for (SearchArgument[] arguments1 : arguments) { + boolean b = true; + 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())) { + b = false; + break; + } + if (argument.getArgumentType() == SearchArgument.ArgumentType.TOOLTIP) + if (argument.getFunction(!argument.isInclude()).apply(fillTooltip(entry, tooltips).get())) { + b = false; + break; + } + if (argument.getArgumentType() == SearchArgument.ArgumentType.TEXT) + if (argument.getFunction(!argument.isInclude()).apply(fillName(entry, name).get())) { + b = false; + break; + } + } + if (b) + return true; + } + 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)); + return mod; + } + + private static AtomicReference fillTooltip(Entry entry, AtomicReference mod) { + if (mod.get() == null) + if (entry.getEntryType() == Entry.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)); + return mod; + } + + private static AtomicReference fillName(Entry 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)); + return mod; + } + + public int getFullTotalSlotsPerPage() { + return width * height; + } + + @Override + public void render(int int_1, int int_2, float float_1) { + GuiLighting.disable(); + widgets.forEach(widget -> widget.render(int_1, int_2, float_1)); + ClientPlayerEntity player = minecraft.player; + if (rectangle.contains(ClientUtils.getMouseLocation()) && ClientHelper.getInstance().isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.delete_items"))); + } + + public void updateList(DisplayHelper.DisplayBoundsHandler boundsHandler, Rectangle rectangle, int page, String searchTerm, boolean processSearchTerm) { + this.rectangle = rectangle; + this.page = page; + this.widgets = Lists.newLinkedList(); + calculateListSize(rectangle); + if (currentDisplayed.isEmpty() || processSearchTerm) + currentDisplayed = processSearchTerm(searchTerm, RoughlyEnoughItemsCore.getEntryRegistry().getEntryList(), new ArrayList<>(ScreenHelper.inventoryStacks)); + int startX = (int) rectangle.getCenterX() - width * 9; + int startY = (int) rectangle.getCenterY() - height * 9; + this.listArea = new Rectangle((int) startX, (int) startY, width * 18, height * 18); + int fitSlotsPerPage = getTotalFitSlotsPerPage(startX, startY, listArea); + int j = page * fitSlotsPerPage; + for (int yy = 0; yy < height; yy++) { + for (int xx = 0; xx < width; xx++) { + int x = startX + xx * 18, y = startY + yy * 18; + if (!canBeFit(x, y, listArea)) + continue; + j++; + if (j > currentDisplayed.size()) + break; + final Entry entry = currentDisplayed.get(j - 1); + widgets.add(new SlotWidget(x, y, entry.getEntryType() == Entry.Type.ITEM ? Renderer.fromItemStackNoCounts(entry.getItemStack()) : Renderer.fromFluid(entry.getFluid()), false, true, true) { + @Override + protected void queueTooltip(ItemStack itemStack, float delta) { + ClientPlayerEntity player = minecraft.player; + if (!ClientHelper.getInstance().isCheating() || player.inventory.getCursorStack().isEmpty()) + super.queueTooltip(itemStack, delta); + } + + @Override + protected List getExtraFluidToolTips(Fluid fluid) { + if (MinecraftClient.getInstance().options.advancedItemTooltips) + return Collections.singletonList("ยง8" + Registry.FLUID.getId(fluid).toString()); + return super.getExtraFluidToolTips(fluid); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (isCurrentRendererItem() && containsMouse(mouseX, mouseY)) { + if (ClientHelper.getInstance().isCheating()) { + if (getCurrentItemStack() != null && !getCurrentItemStack().isEmpty()) { + ItemStack cheatedStack = getCurrentItemStack().copy(); + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.REI_LIKE) + cheatedStack.setCount(button != 1 ? 1 : cheatedStack.getMaxCount()); + else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemCheatingMode() == ItemCheatingMode.JEI_LIKE) + cheatedStack.setCount(button != 0 ? 1 : cheatedStack.getMaxCount()); + else + cheatedStack.setCount(1); + return ClientHelper.getInstance().tryCheatingStack(cheatedStack); + } + } else if (button == 0) + return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack().copy()); + else if (button == 1) + return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack().copy()); + } + return false; + } + }); + } + if (j > currentDisplayed.size()) + break; + } + } + + public int getTotalPage() { + int fitSlotsPerPage = getTotalFitSlotsPerPage(listArea.x, listArea.y, listArea); + if (fitSlotsPerPage > 0) + return MathHelper.ceil(getCurrentDisplayed().size() / fitSlotsPerPage); + return 0; + } + + public int getTotalFitSlotsPerPage(int startX, int startY, Rectangle listArea) { + int slots = 0; + for (int x = 0; x < width; x++) + for (int y = 0; y < height; y++) + if (canBeFit(startX + x * 18, startY + y * 18, listArea)) + slots++; + return slots; + } + + public boolean canBeFit(int left, int top, Rectangle listArea) { + for (DisplayHelper.DisplayBoundsHandler sortedBoundsHandler : RoughlyEnoughItemsCore.getDisplayHelper().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) { + ActionResult fit = sortedBoundsHandler.canItemSlotWidgetFit(!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLeftHandSidePanel(), left, top, minecraft.currentScreen, listArea); + if (fit != ActionResult.PASS) + return fit == ActionResult.SUCCESS; + } + return true; + } + + @Override + public boolean keyPressed(int int_1, int int_2, int int_3) { + for (Widget widget : widgets) + if (widget.keyPressed(int_1, int_2, int_3)) + return true; + return false; + } + + public Rectangle getListArea() { + return listArea; + } + + public List getCurrentDisplayed() { + return currentDisplayed; + } + + private List processSearchTerm(String searchTerm, List ol, List inventoryItems) { + lastSearchArgument.clear(); + 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()) + Collections.reverse(os); + String[] splitSearchTerm = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|"); + Arrays.stream(splitSearchTerm).forEachOrdered(s -> { + String[] split = StringUtils.split(s); + SearchArgument[] arguments = new SearchArgument[split.length]; + for (int i = 0; i < split.length; i++) { + String s1 = split[i]; + if (s1.startsWith("@-") || s1.startsWith("-@")) + arguments[i] = new SearchArgument(SearchArgument.ArgumentType.MOD, s1.substring(2), false); + else if (s1.startsWith("@")) + arguments[i] = new SearchArgument(SearchArgument.ArgumentType.MOD, s1.substring(1), true); + else if (s1.startsWith("#-") || s1.startsWith("-#")) + arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s1.substring(2), false); + else if (s1.startsWith("#")) + arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s1.substring(1), true); + else if (s1.startsWith("-")) + arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TEXT, s1.substring(1), false); + else + arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TEXT, s1, true); + } + if (arguments.length > 0) + lastSearchArgument.add(arguments); + else + lastSearchArgument.add(new SearchArgument[]{SearchArgument.ALWAYS}); + }); + 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.newArrayList(); + for (ItemStack workingItem : workingItems) { + Optional any = stacks.stream().filter(i -> i.getItemStack() != null && i.getItemStack().isItemEqualIgnoreDamage(workingItem)).findAny(); + // if (stacks.stream().anyMatch(i -> i.getItemStack() != null && i.getItemStack().isItemEqualIgnoreDamage(workingItem))) + // newList.add(Entry.create(workingItem)); + if (any.isPresent()) + newList.add(any.get()); + } + return newList; + } + + public List getLastSearchArgument() { + return lastSearchArgument; + } + + public void calculateListSize(Rectangle rect) { + int xOffset = 0, yOffset = 0; + width = 0; + height = 0; + while (true) { + xOffset += 18; + if (height == 0) + width++; + if (xOffset + 19 > rect.width) { + xOffset = 0; + yOffset += 18; + height++; + } + if (yOffset + 19 > rect.height) + break; + } + } + + @Override + public boolean mouseClicked(double double_1, double double_2, int int_1) { + if (rectangle.contains(double_1, double_2)) { + ClientPlayerEntity player = minecraft.player; + if (ClientHelper.getInstance().isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) { + ClientHelper.getInstance().sendDeletePacket(); + return true; + } + if (!player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) + return false; + for (Widget widget : children()) + if (widget.mouseClicked(double_1, double_2, int_1)) + return true; + } + return false; + } + + @Override + public List children() { + return widgets; + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java deleted file mode 100644 index f417b87dc..000000000 --- a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.gui.widget; - -import com.google.common.collect.Lists; -import me.shedaniel.cloth.api.ClientUtils; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.ClientHelper; -import me.shedaniel.rei.api.DisplayHelper; -import me.shedaniel.rei.api.RecipeHelper; -import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.client.ScreenHelper; -import me.shedaniel.rei.client.SearchArgument; -import me.shedaniel.rei.gui.config.ItemCheatingMode; -import me.shedaniel.rei.gui.config.ItemListOrdering; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.GuiLighting; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; -import org.apache.commons.lang3.StringUtils; - -import java.awt.*; -import java.util.List; -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; - -public class ItemListOverlay extends Widget { - - private static final String SPACE = " ", EMPTY = ""; - private static final Comparator ASCENDING_COMPARATOR; - private static List searchBlacklisted = Lists.newArrayList(); - - static { - ASCENDING_COMPARATOR = (itemStack, t1) -> { - if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.name)) - return tryGetItemStackName(itemStack).compareToIgnoreCase(tryGetItemStackName(t1)); - if (RoughlyEnoughItemsCore.getConfigManager().getConfig().getItemListOrdering().equals(ItemListOrdering.item_groups)) { - List itemGroups = Arrays.asList(ItemGroup.GROUPS); - return itemGroups.indexOf(itemStack.getItem().getGroup()) - itemGroups.indexOf(t1.getItem().getGroup()); - } - return 0; - }; - } - - private final List lastSearchArgument; - private List currentDisplayed; - private List widgets; - private int width, height, page; - private Rectangle rectangle, listArea; - - public ItemListOverlay(int page) { - this.currentDisplayed = Lists.newArrayList(); - this.width = 0; - this.height = 0; - this.page = page; - this.lastSearchArgument = Lists.newArrayList(); - } - - public static List tryGetItemStackToolTip(ItemStack itemStack, boolean careAboutAdvanced) { - if (!searchBlacklisted.contains(itemStack.getItem())) - try { - return itemStack.getTooltip(MinecraftClient.getInstance().player, MinecraftClient.getInstance().options.advancedItemTooltips && careAboutAdvanced ? TooltipContext.Default.ADVANCED : TooltipContext.Default.NORMAL).stream().map(Text::asFormattedString).collect(Collectors.toList()); - } catch (Throwable e) { - e.printStackTrace(); - searchBlacklisted.add(itemStack.getItem()); - } - return Collections.singletonList(tryGetItemStackName(itemStack)); - } - - public static String tryGetItemStackName(ItemStack stack) { - if (!searchBlacklisted.contains(stack.getItem())) - try { - return stack.getName().asFormattedString(); - } catch (Throwable e) { - e.printStackTrace(); - searchBlacklisted.add(stack.getItem()); - } - try { - return I18n.translate("item." + Registry.ITEM.getId(stack.getItem()).toString().replace(":", ".")); - } catch (Throwable e) { - e.printStackTrace(); - } - return "ERROR"; - } - - public static boolean filterItem(ItemStack itemStack, List arguments) { - if (arguments.isEmpty()) - return true; - AtomicReference mod = null, tooltips = null, name = null; - for (SearchArgument[] arguments1 : arguments) { - boolean b = true; - for (SearchArgument argument : arguments1) { - if (argument.getArgumentType().equals(SearchArgument.ArgumentType.ALWAYS)) - return true; - if (argument.getArgumentType().equals(SearchArgument.ArgumentType.MOD)) - if (argument.getFunction(!argument.isInclude()).apply(fillMod(it