aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
authorJacob <admin@kath.lol>2025-08-01 12:26:39 +0800
committerLinnea Gräf <nea@nea.moe>2025-08-01 15:34:27 +0200
commit77a990348e7eca92c5d1f05272c8c2528fc49740 (patch)
tree5fe1c8775d010a0d0b17268d6da097926e83faa0 /src/main/java/de
parent8a8620fc640031be4195426afc90387b95e88681 (diff)
downloadSkyblocker-77a990348e7eca92c5d1f05272c8c2528fc49740.tar.gz
Skyblocker-77a990348e7eca92c5d1f05272c8c2528fc49740.tar.bz2
Skyblocker-77a990348e7eca92c5d1f05272c8c2528fc49740.zip
feat: slayer
Diffstat (limited to 'src/main/java/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/HeadTextures.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/ProfileMember.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Slayer.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerBoss.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerData.java60
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SkillsPage.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerKillsWidget.java67
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerLevelWidget.java101
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java71
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java7
10 files changed, 332 insertions, 12 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/HeadTextures.java b/src/main/java/de/hysky/skyblocker/skyblock/item/HeadTextures.java
index bcc6219e..c878bee4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/HeadTextures.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/HeadTextures.java
@@ -24,4 +24,11 @@ public interface HeadTextures {
Set<String> PEST_HEADS = Set.of(MOSQUITO_PEST, RAT_PEST, LOCUST_PEST, CRICKET_PEST, FLY_PEST, BEETLE_PEST, SLUG_PEST, MOTH_PEST, MITE_PEST, EARTHWORM_PEST, FIELD_MOUSE_PEST);
String CARNIVAL_YELLOW_FISH = "ewogICJ0aW1lc3RhbXAiIDogMTcyMDA1MjU4MjAwMSwKICAicHJvZmlsZUlkIiA6ICIzM2Y4ZGExMTU1MzQ0YWQ5OWQ0Y2Q2ZjNhYjFjMjNhYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJCXzFfUl9CIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzM2MGY0Zjk5Yzc4YWRkZGVhYjI3NmViZGY2YWI5YTBmY2ZmYWJkNDlmMGI1NDNlMTk4MWFjN2JkM2Q1NWIxOGEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==";
String FAIRY_SOUL = "eyJ0aW1lc3RhbXAiOjE1ODY2NjcxNjgzNzksInByb2ZpbGVJZCI6ImJlY2RkYjI4YTJjODQ5YjRhOWIwOTIyYTU4MDUxNDIwIiwicHJvZmlsZU5hbWUiOiJTdFR2Iiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8yOTllYTEyMGJkODNkMGM4MWEzYzQ2MjdmNWJjZTFiMTJmYjAzYmNiNTc3NzljNjNkY2M3N2UzZjRhZThhNzkzIn19fQ==";
+ String AATROX_BATPHONE = "ewogICJ0aW1lc3RhbXAiIDogMTU5NjQ5MTIwODg4NCwKICAicHJvZmlsZUlkIiA6ICJkNjBmMzQ3MzZhMTI0N2EyOWI4MmNjNzE1YjAwNDhkYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJCSl9EYW5pZWwiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTMzNmQ3Y2M5NWNiZjY2ODlmNWU4Yzk1NDI5NGVjOGQxZWZjNDk0YTQwMzEzMjViYjQyN2JjODFkNTZhNDg0ZCIKICAgIH0KICB9Cn0=";
+ String REVENANT_HORROR = "e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWZjMDE4NDQ3M2ZlODgyZDI4OTVjZTdjYmM4MTk3YmQ0MGZmNzBiZjEwZDM3NDVkZTk3YjZjMmE5YzVmYzc4ZiJ9fX0=";
+ String TARANTULA_BROODFATHER = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ";
+ String SVEN_PACKMASTER = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjlkMWQzMTEzZWM0M2FjMjk2MWRkNTlmMjgxNzVmYjQ3MTg4NzNjNmM0NDhkZmNhODcyMjMxN2Q2NyJ9fX0";
+ String VOIDGLOOM_SERAPH = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E1OWJiMGE3YTMyOTY1YjNkOTBkOGVhZmE4OTlkMTgzNWY0MjQ1MDllYWRkNGU2YjcwOWFkYTUwYjljZiJ9fX0=";
+ String RIFTSTALKER_BLOODFIEND = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWFhMjllYTk2MTc1N2RjM2M5MGJmYWJmMzAyYzVhYmU5ZDMwOGZiNGE3ZDM4NjRlNTc4OGFkMmNjOTE2MGFhMiJ9fX0=";
+ String INFERNO_DEMONLORD = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc4ZWYyZTRjZjJjNDFhMmQxNGJmZGU5Y2FmZjEwMjE5ZjViMWJmNWIzNWE0OWViNTFjNjQ2Nzg4MmNiNWYwIn19fQ";
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/ProfileMember.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/ProfileMember.java
index e4140bca..6e313a00 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/ProfileMember.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/ProfileMember.java
@@ -12,7 +12,7 @@ public class ProfileMember {
* Nota bene: this is for item collections, for boss collections you need to manually add up the boss kill counts.
*/
public Map<String, Integer> collection = Map.of();
- public Slayer slayer = new Slayer();
+ public SlayerData slayer = new SlayerData();
@SerializedName("fairy_soul")
public FairySouls fairySouls = new FairySouls();
public ProfileMemberProfile profile = new ProfileMemberProfile();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Slayer.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Slayer.java
deleted file mode 100644
index 0adb9054..00000000
--- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/Slayer.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.hysky.skyblocker.skyblock.profileviewer.model;
-
-import com.google.gson.annotations.SerializedName;
-
-import java.util.Map;
-
-public class Slayer {
- @SerializedName("slayer_bosses")
- public Map<String, SlayerBoss> slayerBosses = Map.of();
-}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerBoss.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerBoss.java
index 215b6b0e..08583965 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerBoss.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerBoss.java
@@ -29,4 +29,21 @@ public class SlayerBoss {
default -> 0;
};
}
+
+ public int getTotalBossKills() {
+ int total = 0;
+ for (int i = 0; i <= 4; i++) {
+ total += getBossKillsByZeroIndexedTier(i);
+ }
+ return total;
+ }
+
+ public int getTierWithMostKills() {
+ for (int i = 4; i >= 0; i--) {
+ if (getBossKillsByZeroIndexedTier(i) > 1) return i;
+ }
+ return -1;
+ }
+
+
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerData.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerData.java
new file mode 100644
index 00000000..522f1cfd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/model/SlayerData.java
@@ -0,0 +1,60 @@
+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 java.util.Map;
+
+public class SlayerData {
+ @SerializedName("slayer_bosses")
+ public Map<String, SlayerBoss> slayerBosses = Map.of();
+
+ public SlayerBoss getSlayerData(Slayer slayer) {
+ return slayerBosses.getOrDefault(slayer.getName().toLowerCase(), new SlayerBoss());
+ }
+
+ public double getSlayerExperience(Slayer slayer) {
+ return getSlayerData(slayer).xp;
+ }
+
+ public LevelFinder.LevelInfo getSkillLevel(Slayer slayer) {
+// return LevelFinder.getLevelInfo(slayer.levelFinderOverride, (long) getSlayerExperience(slayer));
+ return LevelFinder.getLevelInfo(slayer.name, (long) getSlayerExperience(slayer));
+ }
+
+ public enum Slayer {
+ REVENANT_HORROR("Zombie", Ico.REVENANT_HORROR_SKULL, Ico.FLESH),
+ TARANTULA_BROODFATHER("Spider", Ico.TARANTULA_BROODFATHER_SKULL, Ico.STRING),
+ SVEN_PACKMASTER("Wolf", Ico.SVEN_PACKMASTER_SKULL, Ico.MUTTON),
+ VOIDGLOOM_SERAPH("Enderman", Ico.VOIDGLOOM_SERAPH_SKULL, Ico.E_PEARL),
+ RIFTSTALKER_BLOODFIEND("Vampire", Ico.RIFTSTALKER_BLOODFIEND_SKULL, Ico.REDSTONE, "Vampire"),
+ INFERNO_DEMONLORD("Blaze", Ico.INFERNO_DEMONLORD_SKULL, Ico.B_POWDER);
+
+ private final String name;
+ private final ItemStack itemStack;
+ private final ItemStack dropItemStack;
+ private final String levelFinderOverride;
+
+
+ Slayer(String name, ItemStack itemStack, ItemStack dropItemStack) {
+ this(name, itemStack, dropItemStack, "GenericSlayer");
+ }
+
+ Slayer(String name, ItemStack itemStack, ItemStack dropItemStack, String override) {
+ this.name = name;
+ this.itemStack = itemStack;
+ this.dropItemStack = dropItemStack;
+ this.levelFinderOverride = override;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public ItemStack getIcon() { return itemStack; }
+
+ public ItemStack getDropIcon() { return dropItemStack; }
+ }
+}
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 cddc78e6..8329af92 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
@@ -52,7 +52,7 @@ public class SkillsPage implements ProfileViewerPage {
@Init
public static void init() {
- ProfileViewerScreenRework.PAGE_CONSTRUCTORS.add(SkillsPage::new);
+// ProfileViewerScreenRework.PAGE_CONSTRUCTORS.add(SkillsPage::new);
}
@Override
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
new file mode 100644
index 00000000..b5e275c1
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerKillsWidget.java
@@ -0,0 +1,67 @@
+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<Text> 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
new file mode 100644
index 00000000..ccb32abd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayerLevelWidget.java
@@ -0,0 +1,101 @@
+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<Text> 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/SlayersPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java
new file mode 100644
index 00000000..8f0a152a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/rework/pages/SlayersPage.java
@@ -0,0 +1,71 @@
+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.tabhud.util.Ico;
+import net.minecraft.item.ItemStack;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SlayersPage implements ProfileViewerPage {
+
+ List<ProfileViewerWidget.Instance> widgets = new ArrayList<>();
+
+ public SlayersPage(ProfileLoadState.SuccessfulLoad load) {
+ var slayerData = load.member().slayer;
+ // TODO: Maybe make it's own SlayerWidget
+ List<ProfileViewerWidget> 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 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)));
+
+ int i = 0;
+ for (var slayer : slayers) {
+ int x = i < 6 ? 88 : 88 + 113;
+ int y = (i % 6) * (2 + 26);
+ i++;
+ widgets.add(widget(
+ x, y, slayer
+ ));
+ }
+ 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(SlayersPage::new);
+ }
+
+ @Override
+ public int getSortIndex() {
+ return 1;
+ }
+
+ @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/tabhud/util/Ico.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java
index 4c91787e..ca818185 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java
@@ -90,4 +90,11 @@ public class Ico {
public static final ItemStack TROPICAL_FISH_BUCKET = Items.TROPICAL_FISH_BUCKET.getDefaultStack();
public static final ItemStack STRIPPED_SPRUCE_WOOD = Items.STRIPPED_SPRUCE_WOOD.getDefaultStack();
public static final ItemStack MANGROVE_LOG = Items.MANGROVE_LOG.getDefaultStack();
+ public static final ItemStack AATROX_BATPHONE_SKULL = ItemUtils.createSkull(HeadTextures.AATROX_BATPHONE);
+ public static final ItemStack REVENANT_HORROR_SKULL = ItemUtils.createSkull(HeadTextures.REVENANT_HORROR);
+ public static final ItemStack TARANTULA_BROODFATHER_SKULL = ItemUtils.createSkull(HeadTextures.TARANTULA_BROODFATHER);
+ public static final ItemStack SVEN_PACKMASTER_SKULL = ItemUtils.createSkull(HeadTextures.SVEN_PACKMASTER);
+ public static final ItemStack VOIDGLOOM_SERAPH_SKULL = ItemUtils.createSkull(HeadTextures.VOIDGLOOM_SERAPH);
+ public static final ItemStack RIFTSTALKER_BLOODFIEND_SKULL = ItemUtils.createSkull(HeadTextures.RIFTSTALKER_BLOODFIEND);
+ public static final ItemStack INFERNO_DEMONLORD_SKULL = ItemUtils.createSkull(HeadTextures.INFERNO_DEMONLORD);
}