diff options
| author | Jacob <admin@kath.lol> | 2025-08-01 18:10:36 +0800 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-08-01 15:34:27 +0200 |
| commit | 501a9a33e78b6e9f98a004dfed933bc38c234eb5 (patch) | |
| tree | ff9574c49538c44550dc44ddb4ea58e8e7d6e42f /src/main/java/de/hysky | |
| parent | 77a990348e7eca92c5d1f05272c8c2528fc49740 (diff) | |
| download | Skyblocker-501a9a33e78b6e9f98a004dfed933bc38c234eb5.tar.gz Skyblocker-501a9a33e78b6e9f98a004dfed933bc38c234eb5.tar.bz2 Skyblocker-501a9a33e78b6e9f98a004dfed933bc38c234eb5.zip | |
feat: basic dungeons
Diffstat (limited to 'src/main/java/de/hysky')
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 |
