diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientboundCommandsPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientboundCommandsPacketMixin.java index d543c4cad9..16a5b64225 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientboundCommandsPacketMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientboundCommandsPacketMixin.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; +import de.hysky.skyblocker.skyblock.AuctionBazaarAutocomplete; import de.hysky.skyblocker.skyblock.CallAutocomplete; import de.hysky.skyblocker.skyblock.ChaptersAutocomplete; import de.hysky.skyblocker.skyblock.JoinInstanceAutocomplete; @@ -34,6 +35,10 @@ public CommandNode modifyCommandSuggestions( case String s when s.equals("rngmeter") && RngMeterAutocomplete.longCommand != null -> RngMeterAutocomplete.longCommand; case String s when s.equals("rng") && RngMeterAutocomplete.shortCommand != null -> RngMeterAutocomplete.shortCommand; case String s when s.equals("call") && CallAutocomplete.commandNode != null -> CallAutocomplete.commandNode; + case String s when s.equals("ahs") && AuctionBazaarAutocomplete.ahsNode != null -> AuctionBazaarAutocomplete.ahsNode; + case String s when s.equals("ahsearch") && AuctionBazaarAutocomplete.ahsearchNode != null -> AuctionBazaarAutocomplete.ahsearchNode; + case String s when s.equals("bz") && AuctionBazaarAutocomplete.bzNode != null -> AuctionBazaarAutocomplete.bzNode; + case String s when s.equals("bazaar") && AuctionBazaarAutocomplete.bazaarNode != null -> AuctionBazaarAutocomplete.bazaarNode; case String s when s.equals("chapter") && ChaptersAutocomplete.singularCommandNode != null -> ChaptersAutocomplete.singularCommandNode; case String s when s.equals("chapters") && ChaptersAutocomplete.pluralCommandNode != null -> ChaptersAutocomplete.pluralCommandNode; default -> original; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/AuctionBazaarAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/AuctionBazaarAutocomplete.java new file mode 100644 index 0000000000..28b4e4ec82 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/AuctionBazaarAutocomplete.java @@ -0,0 +1,55 @@ +package de.hysky.skyblocker.skyblock; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommands.argument; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommands.literal; + +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager; +import de.hysky.skyblocker.utils.NEURepoManager; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.command.CommandUtils; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.commands.SharedSuggestionProvider; +import org.jspecify.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class AuctionBazaarAutocomplete { + public static @Nullable LiteralCommandNode ahsNode; + public static @Nullable LiteralCommandNode ahsearchNode; + public static @Nullable LiteralCommandNode bzNode; + public static @Nullable LiteralCommandNode bazaarNode; + + @Init(priority = 100) // Load after SearchOverManager + public static void init() { + NEURepoManager.runAsyncAfterLoad(AuctionBazaarAutocomplete::createNodes); + } + + // since /bzs is only client-side it needs separate handling + public static CompletableFuture suggestBzs(CommandContext context, SuggestionsBuilder builder) { + return SharedSuggestionProvider.suggest(SearchOverManager.getBazaarItems(), builder); + } + + private static void createNodes() { + ahsNode = createNode("ahs", SearchOverManager::getAuctionItems); + ahsearchNode = createNode("ahsearch", SearchOverManager::getAuctionItems); + bzNode = createNode("bz", SearchOverManager::getBazaarItems); + bazaarNode = createNode("bazaar", SearchOverManager::getBazaarItems); + } + + private static LiteralCommandNode createNode(String command, Supplier> suggester) { + return literal(command) + .requires(_ -> Utils.isOnSkyblock()) + .executes(CommandUtils.noOp) + .then(argument("item", StringArgumentType.greedyString()) + .suggests((_, builder) -> SharedSuggestionProvider.suggest(suggester.get(), builder)) + .executes(CommandUtils.noOp)) + .build(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java index 3278c09c61..f2637e332b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/searchoverlay/SearchOverManager.java @@ -10,6 +10,7 @@ import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.injected.SkyblockerStack; +import de.hysky.skyblocker.skyblock.AuctionBazaarAutocomplete; import de.hysky.skyblocker.skyblock.item.tooltip.info.TooltipInfoType; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.skyblock.museum.Donation; @@ -19,6 +20,7 @@ import de.hysky.skyblocker.utils.FlexibleItemStack; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.NEURepoManager; +import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import io.github.moulberry.repo.data.NEUItem; import io.github.moulberry.repo.util.NEUId; @@ -89,13 +91,30 @@ public static void init() { private static void registerSearchCommands(CommandDispatcher dispatcher, CommandBuildContext registryAccess) { if (SkyblockerConfigManager.get().uiAndVisuals.searchOverlay.enableCommands) { - dispatcher.register(literal("ahs").executes(_ -> startCommand(true, ""))); - dispatcher.register(literal("bzs").executes(_ -> startCommand(false, ""))); - - dispatcher.register(literal("ahs").then(argument("item", StringArgumentType.greedyString()) + dispatcher.register(literal("ahs") + .requires(_ -> Utils.isOnSkyblock()) + .executes(_ -> startCommand(true, ""))); + dispatcher.register(literal("ahsearch") + .requires(_ -> Utils.isOnSkyblock()) + .executes(_ -> startCommand(true, ""))); + dispatcher.register(literal("bzs") + .requires(_ -> Utils.isOnSkyblock()) + .executes(_ -> startCommand(false, ""))); + + dispatcher.register(literal("ahs") + .requires(_ -> Utils.isOnSkyblock()) + .then(argument("item", StringArgumentType.greedyString()) + .executes(context -> startCommand(true, StringArgumentType.getString(context, "item")) + ))); + dispatcher.register(literal("ahsearch") + .requires(_ -> Utils.isOnSkyblock()) + .then(argument("item", StringArgumentType.greedyString()) .executes(context -> startCommand(true, StringArgumentType.getString(context, "item")) ))); - dispatcher.register(literal("bzs").then(argument("item", StringArgumentType.greedyString()) + dispatcher.register(literal("bzs") + .requires(_ -> Utils.isOnSkyblock()) + .then(argument("item", StringArgumentType.greedyString()) + .suggests(AuctionBazaarAutocomplete::suggestBzs) .executes(context -> startCommand(false, StringArgumentType.getString(context, "item")) ))); } @@ -215,6 +234,14 @@ private static void loadItems() { SearchOverManager.namesToNeuId = namesToNeuId; } + public static HashSet getBazaarItems() { + return bazaarItems; + } + + public static HashSet getAuctionItems() { + return auctionItems; + } + /** * Receives data when a search is started and resets values *