aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java71
1 files changed, 39 insertions, 32 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java
index 68f09344..2f748792 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java
@@ -10,9 +10,6 @@ import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Http;
import de.hysky.skyblocker.utils.Http.ApiResponse;
import de.hysky.skyblocker.utils.Utils;
-import it.unimi.dsi.fastutil.ints.IntIntPair;
-import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.minecraft.client.MinecraftClient;
@@ -24,6 +21,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -43,8 +41,6 @@ public class SecretsTracker {
ClientReceiveMessageEvents.GAME.register(SecretsTracker::onMessage);
}
- //If -1 is somehow encountered, it would be very rare, so I just disregard its possibility for now
- //people would probably recognize if it was inaccurate so yeah
private static void calculate(RunPhase phase) {
switch (phase) {
case START -> CompletableFuture.runAsync(() -> {
@@ -57,11 +53,11 @@ public class SecretsTracker {
//The player name will be blank if there isn't a player at that index
if (!playerName.isEmpty()) {
- //If the player was a part of the last run (and didn't have -1 secret count) and that run ended less than 5 mins ago then copy the secrets over
- if (lastRun != null && System.currentTimeMillis() <= lastRunEnded + 300_000 && lastRun.secretCounts().getOrDefault(playerName, -1) != -1) {
- newlyStartedRun.secretCounts().put(playerName, lastRun.secretCounts().getInt(playerName));
+ //If the player was a part of the last run, had non-empty secret data and that run ended less than 5 mins ago then copy the secret data over
+ if (lastRun != null && System.currentTimeMillis() <= lastRunEnded + 300_000 && lastRun.playersSecretData().getOrDefault(playerName, SecretData.EMPTY) != SecretData.EMPTY) {
+ newlyStartedRun.playersSecretData().put(playerName, lastRun.playersSecretData().get(playerName));
} else {
- newlyStartedRun.secretCounts().put(playerName, getPlayerSecrets(playerName).leftInt());
+ newlyStartedRun.playersSecretData().put(playerName, getPlayerSecrets(playerName));
}
}
}
@@ -72,22 +68,23 @@ public class SecretsTracker {
case END -> CompletableFuture.runAsync(() -> {
//In case the game crashes from something
if (currentRun != null) {
- Object2ObjectOpenHashMap<String, IntIntPair> secretsFound = new Object2ObjectOpenHashMap<>();
+ Object2ObjectOpenHashMap<String, SecretData> secretsFound = new Object2ObjectOpenHashMap<>();
//Update secret counts
- for (Entry<String> entry : currentRun.secretCounts().object2IntEntrySet()) {
+ for (Entry<String, SecretData> entry : currentRun.playersSecretData().entrySet()) {
String playerName = entry.getKey();
- int startingSecrets = entry.getIntValue();
- IntIntPair secretsNow = getPlayerSecrets(playerName);
- int secretsPlayerFound = secretsNow.leftInt() - startingSecrets;
+ SecretData startingSecrets = entry.getValue();
+ SecretData secretsNow = getPlayerSecrets(playerName);
+ int secretsPlayerFound = secretsNow.secrets() - startingSecrets.secrets();
- secretsFound.put(playerName, IntIntPair.of(secretsPlayerFound, secretsNow.rightInt()));
- entry.setValue(secretsNow.leftInt());
+ //Add an entry to the secretsFound map with the data - if the secret data from now or the start was cached a warning will be shown
+ secretsFound.put(playerName, secretsNow.updated(secretsPlayerFound, startingSecrets.cached() || secretsNow.cached()));
+ entry.setValue(secretsNow);
}
//Print the results all in one go, so its clean and less of a chance of it being broken up
- for (Map.Entry<String, IntIntPair> entry : secretsFound.entrySet()) {
- sendResultMessage(entry.getKey(), entry.getValue().leftInt(), entry.getValue().rightInt(), true);
+ for (Map.Entry<String, SecretData> entry : secretsFound.entrySet()) {
+ sendResultMessage(entry.getKey(), entry.getValue(), true);
}
//Swap the current and last run as well as mark the run end time
@@ -95,30 +92,31 @@ public class SecretsTracker {
lastRun = currentRun;
currentRun = null;
} else {
- sendResultMessage(null, -1, -1, false);
+ sendResultMessage(null, null, false);
}
});
}
}
- private static void sendResultMessage(String player, int secrets, int cacheAge, boolean success) {
+ private static void sendResultMessage(String player, SecretData secretData, boolean success) {
+ @SuppressWarnings("resource")
PlayerEntity playerEntity = MinecraftClient.getInstance().player;
if (playerEntity != null) {
if (success) {
- playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secretsTracker.feedback", Text.literal(player).withColor(0xf57542), "§7" + secrets, getCacheText(cacheAge))));
+ playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secretsTracker.feedback", Text.literal(player).withColor(0xf57542), "§7" + secretData.secrets(), getCacheText(secretData.cached(), secretData.cacheAge()))));
} else {
playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secretsTracker.failFeedback")));
}
}
}
- private static Text getCacheText(int cacheAge) {
- return Text.literal("\u2139").styled(style -> style.withColor(cacheAge == -1 ? 0x218bff : 0xeac864).withHoverEvent(
- new HoverEvent(HoverEvent.Action.SHOW_TEXT, cacheAge == -1 ? Text.translatable("skyblocker.api.cache.MISS") : Text.translatable("skyblocker.api.cache.HIT", cacheAge))));
+ private static Text getCacheText(boolean cached, int cacheAge) {
+ return Text.literal("\u2139").styled(style -> style.withColor(cached ? 0xeac864 : 0x218bff).withHoverEvent(
+ new HoverEvent(HoverEvent.Action.SHOW_TEXT, cached ? Text.translatable("skyblocker.api.cache.HIT", cacheAge) : Text.translatable("skyblocker.api.cache.MISS"))));
}
private static void onMessage(Text text, boolean overlay) {
- if (Utils.isInDungeons() && SkyblockerConfigManager.get().locations.dungeons.playerSecretsTracker) {
+ if (Utils.isInDungeons() && SkyblockerConfigManager.get().locations.dungeons.playerSecretsTracker && !overlay) {
String message = Formatting.strip(text.getString());
try {
@@ -136,35 +134,44 @@ public class SecretsTracker {
return matcher != null ? matcher.group("name") : "";
}
- private static IntIntPair getPlayerSecrets(String name) {
+ private static SecretData getPlayerSecrets(String name) {
String uuid = ApiUtils.name2Uuid(name);
if (!uuid.isEmpty()) {
try (ApiResponse response = Http.sendHypixelRequest("player", "?uuid=" + uuid)) {
- return IntIntPair.of(getSecretCountFromAchievements(JsonParser.parseString(response.content()).getAsJsonObject()), response.age());
+ return new SecretData(getSecretCountFromAchievements(JsonParser.parseString(response.content()).getAsJsonObject()), response.cached(), response.age());
} catch (Exception e) {
LOGGER.error("[Skyblocker] Encountered an error while trying to fetch {} secret count!", name + "'s", e);
}
}
- return IntIntPair.of(-1, -1);
+ return SecretData.EMPTY;
}
/**
* Gets a player's secret count from their hypixel achievements
*/
private static int getSecretCountFromAchievements(JsonObject playerJson) {
- JsonObject player = playerJson.get("player").getAsJsonObject();
- JsonObject achievements = (player.has("achievements")) ? player.get("achievements").getAsJsonObject() : null;
+ JsonObject player = playerJson.getAsJsonObject("player");
+ JsonObject achievements = player.has("achievements") ? player.getAsJsonObject("achievements") : null;
return (achievements != null && achievements.has("skyblock_treasure_hunter")) ? achievements.get("skyblock_treasure_hunter").getAsInt() : 0;
}
/**
* This will either reflect the value at the start or the end depending on when this is called
*/
- private record TrackedRun(Object2IntOpenHashMap<String> secretCounts) {
+ private record TrackedRun(Object2ObjectOpenHashMap<String, SecretData> playersSecretData) {
private TrackedRun() {
- this(new Object2IntOpenHashMap<>());
+ this(new Object2ObjectOpenHashMap<>());
+ }
+ }
+
+ private record SecretData(int secrets, boolean cached, int cacheAge) {
+ private static final SecretData EMPTY = new SecretData(0, false, 0);
+
+ //If only we had Derived Record Creation :( - https://bugs.openjdk.org/browse/JDK-8321133
+ private SecretData updated(int secrets, boolean cached) {
+ return new SecretData(secrets, cached, this.cacheAge);
}
}