From 9716bdb7ff83ace2961be06e73a54fa7a1143ce2 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 16 Mar 2025 19:25:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E5=AE=9E=E7=8E=B0=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit-loader/src/main/resources/commands.yml | 16 ++++- .../plugin/command/BukkitCommandManager.java | 2 + .../SelectorItemRecipeBrowserCommand.java | 69 +++++++++++++++++++ .../SelectorItemUsageBrowserCommand.java | 65 +++++++++++++++++ 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemRecipeBrowserCommand.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemUsageBrowserCommand.java diff --git a/bukkit-loader/src/main/resources/commands.yml b/bukkit-loader/src/main/resources/commands.yml index 9b8d9648d..9756178c1 100644 --- a/bukkit-loader/src/main/resources/commands.yml +++ b/bukkit-loader/src/main/resources/commands.yml @@ -42,12 +42,24 @@ item_recipe_browser: enable: true permission: ce.command.item_recipe_browser usage: - - /craftengine recipe by-result - - /ce recipe by-result + - /findrecipe by-result item_usage_browser: enable: true permission: ce.command.item_usage_browser + usage: + - /findrecipe by-ingredient + +selector_item_recipe_browser: + enable: true + permission: ce.command.selector_item_recipe_browser + usage: + - /craftengine recipe by-result + - /ce recipe by-result + +selector_item_usage_browser: + enable: true + permission: ce.command.selector_item_usage_browser usage: - /craftengine recipe by-ingredient - /ce recipe by-ingredient diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java index 54d5523cd..f986ceee0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -34,6 +34,8 @@ public class BukkitCommandManager extends AbstractCommandManager new ItemBrowserCommand(this, plugin), new ItemRecipeBrowserCommand(this, plugin), new ItemUsageBrowserCommand(this, plugin), + new SelectorItemRecipeBrowserCommand(this, plugin), + new SelectorItemUsageBrowserCommand(this, plugin), new TestCommand(this, plugin), new DebugGetBlockStateRegistryIdCommand(this, plugin), new DebugGetBlockInternalIdCommand(this, plugin), diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemRecipeBrowserCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemRecipeBrowserCommand.java new file mode 100644 index 000000000..0a9786ddc --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemRecipeBrowserCommand.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.bukkit.data.MultiplePlayerSelector; +import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; +import org.incendo.cloud.bukkit.parser.selector.MultiplePlayerSelectorParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class SelectorItemRecipeBrowserCommand extends BukkitCommandFeature { + + public SelectorItemRecipeBrowserCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { + return builder + .flag(FlagKeys.BROWSE_FLAG) + .required("player", MultiplePlayerSelectorParser.multiplePlayerSelectorParser(true)) + .required("id", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().itemManager().cachedSuggestions()); + } + })) + .handler(context -> { + MultiplePlayerSelector selector = context.get("player"); + Collection players = selector.values(); + for (Player player : players) { + BukkitServerPlayer serverPlayer = plugin().adapt(player); + NamespacedKey namespacedKey = context.get("id"); + Key itemId = Key.of(namespacedKey.namespace(), namespacedKey.value()); + List> inRecipes = plugin().recipeManager().getRecipeByResult(itemId); + if (!inRecipes.isEmpty()) { + plugin().itemBrowserManager().openRecipePage(serverPlayer, null, inRecipes, 0, 0); + } else if (context.flags().hasFlag(FlagKeys.BROWSE)) { + plugin().itemBrowserManager().openNoRecipePage(serverPlayer, itemId, null, 0); + } else { + handleFeedback(context, MessageConstants.COMMAND_ITEM_RECIPE_BROWSER_RECIPE_NO_FOUND); + } + } + }); + } + + @Override + public String getFeatureID() { + return "selector_item_recipe_browser"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemUsageBrowserCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemUsageBrowserCommand.java new file mode 100644 index 000000000..a12a232fe --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SelectorItemUsageBrowserCommand.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.bukkit.data.MultiplePlayerSelector; +import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; +import org.incendo.cloud.bukkit.parser.selector.MultiplePlayerSelectorParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class SelectorItemUsageBrowserCommand extends BukkitCommandFeature { + + public SelectorItemUsageBrowserCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { + return builder + .required("player", MultiplePlayerSelectorParser.multiplePlayerSelectorParser(true)) + .required("id", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().itemManager().cachedSuggestions()); + } + })) + .handler(context -> { + MultiplePlayerSelector selector = context.get("player"); + Collection players = selector.values(); + for (Player player : players) { + BukkitServerPlayer serverPlayer = plugin().adapt(player); + NamespacedKey namespacedKey = context.get("id"); + Key itemId = Key.of(namespacedKey.namespace(), namespacedKey.value()); + List> inRecipes = plugin().recipeManager().getRecipeByIngredient(itemId); + if (!inRecipes.isEmpty()) { + plugin().itemBrowserManager().openRecipePage(serverPlayer, null, inRecipes, 0, 0); + } else { + handleFeedback(context, MessageConstants.COMMAND_ITEM_USAGE_BROWSER_RECIPE_NO_FOUND); + } + } + }); + } + + @Override + public String getFeatureID() { + return "selector_item_usage_browser"; + } +}