diff options
| author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-08-16 22:37:44 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-16 22:37:44 -0400 |
| commit | a0adb15203771c7201ae009306377ead961ba315 (patch) | |
| tree | 8ed9a70b9a2d5eb3df60d410107b78ba4d1b6f07 /src/main/java | |
| parent | 08501643dad2a9c00166f9a2b804dde3f6ee51cc (diff) | |
| download | Skyblocker-a0adb15203771c7201ae009306377ead961ba315.tar.gz Skyblocker-a0adb15203771c7201ae009306377ead961ba315.tar.bz2 Skyblocker-a0adb15203771c7201ae009306377ead961ba315.zip | |
Make Warp Autocomplete adapt to the player's rank (#930)
Ultra fancy now!
Diffstat (limited to 'src/main/java')
3 files changed, 59 insertions, 8 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java index a44a3102..0fc610a6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java @@ -1,20 +1,26 @@ package de.hysky.skyblocker.skyblock; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; +import com.google.gson.JsonParser; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.tree.LiteralCommandNode; -import de.hysky.skyblocker.SkyblockerMod; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; + +import de.hysky.skyblocker.utils.CodecUtils; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.Utils; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanMaps; +import net.azureaaron.hmapi.data.rank.PackageRank; +import net.azureaaron.hmapi.data.rank.RankType; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.command.CommandSource; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; @@ -24,23 +30,36 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.lit */ public class WarpAutocomplete { private static final Logger LOGGER = LoggerFactory.getLogger(WarpAutocomplete.class); + private static final Codec<Object2BooleanMap<String>> MAP_CODEC = CodecUtils.object2BooleanMapCodec(Codec.STRING); + @Nullable public static LiteralCommandNode<FabricClientCommandSource> commandNode; public static void init() { CompletableFuture.supplyAsync(() -> { try { - JsonArray jsonElements = SkyblockerMod.GSON.fromJson(Http.sendGetRequest("https://hysky.de/api/locations"), JsonArray.class); - return jsonElements.asList().stream().map(JsonElement::getAsString).toList(); + String warps = Http.sendGetRequest("https://hysky.de/api/locations"); + + return MAP_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(warps)).getOrThrow(); } catch (Exception e) { LOGGER.error("[Skyblocker] Failed to download warps list", e); } - return List.<String>of(); + return Object2BooleanMaps.<String>emptyMap(); }).thenAccept(warps -> commandNode = literal("warp") .requires(fabricClientCommandSource -> Utils.isOnSkyblock()) .then(argument("destination", StringArgumentType.string()) - .suggests((context, builder) -> CommandSource.suggestMatching(warps, builder)) + .suggests((context, builder) -> CommandSource.suggestMatching(getEligibleWarps(warps), builder)) ).build() ); } + + private static Stream<String> getEligibleWarps(Object2BooleanMap<String> warps) { + return warps.object2BooleanEntrySet().stream() + .filter(WarpAutocomplete::shouldShowWarp) + .map(Object2BooleanMap.Entry::getKey); + } + + private static boolean shouldShowWarp(Object2BooleanMap.Entry<String> entry) { + return entry.getBooleanValue() ? RankType.compare(Utils.getRank(), PackageRank.MVP_PLUS) >= 0 : true; + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java b/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java index 5a780142..272a7836 100644 --- a/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java @@ -1,7 +1,11 @@ package de.hysky.skyblocker.utils; +import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; + import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; @@ -19,4 +23,8 @@ public final class CodecUtils { public static MapCodec<OptionalDouble> optionalDouble(MapCodec<Optional<Double>> codec) { return codec.xmap(opt -> opt.map(OptionalDouble::of).orElseGet(OptionalDouble::empty), optDouble -> optDouble.isPresent() ? Optional.of(optDouble.getAsDouble()) : Optional.empty()); } + + public static <K> Codec<Object2BooleanMap<K>> object2BooleanMapCodec(Codec<K> keyCodec) { + return Codec.unboundedMap(keyCodec, Codec.BOOL).xmap(Object2BooleanOpenHashMap::new, Object2BooleanOpenHashMap::new); + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java index 73861f24..7f91920b 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Utils.java +++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java @@ -8,6 +8,8 @@ import de.hysky.skyblocker.mixins.accessors.MessageHandlerAccessor; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.azureaaron.hmapi.data.rank.PackageRank; +import net.azureaaron.hmapi.data.rank.RankType; import net.azureaaron.hmapi.data.server.Environment; import net.azureaaron.hmapi.events.HypixelPacketEvents; import net.azureaaron.hmapi.network.HypixelNetworking; @@ -15,6 +17,7 @@ import net.azureaaron.hmapi.network.packet.s2c.ErrorS2CPacket; import net.azureaaron.hmapi.network.packet.s2c.HelloS2CPacket; import net.azureaaron.hmapi.network.packet.s2c.HypixelS2CPacket; import net.azureaaron.hmapi.network.packet.v1.s2c.LocationUpdateS2CPacket; +import net.azureaaron.hmapi.network.packet.v1.s2c.PlayerInfoS2CPacket; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.loader.api.FabricLoader; @@ -46,6 +49,11 @@ public class Utils { private static boolean isOnHypixel = false; private static boolean isOnSkyblock = false; /** + * The player's rank. + */ + @NotNull + private static RankType rank = PackageRank.NONE; + /** * Current Skyblock location (from the Mod API) */ @NotNull @@ -186,6 +194,14 @@ public class Utils { return map; } + /** + * @return the player's rank + */ + @NotNull + public static RankType getRank() { + return rank; + } + public static void init() { ClientReceiveMessageEvents.ALLOW_GAME.register(Utils::onChatMessage); ClientReceiveMessageEvents.GAME_CANCELED.register(Utils::onChatMessage); // Somehow this works even though onChatMessage returns a boolean @@ -195,6 +211,7 @@ public class Utils { HypixelNetworking.registerToEvents(Util.make(new Object2IntOpenHashMap<>(), map -> map.put(LocationUpdateS2CPacket.ID, 1))); HypixelPacketEvents.HELLO.register(Utils::onPacket); HypixelPacketEvents.LOCATION_UPDATE.register(Utils::onPacket); + HypixelPacketEvents.PLAYER_INFO.register(Utils::onPacket); } /** @@ -374,6 +391,9 @@ public class Utils { switch (packet) { case HelloS2CPacket(var environment) -> { Utils.environment = environment; + + //Request the player's rank information + HypixelNetworking.sendPlayerInfoC2SPacket(1); } case LocationUpdateS2CPacket(var serverName, var serverType, var _lobbyName, var mode, var map) -> { @@ -412,6 +432,10 @@ public class Utils { LOGGER.error("[Skyblocker] Failed to update your current location! Some features of the mod may not work correctly :( - Error: {}", error); } + case PlayerInfoS2CPacket(var playerRank, var packageRank, var monthlyPackageRank, var _prefix) -> { + rank = RankType.getEffectiveRank(playerRank, packageRank, monthlyPackageRank); + } + default -> {} //Do Nothing } } |
