Unknown vor 6 Jahren
Ursprung
Commit
2890656836

+ 2 - 0
CHANGELOG.md

@@ -1,4 +1,6 @@
 View full changelog [here](https://github.com/shedaniel/RoughlyEnoughItems/blob/1.14/CHANGELOG.md).
+## v2.9-beta+build.108 (BETA)
+- Fixed [#88](https://github.com/shedaniel/RoughlyEnoughItems/issues/88): Stupid Item Search
 ## v2.9-beta+build.107 (BETA)
 - Fixed: Crashing when clicking tabs
 - Added: Buttons to switch category page

+ 3 - 1
src/main/java/me/shedaniel/rei/client/SearchArgument.java

@@ -11,6 +11,7 @@ public class SearchArgument {
     private String text;
     private boolean include;
     private Pattern pattern;
+    public static final SearchArgument ALWAYS = new SearchArgument(ArgumentType.ALWAYS, "", true);
     
     public SearchArgument(ArgumentType argumentType, String text, boolean include) {
         this(argumentType, text, include, true);
@@ -46,7 +47,8 @@ public class SearchArgument {
     public enum ArgumentType {
         TEXT,
         MOD,
-        TOOLTIP
+        TOOLTIP,
+        ALWAYS
     }
     
 }

+ 6 - 4
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -9,6 +9,7 @@ import me.shedaniel.rei.api.DisplayHelper;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.Weather;
 import me.shedaniel.rei.gui.widget.*;
+import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.font.TextRenderer;
@@ -338,12 +339,13 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
             itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         }
-        if (SearchFieldWidget.isSearching) {
+        if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen && SearchFieldWidget.isSearching) {
             GuiLighting.disable();
             blitOffset = 200;
-            int left = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft(), top = ScreenHelper.getLastContainerScreenHooks().rei_getContainerTop();
-            for(Slot slot : ScreenHelper.getLastContainerScreen().getContainer().slotList)
-                if (!slot.hasStack() || !itemListOverlay.getCurrentDisplayed().stream().anyMatch(stack -> stack.isEqualIgnoreTags(slot.getStack())))
+            ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
+            int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop();
+            for(Slot slot : ((ContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
+                if (!slot.hasStack() || !itemListOverlay.filterItem(slot.getStack(), itemListOverlay.getLastSearchArgument()))
                     fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
             blitOffset = 0;
         }

+ 69 - 26
src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java

@@ -27,14 +27,32 @@ import org.apache.commons.lang3.StringUtils;
 import java.awt.*;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
 public class ItemListOverlay extends Widget {
     
     private static final String SPACE = " ", EMPTY = "";
+    private static final Comparator<ItemStack> ASCENDING_COMPARATOR;
+    private static final Comparator<ItemStack> DECENDING_COMPARATOR;
     private static List<Item> searchBlacklisted = Lists.newArrayList();
+    
+    static {
+        ASCENDING_COMPARATOR = (itemStack, t1) -> {
+            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering.equals(ItemListOrdering.name))
+                return tryGetItemStackName(itemStack).compareToIgnoreCase(tryGetItemStackName(t1));
+            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering.equals(ItemListOrdering.item_groups)) {
+                List<ItemGroup> itemGroups = Arrays.asList(ItemGroup.GROUPS);
+                return itemGroups.indexOf(itemStack.getItem().getItemGroup()) - itemGroups.indexOf(t1.getItem().getItemGroup());
+            }
+            return 0;
+        };
+        DECENDING_COMPARATOR = ASCENDING_COMPARATOR.reversed();
+    }
+    
     private final List<ItemStack> currentDisplayed;
+    private final List<SearchArgument[]> lastSearchArgument;
     private List<Widget> widgets;
     private int width, height, page;
     private Rectangle rectangle, listArea;
@@ -44,6 +62,7 @@ public class ItemListOverlay extends Widget {
         this.width = 0;
         this.height = 0;
         this.page = page;
+        this.lastSearchArgument = Lists.newArrayList();
     }
     
     public static List<String> tryGetItemStackToolTip(ItemStack itemStack, boolean careAboutAdvanced) {
@@ -186,20 +205,13 @@ public class ItemListOverlay extends Widget {
     }
     
     private List<ItemStack> processSearchTerm(String searchTerm, List<ItemStack> ol, List<ItemStack> inventoryItems) {
-        List<ItemStack> os = Lists.newArrayList(ol), stacks = Lists.newArrayList(), finalStacks = Lists.newArrayList();
-        List<ItemGroup> itemGroups = Lists.newArrayList(ItemGroup.GROUPS);
-        itemGroups.add(null);
-        ItemListOrdering ordering = RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering;
-        if (ordering != ItemListOrdering.registry)
-            Collections.sort(os, (itemStack, t1) -> {
-                if (ordering.equals(ItemListOrdering.name))
-                    return tryGetItemStackName(itemStack).compareToIgnoreCase(tryGetItemStackName(t1));
-                if (ordering.equals(ItemListOrdering.item_groups))
-                    return itemGroups.indexOf(itemStack.getItem().getItemGroup()) - itemGroups.indexOf(t1.getItem().getItemGroup());
-                return 0;
-            });
-        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending)
-            Collections.reverse(os);
+        lastSearchArgument.clear();
+        List<ItemStack> os = Lists.newArrayList(ol), stacks = Lists.newArrayList();
+        if (RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering != ItemListOrdering.registry)
+            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending)
+                os.sort(ASCENDING_COMPARATOR);
+            else
+                os.sort(DECENDING_COMPARATOR);
         String[] splitSearchTerm = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|");
         Arrays.stream(splitSearchTerm).forEachOrdered(s -> {
             String[] split = StringUtils.split(s);
@@ -219,25 +231,56 @@ public class ItemListOverlay extends Widget {
                 else
                     arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TEXT, s1, true);
             }
-            os.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
+            if (arguments.length > 0)
+                lastSearchArgument.add(arguments);
+            else lastSearchArgument.add(new SearchArgument[]{SearchArgument.ALWAYS});
         });
-        if (splitSearchTerm.length == 0)
-            stacks.addAll(os);
+        os.stream().filter(itemStack -> filterItem(itemStack, lastSearchArgument)).forEachOrdered(stacks::add);
         List<ItemStack> workingItems = RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && !stacks.isEmpty() && !inventoryItems.isEmpty() ? Lists.newArrayList() : Lists.newArrayList(ol);
         if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled()) {
             RecipeHelper.getInstance().findCraftableByItems(inventoryItems).forEach(workingItems::add);
             workingItems.addAll(inventoryItems);
         }
         if (!RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled())
-            finalStacks.addAll(stacks.stream().distinct().collect(Collectors.toList()));
-        else
-            finalStacks.addAll(stacks.stream().filter(itemStack -> {
-                for(ItemStack workingItem : workingItems)
-                    if (itemStack.isEqualIgnoreTags(workingItem))
-                        return true;
-                return false;
-            }).distinct().collect(Collectors.toList()));
-        return finalStacks;
+            return stacks;
+        return stacks.stream().filter(itemStack -> workingItems.stream().anyMatch(stack -> stack.isEqualIgnoreTags(itemStack))).collect(Collectors.toList());
+    }
+    
+    public List<SearchArgument[]> getLastSearchArgument() {
+        return lastSearchArgument;
+    }
+    
+    public boolean filterItem(ItemStack itemStack, List<SearchArgument[]> arguments) {
+        if (arguments.isEmpty())
+            return true;
+        String mod = ClientHelper.getInstance().getModFromItem(itemStack.getItem()).toLowerCase();
+        String tooltips = tryGetItemStackToolTip(itemStack, false).stream().skip(1).collect(Collectors.joining("")).replace(SPACE, EMPTY).toLowerCase();
+        String name = tryGetItemStackName(itemStack).replace(SPACE, EMPTY).toLowerCase();
+        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 (SearchArgument.getFunction(!argument.isInclude()).apply(mod.indexOf(argument.getText()))) {
+                        b = false;
+                        break;
+                    }
+                if (argument.getArgumentType().equals(SearchArgument.ArgumentType.TOOLTIP))
+                    if (SearchArgument.getFunction(!argument.isInclude()).apply(tooltips.indexOf(argument.getText()))) {
+                        b = false;
+                        break;
+                    }
+                if (argument.getArgumentType().equals(SearchArgument.ArgumentType.TEXT))
+                    if (SearchArgument.getFunction(!argument.isInclude()).apply(name.indexOf(argument.getText()))) {
+                        b = false;
+                        break;
+                    }
+            }
+            if (b)
+                return true;
+        }
+        return false;
     }
     
     private boolean filterItem(ItemStack itemStack, SearchArgument... arguments) {

+ 1 - 0
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -108,6 +108,7 @@
   "tooltip.rei.config.max_recipes_per_page": "Declares the maximum possible displayed recipes:\nValues: 2 - 99\n \nDefaulted: 3",
   "tooltip.rei.config.light_gray_recipe_border": "Declares the appearance of the recipe border:\nYes: Light Gray\nNo: Hard Black\n \nDefaulted: No",
   "tooltip.rei.config.april_fools.2019": "Forcefully enables the 2019 april fools joke:\nValues: Yes / No\n \nDefaulted: No",
+
   "_comment": "Don't change / translate the credit down below if you are doing it :)",
   "text.rei.credit.text": "§lRoughly Enough Items\n§7Originally a fork for Almost Enough Items.\n\n§lDevelopers\n  - Originally by ZenDarva\n  - Created by Danielshe\n  - Plugin Support by TehNut\n\n§lLanguage Translation\n  English - Danielshe\n  Simplified Chinese - XuyuEre & Danielshe\n  Traditional Chinese - hugoalh, gxy17886 & Danielshe\n  French - Yanis48\n  German - MelanX\n  Estonian - Madis0\n  Portuguese - thiagokenis\n  LOLCAT - Danielshe\n  Upside Down - Danielshe\n  Brazilian Portuguese - thiagokenis\n  Bulgarian - geniiii\n\n§lLicense\n§7Roughly Enough Items is using MIT."
 }