Unknown 6 年之前
父节点
当前提交
01c1ea5478

+ 2 - 0
CHANGELOG.md

@@ -1,4 +1,6 @@
 View full changelog [here](https://github.com/shedaniel/RoughlyEnoughItems/blob/1.14/CHANGELOG.md).
+## v2.7.10.96
+- Fixed [#69](https://github.com/shedaniel/RoughlyEnoughItems/issues/67): Weird Search Field
 ## v2.7.10.95
 - Fixed [#67](https://github.com/shedaniel/RoughlyEnoughItems/issues/67): Item Panel Crashes
 ## v2.7.9.94

+ 1 - 1
gradle.properties

@@ -1,4 +1,4 @@
-mod_version=2.7.10+build.95
+mod_version=2.7.10+build.96
 minecraft_version=1.14 Pre-Release 4
 yarn_version=1.14 Pre-Release 4+build.2
 fabric_version=0.2.7+build.123

+ 8 - 0
src/main/java/me/shedaniel/rei/client/SearchArgument.java

@@ -1,7 +1,11 @@
 package me.shedaniel.rei.client;
 
+import java.util.function.Function;
+
 public class SearchArgument {
     
+    public static final Function<Integer, Boolean> INCLUDE = integer -> integer > -1;
+    public static final Function<Integer, Boolean> NOT_INCLUDE = integer -> !INCLUDE.apply(integer);
     private ArgumentType argumentType;
     private String text;
     private boolean include;
@@ -12,6 +16,10 @@ public class SearchArgument {
         this.include = include;
     }
     
+    public static Function<Integer, Boolean> getFunction(boolean include) {
+        return include ? SearchArgument.INCLUDE : SearchArgument.NOT_INCLUDE;
+    }
+    
     public ArgumentType getArgumentType() {
         return argumentType;
     }

+ 43 - 49
src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java

@@ -11,19 +11,23 @@ import me.shedaniel.rei.client.ItemListOrdering;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.SearchArgument;
 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.TextComponent;
 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.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -42,10 +46,10 @@ public class ItemListOverlay extends Widget {
         this.page = page;
     }
     
-    public static List<String> tryGetItemStackToolTip(ItemStack itemStack) {
+    public static List<String> tryGetItemStackToolTip(ItemStack itemStack, boolean careAboutAdvanced) {
         if (!searchBlacklisted.contains(itemStack.getItem()))
             try {
-                return MinecraftClient.getInstance().currentScreen.getTooltipFromItem(itemStack);
+                return itemStack.getTooltipText(MinecraftClient.getInstance().player, MinecraftClient.getInstance().options.advancedItemTooltips && careAboutAdvanced ? TooltipContext.Default.ADVANCED : TooltipContext.Default.NORMAL).stream().map(TextComponent::getFormattedText).collect(Collectors.toList());
             } catch (Throwable e) {
                 e.printStackTrace();
                 searchBlacklisted.add(itemStack.getItem());
@@ -95,12 +99,12 @@ public class ItemListOverlay extends Widget {
         int j = page * fitSlotsPerPage;
         for(int i = 0; i < getFullTotalSlotsPerPage(); i++) {
             j++;
-            if (j >= currentDisplayed.size())
+            if (j > currentDisplayed.size())
                 break;
             int x = startX + (i % width) * 18, y = startY + MathHelper.floor(i / width) * 18;
             if (!canBeFit(x, y, listArea))
                 continue;
-            widgets.add(new ItemSlotWidget(x, y, Collections.singletonList(currentDisplayed.get(j)), false, true, true) {
+            widgets.add(new ItemSlotWidget(x, y, Collections.singletonList(currentDisplayed.get(j - 1)), false, true, true) {
                 @Override
                 protected void queueTooltip(ItemStack itemStack, float delta) {
                     ClientPlayerEntity player = minecraft.player;
@@ -179,7 +183,7 @@ public class ItemListOverlay extends Widget {
     
     private List<ItemStack> processSearchTerm(String searchTerm, List<ItemStack> ol, List<ItemStack> inventoryItems) {
         List<ItemStack> os = new LinkedList<>(ol), stacks = Lists.newArrayList(), finalStacks = Lists.newArrayList();
-        List<ItemGroup> itemGroups = new LinkedList<>(Arrays.asList(ItemGroup.GROUPS));
+        List<ItemGroup> itemGroups = Lists.newArrayList(ItemGroup.GROUPS);
         itemGroups.add(null);
         ItemListOrdering ordering = RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering;
         if (ordering != ItemListOrdering.registry)
@@ -194,67 +198,57 @@ public class ItemListOverlay extends Widget {
             Collections.reverse(os);
         String[] splitSearchTerm = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|");
         Arrays.stream(splitSearchTerm).forEachOrdered(s -> {
-            List<SearchArgument> arguments = Lists.newArrayList();
-            Arrays.stream(StringUtils.split(s)).forEachOrdered(s1 -> {
+            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.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s1.substring(2), false));
+                    arguments[i] = new SearchArgument(SearchArgument.ArgumentType.MOD, s1.substring(2), false);
                 else if (s1.startsWith("@"))
-                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s1.substring(1), true));
+                    arguments[i] = new SearchArgument(SearchArgument.ArgumentType.MOD, s1.substring(1), true);
                 else if (s1.startsWith("#-") || s1.startsWith("-#"))
-                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s1.substring(2), false));
+                    arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s1.substring(2), false);
                 else if (s1.startsWith("#"))
-                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s1.substring(1), true));
+                    arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s1.substring(1), true);
                 else if (s1.startsWith("-"))
-                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s1.substring(1), false));
+                    arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TEXT, s1.substring(1), false);
                 else
-                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s1, true));
-            });
-            os.stream().filter(itemStack -> arguments.isEmpty() || filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
+                    arguments[i] = new SearchArgument(SearchArgument.ArgumentType.TEXT, s1, true);
+            }
+            os.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
         });
         if (splitSearchTerm.length == 0)
             stacks.addAll(os);
-        List<ItemStack> workingItems = RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && inventoryItems.size() > 0 ? new ArrayList<>() : new LinkedList<>(ol);
+        List<ItemStack> workingItems = RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && inventoryItems.size() > 0 ? Lists.newArrayList() : Collections.unmodifiableList(ol);
         if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled()) {
             RecipeHelper.getInstance().findCraftableByItems(inventoryItems).forEach(workingItems::add);
             workingItems.addAll(inventoryItems);
         }
-        final List<ItemStack> finalWorkingItems = workingItems;
-        finalStacks.addAll(stacks.stream().filter(itemStack -> {
-            if (!RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled())
-                return true;
-            for(ItemStack workingItem : finalWorkingItems)
-                if (itemStack.isEqualIgnoreTags(workingItem))
-                    return true;
-            return false;
-        }).distinct().collect(Collectors.toList()));
+        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;
     }
     
