aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-08-16 22:37:44 -0400
committerGitHub <noreply@github.com>2024-08-16 22:37:44 -0400
commita0adb15203771c7201ae009306377ead961ba315 (patch)
tree8ed9a70b9a2d5eb3df60d410107b78ba4d1b6f07 /src/main/java
parent08501643dad2a9c00166f9a2b804dde3f6ee51cc (diff)
downloadSkyblocker-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')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java35
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/CodecUtils.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/Utils.java24
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
}
}