From 4a43f346a9415f338aff68e51d6cd5f62c57608e Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:21:05 -0400 Subject: Add RNG Meter Autocomplete feature --- .../mixins/CommandTreeS2CPacketMixin.java | 3 ++ .../skyblocker/skyblock/RngMeterAutocomplete.java | 60 ++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/RngMeterAutocomplete.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java index d3307fb8..17d7af8d 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java @@ -5,6 +5,7 @@ import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; import de.hysky.skyblocker.skyblock.JoinInstanceAutocomplete; +import de.hysky.skyblocker.skyblock.RngMeterAutocomplete; import de.hysky.skyblocker.skyblock.SackItemAutocomplete; import de.hysky.skyblocker.skyblock.ViewstashAutocomplete; import de.hysky.skyblocker.skyblock.WarpAutocomplete; @@ -28,6 +29,8 @@ public class CommandTreeS2CPacketMixin { case String s when s.equals("joininstance") && JoinInstanceAutocomplete.joinInstanceCommand != null -> JoinInstanceAutocomplete.joinInstanceCommand; case String s when s.equals("joindungeon") && JoinInstanceAutocomplete.dungeonCommand != null -> JoinInstanceAutocomplete.dungeonCommand; case String s when s.equals("joinkuudra") && JoinInstanceAutocomplete.kuudraCommand != null -> JoinInstanceAutocomplete.kuudraCommand; + case String s when s.equals("rngmeter") && RngMeterAutocomplete.longCommand != null -> RngMeterAutocomplete.longCommand; + case String s when s.equals("rng") && RngMeterAutocomplete.shortCommand != null -> RngMeterAutocomplete.shortCommand; default -> original; }; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/RngMeterAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/RngMeterAutocomplete.java new file mode 100644 index 00000000..00acc953 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/RngMeterAutocomplete.java @@ -0,0 +1,60 @@ +package de.hysky.skyblocker.skyblock; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; + +import com.google.gson.JsonParser; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.mojang.logging.LogUtils; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; + +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.utils.Http; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.command.CommandSource; + +public class RngMeterAutocomplete { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final Codec>> CODEC = Codec.unboundedMap(Codec.STRING, Codec.STRING.listOf()); + private static Map> rngMeters = new HashMap<>(); + @Nullable + public static LiteralCommandNode longCommand; + @Nullable + public static LiteralCommandNode shortCommand; + + @Init + public static void init() { + CompletableFuture.runAsync(() -> { + try { + String json = Http.sendGetRequest("https://hysky.de/api/rngmeters"); + rngMeters = CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(json)).getOrThrow(); + + longCommand = createCommandNode("rngmeter"); + shortCommand = createCommandNode("rng"); + } catch (Exception e) { + LOGGER.error("[Skyblocker RNG Meter Autocomplete] Failed to load RNG Meter data.", e); + } + }); + } + + private static LiteralCommandNode createCommandNode(String command) { + return literal(command) + .requires(source -> Utils.isOnSkyblock()) + .then(argument("type", StringArgumentType.string()) + .suggests((context, builder) -> CommandSource.suggestMatching(rngMeters.keySet(), builder)) + .then(argument("subtype", StringArgumentType.string()) + .suggests((context, builder) -> CommandSource.suggestMatching(rngMeters.getOrDefault(StringArgumentType.getString(context, "type"), List.of()), builder))) + ).build(); + } +} -- cgit