aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills
diff options
context:
space:
mode:
authornmccullagh <narhanael64@gmail.com>2024-05-13 15:54:01 +0100
committernmccullagh <narhanael64@gmail.com>2024-06-29 00:44:04 +0100
commit0f2c29fe6cc57cae766fa0d862cda6c26f1b0741 (patch)
treed9f5dcd7d97aeea52e3fff165c6c525193e72cfd /src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills
parentd12504ef9992a72de9eb3c3a930c9f3c855c0acc (diff)
downloadSkyblocker-0f2c29fe6cc57cae766fa0d862cda6c26f1b0741.tar.gz
Skyblocker-0f2c29fe6cc57cae766fa0d862cda6c26f1b0741.tar.bz2
Skyblocker-0f2c29fe6cc57cae766fa0d862cda6c26f1b0741.zip
profile viewer skill page
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java95
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java93
2 files changed, 188 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java
new file mode 100644
index 00000000..3a3870f3
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java
@@ -0,0 +1,95 @@
+package de.hysky.skyblocker.skyblock.profileviewer.skills;
+
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder;
+import de.hysky.skyblocker.skyblock.profileviewer.utils.SkullCreator;
+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 SkillWidget {
+ private final String SKILL_NAME;
+ private final LevelFinder.LevelInfo SKILL_LEVEL;
+
+ 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 final ItemStack stack;
+ private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ private static final Map<String, ItemStack> SKILL_LOGO = Map.ofEntries(
+ Map.entry("Combat", Ico.STONE_SWORD),
+ Map.entry("Farming", Ico.GOLDEN_HOE),
+ Map.entry("Mining", Ico.STONE_PICKAXE),
+ Map.entry("Foraging", Ico.JUNGLE_SAPLING),
+ Map.entry("Fishing", Ico.FISH_ROD),
+ Map.entry("Enchanting", Ico.ENCHANTING_TABLE),
+ Map.entry("Alchemy", Ico.BREWING_STAND),
+ Map.entry("Taming", Ico.SPAWN_EGG),
+ Map.entry("Carpentry", Ico.CRAFTING_TABLE),
+ Map.entry("Catacombs", SkullCreator.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliNTY4OTViOTY1OTg5NmFkNjQ3ZjU4NTk5MjM4YWY1MzJkNDZkYjljMWIwMzg5YjhiYmViNzA5OTlkYWIzM2QifX19")),
+ Map.entry("Runecraft", Ico.MAGMA_CREAM),
+ Map.entry("Social", Ico.EMERALD)
+ );
+ private static final Map<String, Integer> SKILL_CAP = Map.ofEntries(
+ Map.entry("Combat", 60),
+ Map.entry("Farming", 60),
+ Map.entry("Mining", 60),
+ Map.entry("Foraging", 50),
+ Map.entry("Fishing", 50),
+ Map.entry("Enchanting", 60),
+ Map.entry("Alchemy", 50),
+ Map.entry("Taming", 60),
+ Map.entry("Carpentry", 50),
+ Map.entry("Catacombs", 50),
+ Map.entry("Runecraft", 25),
+ Map.entry("Social", 25)
+ );
+ private static final Map<String, Integer> SOFT_SKILL_CAP = Map.of(
+ "Taming", 50,
+ "Farming", 50
+ );
+
+ private static final Map<String, Integer> INFINITE = Map.of(
+ "Catacombs", 0
+ );
+
+ public SkillWidget(String skill, long xp, int playerCap) {
+ this.SKILL_NAME = skill;
+ this.SKILL_LEVEL = LevelFinder.getLevelInfo(skill, xp);
+ if (SKILL_LEVEL.level >= SKILL_CAP.get(skill) && !INFINITE.containsKey(skill)) {
+ SKILL_LEVEL.fill = 1;
+ SKILL_LEVEL.level = SKILL_CAP.get(skill);
+ }
+
+ this.stack = SKILL_LOGO.getOrDefault(skill, Ico.BARRIER);
+ if (playerCap != -1) {
+ this.SKILL_LEVEL.level = Math.min(SKILL_LEVEL.level, (SOFT_SKILL_CAP.get(this.SKILL_NAME) + playerCap));
+ }
+
+ }
+
+ public void render(DrawContext context, int x, int y) {
+ context.drawItem(this.stack, x + 3, y + 2);
+ context.drawText(textRenderer, SKILL_NAME + " " + SKILL_LEVEL.level, x + 31, y + 2, Color.white.hashCode(), false);
+
+ Color fillColor = Color.green;
+ if (SKILL_LEVEL.level >= SKILL_CAP.get(SKILL_NAME)) {
+ fillColor = Color.MAGENTA;
+ }
+
+ if ((SOFT_SKILL_CAP.containsKey(SKILL_NAME) && SKILL_LEVEL.level > SOFT_SKILL_CAP.get(SKILL_NAME)) && SKILL_LEVEL.level < SKILL_CAP.get(SKILL_NAME) && SKILL_LEVEL.fill == 1 ||
+ (SKILL_NAME.equals("Taming") && SKILL_LEVEL.level >= SOFT_SKILL_CAP.get(SKILL_NAME))) {
+ fillColor = Color.YELLOW;
+ }
+
+ context.drawGuiTexture(BAR_BACK, x + 30, y + 12, 75, 6);
+ RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 30, y + 12, (int) (75 * SKILL_LEVEL.fill), 6, fillColor);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java
new file mode 100644
index 00000000..c331bbdd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java
@@ -0,0 +1,93 @@
+package de.hysky.skyblocker.skyblock.profileviewer.skills;
+
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerPage;
+import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.util.Identifier;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SkillsPage implements ProfileViewerPage {
+ private static final Identifier TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/icon_data_widget.png");
+ private static final String[] SKILLS = {"Combat", "Mining", "Farming", "Foraging", "Fishing", "Enchanting", "Alchemy", "Taming", "Carpentry", "Catacombs", "Runecraft", "Social"};
+ private static final int ROW_GAP = 28;
+
+ private final JsonObject HYPIXEL_PROFILE;
+ private final JsonObject PLAYER_PROFILE;
+
+ private final List<SkillWidget> skillWidgets = new ArrayList<>();
+ private JsonObject skills;
+
+ public SkillsPage(JsonObject hProfile, JsonObject pProfile) {
+ this.HYPIXEL_PROFILE = hProfile;
+ this.PLAYER_PROFILE = pProfile;
+
+ try {
+ this.skills = this.PLAYER_PROFILE.getAsJsonObject("player_data").getAsJsonObject("experience");
+ for (String skill : SKILLS) {
+ skillWidgets.add(new SkillWidget(skill, getSkillXP("SKILL_" + skill.toUpperCase()), getSkillCap(skill)));
+ }
+ } catch (Exception e) {
+ ProfileViewerScreen.LOGGER.error("[Skyblocker Profile Viewer] Error creating widgets.", e);
+ }
+ }
+
+ public void render(DrawContext context, int mouseX, int mouseY, float delta, int rootX, int rootY) {
+ int column2 = rootX + 113;
+ for (int i = 0; i < skillWidgets.size(); i++) {
+ int x = (i < 6) ? rootX : column2;
+ int y = rootY + (i % 6) * ROW_GAP;
+ context.drawTexture(TEXTURE, x, y, 0, 0, 109, 26, 109, 26);
+ skillWidgets.get(i).render(context, x, y + 3);
+ }
+ }
+
+ private int getSkillCap(String skill) {
+ try {
+ return switch (skill) {
+ case "Farming" -> this.PLAYER_PROFILE.getAsJsonObject("jacobs_contest").getAsJsonObject("perks").get("farming_level_cap").getAsInt();
+ default -> -1;
+ };
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ private long getSkillXP(String skill) {
+ try {
+ return switch (skill) {
+ case "SKILL_CATACOMBS" -> getCatacombsXP();
+ case "SKILL_SOCIAL" -> getCoopSocialXP();
+ case "SKILL_RUNECRAFT" -> this.skills.get("SKILL_RUNECRAFTING").getAsLong();
+ default -> this.skills.get(skill).getAsLong();
+ };
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ private long getCatacombsXP() {
+ try {
+ JsonObject dungeonSkills = this.PLAYER_PROFILE.getAsJsonObject("dungeons").getAsJsonObject("dungeon_types");
+ return dungeonSkills.getAsJsonObject("catacombs").get("experience").getAsLong();
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ private long getCoopSocialXP() {
+ long socialXP = 0;
+ JsonObject members = HYPIXEL_PROFILE.getAsJsonObject("members");
+ for (String memberId : members.keySet()) {
+ try {
+ socialXP += members.getAsJsonObject(memberId).getAsJsonObject("player_data").getAsJsonObject("experience").get("SKILL_SOCIAL").getAsLong();
+ } catch (Exception e) {
+ ProfileViewerScreen.LOGGER.warn("[Skyblocker Profile Viewer] Error calculating co-op social xp", e);
+ }
+ }
+ return socialXP;
+ }
+}