diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-26 18:49:04 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-26 18:49:04 +0800 |
| commit | 659027baa60c56b5aeab38d4f7c676c37857ec68 (patch) | |
| tree | 3f2e80521f4c999505eea7dd54503eccc9ec42a9 | |
| parent | 02d1d95dd54285cc1237d1b5016401274a5ae5f0 (diff) | |
| download | RoughlyEnoughItems-659027baa60c56b5aeab38d4f7c676c37857ec68.tar.gz RoughlyEnoughItems-659027baa60c56b5aeab38d4f7c676c37857ec68.tar.bz2 RoughlyEnoughItems-659027baa60c56b5aeab38d4f7c676c37857ec68.zip | |
Improve Search Argument Matching
Signed-off-by: shedaniel <daniel@shedaniel.me>
21 files changed, 156 insertions, 96 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java index 14cbcaa04..9ee60c5f8 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java @@ -29,6 +29,8 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.ClientInternals; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -37,9 +39,11 @@ public interface EntryRenderer<T> { return ClientInternals.getEmptyEntryRenderer(); } + @Environment(EnvType.CLIENT) void render(EntryStack<T> entry, PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta); @Nullable + @Environment(EnvType.CLIENT) Tooltip getTooltip(EntryStack<T> entry, Point mouse); @ApiStatus.NonExtendable diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java index 09ab18617..22fe2fcb0 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java @@ -27,12 +27,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.Nullable; public interface Renderer { + @Environment(EnvType.CLIENT) void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta); @Nullable + @Environment(EnvType.CLIENT) default Tooltip getTooltip(Point mouse) { return null; } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java index 74d66a18a..ef0d90312 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + package me.shedaniel.rei.api.client.gui.widgets; import net.minecraft.client.gui.components.events.GuiEventListener; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java index d251f8a14..07cbe62f7 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java @@ -27,9 +27,11 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.serialization.Dynamic; import com.mojang.serialization.JsonOps; +import me.shedaniel.math.Point; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; @@ -122,6 +124,16 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { throw new UnsupportedOperationException(getType().getId() + " does not support serialization!"); } + @Nullable + @Environment(EnvType.CLIENT) + Tooltip getTooltip(Point mouse, boolean appendModName); + + @Override + @Nullable + default Tooltip getTooltip(Point mouse) { + return getTooltip(mouse, ConfigObject.getInstance().shouldAppendModNames()); + } + EntryDefinition<T> getDefinition(); default EntryType<T> getType() { @@ -132,6 +144,7 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { return getDefinition().getValueType(); } + @Environment(EnvType.CLIENT) default EntryRenderer<T> getRenderer() { EntryRenderer<?> renderer = get(Settings.RENDER).apply(this); return renderer == null ? EntryRenderer.empty() : renderer.cast(); @@ -144,7 +157,6 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { EntryStack<T> copy(); - @ApiStatus.Internal default EntryStack<T> rewrap() { return copy(); } @@ -187,8 +199,10 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { public static final Supplier<Boolean> TRUE = () -> true; public static final Supplier<Boolean> FALSE = () -> false; + @Environment(EnvType.CLIENT) public static final Function<EntryStack<?>, EntryRenderer<?>> DEFAULT_RENDERER = stack -> stack.getDefinition().getRenderer(); public static final BiFunction<EntryStack<?>, Tooltip, Tooltip> DEFAULT_TOOLTIP_PROCESSOR = (stack, tooltip) -> tooltip; + @Environment(EnvType.CLIENT) public static final Settings<Function<EntryStack<?>, EntryRenderer<?>>> RENDER = new Settings<>(DEFAULT_RENDERER); @Deprecated public static final Settings<BiFunction<EntryStack<?>, Tooltip, Tooltip>> TOOLTIP_PROCESSOR = new Settings<>(DEFAULT_TOOLTIP_PROCESSOR); diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java index 146fbc1a8..f08480de1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java @@ -24,8 +24,8 @@ package me.shedaniel.rei.api.common.entry.type; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; -import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.EntrySerializer; +import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -36,6 +36,11 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; +/** + * A definition of an {@link EntryType}, an interface to provide information from an object type. + * + * @param <T> the type of entry + */ public interface EntryDefinition<T> { Class<T> getValueType(); @@ -44,7 +49,8 @@ public interface EntryDefinition<T> { @Environment(EnvType.CLIENT) EntryRenderer<T> getRenderer(); - @Nullable ResourceLocation getIdentifier(EntryStack<T> entry, T value); + @Nullable + ResourceLocation getIdentifier(EntryStack<T> entry, T value); boolean isEmpty(EntryStack<T> entry, T value); diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java index 0a7560a8f..bdb54adbb 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java @@ -49,8 +49,6 @@ import java.util.List; * @see me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo */ public interface MenuInfo<T extends AbstractContainerMenu, D extends Display> { - Class<? extends T> getMenuClass(); - default RecipeFinderPopulator<T, D> getRecipeFinderPopulator() { return (context, recipeFinder) -> { for (StackAccessor inventoryStack : getInventoryStacks(context)) { diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java index ce4c2065e..4248a198f 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java @@ -40,9 +40,9 @@ public interface MenuInfoRegistry extends Reloadable<REIServerPlugin> { return PluginManager.getServerInstance().get(MenuInfoRegistry.class); } - <D extends Display> void register(CategoryIdentifier<D> category, MenuInfo<?, D> menuInfo); + <C extends AbstractContainerMenu, D extends Display> void register(CategoryIdentifier<D> category, Class<C> menuClass, MenuInfo<C, D> menuInfo); <D extends Display> void registerGeneric(Predicate<CategoryIdentifier<?>> categoryPredicate, MenuInfo<?, D> menuInfo); - <T extends AbstractContainerMenu, D extends Display> MenuInfo<T, D> get(CategoryIdentifier<D> category, Class<T> menuClass); + <C extends AbstractContainerMenu, D extends Display> MenuInfo<C, D> get(CategoryIdentifier<D> category, Class<C> menuClass); } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java index a513c649a..f1a4bb84a 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java @@ -29,17 +29,6 @@ import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.item.ItemStack; public class RecipeBookGridMenuInfo<T extends RecipeBookMenu<?>, D extends SimpleMenuDisplay> implements SimpleGridMenuInfo<T, D> { - private final Class<? extends RecipeBookMenu<?>> menuClass; - - public RecipeBookGridMenuInfo(Class<T> menuClass) { - this.menuClass = menuClass; - } - - @Override - public Class<? extends T> getMenuClass() { - return (Class<? extends T>) menuClass; - } - @Override public int getCraftingResultSlotIndex(T menu) { return menu.getResultSlotIndex(); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java index b0788e1a5..3e72b8710 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java @@ -106,21 +106,21 @@ public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin { @Override public void registerMenuInfo(MenuInfoRegistry registry) { - registry.register(BuiltinPlugin.CRAFTING, new RecipeBookGridMenuInfo<CraftingMenu, DefaultCraftingDisplay>(CraftingMenu.class) { + registry.register(BuiltinPlugin.CRAFTING, CraftingMenu.class,new RecipeBookGridMenuInfo<CraftingMenu, DefaultCraftingDisplay>() { @Override public List<List<ItemStack>> getDisplayInputs(MenuInfoContext<CraftingMenu, ?, DefaultCraftingDisplay> context) { return context.getDisplay().getOrganisedInputEntries(this, context.getMenu()); } }); - registry.register(BuiltinPlugin.CRAFTING, new RecipeBookGridMenuInfo<InventoryMenu, DefaultCraftingDisplay>(InventoryMenu.class) { + registry.register(BuiltinPlugin.CRAFTING, InventoryMenu.class,new RecipeBookGridMenuInfo<InventoryMenu, DefaultCraftingDisplay>() { @Override public List<List<ItemStack>> getDisplayInputs(MenuInfoContext<InventoryMenu, ?, DefaultCraftingDisplay> context) { return context.getDisplay().getOrganisedInputEntries(this, context.getMenu()); } }); - registry.register(BuiltinPlugin.SMELTING, new RecipeBookGridMenuInfo<>(FurnaceMenu.class)); - registry.register(BuiltinPlugin.SMOKING, new RecipeBookGridMenuInfo<>(SmokerMenu.class)); - registry.register(BuiltinPlugin.BLASTING, new RecipeBookGridMenuInfo<>(BlastFurnaceMenu.class)); + registry.register(BuiltinPlugin.SMELTING, FurnaceMenu.class, new RecipeBookGridMenuInfo<>()); + registry.register(BuiltinPlugin.SMOKING, SmokerMenu.class, new RecipeBookGridMenuInfo<>()); + registry.register(BuiltinPlugin.BLASTING, BlastFurnaceMenu.class, new RecipeBookGridMenuInfo<>()); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index fbdee9dda..7e85ff752 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -462,7 +462,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt entry.y.setAs(y - 8); boolean contains = currentBounds.contains(PointHelper.ofMouse()); - int newIndex = contains ? getReleaseIndex() : Iterables.indexOf(entries.values(), e -> e == entry); + int newIndex = contains ? getReleaseIndex() : Math.max(0, Iterables.indexOf(entries.values(), e -> e == entry)); if (entries.size() - 1 <= newIndex) { Entry remove = this.entries.remove(entry.hashIgnoreAmount()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java index 772e02633..9c1f24008 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java @@ -59,6 +59,10 @@ public class AlternativeArgument extends ForwardingList<Argument<?, ?>> { return this; } + public boolean isEmpty() { + return arguments == null; + } + public AlternativeArgument build() { if (arguments == null) return AlternativeArgument.EMPTY; if (arguments.size() == 1) return new AlternativeArgument(Collections.singletonList(arguments.get(0))); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java index 8d5cbb59e..f654ce076 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java @@ -25,18 +25,14 @@ package me.shedaniel.rei.impl.client.search.argument; import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; -import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.gui.config.SearchMode; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.search.argument.type.AlwaysMatchingArgumentType; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentType; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry; import me.shedaniel.rei.impl.client.search.result.ArgumentApplicableResult; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.network.chat.Component; import net.minecraft.util.IntRange; import net.minecraft.util.Unit; import org.apache.commons.lang3.StringUtils; @@ -102,33 +98,23 @@ public class Argument<T, R> { public static List<CompoundArgument> bakeArguments(String searchTerm, @Nullable ProcessedSink sink) { List<CompoundArgument> compoundArguments = Lists.newArrayList(); int tokenStartIndex = 0; - String[] allTokens = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|"); - for (String token : allTokens) { + for (String token : StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|")) { Matcher terms = SPLIT_PATTERN.matcher(token); CompoundArgument.Builder builder = CompoundArgument.builder(); while (terms.find()) { - String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2)); AlternativeArgument.Builder alternativeBuilder = AlternativeArgument.builder(); for (ArgumentType<?, ?> type : ArgumentTypesRegistry.ARGUMENT_TYPE_LIST) { - if (type.getSearchMode() == SearchMode.NEVER) continue; - ArgumentApplicableResult result = type.checkApplicable(term); - - if (result.isApplicable()) { - int group = terms.group(1) != null ? 1 : 2; - Argument<?, ?> argument = new Argument<>(type, result.getText(), !result.isInverted(), - terms.start(group) + tokenStartIndex, terms.end(group) + tokenStartIndex, !result.shouldPreserveCasing()); - alternativeBuilder.add(argument); - if (sink != null) { - if (group == 1) { - sink.addQuote(terms.start() + tokenStartIndex); - if (terms.end() - 1 + tokenStartIndex < searchTerm.length()) { - sink.addQuote(terms.end() - 1 + tokenStartIndex); - } - } - sink.addPart(argument, result.isUsingGrammar(), result.grammarRanges(), terms.start() + tokenStartIndex); - } + applyArgument(type, searchTerm, terms, tokenStartIndex, alternativeBuilder, true, sink); + if (!alternativeBuilder.isEmpty()) { + break; + } + } + + if (alternativeBuilder.isEmpty()) { + for (ArgumentType<?, ?> type : ArgumentTypesRegistry.ARGUMENT_TYPE_LIST) { + applyArgument(type, searchTerm, terms, tokenStartIndex, alternativeBuilder, false, sink); } } @@ -140,6 +126,11 @@ public class Argument<T, R> { sink.addSplitter(tokenStartIndex - 1); } } + prepareSearchFilter(compoundArguments); + return compoundArguments; + } + + private static void prepareSearchFilter(List<CompoundArgument> compoundArguments) { for (CompoundArgument arguments : compoundArguments) { for (AlternativeArgument alternativeArgument : arguments) { for (Argument<?, ?> argument : alternativeArgument) { @@ -148,14 +139,35 @@ public class Argument<T, R> { } } } - return compoundArguments; + } + + private static void applyArgument(ArgumentType<?, ?> type, String searchTerm, Matcher terms, int tokenStartIndex, AlternativeArgument.Builder alternativeBuilder, boolean forceGrammar, @Nullable ProcessedSink sink) { + String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2)); + if (type.getSearchMode() == SearchMode.NEVER) return; + ArgumentApplicableResult result = type.checkApplicable(term, forceGrammar); + + if (result.isApplicable()) { + int group = terms.group(1) != null ? 1 : 2; + Argument<?, ?> argument = new Argument<>(type, result.getText(), !result.isInverted(), + terms.start(group) + tokenStartIndex, terms.end(group) + tokenStartIndex, !result.shouldPreserveCasing()); + alternativeBuilder.add(argument); + if (sink != null) { + if (group == 1) { + sink.addQuote(terms.start() + tokenStartIndex); + if (terms.end() - 1 + tokenStartIndex < searchTerm.length()) { + sink.addQuote(terms.end() - 1 + tokenStartIndex); + } + } + sink.addPart(argument, result.isUsingGrammar(), result.grammarRanges(), terms.start() + tokenStartIndex); + } + } } @ApiStatus.Internal public static boolean matches(EntryStack<?> stack, List<CompoundArgument> compoundArguments) { if (compoundArguments.isEmpty()) return true; Mutable<?> mutable = new MutableObject<>(); - + a: for (CompoundArgument arguments : compoundArguments) { for (AlternativeArgument argument : arguments) { @@ -188,13 +200,6 @@ public class Argument<T, R> { return argumentType.matches((Mutable<B>) data, stack, filter, (T) filterData); } - public static String tryGetEntryStackTooltip(EntryStack<?> stack) { - Tooltip tooltip = stack.getTooltip(new Point()); - if (tooltip != null) - return CollectionUtils.mapAndJoinToString(tooltip.getText(), Component::getString, "\n"); - return ""; - } - public ArgumentType<?, ?> getArgument() { return argumentType; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java index 8c0a3af0d..d64b0d6cb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java @@ -52,7 +52,7 @@ public final class AlwaysMatchingArgumentType extends ArgumentType<Unit, Unit> { } @Override - public ArgumentApplicableResult checkApplicable(String text) { + public ArgumentApplicableResult checkApplicable(String text, boolean forceGrammar) { return ArgumentApplicableResult.notApplicable(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java index aa8368967..9aa9882f4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java @@ -54,12 +54,16 @@ public abstract class ArgumentType<T, R> { return SearchMode.PREFIX; } - public ArgumentApplicableResult checkApplicable(String text) { - ArgumentApplicableResult status = checkApplicable(text, getPrefix()); - if (status.isApplicable()) { - return status; - } else if (getSearchMode() == SearchMode.ALWAYS) { - status = checkApplicable(text, ""); + public ArgumentApplicableResult checkApplicable(String text, boolean forceGrammar) { + String prefix = getPrefix(); + if (forceGrammar && !prefix.isEmpty()) { + ArgumentApplicableResult status = checkApplicable(text, prefix); + if (status.isApplicable()) { + return status; + } + } + if (!forceGrammar && getSearchMode() == SearchMode.ALWAYS) { + ArgumentApplicableResult status = checkApplicable(text, ""); if (status.isApplicable()) { status.notUsingGrammar(); } @@ -71,7 +75,7 @@ public abstract class ArgumentType<T, R> { private ArgumentApplicableResult checkApplicable(String text, String prefix) { if (prefix == null) return ArgumentApplicableResult.notApplicable(); if (text.startsWith("-" + prefix)) return ArgumentApplicableResult.applyInverted(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1); - if (text.startsWith(prefix + "-")) return ArgumentApplicableResult.applyInverted(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1); + if (!prefix.isEmpty() && text.startsWith(prefix + "-")) return ArgumentApplicableResult.applyInverted(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1); if (text.startsWith(prefix)) return ArgumentApplicableResult.apply(text.substring(prefix.length())).grammar(0, prefix.length()); return ArgumentApplicableResult.notApplicable(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java index a17bfbcf9..1fd0a8249 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java @@ -71,7 +71,7 @@ public final class IdentifierArgumentType extends ArgumentType<Unit, String> { if (identifier == null) { data.setValue(EMPTY); } else { - String s = identifier.toString(); + String s = identifier.getPath(); if (s.isEmpty()) { data.setValue(EMPTY); } else { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java index d8c13007f..566698faa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java @@ -50,7 +50,7 @@ public final class RegexArgumentType extends ArgumentType<@Nullable Pattern, Str } @Override - public ArgumentApplicableResult checkApplicable(String text) { + public ArgumentApplicableResult checkApplicable(String text, boolean forceGrammar) { boolean inverted = false; String matchText = text; if (matchText.startsWith("-")) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java index 347862cd5..a0661c8c0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java @@ -44,7 +44,8 @@ public final class TextArgumentType extends ArgumentType<Unit, String> { } @Override - public @Nullable String getPrefix() { + @Nullable + public String getPrefix() { return ""; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java index 759e6cdeb..f200c7afa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java +++ b/ |
