aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky
diff options
context:
space:
mode:
authorJacob <admin@kath.lol>2025-08-01 18:10:36 +0800
committerLinnea Gräf <nea@nea.moe>2025-08-01 15:34:27 +0200
commit501a9a33e78b6e9f98a004dfed933bc38c234eb5 (patch)
treeff9574c49538c44550dc44ddb4ea58e8e7d6e42f /src/main/java/de/hysky
parent77a990348e7eca92c5d1f05272c8c2528fc49740 (diff)
downloadSkyblocker-501a9a33e78b6e9f98a004dfed933bc38c234eb5.tar.gz
Skyblocker-501a9a33e78b6e9f98a004dfed933bc38c234eb5.tar.bz2
Skyblocker-501a9a33e78b6e9f98a004dfed933bc38c234eb5.zip
feat: basic dungeons
Diffstat (limited to 'src/main/java/de/hysky')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Dungeons.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsLevelWidget.java102
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsPage.java70
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java2
4 files changed, 200 insertions, 1 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Dungeons.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Dungeons.java
index 076f3ea5..c250beb3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Dungeons.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Dungeons.java
@@ -2,6 +2,8 @@ package de.hysky.skyblocker.skyblock.profileviewer.model;
import com.google.gson.annotations.SerializedName;
import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder;
+import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
+import net.minecraft.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.time.LocalDate;
@@ -21,6 +23,31 @@ public class Dungeons {
public Treasures treasures = new Treasures();
@SerializedName("player_classes")
public Map<String, ClassStats> classStats = Map.of();
+
+ public ClassStats getClassData(Class dungeonClass) {
+ return classStats.getOrDefault(dungeonClass.getName().toLowerCase(), new ClassStats());
+ }
+
+ public enum Class {
+ HEALER("Healer", Ico.S_POTION),
+ MAGE("Mage", Ico.B_ROD),
+ BERSERK("Berserk", Ico.IRON_SWORD),
+ ARCHER("Archer", Ico.BOW),
+ TANK("Tank", Ico.CHESTPLATE);
+
+ private final String name;
+ private final ItemStack itemStack;
+
+ Class(String name, ItemStack itemStack) {
+ this.name = name;
+ this.itemStack = itemStack;
+ }
+
+ public String getName() { return name; }
+
+ public ItemStack getIcon() { return itemStack; }
+ }
+
@SerializedName("dungeon_types")
public PerDungeonType dungeonInfo;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsLevelWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsLevelWidget.java
new file mode 100644
index 00000000..d93db388
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsLevelWidget.java
@@ -0,0 +1,102 @@
+package de.hysky.skyblocker.skyblock.profileviewer.rework.pages;
+
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.profileviewer.model.Dungeons;
+import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerData;
+import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget;
+import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder;
+import de.hysky.skyblocker.utils.render.HudHelper;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gl.RenderPipelines;
+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.ArrayList;
+import java.util.List;
+
+import static de.hysky.skyblocker.utils.Formatters.INTEGER_NUMBERS;
+import static de.hysky.skyblocker.utils.Formatters.SHORT_INTEGER_NUMBERS;
+
+final class DungeonsLevelWidget implements ProfileViewerWidget {
+ private static final Identifier ICON_DATA_TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/icon_data_widget.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 final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ private final Dungeons.Class dungeonClass;
+ private final LevelFinder.LevelInfo levelInfo;
+
+ DungeonsLevelWidget(
+ Dungeons.Class dungeonClass,
+ LevelFinder.LevelInfo levelInfo
+ ) {
+ this.dungeonClass = dungeonClass;
+ this.levelInfo = levelInfo;
+ }
+
+ public static final int WIDTH = 109;
+ public static final int HEIGHT = 26;
+
+ @Override
+ public void render(DrawContext drawContext,
+ int x, int y, int mouseX, int mouseY, float deltaTicks) {
+ drawContext.drawTexture(RenderPipelines.GUI_TEXTURED, ICON_DATA_TEXTURE, x, y, 0, 0, WIDTH, HEIGHT, WIDTH, HEIGHT);
+ drawContext.drawItem(dungeonClass.getIcon(), x + 3, y + 5);
+ drawContext.drawText(textRenderer, dungeonClass.getName() + " " + levelInfo.level, x + 31, y + 4, -1, false);
+ Color fillColor = Color.GREEN;
+ var levelCap = dungeonClass.getName().equals("Vampire") ? 5 : 9;
+ if (levelInfo.level >= levelCap)
+ fillColor = Color.MAGENTA;
+ drawContext.drawGuiTexture(RenderPipelines.GUI_TEXTURED, BAR_BACK, x + 30, y + 14, 75, 6);
+ HudHelper.renderNineSliceColored(drawContext, BAR_FILL, x + 30, y + 14, (int) (75 * levelInfo.fill), 6, fillColor);
+
+ // TODO: add helper for hover selection
+ if (mouseX > x + 30 && mouseX < x + 105 && mouseY > y + 14 && mouseY < y + 21) {
+ List<Text> tooltipText = new ArrayList<>();
+ tooltipText.add(Text.literal(dungeonClass.getName() + " " + levelInfo.level).formatted(Formatting.GREEN));
+ if (levelInfo.level < levelCap) {
+ tooltipText.add(Text.literal("Progress to Level " + (levelInfo.level + 1) + ":").formatted(Formatting.GRAY));
+ tooltipText.add(Text.literal("")
+ .append(formatBar(levelInfo.fill, 15, Formatting.DARK_GREEN, Formatting.GRAY))
+ .append(" ")
+ .append(INTEGER_NUMBERS.format(levelInfo.levelXP))
+ .append("/")
+ .append(SHORT_INTEGER_NUMBERS.format(levelInfo.nextLevelXP))
+ .formatted(Formatting.YELLOW));
+ tooltipText.add(
+ Text.literal("XP till " + (levelInfo.level + 1) + ": ")
+ .append(Text.literal(INTEGER_NUMBERS.format(levelInfo.nextLevelXP - levelInfo.levelXP)).formatted(Formatting.YELLOW))
+ .formatted(Formatting.GRAY));
+ } else {
+ tooltipText.add(Text.literal("Progress: §6MAXED").formatted(Formatting.GRAY));
+ }
+ tooltipText.add(Text.literal("§7Total XP: §r" + INTEGER_NUMBERS.format(levelInfo.xp)).formatted(Formatting.YELLOW));
+ drawContext.drawTooltip(textRenderer, tooltipText, mouseX, mouseY);
+ }
+ }
+
+ private static Text formatBar(double percentage, int total, Formatting filledStyle, Formatting emptyStyle) {
+ return formatBar((int) Math.round(percentage * total), total, filledStyle, emptyStyle);
+ }
+
+ private static Text formatBar(int filled, int total, Formatting filledStyle, Formatting emptyStyle) {
+ assert filled <= total;
+ return Text.literal("")
+ .append(Text.literal(" ".repeat(filled)).formatted(filledStyle, Formatting.STRIKETHROUGH, Formatting.BOLD))
+ .append(Text.literal(" ".repeat(total - filled)).formatted(emptyStyle, Formatting.STRIKETHROUGH, Formatting.BOLD));
+ }
+
+ @Override
+ public int getHeight() {
+ return HEIGHT;
+ }
+
+ @Override
+ public int getWidth() {
+ return WIDTH;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsPage.java
new file mode 100644
index 00000000..966b1acf
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsPage.java
@@ -0,0 +1,70 @@
+package de.hysky.skyblocker.skyblock.profileviewer.rework.pages;
+
+import de.hysky.skyblocker.annotations.Init;
+import de.hysky.skyblocker.skyblock.profileviewer.model.Dungeons;
+import de.hysky.skyblocker.skyblock.profileviewer.model.PlayerData;
+import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerData;
+import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileLoadState;
+import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerPage;
+import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerScreenRework;
+import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget;
+import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
+import net.minecraft.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.OptionalInt;
+
+public class DungeonsPage implements ProfileViewerPage {
+
+ List<ProfileViewerWidget.Instance> widgets = new ArrayList<>();
+
+ public DungeonsPage(ProfileLoadState.SuccessfulLoad load) {
+ var dungeonsData = load.member().dungeons;
+ List<ProfileViewerWidget> dungeons = new ArrayList<>();
+ dungeons.add(new SkillWidget(PlayerData.Skill.CATACOMBS, PlayerData.Skill.CATACOMBS.getLevelInfo(dungeonsData.dungeonInfo.catacombs.experience), OptionalInt.empty()));
+ dungeons.add(new DungeonsLevelWidget(Dungeons.Class.HEALER, dungeonsData.getClassData(Dungeons.Class.HEALER).getLevelInfo()));
+ dungeons.add(new DungeonsLevelWidget(Dungeons.Class.MAGE, dungeonsData.getClassData(Dungeons.Class.MAGE).getLevelInfo()));
+ dungeons.add(new DungeonsLevelWidget(Dungeons.Class.BERSERK, dungeonsData.getClassData(Dungeons.Class.BERSERK).getLevelInfo()));
+ dungeons.add(new DungeonsLevelWidget(Dungeons.Class.ARCHER, dungeonsData.getClassData(Dungeons.Class.ARCHER).getLevelInfo()));
+ dungeons.add(new DungeonsLevelWidget(Dungeons.Class.TANK, dungeonsData.getClassData(Dungeons.Class.TANK).getLevelInfo()));
+
+ int i = 0;
+ for (var dungeon : dungeons) {
+ int x = i < 6 ? 88 : 88 + 113;
+ int y = (i % 6) * (2 + 26);
+ i++;
+ widgets.add(widget(
+ x, y, dungeon
+ ));
+ }
+ widgets.add(widget(0, 0, new EntityViewerWidget(load.mainMemberId())));
+ widgets.add(widget(0, 112, new PlayerMetaWidget(load)));
+ }
+
+ @Init
+ public static void init() {
+ ProfileViewerScreenRework.PAGE_CONSTRUCTORS.add(DungeonsPage::new);
+ }
+
+ @Override
+ public int getSortIndex() {
+ return 2;
+ }
+
+ @Override
+ public ItemStack getIcon() {
+ return Ico.AATROX_BATPHONE_SKULL;
+ }
+
+ @Override
+ public String getName() {
+ return "Slayers";
+ }
+
+ @Override
+ public List<ProfileViewerWidget.Instance> getWidgets() {
+ // TODO: add player widget to the left only on this page.
+ return widgets;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java
index 8f0a152a..158fbb1e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java
@@ -45,7 +45,7 @@ public class SlayersPage implements ProfileViewerPage {
@Init
public static void init() {
- ProfileViewerScreenRework.PAGE_CONSTRUCTORS.add(SlayersPage::new);
+// ProfileViewerScreenRework.PAGE_CONSTRUCTORS.add(SlayersPage::new);
}
@Override