aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons
diff options
context:
space:
mode:
authorKevin <92656833+kevinthegreat1@users.noreply.github.com>2024-06-30 14:35:01 +0800
committerGitHub <noreply@github.com>2024-06-30 14:35:01 +0800
commitb75bfdbeae151253d60c01c2c268dfa511997883 (patch)
tree11735fc95f58a6d4e85bd0a44cb009ca418924e5 /src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons
parentbc773c76b3362af799577c89fa6f7b79c1ee013b (diff)
parentd824171262521557c73688068804c5d9119fbc7c (diff)
downloadSkyblocker-b75bfdbeae151253d60c01c2c268dfa511997883.tar.gz
Skyblocker-b75bfdbeae151253d60c01c2c268dfa511997883.tar.bz2
Skyblocker-b75bfdbeae151253d60c01c2c268dfa511997883.zip
Merge pull request #708 from BigloBot/main
Profile Viewer
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java62
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java55
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonHeaderWidget.java46
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java61
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java39
5 files changed, 263 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java
new file mode 100644
index 00000000..3b847b1b
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java
@@ -0,0 +1,62 @@
+package de.hysky.skyblocker.skyblock.profileviewer.dungeons;
+
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder;
+import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+
+import java.awt.*;
+import java.util.Map;
+
+public class DungeonClassWidget {
+ private final String className;
+ private LevelFinder.LevelInfo classLevel;
+ private static final int CLASS_CAP = 50;
+ private JsonObject classData;
+ private final ItemStack stack;
+ private boolean active = false;
+
+ private static final Identifier TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/icon_data_widget.png");
+ private static final Identifier ACTIVE_TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
+ private static final Identifier BAR_FILL = Identifier.of(SkyblockerMod.NAMESPACE, "bars/bar_fill");
+ private static final Identifier BAR_BACK = Identifier.of(SkyblockerMod.NAMESPACE, "bars/bar_back");
+
+ private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ private static final Map<String, ItemStack> CLASS_ICON = Map.ofEntries(
+ Map.entry("Healer", Ico.S_POTION),
+ Map.entry("Mage", Ico.B_ROD),
+ Map.entry("Berserk", Ico.IRON_SWORD),
+ Map.entry("Archer", Ico.BOW),
+ Map.entry("Tank", Ico.CHESTPLATE)
+ );
+
+ public DungeonClassWidget(String className, JsonObject playerProfile) {
+ this.className = className;
+ stack = CLASS_ICON.getOrDefault(className, Ico.BARRIER);
+ try {
+ classData = playerProfile.getAsJsonObject("dungeons").getAsJsonObject("player_classes").getAsJsonObject(this.className.toLowerCase());
+ classLevel = LevelFinder.getLevelInfo("Catacombs", classData.get("experience").getAsLong());
+ active = playerProfile.getAsJsonObject("dungeons").get("selected_dungeon_class").getAsString().equals(className.toLowerCase());
+ } catch (Exception ignored) {
+ classLevel = LevelFinder.getLevelInfo("", 0);
+ }
+ }
+
+ public void render(DrawContext context, int x, int y) {
+ context.drawTexture(TEXTURE, x, y, 0, 0, 109, 26, 109, 26);
+ context.drawItem(stack, x + 3, y + 5);
+ if (active) context.drawTexture(ACTIVE_TEXTURE, x + 3, y + 5, 0, 0, 16, 16, 16, 16);
+
+ context.drawText(textRenderer, className + " " + classLevel.level, x + 31, y + 5, Color.WHITE.getRGB(), false);
+ Color fillColor = classLevel.level >= CLASS_CAP ? Color.MAGENTA : Color.GREEN;
+ context.drawGuiTexture(BAR_BACK, x + 30, y + 15, 75, 6);
+ RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 30, y + 15, (int) (75 * classLevel.fill), 6, fillColor);
+ }
+
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java
new file mode 100644
index 00000000..7c9206c0
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java
@@ -0,0 +1,55 @@
+package de.hysky.skyblocker.skyblock.profileviewer.dungeons;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.Identifier;
+
+import java.awt.*;
+import java.util.Map;
+
+public class DungeonFloorRunsWidget {
+ private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ private static final Identifier TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/dungeons_body.png");
+
+ private static final String[] DUNGEONS = {"catacombs", "master_catacombs"};
+ private JsonObject dungeonsStats;
+
+ public DungeonFloorRunsWidget(JsonObject pProfile) {
+ try {
+ dungeonsStats = pProfile.getAsJsonObject("dungeons").getAsJsonObject("dungeon_types");
+ } catch (Exception ignored) {}
+ }
+
+ // TODO: Hovering on each floor should probably showcase best run times in a tooltip
+ public void render(DrawContext context, int x, int y) {
+ context.drawTexture(TEXTURE, x, y, 0, 0, 109, 110, 109, 110);
+ context.drawText(textRenderer, Text.literal("Floor Runs").formatted(Formatting.BOLD), x + 6, y + 4, Color.WHITE.getRGB(), true);
+
+ int columnX = x + 4;
+ int elementY = y + 15;
+ for (String dungeon : DUNGEONS) {
+ JsonObject dungeonData;
+ try {
+ dungeonData = dungeonsStats.getAsJsonObject(dungeon).getAsJsonObject(dungeon.equals("catacombs") ? "times_played" : "tier_completions");
+ for (Map.Entry<String, JsonElement> entry : dungeonData.entrySet()) {
+ if (entry.getKey().equals("total")) continue;
+
+ String textToRender = String.format((dungeon.equals("catacombs") ? "§aF" : "§cM") + "%s§r %s", entry.getKey(), entry.getValue().getAsInt());
+ context.drawText(textRenderer, textToRender, columnX + 2, elementY + 2, Color.WHITE.getRGB(), true);
+
+ elementY += 11;
+ }
+ columnX += 52;
+ elementY = y + 26;
+ } catch (Exception e) {
+ return;
+ }
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonHeaderWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonHeaderWidget.java
new file mode 100644
index 00000000..1a62a47b
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonHeaderWidget.java
@@ -0,0 +1,46 @@
+package de.hysky.skyblocker.skyblock.profileviewer.dungeons;
+
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.util.Identifier;
+
+import java.awt.*;
+import java.text.DecimalFormat;
+
+public class DungeonHeaderWidget {
+ private LevelFinder.LevelInfo classLevel;
+ private float classAvg;
+
+ private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ private static final DecimalFormat DF = new DecimalFormat("#.##");
+ private static final Identifier TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/dungeons_header.png");
+
+ public DungeonHeaderWidget(JsonObject playerProfile, String[] classes) {
+ try {
+ JsonObject DUNGEONS_PROFILE = playerProfile.getAsJsonObject("dungeons").getAsJsonObject("dungeon_types").getAsJsonObject("catacombs");
+ this.classLevel = LevelFinder.getLevelInfo("Catacombs", DUNGEONS_PROFILE.get("experience").getAsLong());
+
+ float avg = 0;
+ JsonObject CLASS_DATA = playerProfile.getAsJsonObject("dungeons").getAsJsonObject("player_classes");
+ for (String element : classes) {
+ avg += LevelFinder.getLevelInfo("Catacombs", CLASS_DATA.getAsJsonObject(element.toLowerCase()).get("experience").getAsLong()).level;
+ }
+ classAvg = avg/classes.length;
+ } catch (Exception ignored) {
+ this.classLevel = LevelFinder.getLevelInfo("", 0);
+ classAvg = 0;
+ }
+ }
+
+ public void render(DrawContext context, int x, int y) {
+ context.drawTexture(TEXTURE, x, y, 0, 0, 109, 26, 109, 26);
+
+ context.drawText(textRenderer, "§i§6§lCatacombs §r" + this.classLevel.level, x + 3, y + 4, Color.WHITE.getRGB(), true);
+
+ context.drawText(textRenderer, "§eClass Average §r" + DF.format(this.classAvg), x + 3, y + 14, Color.WHITE.getRGB(), true);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java
new file mode 100644
index 00000000..679cc575
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java
@@ -0,0 +1,61 @@
+package de.hysky.skyblocker.skyblock.profileviewer.dungeons;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.util.Identifier;
+
+import java.awt.*;
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DungeonMiscStatsWidgets {
+ private static final Identifier TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/icon_data_widget.png");
+ private static final Identifier RUN_ICON = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/run_icon.png");
+ private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ private static final DecimalFormat DF = new DecimalFormat("#.##");
+ private static final String[] DUNGEONS = {"catacombs", "master_catacombs"};
+
+ private final Map<String, Integer> dungeonRuns = new HashMap<>();
+ private int secrets = 0;
+ private int totalRuns = 0;
+
+ public DungeonMiscStatsWidgets(JsonObject pProfile) {
+ JsonObject DUNGEONS_DATA = pProfile.getAsJsonObject("dungeons");
+ try {
+ secrets = DUNGEONS_DATA.get("secrets").getAsInt();
+
+ for (String dungeon : DUNGEONS) {
+ JsonObject dungeonData = DUNGEONS_DATA.getAsJsonObject("dungeon_types").getAsJsonObject(dungeon).getAsJsonObject(dungeon.equals("catacombs") ? "times_played" : "tier_completions");
+ int runs = 0;
+ for (Map.Entry<String, JsonElement> entry : dungeonData.entrySet()) {
+ String key = entry.getKey();
+ if (key.equals("total")) continue;
+ runs += entry.getValue().getAsInt();
+ }
+ dungeonRuns.put(dungeon, runs);
+ totalRuns += runs;
+ }
+
+ } catch (Exception ignored) {}
+ }
+
+ public void render(DrawContext context, int x, int y) {
+ context.drawTexture(TEXTURE, x, y, 0, 0, 109, 26, 109, 26);
+ context.drawItem(Ico.FEATHER, x + 2, y + 4);
+
+ context.drawText(textRenderer, "Secrets " + secrets, x + 30, y + 4, Color.WHITE.getRGB(), true);
+ context.drawText(textRenderer, "Avg " + (totalRuns > 0 ? DF.format(secrets / (float) totalRuns) : 0) + "/Run", x + 30, y + 14, Color.WHITE.getRGB(), true);
+
+ context.drawTexture(TEXTURE, x, y + 28, 0, 0, 109, 26, 109, 26);
+ context.drawTexture(RUN_ICON, x + 4, y + 33, 0, 0, 14, 16, 14, 16);
+
+ context.drawText(textRenderer, "§aNormal §r" + dungeonRuns.getOrDefault("catacombs", 0), x + 30, y + 32, Color.WHITE.getRGB(), true);
+ context.drawText(textRenderer, "§cMaster §r" + dungeonRuns.getOrDefault("master_catacombs", 0), x + 30, y + 42, Color.WHITE.getRGB(), true);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java
new file mode 100644
index 00000000..b1398661
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java
@@ -0,0 +1,39 @@
+package de.hysky.skyblocker.skyblock.profileviewer.dungeons;
+
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerPage;
+import de.hysky.skyblocker.utils.ProfileUtils;
+import net.minecraft.client.gui.DrawContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DungeonsPage implements ProfileViewerPage {
+ public static final Logger LOGGER = LoggerFactory.getLogger(ProfileUtils.class);
+ private static final String[] CLASSES = {"Healer", "Mage", "Berserk", "Archer", "Tank"};
+
+ private final DungeonHeaderWidget dungeonHeaderWidget;
+ private final List<DungeonClassWidget> dungeonClassWidgetsList = new ArrayList<>();
+ private final DungeonFloorRunsWidget dungeonFloorRunsWidget;
+ private final DungeonMiscStatsWidgets dungeonMiscStatsWidgets;
+
+ public DungeonsPage(JsonObject pProfile) {
+ dungeonHeaderWidget = new DungeonHeaderWidget(pProfile, CLASSES);
+ dungeonFloorRunsWidget = new DungeonFloorRunsWidget(pProfile);
+ dungeonMiscStatsWidgets = new DungeonMiscStatsWidgets(pProfile);
+ for (String element : CLASSES) {
+ dungeonClassWidgetsList.add(new DungeonClassWidget(element, pProfile));
+ }
+ }
+
+ public void render(DrawContext context, int mouseX, int mouseY, float delta, int rootX, int rootY) {
+ dungeonHeaderWidget.render(context, rootX, rootY);
+ dungeonFloorRunsWidget.render(context, rootX + 113, rootY + 56);
+ dungeonMiscStatsWidgets.render(context, rootX + 113, rootY);
+ for (int i = 0; i < dungeonClassWidgetsList.size(); i++) {
+ dungeonClassWidgetsList.get(i).render(context, rootX, rootY + 28 + i * 28);
+ }
+ }
+}