From 3ec56dfbde5701489921ae759fa10c5349db0ceb Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 1 Aug 2025 20:22:16 +0800 Subject: refactor some level widgets into bar widget --- .../skyblock/profileviewer/rework/ErrorPage.java | 1 + .../skyblock/profileviewer/rework/LoadingPage.java | 1 + .../skyblock/profileviewer/rework/TextWidget.java | 41 -------- .../rework/pages/DungeonsLevelWidget.java | 102 ------------------ .../profileviewer/rework/pages/DungeonsPage.java | 13 +-- .../profileviewer/rework/pages/SkillWidget.java | 109 ------------------- .../profileviewer/rework/pages/SkillsPage.java | 31 +++--- .../rework/pages/SlayerKillsWidget.java | 67 ------------ .../rework/pages/SlayerLevelWidget.java | 101 ------------------ .../profileviewer/rework/pages/SlayerWidget.java | 63 +++++++++++ .../profileviewer/rework/pages/SlayersPage.java | 26 ++--- .../profileviewer/rework/widgets/BarWidget.java | 116 +++++++++++++++++++++ .../profileviewer/rework/widgets/TextWidget.java | 42 ++++++++ 13 files changed, 261 insertions(+), 452 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/TextWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsLevelWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerKillsWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerLevelWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/BarWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/TextWidget.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/ErrorPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/ErrorPage.java index 53a29544..b14dd0e2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/ErrorPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/ErrorPage.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.profileviewer.rework; +import de.hysky.skyblocker.skyblock.profileviewer.rework.widgets.TextWidget; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/LoadingPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/LoadingPage.java index 4d326277..f707b9e8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/LoadingPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/LoadingPage.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.profileviewer.rework; +import de.hysky.skyblocker.skyblock.profileviewer.rework.widgets.TextWidget; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/TextWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/TextWidget.java deleted file mode 100644 index 91fe329b..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/TextWidget.java +++ /dev/null @@ -1,41 +0,0 @@ -package de.hysky.skyblocker.skyblock.profileviewer.rework; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.Text; - -public final class TextWidget implements ProfileViewerWidget { - private final TextRenderer textRenderer; - private final Text text; - private final int offset; - - public TextWidget(TextRenderer textRenderer, Text text, boolean centered) { - this.textRenderer = textRenderer; - this.text = text; - this.offset = centered ? -textRenderer.getWidth(text) / 2 : 0; - } - - public static TextWidget leftAligned(Text text) { - return new TextWidget(MinecraftClient.getInstance().textRenderer, text, false); - } - - public static TextWidget centered(Text text) { - return new TextWidget(MinecraftClient.getInstance().textRenderer, text, true); - } - - @Override - public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, float deltaTicks) { - drawContext.drawText(textRenderer, text, x + offset, y, -1, true); - } - - @Override - public int getHeight() { - return textRenderer.fontHeight; - } - - @Override - public int getWidth() { - return 0; - } -} 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 deleted file mode 100644 index d93db388..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/DungeonsLevelWidget.java +++ /dev/null @@ -1,102 +0,0 @@ -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 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 index 966b1acf..608e659b 100644 --- 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 @@ -8,6 +8,7 @@ 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.profileviewer.rework.widgets.BarWidget; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.item.ItemStack; @@ -22,12 +23,12 @@ public class DungeonsPage implements ProfileViewerPage { public DungeonsPage(ProfileLoadState.SuccessfulLoad load) { var dungeonsData = load.member().dungeons; List 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())); + dungeons.add(new BarWidget(PlayerData.Skill.CATACOMBS.getName(), PlayerData.Skill.CATACOMBS.getIcon(), PlayerData.Skill.CATACOMBS.getLevelInfo(dungeonsData.dungeonInfo.catacombs.experience), OptionalInt.empty(), OptionalInt.empty())); + dungeons.add(new BarWidget(Dungeons.Class.HEALER.getName(), Dungeons.Class.HEALER.getIcon(), dungeonsData.getClassData(Dungeons.Class.HEALER).getLevelInfo(), OptionalInt.empty(), OptionalInt.empty())); + dungeons.add(new BarWidget(Dungeons.Class.MAGE.getName(), Dungeons.Class.MAGE.getIcon(), dungeonsData.getClassData(Dungeons.Class.MAGE).getLevelInfo(), OptionalInt.empty(), OptionalInt.empty())); + dungeons.add(new BarWidget(Dungeons.Class.BERSERK.getName(), Dungeons.Class.BERSERK.getIcon(), dungeonsData.getClassData(Dungeons.Class.BERSERK).getLevelInfo(), OptionalInt.empty(), OptionalInt.empty())); + dungeons.add(new BarWidget(Dungeons.Class.ARCHER.getName(), Dungeons.Class.ARCHER.getIcon(), dungeonsData.getClassData(Dungeons.Class.ARCHER).getLevelInfo(), OptionalInt.empty(), OptionalInt.empty())); + dungeons.add(new BarWidget(Dungeons.Class.TANK.getName(), Dungeons.Class.TANK.getIcon(), dungeonsData.getClassData(Dungeons.Class.TANK).getLevelInfo(), OptionalInt.empty(), OptionalInt.empty())); int i = 0; for (var dungeon : dungeons) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillWidget.java deleted file mode 100644 index 35369ff6..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillWidget.java +++ /dev/null @@ -1,109 +0,0 @@ -package de.hysky.skyblocker.skyblock.profileviewer.rework.pages; - -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.skyblock.profileviewer.model.PlayerData; -import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget; -import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder; -import de.hysky.skyblocker.utils.NEURepoManager; -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 java.util.Locale; -import java.util.OptionalInt; - -import static de.hysky.skyblocker.utils.Formatters.INTEGER_NUMBERS; -import static de.hysky.skyblocker.utils.Formatters.SHORT_INTEGER_NUMBERS; - -final class SkillWidget 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 PlayerData.Skill skill; - private final LevelFinder.LevelInfo levelInfo; - private final OptionalInt softSkillCap; - - SkillWidget( - PlayerData.Skill skill, - LevelFinder.LevelInfo levelInfo, - OptionalInt softSkillCap - ) { - this.skill = skill; - this.levelInfo = levelInfo; - this.softSkillCap = softSkillCap; - } - - 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(skill.getIcon(), x + 3, y + 5); - drawContext.drawText(textRenderer, skill.getName() + " " + levelInfo.level, x + 31, y + 4, -1, false); - Color fillColor = Color.GREEN; - var skillCap = NEURepoManager.getConstants().getLeveling().getMaximumLevels().get(skill.name().toLowerCase(Locale.ROOT)); - if (softSkillCap.isPresent() && levelInfo.level > softSkillCap.getAsInt()) - fillColor = Color.YELLOW; - if (levelInfo.level >= skillCap) - 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 tooltipText = new ArrayList<>(); - tooltipText.add(Text.literal(skill.getName() + " " + levelInfo.level).formatted(Formatting.GREEN)); - if (levelInfo.level < skillCap) { - 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/SkillsPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillsPage.java index 8329af92..eebb2821 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillsPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillsPage.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.profileviewer.rework.pages; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.skyblock.profileviewer.model.PlayerData; import de.hysky.skyblocker.skyblock.profileviewer.rework.*; +import de.hysky.skyblocker.skyblock.profileviewer.rework.widgets.BarWidget; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.item.ItemStack; @@ -15,25 +16,27 @@ public class SkillsPage implements ProfileViewerPage { public SkillsPage(ProfileLoadState.SuccessfulLoad load) { var playerData = load.member().playerData; - List skills = new ArrayList<>(); - skills.add(new SkillWidget(PlayerData.Skill.COMBAT, playerData.getSkillLevel(PlayerData.Skill.COMBAT), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.MINING, playerData.getSkillLevel(PlayerData.Skill.MINING), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.FARMING, playerData.getSkillLevel(PlayerData.Skill.FARMING), OptionalInt.of(50))); - skills.add(new SkillWidget(PlayerData.Skill.FORAGING, playerData.getSkillLevel(PlayerData.Skill.FORAGING), OptionalInt.of(50))); - skills.add(new SkillWidget(PlayerData.Skill.FISHING, playerData.getSkillLevel(PlayerData.Skill.FISHING), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.ENCHANTING, playerData.getSkillLevel(PlayerData.Skill.ENCHANTING), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.ALCHEMY, playerData.getSkillLevel(PlayerData.Skill.ALCHEMY), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.TAMING, playerData.getSkillLevel(PlayerData.Skill.TAMING), OptionalInt.of(50))); - skills.add(new SkillWidget(PlayerData.Skill.CARPENTRY, playerData.getSkillLevel(PlayerData.Skill.CARPENTRY), OptionalInt.empty())); + List skills = new ArrayList<>(); + skills.add(new BarWidget(PlayerData.Skill.COMBAT.getName(), PlayerData.Skill.COMBAT.getIcon(), playerData.getSkillLevel(PlayerData.Skill.COMBAT), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget(PlayerData.Skill.MINING.getName(),PlayerData.Skill.MINING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.MINING), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget(PlayerData.Skill.FARMING.getName(), PlayerData.Skill.FARMING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.FARMING), OptionalInt.empty(), OptionalInt.of(50))); + skills.add(new BarWidget(PlayerData.Skill.FORAGING.getName(), PlayerData.Skill.FORAGING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.FORAGING), OptionalInt.empty(), OptionalInt.of(50))); + skills.add(new BarWidget(PlayerData.Skill.FISHING.getName(),PlayerData.Skill.FISHING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.FISHING), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget(PlayerData.Skill.ENCHANTING.getName(),PlayerData.Skill.ENCHANTING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.ENCHANTING), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget(PlayerData.Skill.ALCHEMY.getName(),PlayerData.Skill.ALCHEMY.getIcon(), playerData.getSkillLevel(PlayerData.Skill.ALCHEMY), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget(PlayerData.Skill.TAMING.getName(), PlayerData.Skill.TAMING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.TAMING), OptionalInt.empty(), OptionalInt.of(50))); + skills.add(new BarWidget(PlayerData.Skill.CARPENTRY.getName(),PlayerData.Skill.CARPENTRY.getIcon(), playerData.getSkillLevel(PlayerData.Skill.CARPENTRY), OptionalInt.empty(), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.CATACOMBS, PlayerData.Skill.CATACOMBS.getLevelInfo(load.member().dungeons.dungeonInfo.catacombs.experience), OptionalInt.empty())); - skills.add(new SkillWidget(PlayerData.Skill.RUNECRAFTING, playerData.getSkillLevel(PlayerData.Skill.RUNECRAFTING), OptionalInt.empty())); - skills.add(new SkillWidget( - PlayerData.Skill.SOCIAL, + skills.add(new BarWidget(PlayerData.Skill.CATACOMBS.getName(), PlayerData.Skill.CATACOMBS.getIcon(), PlayerData.Skill.CATACOMBS.getLevelInfo(load.member().dungeons.dungeonInfo.catacombs.experience), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget(PlayerData.Skill.RUNECRAFTING.getName(), PlayerData.Skill.RUNECRAFTING.getIcon(), playerData.getSkillLevel(PlayerData.Skill.RUNECRAFTING), OptionalInt.empty(), OptionalInt.empty())); + skills.add(new BarWidget( + PlayerData.Skill.SOCIAL.getName(), + PlayerData.Skill.SOCIAL.getIcon(), PlayerData.Skill.SOCIAL.getLevelInfo( load.profile().members.values() .stream().mapToDouble(it -> it.playerData.getSkillExperience(PlayerData.Skill.SOCIAL)) .sum()), + OptionalInt.empty(), OptionalInt.empty())); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerKillsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerKillsWidget.java deleted file mode 100644 index b5e275c1..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerKillsWidget.java +++ /dev/null @@ -1,67 +0,0 @@ -package de.hysky.skyblocker.skyblock.profileviewer.rework.pages; - -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerBoss; -import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerData; -import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget; -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.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 SlayerKillsWidget implements ProfileViewerWidget { - private static final Identifier ICON_DATA_TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/icon_data_widget.png"); - - private final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - private final SlayerData.Slayer slayer; - private final SlayerBoss slayerData; - - SlayerKillsWidget( - SlayerData.Slayer slayer, - SlayerBoss slayerData - ) { - this.slayer = slayer; - this.slayerData = slayerData; - } - - 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(slayer.getDropIcon(), x + 3, y + 5); - drawContext.drawText(textRenderer, "§aKills: §r" + slayerData.getTotalBossKills(), x + 31, y + 4, -1, false); - drawContext.drawText(textRenderer, slayerData.getTierWithMostKills() == -1 ? "No Data" : "§cT" + (slayerData.getTierWithMostKills() + 1) + " Kills: §r" + slayerData.getBossKillsByZeroIndexedTier(slayerData.getTierWithMostKills()), x + 31, y + 14, -1, false); - - // TODO: add helper for hover selection - if (mouseX > x + 30 && mouseX < x + 105 && mouseY > y + 14 && mouseY < y + 21) { - List tooltipText = new ArrayList<>(); - for (int i = 0; i <= 4; i++) { - tooltipText.add(Text.literal("§cT" + (i + 1) + " Kills: §r" + slayerData.getBossKillsByZeroIndexedTier(i))); - } - drawContext.drawTooltip(textRenderer, tooltipText, mouseX, mouseY); - } - - } - - @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/SlayerLevelWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerLevelWidget.java deleted file mode 100644 index ccb32abd..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerLevelWidget.java +++ /dev/null @@ -1,101 +0,0 @@ -package de.hysky.skyblocker.skyblock.profileviewer.rework.pages; - -import de.hysky.skyblocker.SkyblockerMod; -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 SlayerLevelWidget 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 SlayerData.Slayer slayer; - private final LevelFinder.LevelInfo levelInfo; - - SlayerLevelWidget( - SlayerData.Slayer slayer, - LevelFinder.LevelInfo levelInfo - ) { - this.slayer = slayer; - 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(slayer.getIcon(), x + 3, y + 5); - drawContext.drawText(textRenderer, slayer.getName() + " " + levelInfo.level, x + 31, y + 4, -1, false); - Color fillColor = Color.GREEN; - var levelCap = slayer.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 tooltipText = new ArrayList<>(); - tooltipText.add(Text.literal(slayer.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/SlayerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerWidget.java new file mode 100644 index 00000000..800305bf --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerWidget.java @@ -0,0 +1,63 @@ +package de.hysky.skyblocker.skyblock.profileviewer.rework.pages; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerBoss; +import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerData; +import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget; +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.Identifier; + +import java.util.ArrayList; +import java.util.List; + +final class SlayerWidget implements ProfileViewerWidget { + private static final Identifier ICON_DATA_TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/icon_data_widget.png"); + + private final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + private final SlayerData.Slayer slayer; + private final SlayerBoss slayerData; + + SlayerWidget( + SlayerData.Slayer slayer, + SlayerBoss slayerData + ) { + this.slayer = slayer; + this.slayerData = slayerData; + } + + 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(slayer.getDropIcon(), x + 3, y + 5); + drawContext.drawText(textRenderer, "§aKills: §r" + slayerData.getTotalBossKills(), x + 31, y + 4, -1, false); + drawContext.drawText(textRenderer, slayerData.getTierWithMostKills() == -1 ? "No Data" : "§cT" + (slayerData.getTierWithMostKills() + 1) + " Kills: §r" + slayerData.getBossKillsByZeroIndexedTier(slayerData.getTierWithMostKills()), x + 31, y + 14, -1, false); + + // TODO: add helper for hover selection + if (mouseX > x + 30 && mouseX < x + 105 && mouseY > y + 14 && mouseY < y + 21) { + List tooltipText = new ArrayList<>(); + for (int i = 0; i <= 4; i++) { + tooltipText.add(Text.literal("§cT" + (i + 1) + " Kills: §r" + slayerData.getBossKillsByZeroIndexedTier(i))); + } + drawContext.drawTooltip(textRenderer, tooltipText, mouseX, mouseY); + } + + } + + @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/SlayersPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java index 158fbb1e..cf75a604 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 @@ -3,10 +3,12 @@ package de.hysky.skyblocker.skyblock.profileviewer.rework.pages; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.skyblock.profileviewer.model.SlayerData; import de.hysky.skyblocker.skyblock.profileviewer.rework.*; +import de.hysky.skyblocker.skyblock.profileviewer.rework.widgets.BarWidget; 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 SlayersPage implements ProfileViewerPage { @@ -16,19 +18,19 @@ public class SlayersPage implements ProfileViewerPage { var slayerData = load.member().slayer; // TODO: Maybe make it's own SlayerWidget List slayers = new ArrayList<>(); - slayers.add(new SlayerLevelWidget(SlayerData.Slayer.REVENANT_HORROR, slayerData.getSkillLevel(SlayerData.Slayer.REVENANT_HORROR))); - slayers.add(new SlayerLevelWidget(SlayerData.Slayer.TARANTULA_BROODFATHER, slayerData.getSkillLevel(SlayerData.Slayer.TARANTULA_BROODFATHER))); - slayers.add(new SlayerLevelWidget(SlayerData.Slayer.SVEN_PACKMASTER, slayerData.getSkillLevel(SlayerData.Slayer.SVEN_PACKMASTER))); - slayers.add(new SlayerLevelWidget(SlayerData.Slayer.VOIDGLOOM_SERAPH, slayerData.getSkillLevel(SlayerData.Slayer.VOIDGLOOM_SERAPH))); - slayers.add(new SlayerLevelWidget(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND, slayerData.getSkillLevel(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND))); - slayers.add(new SlayerLevelWidget(SlayerData.Slayer.INFERNO_DEMONLORD, slayerData.getSkillLevel(SlayerData.Slayer.INFERNO_DEMONLORD))); + slayers.add(new BarWidget(SlayerData.Slayer.REVENANT_HORROR.getName(), SlayerData.Slayer.REVENANT_HORROR.getIcon(), slayerData.getSkillLevel(SlayerData.Slayer.REVENANT_HORROR), OptionalInt.empty(), OptionalInt.empty())); + slayers.add(new BarWidget(SlayerData.Slayer.TARANTULA_BROODFATHER.getName(), SlayerData.Slayer.TARANTULA_BROODFATHER.getIcon(), slayerData.getSkillLevel(SlayerData.Slayer.TARANTULA_BROODFATHER), OptionalInt.empty(), OptionalInt.empty())); + slayers.add(new BarWidget(SlayerData.Slayer.SVEN_PACKMASTER.getName(), SlayerData.Slayer.SVEN_PACKMASTER.getIcon(), slayerData.getSkillLevel(SlayerData.Slayer.SVEN_PACKMASTER), OptionalInt.empty(), OptionalInt.empty())); + slayers.add(new BarWidget(SlayerData.Slayer.VOIDGLOOM_SERAPH.getName(), SlayerData.Slayer.VOIDGLOOM_SERAPH.getIcon(), slayerData.getSkillLevel(SlayerData.Slayer.VOIDGLOOM_SERAPH), OptionalInt.empty(), OptionalInt.empty())); + slayers.add(new BarWidget(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND.getName(), SlayerData.Slayer.RIFTSTALKER_BLOODFIEND.getIcon(), slayerData.getSkillLevel(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND), OptionalInt.empty(), OptionalInt.empty())); + slayers.add(new BarWidget(SlayerData.Slayer.INFERNO_DEMONLORD.getName(), SlayerData.Slayer.INFERNO_DEMONLORD.getIcon(), slayerData.getSkillLevel(SlayerData.Slayer.INFERNO_DEMONLORD), OptionalInt.empty(), OptionalInt.empty())); - slayers.add(new SlayerKillsWidget(SlayerData.Slayer.REVENANT_HORROR, slayerData.getSlayerData(SlayerData.Slayer.REVENANT_HORROR))); - slayers.add(new SlayerKillsWidget(SlayerData.Slayer.TARANTULA_BROODFATHER, slayerData.getSlayerData(SlayerData.Slayer.TARANTULA_BROODFATHER))); - slayers.add(new SlayerKillsWidget(SlayerData.Slayer.SVEN_PACKMASTER, slayerData.getSlayerData(SlayerData.Slayer.SVEN_PACKMASTER))); - slayers.add(new SlayerKillsWidget(SlayerData.Slayer.VOIDGLOOM_SERAPH, slayerData.getSlayerData(SlayerData.Slayer.VOIDGLOOM_SERAPH))); - slayers.add(new SlayerKillsWidget(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND, slayerData.getSlayerData(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND))); - slayers.add(new SlayerKillsWidget(SlayerData.Slayer.INFERNO_DEMONLORD, slayerData.getSlayerData(SlayerData.Slayer.INFERNO_DEMONLORD))); + slayers.add(new SlayerWidget(SlayerData.Slayer.REVENANT_HORROR, slayerData.getSlayerData(SlayerData.Slayer.REVENANT_HORROR))); + slayers.add(new SlayerWidget(SlayerData.Slayer.TARANTULA_BROODFATHER, slayerData.getSlayerData(SlayerData.Slayer.TARANTULA_BROODFATHER))); + slayers.add(new SlayerWidget(SlayerData.Slayer.SVEN_PACKMASTER, slayerData.getSlayerData(SlayerData.Slayer.SVEN_PACKMASTER))); + slayers.add(new SlayerWidget(SlayerData.Slayer.VOIDGLOOM_SERAPH, slayerData.getSlayerData(SlayerData.Slayer.VOIDGLOOM_SERAPH))); + slayers.add(new SlayerWidget(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND, slayerData.getSlayerData(SlayerData.Slayer.RIFTSTALKER_BLOODFIEND))); + slayers.add(new SlayerWidget(SlayerData.Slayer.INFERNO_DEMONLORD, slayerData.getSlayerData(SlayerData.Slayer.INFERNO_DEMONLORD))); int i = 0; for (var slayer : slayers) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/BarWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/BarWidget.java new file mode 100644 index 00000000..4873815e --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/BarWidget.java @@ -0,0 +1,116 @@ +package de.hysky.skyblocker.skyblock.profileviewer.rework.widgets; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.profileviewer.model.PlayerData; +import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget; +import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder; +import de.hysky.skyblocker.utils.NEURepoManager; +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.item.ItemStack; +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 java.util.Locale; +import java.util.OptionalInt; + +import static de.hysky.skyblocker.utils.Formatters.INTEGER_NUMBERS; +import static de.hysky.skyblocker.utils.Formatters.SHORT_INTEGER_NUMBERS; + +public final class BarWidget 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 String name; + private final ItemStack icon; + private final LevelFinder.LevelInfo levelInfo; + private final OptionalInt levelCap; + private final OptionalInt softSkillCap; + + public BarWidget( + String name, + ItemStack icon, + LevelFinder.LevelInfo levelInfo, + OptionalInt levelCap, + OptionalInt softSkillCap + ) { + this.name = name; + this.icon = icon; + this.levelInfo = levelInfo; + this.levelCap = levelCap; + this.softSkillCap = softSkillCap; + } + + 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(icon, x + 3, y + 5); + drawContext.drawText(textRenderer, name + " " + levelInfo.level, x + 31, y + 4, -1, false); + Color fillColor = Color.GREEN; + var skillCap = levelCap.isPresent() ? levelCap.getAsInt() : NEURepoManager.getConstants().getLeveling().getMaximumLevels().getOrDefault(name.toLowerCase(Locale.ROOT), 50); + if (softSkillCap.isPresent() && levelInfo.level > softSkillCap.getAsInt()) + fillColor = Color.YELLOW; + if (levelInfo.level >= skillCap) + 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 tooltipText = new ArrayList<>(); + tooltipText.add(Text.literal(name + " " + levelInfo.level).formatted(Formatting.GREEN)); + if (levelInfo.level < skillCap) { + 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/widgets/TextWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/TextWidget.java new file mode 100644 index 00000000..819ca7b9 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/widgets/TextWidget.java @@ -0,0 +1,42 @@ +package de.hysky.skyblocker.skyblock.profileviewer.rework.widgets; + +import de.hysky.skyblocker.skyblock.profileviewer.rework.ProfileViewerWidget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; + +public final class TextWidget implements ProfileViewerWidget { + private final TextRenderer textRenderer; + private final Text text; + private final int offset; + + public TextWidget(TextRenderer textRenderer, Text text, boolean centered) { + this.textRenderer = textRenderer; + this.text = text; + this.offset = centered ? -textRenderer.getWidth(text) / 2 : 0; + } + + public static TextWidget leftAligned(Text text) { + return new TextWidget(MinecraftClient.getInstance().textRenderer, text, false); + } + + public static TextWidget centered(Text text) { + return new TextWidget(MinecraftClient.getInstance().textRenderer, text, true); + } + + @Override + public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, float deltaTicks) { + drawContext.drawText(textRenderer, text, x + offset, y, -1, true); + } + + @Override + public int getHeight() { + return textRenderer.fontHeight; + } + + @Override + public int getWidth() { + return 0; + } +} -- cgit