From c2e4a0513ef19aac52c38478fdd34a8d93990e75 Mon Sep 17 00:00:00 2001
From: Ghost <66458557+Ghost-3@users.noreply.github.com>
Date: Sun, 18 Feb 2024 22:12:10 +0300
Subject: Better location management (#547)
* Better location management
* Location enum rework
* Removed unused constants
---
.../skyblocker/skyblock/crimson/kuudra/Kuudra.java | 1 -
.../de/hysky/skyblocker/skyblock/rift/TheRift.java | 5 -
.../java/de/hysky/skyblocker/utils/Location.java | 116 +++++++++++++++++++++
src/main/java/de/hysky/skyblocker/utils/Utils.java | 80 ++++++++------
4 files changed, 167 insertions(+), 35 deletions(-)
create mode 100644 src/main/java/de/hysky/skyblocker/utils/Location.java
(limited to 'src/main/java/de/hysky')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
index 033a919d..5bc98894 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
@@ -10,7 +10,6 @@ import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
public class Kuudra {
- public static final String LOCATION = "kuudra";
static KuudraPhase phase = KuudraPhase.OTHER;
public static void init() {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java
index 02b694b6..7413e06f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java
@@ -8,11 +8,6 @@ import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
public class TheRift {
- /**
- * @see de.hysky.skyblocker.utils.Utils#isInTheRift() Utils#isInTheRift().
- */
- public static final String LOCATION = "rift";
-
public static void init() {
WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render);
WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render);
diff --git a/src/main/java/de/hysky/skyblocker/utils/Location.java b/src/main/java/de/hysky/skyblocker/utils/Location.java
new file mode 100644
index 00000000..bd2773fd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/Location.java
@@ -0,0 +1,116 @@
+package de.hysky.skyblocker.utils;
+
+import java.util.Arrays;
+
+/**
+ * All Skyblock locations
+ */
+public enum Location {
+ /**
+ * mode: dynamic
+ */
+ PRIVATE_ISLAND("dynamic"),
+ /**
+ * mode: garden
+ */
+ GARDEN("garden"),
+ /**
+ * mode: hub
+ */
+ HUB("hub"),
+ /**
+ * mode: farming_1
+ */
+ THE_FARMING_ISLAND("farming_1"),
+ /**
+ * mode: foraging_1
+ */
+ THE_PARK("foraging_1"),
+ /**
+ * mode: combat_1
+ */
+ SPIDERS_DEN("combat_1"),
+ /**
+ * mode: combat_2
+ */
+ BLAZING_FORTRESS("combat_2"),
+ /**
+ * mode: combat_3
+ */
+ THE_END("combat_3"),
+ /**
+ * mode: crimson_isle
+ */
+ CRIMSON_ISLE("crimson_isle"),
+ /**
+ * mode: mining_1
+ */
+ GOLD_MINE("mining_1"),
+ /**
+ * mode: mining_2
+ */
+ DEEP_CAVERNS("mining_2"),
+ /**
+ * mode: mining_3
+ */
+ DWARVEN_MINES("mining_3"),
+ /**
+ * mode: dungeon_hub
+ */
+ DUNGEON_HUB("dungeon_hub"),
+ /**
+ * mode: winter
+ */
+ WINTER_ISLAND("winter"),
+ /**
+ * mode: rift
+ */
+ THE_RIFT("rift"),
+ /**
+ * mode: dark_auction
+ */
+ DARK_AUCTION("dark_auction"),
+ /**
+ * mode: crystal_hollows
+ */
+ CRYSTAL_HOLLOWS("crystal_hollows"),
+ /**
+ * mode: dungeon
+ */
+ DUNGEON("dungeon"),
+ /**
+ * mode: kuudra
+ */
+ KUUDRAS_HOLLOW("kuudra"),
+ /**
+ * Unknown Skyblock location
+ */
+ UNKNOWN("unknown");
+
+ /**
+ * location id from Hypixel API
+ */
+ private final String id;
+
+ /**
+ * @param id location id from Hypixel API
+ */
+ Location(String id) {
+ this.id = id;
+ }
+
+ /**
+ * @return location id
+ */
+ public String id() {
+ return this.id;
+ }
+
+ /**
+ * @param id location id from Hypixel API
+ * @return location object
+ */
+ public static Location from(String id) {
+ return Arrays.stream(Location.values()).filter(loc -> id.equals(loc.id())).findFirst().orElse(UNKNOWN);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java
index cd739a0c..08d0b167 100644
--- a/src/main/java/de/hysky/skyblocker/utils/Utils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java
@@ -3,10 +3,8 @@ package de.hysky.skyblocker.utils;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import de.hysky.skyblocker.events.SkyblockEvents;
-import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.item.MuseumItemCache;
import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
-import de.hysky.skyblocker.skyblock.rift.TheRift;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -37,14 +35,16 @@ import java.util.concurrent.CompletableFuture;
public class Utils {
private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class);
private static final String ALTERNATE_HYPIXEL_ADDRESS = System.getProperty("skyblocker.alternateHypixelAddress", "");
- private static final String DUNGEONS_LOCATION = "dungeon";
- private static final String CRYSTAL_HOLLOWS_LOCATION = "crystal_hollows";
- private static final String DWARVEN_MINES_LOCATION = "mining_3";
private static final String PROFILE_PREFIX = "Profile: ";
private static boolean isOnHypixel = false;
private static boolean isOnSkyblock = false;
private static boolean isInjected = false;
+ /**
+ * Current Skyblock location (from /locraw)
+ */
+ @NotNull
+ private static Location location = Location.UNKNOWN;
/**
* The profile name parsed from the player list.
*/
@@ -88,31 +88,30 @@ public class Utils {
}
public static boolean isInDungeons() {
- return getLocationRaw().equals(DUNGEONS_LOCATION) || FabricLoader.getInstance().isDevelopmentEnvironment();
+ return location == Location.DUNGEON || FabricLoader.getInstance().isDevelopmentEnvironment();
}
public static boolean isInCrystalHollows() {
- return getLocationRaw().equals(CRYSTAL_HOLLOWS_LOCATION) || FabricLoader.getInstance().isDevelopmentEnvironment();
+ return location == Location.CRYSTAL_HOLLOWS || FabricLoader.getInstance().isDevelopmentEnvironment();
}
public static boolean isInDwarvenMines() {
- return getLocationRaw().equals(DWARVEN_MINES_LOCATION) || FabricLoader.getInstance().isDevelopmentEnvironment();
+ return location == Location.DWARVEN_MINES || FabricLoader.getInstance().isDevelopmentEnvironment();
}
public static boolean isInTheRift() {
- return getLocationRaw().equals(TheRift.LOCATION);
+ return location == Location.THE_RIFT;
}
/**
* @return if the player is in the end island
*/
public static boolean isInTheEnd() {
- // /locraw returns "combat_3" when in The End
- return getLocationRaw().equals("combat_3");
+ return location == Location.THE_END;
}
public static boolean isInKuudra() {
- return getLocationRaw().equals(Kuudra.LOCATION);
+ return location == Location.KUUDRAS_HOLLOW;
}
public static boolean isInjected() {
@@ -132,6 +131,14 @@ public class Utils {
return profileId;
}
+ /**
+ * @return the location parsed from /locraw.
+ */
+ @NotNull
+ public static Location getLocation() {
+ return location;
+ }
+
/**
* @return the server parsed from /locraw.
*/
@@ -375,6 +382,32 @@ public class Utils {
}
}
+ /**
+ * Parses /locraw chat message and updates {@link #server}, {@link #gameType}, {@link #locationRaw}, {@link #map}
+ * and {@link #location}
+ *
+ * @param message json message from chat
+ */
+ private static void parseLocRaw(String message) {
+ JsonObject locRaw = JsonParser.parseString(message).getAsJsonObject();
+
+ if (locRaw.has("server")) {
+ server = locRaw.get("server").getAsString();
+ }
+ if (locRaw.has("gameType")) {
+ gameType = locRaw.get("gameType").getAsString();
+ }
+ if (locRaw.has("mode")) {
+ locationRaw = locRaw.get("mode").getAsString();
+ location = Location.from(locationRaw);
+ } else {
+ location = Location.UNKNOWN;
+ }
+ if (locRaw.has("map")) {
+ map = locRaw.get("map").getAsString();
+ }
+ }
+
/**
* Parses the /locraw reply from the server and updates the player's profile id
*
@@ -382,25 +415,13 @@ public class Utils {
*/
public static boolean onChatMessage(Text text, boolean overlay) {
String message = text.getString();
- if (message.startsWith("{\"server\":") && message.endsWith("}")) {
- JsonObject locRaw = JsonParser.parseString(message).getAsJsonObject();
- if (locRaw.has("server")) {
- server = locRaw.get("server").getAsString();
- if (locRaw.has("gameType")) {
- gameType = locRaw.get("gameType").getAsString();
- }
- if (locRaw.has("mode")) {
- locationRaw = locRaw.get("mode").getAsString();
- }
- if (locRaw.has("map")) {
- map = locRaw.get("map").getAsString();
- }
- boolean shouldFilter = !sentLocRaw;
- sentLocRaw = false;
+ if (message.startsWith("{\"server\":") && message.endsWith("}")) {
+ parseLocRaw(message);
+ boolean shouldFilter = !sentLocRaw;
+ sentLocRaw = false;
- return shouldFilter;
- }
+ return shouldFilter;
}
if (isOnSkyblock && message.startsWith("Profile ID: ")) {
@@ -419,6 +440,7 @@ public class Utils {
gameType = "";
locationRaw = "";
map = "";
+ location = Location.UNKNOWN;
}
private static void tickMayorCache(boolean refresh) {
--
cgit