aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/thatgravyboat/skyblockhud/handlers/WarpHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/thatgravyboat/skyblockhud/handlers/WarpHandler.java')
-rw-r--r--src/main/java/com/thatgravyboat/skyblockhud/handlers/WarpHandler.java172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/main/java/com/thatgravyboat/skyblockhud/handlers/WarpHandler.java b/src/main/java/com/thatgravyboat/skyblockhud/handlers/WarpHandler.java
new file mode 100644
index 0000000..71079b6
--- /dev/null
+++ b/src/main/java/com/thatgravyboat/skyblockhud/handlers/WarpHandler.java
@@ -0,0 +1,172 @@
+package com.thatgravyboat.skyblockhud.handlers;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
+import com.google.gson.*;
+import com.thatgravyboat.skyblockhud.SkyblockHud;
+import com.thatgravyboat.skyblockhud.api.events.ProfileJoinedEvent;
+import com.thatgravyboat.skyblockhud.api.events.ProfileSwitchedEvent;
+import com.thatgravyboat.skyblockhud.mixins.GuiChestAccessor;
+import com.thatgravyboat.skyblockhud.utils.Utils;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.inventory.GuiChest;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.client.event.GuiOpenEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class WarpHandler {
+
+ private static String profile = null;
+ private static File warpConfig;
+ private static final Gson GSON = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
+ private static final SetMultimap<String, Warp> PLAYER_WARPS = HashMultimap.create();
+
+ public static Collection<Warp> getWarps() {
+ return PLAYER_WARPS.get(profile);
+ }
+
+ @SubscribeEvent
+ public void profileChange(ProfileSwitchedEvent event){
+ if (profile != null && !profile.equals(event.profile)){
+ load();
+ }
+ profile = event.profile;
+ }
+
+ @SubscribeEvent
+ public void profileJoined(ProfileJoinedEvent event){
+ if (profile != null && !profile.equals(event.profile)){
+ load();
+ }
+ profile = event.profile;
+ }
+
+ @SubscribeEvent
+ public void onGuiClosed(GuiOpenEvent event) {
+ boolean changed = false;
+ GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen;
+ if (currentScreen instanceof GuiChest){
+ GuiChestAccessor accessor = (GuiChestAccessor) currentScreen;
+ if (accessor.getLowerChestInventory().getDisplayName().getUnformattedText().contains("Fast Travel")){
+ for (int i = 9; i < Math.min(36, accessor.getLowerChestInventory().getSizeInventory()); i++) {
+ ItemStack stack = accessor.getLowerChestInventory().getStackInSlot(i);
+ if (stack != null && stack.getItem().equals(Items.skull) && stack.getTagCompound().hasKey("display")){
+ NBTTagList lore = stack.getTagCompound().getCompoundTag("display").getTagList("Lore", 8);
+
+ String warpLine = Utils.removeColor(lore.getStringTagAt(0)).trim();
+
+ if (warpLine.equals("Unknown island!")) continue;
+
+ String disabledLine = Utils.removeColor(lore.getStringTagAt(lore.tagCount()-1)).trim();
+
+ Warp warp = Warp.fromId(warpLine.replace("/warp", "").trim());
+
+ if (warp != null && !disabledLine.equals("Warp not unlocked!")) {
+ if (PLAYER_WARPS.put(profile, warp)){
+ changed = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (changed) save();
+ }
+
+ public static void save() {
+ JsonObject json = new JsonObject();
+ JsonArray array = new JsonArray();
+ PLAYER_WARPS.asMap().forEach((profile, warps) -> {
+ JsonObject profileObject = new JsonObject();
+ profileObject.addProperty("profile", profile);
+ JsonArray warpArray = new JsonArray();
+ warps.forEach(warp -> warpArray.add(new JsonPrimitive(warp.name())));
+ profileObject.add("warps", warpArray);
+ array.add(profileObject);
+ });
+ json.add("profileWarps", array);
+
+ warpConfig = new File(SkyblockHud.configDirectory, "sbh-warps.json");
+
+ try {
+ warpConfig.createNewFile();
+ try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(warpConfig), StandardCharsets.UTF_8))) {
+ writer.write(GSON.toJson(json));
+ }
+ } catch (IOException ignored) {}
+ }
+
+ public static boolean load() {
+ warpConfig = new File(SkyblockHud.configDirectory, "sbh-warps.json");
+
+ try {
+ if (warpConfig.createNewFile()) return true;
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(warpConfig), StandardCharsets.UTF_8))) {
+ JsonObject json = GSON.fromJson(reader, JsonObject.class);
+ json.get("profileWarps").getAsJsonArray().forEach(jsonElement -> {
+ JsonObject profileObject = jsonElement.getAsJsonObject();
+ List<Warp> warps = new ArrayList<>();
+ profileObject.get("warps").getAsJsonArray().forEach(warpId -> {
+ Warp warp = Warp.safeValueOf(warpId.getAsString());
+ if (warp != null) warps.add(warp);
+ });
+ PLAYER_WARPS.putAll(profileObject.get("profile").getAsString(), warps);
+ });
+ }
+ } catch (Exception ignored) {}
+ return false;
+ }
+
+ public enum Warp {
+ HUB("hub"),
+ PRIVATE("home"),
+ SPIDERSDEN("spider"),
+ BLAZINGFORTRESS("nether"),
+ THEEND("end"),
+ THEPARK("park"),
+ GOLDMINE("gold"),
+ DEEPCAVERNS("deep"),
+ DWARVENMINES("mines"),
+ THEBARN("barn"),
+ MUSHROOMDESERT("desert"),
+ THECASTLE("castle"),
+ SIRIUSSHACK("da"),
+ GRAVEYARDCAVES("crypt"),
+ SPIDERSNEST("nest"),
+ MAGMACUBE("magma"),
+ DRAGONNEST("drag"),
+ JUNGLE("jungle"),
+ HOWLINGCAVE("howl"),
+ DUNGEONHUB("dungeon_hub");
+
+ public String warpId;
+
+ Warp(String warpId){
+ this.warpId = warpId;
+ }
+
+ public static Warp fromId(String id){
+ for (Warp value : Warp.values()) {
+ if (value.warpId.equals(id)) return value;
+ }
+ return null;
+ }
+
+ public static Warp safeValueOf(String value){
+ try {
+ return Warp.valueOf(value);
+ }catch (Exception e) {
+ return null;
+ }
+ }
+ }
+
+}