-    private boolean filterItem(ItemStack itemStack, List<SearchArgument> arguments) {
-        String mod = ClientHelper.getModFromItem(itemStack.getItem());
-        List<String> toolTipsList = tryGetItemStackToolTip(itemStack);
-        String toolTipsMixed = toolTipsList.stream().skip(1).collect(Collectors.joining()).toLowerCase();
-        String allMixed = toolTipsList.stream().collect(Collectors.joining()).toLowerCase();
-        for(SearchArgument searchArgument : arguments.stream().filter(searchArgument -> !searchArgument.isInclude()).collect(Collectors.toList())) {
-            if (searchArgument.getArgumentType().equals(SearchArgument.ArgumentType.MOD))
-                if (mod.toLowerCase().contains(searchArgument.getText().toLowerCase()))
-                    return false;
-            if (searchArgument.getArgumentType().equals(SearchArgument.ArgumentType.TOOLTIP))
-                if (toolTipsMixed.contains(searchArgument.getText().toLowerCase()))
-                    return false;
-            if (searchArgument.getArgumentType().equals(SearchArgument.ArgumentType.TEXT))
-                if (allMixed.contains(searchArgument.getText().toLowerCase()))
-                    return false;
-        }
-        for(SearchArgument searchArgument : arguments.stream().filter(SearchArgument::isInclude).collect(Collectors.toList())) {
-            if (searchArgument.getArgumentType().equals(SearchArgument.ArgumentType.MOD))
-                if (!mod.toLowerCase().contains(searchArgument.getText().toLowerCase()))
+    private boolean filterItem(ItemStack itemStack, SearchArgument... arguments) {
+        String mod = ClientHelper.getModFromItem(itemStack.getItem()).toLowerCase();
+        String tooltips = tryGetItemStackToolTip(itemStack, false).stream().skip(1).collect(Collectors.joining("")).replaceAll(" ", "").toLowerCase();
+        String name = tryGetItemStackName(itemStack).replaceAll(" ", "").toLowerCase();
+        for(SearchArgument argument : arguments) {
+            if (argument.getArgumentType().equals(SearchArgument.ArgumentType.MOD))
+                if (SearchArgument.getFunction(!argument.isInclude()).apply(mod.indexOf(argument.getText().toLowerCase())))
                     return false;
-            if (searchArgument.getArgumentType().equals(SearchArgument.ArgumentType.TOOLTIP))
-                if (!toolTipsMixed.contains(searchArgument.getText().toLowerCase()))
+            if (argument.getArgumentType().equals(SearchArgument.ArgumentType.TOOLTIP))
+                if (SearchArgument.getFunction(!argument.isInclude()).apply(tooltips.indexOf(argument.getText().toLowerCase())))
                     return false;
-            if (searchArgument.getArgumentType().equals(SearchArgument.ArgumentType.TEXT))
-                if (!allMixed.contains(searchArgument.getText().toLowerCase()))
+            if (argument.getArgumentType().equals(SearchArgument.ArgumentType.TEXT))
+                if (SearchArgument.getFunction(!argument.isInclude()).apply(name.indexOf(argument.getText().toLowerCase())))
                     return false;
         }
         return true;

+ 2 - 2
src/main/java/me/shedaniel/rei/gui/widget/ItemSlotWidget.java

@@ -95,10 +95,10 @@ public class ItemSlotWidget extends HighlightableWidget {
     
     protected List<String> getTooltip(ItemStack itemStack) {
         final String modString = ClientHelper.getFormattedModFromItem(itemStack.getItem());
-        List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack));
+        List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true));
         toolTip.addAll(getExtraToolTips(itemStack));
         boolean alreadyHasMod = false;
-        for(String s : Lists.newArrayList(toolTip))
+        for(String s : toolTip)
             if (s.equalsIgnoreCase(modString)) {
                 alreadyHasMod = true;
                 break;