From c7b44466f04d844d20c4759a5e46b2261cf10b87 Mon Sep 17 00:00:00 2001 From: Toosiii Date: Wed, 29 Jul 2026 14:17:00 +0200 Subject: [PATCH 1/9] Added a helper to the Accessories that is able to show if you have any duplicates in your bag --- .../AccessoriesContainerSolver.java | 34 ++++++++++++++----- .../accessories/AccessoriesHelper.java | 34 +++++++++++++++++-- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java index d6ed9079883..ada6e030574 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java @@ -12,7 +12,8 @@ import java.util.List; public class AccessoriesContainerSolver extends SimpleContainerSolver { - private static final int COLOR = ARGB.color(0.7f, CommonColors.GREEN); + private static final int UNIQUE_COLOR = ARGB.color(0.7f, CommonColors.GREEN); + private static final int DUPLICATE_COLOR = ARGB.color(0.7f, CommonColors.RED); public static final AccessoriesContainerSolver INSTANCE = new AccessoriesContainerSolver(); @Nullable String highlightedAccessory; @@ -22,13 +23,30 @@ protected AccessoriesContainerSolver() { } @Override - public List getColors(Int2ObjectMap slots) { - if (highlightedAccessory == null) return List.of(); - return slots.int2ObjectEntrySet().stream() - .filter(entry -> entry.getValue().getSkyblockId().equals(highlightedAccessory)) - .map(entry -> new ColorHighlight(entry.getIntKey(), COLOR)) - .toList(); - } +public List getColors(Int2ObjectMap slots) { + + return slots.int2ObjectEntrySet().stream() + .map(entry -> { + + int slot = entry.getIntKey(); + ItemStack stack = entry.getValue(); + + String id = stack.getSkyblockId(); + + if (id.isEmpty()) return null; + + + if (AccessoriesHelper.duplicateSlots.contains(slot)) { + return new ColorHighlight(slot, DUPLICATE_COLOR); + } + + + return new ColorHighlight(slot, UNIQUE_COLOR); + + }) + .filter(java.util.Objects::nonNull) + .toList(); +} @Override public boolean isEnabled() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java index 3b5382cc852..7f7235b6df3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java @@ -38,9 +38,38 @@ public class AccessoriesHelper { private static final ProfiledData COLLECTED_ACCESSORIES = new ProfiledData<>(FILE, ProfileAccessoryData.CODEC, true); private static final Predicate NON_EMPTY = s -> !s.isEmpty(); private static final Predicate HAS_FAMILY = Accessory::hasFamily; - private static final ToIntFunction ACCESSORY_TIER = Accessory::tier; +private static final ToIntFunction ACCESSORY_TIER = Accessory::tier; - public static Map ACCESSORY_DATA = new Object2ObjectOpenHashMap<>(); +public static Map ACCESSORY_DATA = new Object2ObjectOpenHashMap<>(); + +public static final Set duplicateSlots = new ObjectOpenHashSet<>(); + + + private static void updateDuplicateSlots(List slots) { + + duplicateSlots.clear(); + + Map> found = new Object2ObjectOpenHashMap<>(); + + for (int i = 0; i < slots.size(); i++) { + + ItemStack stack = slots.get(i).getItem(); + + String id = stack.getSkyblockId(); + + if (id.isEmpty()) continue; + + found.computeIfAbsent(id, _ -> new ObjectArrayList<>()) + .add(i); + } + + for (List duplicate : found.values()) { + + if (duplicate.size() > 1) { + duplicateSlots.addAll(duplicate); + } + } +} @Init public static void init() { @@ -71,6 +100,7 @@ private static void collectAccessories(List slots, int page) { .map(ItemStack::getSkyblockId) .filter(NON_EMPTY) .toList(); + updateDuplicateSlots(slots); List recombobulated = slots.stream() .map(Slot::getItem) From 0f0055eb924cd4a20480e77dae4b4f5a0c39601b Mon Sep 17 00:00:00 2001 From: Toosiii Date: Wed, 29 Jul 2026 14:17:33 +0200 Subject: [PATCH 2/9] Refactor Accessories Helper: Introduce new configuration structure and add option to highlight duplicate accessories --- .../config/categories/HelperCategory.java | 31 +++++++++++++------ .../config/configs/HelperConfig.java | 14 ++++++--- .../AccessoriesContainerSolver.java | 17 +++++----- .../accessories/AccessoriesHelperWidget.java | 3 +- .../assets/skyblocker/lang/de_de.json | 6 +++- .../assets/skyblocker/lang/en_us.json | 5 +++ 6 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index fb8b281227f..9bd66490973 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -84,16 +84,27 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig newValue -> config.helpers.enableAnvilHelper = newValue) .controller(ConfigUtils.createBooleanController()) .build()) - // Accessories Helper Widget - .option(Option.createBuilder() - .name(Component.translatable("skyblocker.config.helpers.enableAccessoriesHelperWidget")) - .description(Component.translatable("skyblocker.config.helpers.enableAccessoriesHelperWidget.@Tooltip")) - .tags(CommonTags.ADDED_IN_6_0_0) - .binding(defaults.helpers.enableAccessoriesHelperWidget, - () -> config.helpers.enableAccessoriesHelperWidget, - newValue -> config.helpers.enableAccessoriesHelperWidget = newValue) - .controller(ConfigUtils.createBooleanController()) - .build()) + // Accessories +.group(OptionGroup.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories")) + .collapsed(true) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget")) + .description(Component.translatable("skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget.@Tooltip")) + .tags(CommonTags.ADDED_IN_6_0_0) + .binding(defaults.helpers.accessories.enableAccessoriesHelperWidget, + () -> config.helpers.accessories.enableAccessoriesHelperWidget, + newValue -> config.helpers.accessories.enableAccessoriesHelperWidget = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories.showDuplicateAccessories")) + .binding(defaults.helpers.accessories.showDuplicateAccessories, + () -> config.helpers.accessories.showDuplicateAccessories, + newValue -> config.helpers.accessories.showDuplicateAccessories = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .build()) // Builder's Wand and Ruler Preview .group(OptionGroup.createBuilder() diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index 7ecb001e73b..9937ada8fc4 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -21,7 +21,7 @@ public class HelperConfig { public boolean enableAnvilHelper = true; - public boolean enableAccessoriesHelperWidget = true; + public Accessories accessories = new Accessories(); public BuildersWand buildersWand = new BuildersWand(); @@ -45,14 +45,20 @@ public class HelperConfig { public GreatSpookEvent greatSpookEvent = new GreatSpookEvent(); + public static class Accessories { + public boolean enableAccessoriesHelperWidget = true; + + public boolean showDuplicateAccessories = true; +} + public static class BuildersWand { - public boolean enableBuildersWandPreview = true; + public boolean enableBuildersWandPreview = true; - public float previewOpacity = 0.5f; + public float previewOpacity = 0.5f; } public static class MythologicalRitual { - public boolean enableMythologicalRitualHelper = true; + public boolean enableMythologicalRitualHelper = true; } public static class Jerry { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java index ada6e030574..bea88699e2a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java @@ -4,9 +4,9 @@ import de.hysky.skyblocker.utils.container.SimpleContainerSolver; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.world.item.ItemStack; -import net.minecraft.util.CommonColors; import net.minecraft.util.ARGB; +import net.minecraft.util.CommonColors; +import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.Nullable; import java.util.List; @@ -24,10 +24,8 @@ protected AccessoriesContainerSolver() { @Override public List getColors(Int2ObjectMap slots) { - return slots.int2ObjectEntrySet().stream() .map(entry -> { - int slot = entry.getIntKey(); ItemStack stack = entry.getValue(); @@ -35,14 +33,13 @@ public List getColors(Int2ObjectMap slots) { if (id.isEmpty()) return null; - - if (AccessoriesHelper.duplicateSlots.contains(slot)) { + if (SkyblockerConfigManager.get().helpers.accessories.enableAccessoriesHelperWidget + && SkyblockerConfigManager.get().helpers.accessories.showDuplicateAccessories + && AccessoriesHelper.duplicateSlots.contains(slot)) { return new ColorHighlight(slot, DUPLICATE_COLOR); } - return new ColorHighlight(slot, UNIQUE_COLOR); - }) .filter(java.util.Objects::nonNull) .toList(); @@ -50,6 +47,6 @@ public List getColors(Int2ObjectMap slots) { @Override public boolean isEnabled() { - return SkyblockerConfigManager.get().helpers.enableAccessoriesHelperWidget; - } + return SkyblockerConfigManager.get().helpers.accessories.showDuplicateAccessories; +} } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java index 7807b75cf5c..2367bf0d74c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java @@ -90,7 +90,8 @@ class AccessoriesHelperWidget extends AbstractContainerWidget implements Hovered private static boolean showHighestTierOnly; static void attachToScreen(ContainerScreen screen) { - if (!SkyblockerConfigManager.get().general.itemTooltip.enableAccessoriesHelper || !SkyblockerConfigManager.get().helpers.enableAccessoriesHelperWidget) return; + if (!SkyblockerConfigManager.get().general.itemTooltip.enableAccessoriesHelper + || !SkyblockerConfigManager.get().helpers.accessories.enableAccessoriesHelperWidget) return; final AccessoriesHelperWidget widget = new AccessoriesHelperWidget(); widget.setY((screen.height - widget.getHeight()) / 2); Screens.getWidgets(screen).add(widget); diff --git a/src/main/resources/assets/skyblocker/lang/de_de.json b/src/main/resources/assets/skyblocker/lang/de_de.json index ee470e965fb..a44f06f589a 100644 --- a/src/main/resources/assets/skyblocker/lang/de_de.json +++ b/src/main/resources/assets/skyblocker/lang/de_de.json @@ -413,5 +413,9 @@ "skyblocker.config.chat.chatRules.screen.ruleScreen.chatMessage": "Ersetze Nachricht Mit:", "skyblocker.config.chat.chatRules.screen.ruleScreen.chatMessage.@Placeholder": "Für Originalnachricht leer lassen.", "skyblocker.config.chat.chatRules.screen.ruleScreen.formatting": "Alle Ausgabemeldungen können mithilfe von Formatierungscodes (unter Verwendung von &) formatiert werden.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.hideMessage": "Verstecke Nachricht" + "skyblocker.config.chat.chatRules.screen.ruleScreen.hideMessage": "Verstecke Nachricht", + "skyblocker.config.helpers.accessories": "Accessoires", + "skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget": "Accessoire-Helfer anzeigen", + "skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget.@Tooltip": "Zeigt den Accessoire-Helfer im Accessoire-Beutel an.", + "skyblocker.config.helpers.accessories.showDuplicateAccessories": "Doppelte Accessoires markieren" } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index fb450a1bce3..1ccab3d7d50 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -682,6 +682,11 @@ "skyblocker.config.helpers": "Helpers", + "skyblocker.config.helpers.accessories": "Accessories", + "skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget": "Enable Accessories Helper Widget", + "skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget.@Tooltip": "Shows the Accessories Helper Widget in the accessory bag.", + "skyblocker.config.helpers.accessories.showDuplicateAccessories": "Highlight Duplicate Accessories", + "skyblocker.config.helpers.bazaar": "Bazaar", "skyblocker.config.helpers.bazaar.enableBazaarHelper": "Enable Bazaar Helper", "skyblocker.config.helpers.bazaar.enableBazaarHelper.@Tooltip": "Draws icons on top of orders to explain the current state of the order.\n\n%s: Order is going to expire soon\n%s: Order has expired\n%s: Order is filled to some degree and there are items/coins to claim\n%s: Order is filled", From e2d2103c3315111a494df8e7e7b6ddc8fff56843 Mon Sep 17 00:00:00 2001 From: Toosiii Date: Wed, 29 Jul 2026 14:17:00 +0200 Subject: [PATCH 3/9] Added a helper to the Accessories that is able to show if you have any duplicates in your bag --- .../AccessoriesContainerSolver.java | 34 ++++++++++++++----- .../accessories/AccessoriesHelper.java | 34 +++++++++++++++++-- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java index d6ed9079883..ada6e030574 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java @@ -12,7 +12,8 @@ import java.util.List; public class AccessoriesContainerSolver extends SimpleContainerSolver { - private static final int COLOR = ARGB.color(0.7f, CommonColors.GREEN); + private static final int UNIQUE_COLOR = ARGB.color(0.7f, CommonColors.GREEN); + private static final int DUPLICATE_COLOR = ARGB.color(0.7f, CommonColors.RED); public static final AccessoriesContainerSolver INSTANCE = new AccessoriesContainerSolver(); @Nullable String highlightedAccessory; @@ -22,13 +23,30 @@ protected AccessoriesContainerSolver() { } @Override - public List getColors(Int2ObjectMap slots) { - if (highlightedAccessory == null) return List.of(); - return slots.int2ObjectEntrySet().stream() - .filter(entry -> entry.getValue().getSkyblockId().equals(highlightedAccessory)) - .map(entry -> new ColorHighlight(entry.getIntKey(), COLOR)) - .toList(); - } +public List getColors(Int2ObjectMap slots) { + + return slots.int2ObjectEntrySet().stream() + .map(entry -> { + + int slot = entry.getIntKey(); + ItemStack stack = entry.getValue(); + + String id = stack.getSkyblockId(); + + if (id.isEmpty()) return null; + + + if (AccessoriesHelper.duplicateSlots.contains(slot)) { + return new ColorHighlight(slot, DUPLICATE_COLOR); + } + + + return new ColorHighlight(slot, UNIQUE_COLOR); + + }) + .filter(java.util.Objects::nonNull) + .toList(); +} @Override public boolean isEnabled() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java index 44fe0efe268..92a0fc15fb8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java @@ -39,9 +39,38 @@ public class AccessoriesHelper { private static final ProfiledData COLLECTED_ACCESSORIES = new ProfiledData<>(FILE, ProfileAccessoryData.CODEC, true); private static final Predicate NON_EMPTY = s -> !s.isEmpty(); private static final Predicate HAS_FAMILY = Accessory::hasFamily; - private static final ToIntFunction ACCESSORY_TIER = Accessory::tier; +private static final ToIntFunction ACCESSORY_TIER = Accessory::tier; - public static Map ACCESSORY_DATA = new Object2ObjectOpenHashMap<>(); +public static Map ACCESSORY_DATA = new Object2ObjectOpenHashMap<>(); + +public static final Set duplicateSlots = new ObjectOpenHashSet<>(); + + + private static void updateDuplicateSlots(List slots) { + + duplicateSlots.clear(); + + Map> found = new Object2ObjectOpenHashMap<>(); + + for (int i = 0; i < slots.size(); i++) { + + ItemStack stack = slots.get(i).getItem(); + + String id = stack.getSkyblockId(); + + if (id.isEmpty()) continue; + + found.computeIfAbsent(id, _ -> new ObjectArrayList<>()) + .add(i); + } + + for (List duplicate : found.values()) { + + if (duplicate.size() > 1) { + duplicateSlots.addAll(duplicate); + } + } +} @Init public static void init() { @@ -72,6 +101,7 @@ private static void collectAccessories(List slots, int page) { .map(ItemStack::getSkyblockId) .filter(NON_EMPTY) .toList(); + updateDuplicateSlots(slots); List recombobulated = slots.stream() .map(Slot::getItem) From 17f011b765f8f4c8f426f559c6b4bb2d01510bb6 Mon Sep 17 00:00:00 2001 From: Toosiii Date: Wed, 29 Jul 2026 14:17:33 +0200 Subject: [PATCH 4/9] Refactor Accessories Helper: Introduce new configuration structure and add option to highlight duplicate accessories --- .../config/categories/HelperCategory.java | 31 ++++++++---- .../config/configs/HelperConfig.java | 13 ----- .../AccessoriesContainerSolver.java | 17 +++---- .../accessories/AccessoriesHelperWidget.java | 3 +- .../assets/skyblocker/lang/de_de.json | 47 +------------------ .../assets/skyblocker/lang/en_us.json | 5 ++ 6 files changed, 37 insertions(+), 79 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index 082e80211de..097c6736e0d 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -79,16 +79,27 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig newValue -> config.helpers.enableAnvilHelper = newValue) .controller(ConfigUtils.createBooleanController()) .build()) - // Accessories Helper Widget - .option(Option.createBuilder() - .name(Component.translatable("skyblocker.config.helpers.enableAccessoriesHelperWidget")) - .description(Component.translatable("skyblocker.config.helpers.enableAccessoriesHelperWidget.@Tooltip")) - .tags(CommonTags.ADDED_IN_6_0_0) - .binding(defaults.helpers.enableAccessoriesHelperWidget, - () -> config.helpers.enableAccessoriesHelperWidget, - newValue -> config.helpers.enableAccessoriesHelperWidget = newValue) - .controller(ConfigUtils.createBooleanController()) - .build()) + // Accessories +.group(OptionGroup.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories")) + .collapsed(true) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget")) + .description(Component.translatable("skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget.@Tooltip")) + .tags(CommonTags.ADDED_IN_6_0_0) + .binding(defaults.helpers.accessories.enableAccessoriesHelperWidget, + () -> config.helpers.accessories.enableAccessoriesHelperWidget, + newValue -> config.helpers.accessories.enableAccessoriesHelperWidget = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories.showDuplicateAccessories")) + .binding(defaults.helpers.accessories.showDuplicateAccessories, + () -> config.helpers.accessories.showDuplicateAccessories, + newValue -> config.helpers.accessories.showDuplicateAccessories = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .build()) // Builder's Wand and Ruler Preview .group(OptionGroup.createBuilder() diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index 314712c3333..7ecb001e73b 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -45,8 +45,6 @@ public class HelperConfig { public GreatSpookEvent greatSpookEvent = new GreatSpookEvent(); - public CenturyRaffle centuryRaffle = new CenturyRaffle(); - public static class BuildersWand { public boolean enableBuildersWandPreview = true; @@ -122,11 +120,6 @@ public String toString() { } } - // Placeholder! - public static class Loadouts { - - } - public static class FairySouls { public boolean enableFairySoulsHelper = false; @@ -177,10 +170,4 @@ public static class ItemPrice { public static class GreatSpookEvent { public boolean enableMathTeacherHelper = true; } - - public static class CenturyRaffle { - public boolean enableRaffleTaskHighlight = true; - - public boolean enableRaffleRewardHighlight = true; - } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java index ada6e030574..bea88699e2a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java @@ -4,9 +4,9 @@ import de.hysky.skyblocker.utils.container.SimpleContainerSolver; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.world.item.ItemStack; -import net.minecraft.util.CommonColors; import net.minecraft.util.ARGB; +import net.minecraft.util.CommonColors; +import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.Nullable; import java.util.List; @@ -24,10 +24,8 @@ protected AccessoriesContainerSolver() { @Override public List getColors(Int2ObjectMap slots) { - return slots.int2ObjectEntrySet().stream() .map(entry -> { - int slot = entry.getIntKey(); ItemStack stack = entry.getValue(); @@ -35,14 +33,13 @@ public List getColors(Int2ObjectMap slots) { if (id.isEmpty()) return null; - - if (AccessoriesHelper.duplicateSlots.contains(slot)) { + if (SkyblockerConfigManager.get().helpers.accessories.enableAccessoriesHelperWidget + && SkyblockerConfigManager.get().helpers.accessories.showDuplicateAccessories + && AccessoriesHelper.duplicateSlots.contains(slot)) { return new ColorHighlight(slot, DUPLICATE_COLOR); } - return new ColorHighlight(slot, UNIQUE_COLOR); - }) .filter(java.util.Objects::nonNull) .toList(); @@ -50,6 +47,6 @@ public List getColors(Int2ObjectMap slots) { @Override public boolean isEnabled() { - return SkyblockerConfigManager.get().helpers.enableAccessoriesHelperWidget; - } + return SkyblockerConfigManager.get().helpers.accessories.showDuplicateAccessories; +} } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java index d9838b9fa39..d894eb6a291 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java @@ -90,7 +90,8 @@ class AccessoriesHelperWidget extends AbstractContainerWidget implements Hovered private static boolean showHighestTierOnly; static void attachToScreen(ContainerScreen screen) { - if (!SkyblockerConfigManager.get().general.itemTooltip.enableAccessoriesHelper || !SkyblockerConfigManager.get().helpers.enableAccessoriesHelperWidget) return; + if (!SkyblockerConfigManager.get().general.itemTooltip.enableAccessoriesHelper + || !SkyblockerConfigManager.get().helpers.accessories.enableAccessoriesHelperWidget) return; final AccessoriesHelperWidget widget = new AccessoriesHelperWidget(); widget.setY((screen.height - widget.getHeight()) / 2); Screens.getWidgets(screen).add(widget); diff --git a/src/main/resources/assets/skyblocker/lang/de_de.json b/src/main/resources/assets/skyblocker/lang/de_de.json index ad956db9325..ee470e965fb 100644 --- a/src/main/resources/assets/skyblocker/lang/de_de.json +++ b/src/main/resources/assets/skyblocker/lang/de_de.json @@ -82,6 +82,7 @@ "skyblocker.config.debug": "Debuggen", "skyblocker.config.debug.showInvisibleArmorStands": "Unsichtbare Rüstungsständer anzeigen", "skyblocker.itemTooltip.nullMessage": "Item Preisinformationen im Tooltip werden in maximal 60 Sekunden aktualisiert. Wenn nicht, überprüfe latest.log", + "key.skyblocker.wikiLookup.official": "Nachschlagen im Hypixel Wiki", "key.skyblocker.debug.dumpHoveredItem": "Items aus der Umgebung entfernen", "text.skyblocker.dead": "Tot", "skyblocker.config.crimsonIsle.kuudra.safeSpotWaypoints": "Sichere Punkte Wegpunkte", @@ -412,49 +413,5 @@ "skyblocker.config.chat.chatRules.screen.ruleScreen.chatMessage": "Ersetze Nachricht Mit:", "skyblocker.config.chat.chatRules.screen.ruleScreen.chatMessage.@Placeholder": "Für Originalnachricht leer lassen.", "skyblocker.config.chat.chatRules.screen.ruleScreen.formatting": "Alle Ausgabemeldungen können mithilfe von Formatierungscodes (unter Verwendung von &) formatiert werden.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.hideMessage": "Verstecke Nachricht", - "emi.category.skyblocker.skyblock_kat_upgrade": "Kat verbesserung (Skyblock)", - "skyblocker.config.chat.chatRules.screen.ruleScreen.announcement.@Tooltip": "Zeigen Sie die Nachricht im Titelbehälter an. Position und Maßstab können in der UI- und Visuals-Kategorie der Mod-Einstellungen geändert werden", - "skyblocker.config.chat.chatRules.screen.ruleScreen.announcement.duration": "Ankündigungszeit", - "skyblocker.config.chat.chatRules.screen.ruleScreen.ignoreCase": "Fall ignorieren", - "skyblocker.config.chat.chatRules.screen.ruleScreen.ignoreCase.@Tooltip": "Wenn der Filter groß- und kleinschreibungsempfindlich ist.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.includeFormatting": "Formatierung enthalten", - "skyblocker.config.chat.chatRules.screen.ruleScreen.includeFormatting.@Tooltip": "Sollen die Formatierungszeichen beibehalten oder entfernt werden?", - "skyblocker.config.chat.chatRules.screen.ruleScreen.inputs": "Eingabe:", - "skyblocker.config.chat.chatRules.screen.ruleScreen.locations": "Position bearbeiten", - "skyblocker.config.chat.chatRules.screen.ruleScreen.locations.@Tooltip": "Whitelist der Orte, an denen die Chat-Regel funktioniert.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.locationsConfigScreen": "Chat Ort Regel Config", - "skyblocker.config.chat.chatRules.screen.ruleScreen.locationsConfigScreen.note": "Hinweis: Wenn alle Standorte deaktiviert sind, funktioniert die Chat-Regel an jedem Ort.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.name": "Name", - "skyblocker.config.chat.chatRules.screen.ruleScreen.name.@Tooltip": "Name der Regel.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.outputField.@Placeholder": "Leer lassen um auszublenden.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.outputs": "Ausgabe", - "skyblocker.config.chat.chatRules.screen.ruleScreen.partialMatch": "Teilübereinstimmung", - "skyblocker.config.chat.chatRules.screen.ruleScreen.regex": "Verwenden Sie Regex (%s)", - "skyblocker.config.chat.chatRules.screen.ruleScreen.regexLink": "?", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds": "Klang", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.@Tooltip": "Spiele einen Klang beim senden der Nachricht.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.amethyst": "Amethyst", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.anvil": "Pause", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.arrowHit": "Ding", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.cave": "Höhle", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.crit": "Kritisch", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.custom": "Benutzerdefiniert", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.none": "Nicht definiert", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.pling": "Pling", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.search.@Tooltip": "Mehr Klänge suchen", - "skyblocker.config.chat.chatRules.screen.ruleScreen.sounds.zombie": "Zombie", - "skyblocker.config.chat.chatRules.screen.ruleScreen.toast": "Toast:", - "skyblocker.config.chat.chatRules.screen.ruleScreen.toast.duration": "Toast dauer", - "skyblocker.config.chat.chatRules.screen.ruleScreen.toast.duration.@Tooltip": "Wie lange der Toast auf dem Bildschirm bleibt.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.toast.icon": "Toast Symbol:", - "skyblocker.config.chat.chatRules.screen.ruleScreen.toast.icon.unableToEdit": "Das Bearbeiten von Gegenständen ist deaktiviert, bis man einer Welt beitritt!", - "skyblocker.config.chat.chatRules.screen.ruleScreen.toast.iconPreview.@Tooltip": "Klicken Sie, um den SkyBlock-Item-Selector zu öffnen.", - "skyblocker.config.chat.chatRules.screen.ruleScreen.true": "Richtig", - "skyblocker.config.chat.confirmationPromptHelper": "Chat-Bestätigungs-Prompt-Helfer", - "skyblocker.config.chat.confirmationPromptHelper.@Tooltip": "Sobald du eine Ja- oder Nein-Meldung im Chat erhältst, kannst du innerhalb von 60 Sekunden überall auf dem Bildschirm klicken, um die Eingabe zu akzeptieren.\n\nEin Beispiel dafür sind die Aufgaben von Trevor dem Fallensteller.", - "skyblocker.config.chat.filter": "Filter", - "skyblocker.config.chat.filter.chatFilterResult.ACTION_BAR": "Bewegung zur Aktionsleiste", - "skyblocker.config.chat.filter.chatFilterResult.FILTER": "Filter", - "skyblocker.config.chat.filter.chatFilterResult.PASS": "Deaktiviert" + "skyblocker.config.chat.chatRules.screen.ruleScreen.hideMessage": "Verstecke Nachricht" } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index cd4348eec1c..746f549fae9 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -710,6 +710,11 @@ "skyblocker.config.helpers": "Helpers", + "skyblocker.config.helpers.accessories": "Accessories", + "skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget": "Enable Accessories Helper Widget", + "skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget.@Tooltip": "Shows the Accessories Helper Widget in the accessory bag.", + "skyblocker.config.helpers.accessories.showDuplicateAccessories": "Highlight Duplicate Accessories", + "skyblocker.config.helpers.bazaar": "Bazaar", "skyblocker.config.helpers.bazaar.enableBazaarHelper": "Enable Bazaar Helper", "skyblocker.config.helpers.bazaar.enableBazaarHelper.@Tooltip": "Draws icons on top of orders to explain the current state of the order.\n\n%s: Order is going to expire soon\n%s: Order has expired\n%s: Order is filled to some degree and there are items/coins to claim\n%s: Order is filled", From 13e470d05b9d44dbec619ed3ecd8ea44d8dfdf82 Mon Sep 17 00:00:00 2001 From: Toosiii Date: Fri, 31 Jul 2026 10:18:19 +0200 Subject: [PATCH 5/9] Removed the green - jsut higlighting uniques made Dupes more transperent formatted the code I think I fixed the existing feature? --- .../config/categories/HelperCategory.java | 23 ++++ .../config/configs/HelperConfig.java | 8 ++ .../AccessoriesContainerSolver.java | 22 ++- .../accessories/AccessoriesHelper.java | 59 ++++++-- .../accessories/AccessoriesHelperWidget.java | 130 +++++++++++------- 5 files changed, 183 insertions(+), 59 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index 097c6736e0d..15fe1132283 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -80,6 +80,7 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig .controller(ConfigUtils.createBooleanController()) .build()) // Accessories +<<<<<<< HEAD .group(OptionGroup.createBuilder() .name(Component.translatable("skyblocker.config.helpers.accessories")) .collapsed(true) @@ -100,6 +101,28 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig .controller(ConfigUtils.createBooleanController()) .build()) .build()) +======= + .group(OptionGroup.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories")) + .collapsed(true) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget")) + .description(Component.translatable("skyblocker.config.helpers.accessories.enableAccessoriesHelperWidget.@Tooltip")) + .tags(CommonTags.ADDED_IN_6_0_0) + .binding(defaults.helpers.accessories.enableAccessoriesHelperWidget, + () -> config.helpers.accessories.enableAccessoriesHelperWidget, + newValue -> config.helpers.accessories.enableAccessoriesHelperWidget = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.helpers.accessories.showDuplicateAccessories")) + .binding(defaults.helpers.accessories.showDuplicateAccessories, + () -> config.helpers.accessories.showDuplicateAccessories, + newValue -> config.helpers.accessories.showDuplicateAccessories = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .build()) +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) // Builder's Wand and Ruler Preview .group(OptionGroup.createBuilder() diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index 9937ada8fc4..bb591d355a4 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -4,8 +4,10 @@ import de.hysky.skyblocker.skyblock.item.SkyblockItemRarity; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.waypoint.Waypoint; + import java.util.ArrayList; import java.util.List; + import net.minecraft.client.resources.language.I18n; public class HelperConfig { @@ -51,6 +53,12 @@ public static class Accessories { public boolean showDuplicateAccessories = true; } + public static class Accessories { + public boolean enableAccessoriesHelperWidget = true; + + public boolean showDuplicateAccessories = true; + } + public static class BuildersWand { public boolean enableBuildersWandPreview = true; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java index bea88699e2a..09a697dad68 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesContainerSolver.java @@ -12,10 +12,13 @@ import java.util.List; public class AccessoriesContainerSolver extends SimpleContainerSolver { +<<<<<<< HEAD private static final int UNIQUE_COLOR = ARGB.color(0.7f, CommonColors.GREEN); private static final int DUPLICATE_COLOR = ARGB.color(0.7f, CommonColors.RED); +======= +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) public static final AccessoriesContainerSolver INSTANCE = new AccessoriesContainerSolver(); - + private static final int DUPLICATE_COLOR = ARGB.color(0.45f, CommonColors.RED); @Nullable String highlightedAccessory; protected AccessoriesContainerSolver() { @@ -23,6 +26,7 @@ protected AccessoriesContainerSolver() { } @Override +<<<<<<< HEAD public List getColors(Int2ObjectMap slots) { return slots.int2ObjectEntrySet().stream() .map(entry -> { @@ -44,9 +48,25 @@ public List getColors(Int2ObjectMap slots) { .filter(java.util.Objects::nonNull) .toList(); } +======= + public List getColors(Int2ObjectMap slots) { + if (highlightedAccessory == null) return List.of(); + return slots.int2ObjectEntrySet().stream() + .filter(entry -> + SkyblockerConfigManager.get().helpers.accessories.enableAccessoriesHelperWidget + && SkyblockerConfigManager.get().helpers.accessories.showDuplicateAccessories + && AccessoriesHelper.duplicateSlots.contains(entry.getIntKey())) + .map(entry -> new ColorHighlight(entry.getIntKey(), DUPLICATE_COLOR)) + .toList(); + } +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) @Override public boolean isEnabled() { return SkyblockerConfigManager.get().helpers.accessories.showDuplicateAccessories; +<<<<<<< HEAD } +======= + } +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java index 92a0fc15fb8..6061eb37bdc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelper.java @@ -19,6 +19,7 @@ import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; + import java.nio.file.Path; import java.util.Comparator; import java.util.List; @@ -32,13 +33,15 @@ import java.util.stream.Collectors; public class AccessoriesHelper { + public static final Set duplicateSlots = new ObjectOpenHashSet<>(); + static final Pattern ACCESSORY_BAG_TITLE = Pattern.compile("Accessory Bag(?: \\((?\\d+)\\/\\d+\\))?"); private static final ObjectOpenHashSet EMPTY = new ObjectOpenHashSet<>(0); private static final Path FILE = SkyblockerMod.CONFIG_DIR.resolve("collected_accessories.json"); - static final Pattern ACCESSORY_BAG_TITLE = Pattern.compile("Accessory Bag(?: \\((?\\d+)\\/\\d+\\))?"); - //UUID -> Profile Id & Data + //UUID -> Profile ID & Data private static final ProfiledData COLLECTED_ACCESSORIES = new ProfiledData<>(FILE, ProfileAccessoryData.CODEC, true); private static final Predicate NON_EMPTY = s -> !s.isEmpty(); private static final Predicate HAS_FAMILY = Accessory::hasFamily; +<<<<<<< HEAD private static final ToIntFunction ACCESSORY_TIER = Accessory::tier; public static Map ACCESSORY_DATA = new Object2ObjectOpenHashMap<>(); @@ -71,6 +74,36 @@ private static void updateDuplicateSlots(List slots) { } } } +======= + private static final ToIntFunction ACCESSORY_TIER = Accessory::tier; + public static Map ACCESSORY_DATA = new Object2ObjectOpenHashMap<>(); +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) + + private static void updateDuplicateSlots(List slots) { + + duplicateSlots.clear(); + + Map> found = new Object2ObjectOpenHashMap<>(); + + for (int i = 0; i < slots.size(); i++) { + + ItemStack stack = slots.get(i).getItem(); + + String id = stack.getSkyblockId(); + + if (id.isEmpty()) continue; + + found.computeIfAbsent(id, _ -> new ObjectArrayList<>()) + .add(i); + } + + for (List duplicate : found.values()) { + + if (duplicate.size() > 1) { + duplicateSlots.addAll(duplicate); + } + } + } @Init public static void init() { @@ -101,7 +134,11 @@ private static void collectAccessories(List slots, int page) { .map(ItemStack::getSkyblockId) .filter(NON_EMPTY) .toList(); +<<<<<<< HEAD updateDuplicateSlots(slots); +======= + updateDuplicateSlots(slots); +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) List recombobulated = slots.stream() .map(Slot::getItem) @@ -193,6 +230,15 @@ public static void refreshData(Map data) { ACCESSORY_DATA = data; } + public enum AccessoryReport { + HAS_HIGHEST_TIER, //You've collected the highest tier - Collected + IS_GREATER_TIER, //This accessory is an upgrade from the one in the same family that you already have - Upgrade -- Shows you what tier this accessory is in its family + HAS_GREATER_TIER, //This accessory has a higher tier upgrade - Upgradable -- Shows you the highest tier accessory you've collected in that family + OWNS_BETTER_TIER, //You've collected an accessory in this family with a higher tier - Downgrade -- Shows you the highest tier accessory you've collected in that family + MISSING, //You don't have any accessories in this family - Missing + INELIGIBLE + } + private record ProfileAccessoryData(Int2ObjectOpenHashMap> pages, ObjectOpenHashSet recombobulatedAccessories) { private static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.unboundedMap(Codec.INT, Codec.STRING.listOf().xmap(ObjectOpenHashSet::new, ObjectArrayList::new)) @@ -230,13 +276,4 @@ private boolean hasSameFamily(Accessory other) { } public record FamilyReport(Accessory highestInFamily, Optional highestCollectedInFamily) {} - - public enum AccessoryReport { - HAS_HIGHEST_TIER, //You've collected the highest tier - Collected - IS_GREATER_TIER, //This accessory is an upgrade from the one in the same family that you already have - Upgrade -- Shows you what tier this accessory is in its family - HAS_GREATER_TIER, //This accessory has a higher tier upgrade - Upgradable -- Shows you the highest tier accessory you've collected in that family - OWNS_BETTER_TIER, //You've collected an accessory in this family with a higher tier - Downgrade -- Shows you the highest tier accessory you've collected in that family - MISSING, //You don't have any accessories in this family - Missing - INELIGIBLE - } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java index d894eb6a291..819caffa816 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/AccessoriesHelperWidget.java @@ -71,18 +71,23 @@ class AccessoriesHelperWidget extends AbstractContainerWidget implements Hovered private static final Identifier TEXTURE = SkyblockerMod.id("background"); private static final int BORDER_SIZE = 8; private static final int BUTTON_COUNT = 20; + // Things that should persist when you close the accessory bag + private static Filter filter = Filter.ALL; + private static int page; + private static boolean open; + private static boolean showHighestTierOnly; private final List widgets; private final List buttons = new ArrayList<>(BUTTON_COUNT); private final FrameLayout layout; private final StringWidget pageText = new StringWidget(CommonComponents.EMPTY, Minecraft.getInstance().font).setMaxWidth(30, StringWidget.TextOverflow.SCROLLING); private final ArrowButton prevPageButton = new ArrowButton(false); private final ArrowButton nextPageButton = new ArrowButton(true); - private List accessories = List.of(); private List displays = List.of(); private List recombDisplays = List.of(); private boolean refreshWhenDoneLoading = false; +<<<<<<< HEAD // Things that should persist when you close the accessory bag private static Filter filter = Filter.ALL; private static int page; @@ -116,6 +121,8 @@ static void attachToScreen(ContainerScreen screen) { tabButton.setToggled(open); } +======= +>>>>>>> 85f1ed11d (Removed the green - jsut higlighting uniques) AccessoriesHelperWidget() { super(0, 0, 147, 182, CommonComponents.EMPTY, AbstractScrollArea.defaultSettings(4)); this.layout = new FrameLayout(getWidth() - BORDER_SIZE * 2, getHeight() - BORDER_SIZE * 2); @@ -158,6 +165,47 @@ static void attachToScreen(ContainerScreen screen) { updatePageSwitcher(); } + static void attachToScreen(ContainerScreen screen) { + if (!SkyblockerConfigManager.get().general.itemTooltip.enableAccessoriesHelper + || !SkyblockerConfigManager.get().helpers.accessories.enableAccessoriesHelperWidget) return; + final AccessoriesHelperWidget widget = new AccessoriesHelperWidget(); + widget.setY((screen.height - widget.getHeight()) / 2); + Screens.getWidgets(screen).add(widget); + final int previousX = ((AbstractContainerScreenAccessor) screen).getX(); + final int offset = Math.max(180 - previousX, 0); + TabButton tabButton = new TabButton(button -> { + boolean toggled = button.toggled; + widget.visible = open = toggled; + int x = toggled ? previousX + offset : previousX; + ((AbstractContainerScreenAccessor) screen).setX(x); + widget.setX(x - widget.getWidth() - 2); + button.setX((toggled ? widget.getX() : x) - button.getWidth() + 5); + button.setY((toggled ? widget.getY() : ((AbstractContainerScreenAccessor) screen).getY()) + 8); + if (toggled) { + widget.refreshData(); + } else { + // Reset page when you close the helper. keep rest for UX + page = 0; + } + }); + Screens.getWidgets(screen).add(tabButton); + tabButton.setToggled(open); + } + + /** + * Checks bazaar, lbin and craft cost. + */ + private static OptionalDouble getPrice(Accessory acc) { + FlexibleItemStack stack = ItemRepository.getItemStack(acc.id()); + if (stack == null) return OptionalDouble.empty(); + OptionalDouble optionalPrice = ItemUtils.getItemPrice(stack); + double price; + if (optionalPrice.isPresent()) price = optionalPrice.getAsDouble(); + else price = ItemUtils.getCraftCost(stack.getNeuName()); + if (price <= 0) return OptionalDouble.empty(); + return OptionalDouble.of(price); + } + private void refreshData() { final Set collectedAccessories = AccessoriesHelper.getCollectedAccessories(); this.recombDisplays = collectedAccessories.stream() @@ -201,20 +249,6 @@ private void updateFilter() { ).toList(); } - /** - * Checks bazaar, lbin and craft cost. - */ - private static OptionalDouble getPrice(Accessory acc) { - FlexibleItemStack stack = ItemRepository.getItemStack(acc.id()); - if (stack == null) return OptionalDouble.empty(); - OptionalDouble optionalPrice = ItemUtils.getItemPrice(stack); - double price; - if (optionalPrice.isPresent()) price = optionalPrice.getAsDouble(); - else price = ItemUtils.getCraftCost(stack.getNeuName()); - if (price <= 0) return OptionalDouble.empty(); - return OptionalDouble.of(price); - } - private void changePage(int offset) { page = Math.clamp(page + offset, 0, getPageCount() - 1); updatePageSwitcher(); @@ -292,29 +326,25 @@ protected int contentHeight() { return buttons.stream().map(ResultButton::getFocusedItem).filter(Objects::nonNull).findFirst().orElse(null); } - private class ArrowButton extends AbstractWidget { - private final boolean next; - private final WidgetSprites textures; - - ArrowButton(boolean next) { - super(0, 0, 12, 17, CommonComponents.EMPTY); - this.next = next; - this.textures = next ? RecipeBookPage.PAGE_FORWARD_SPRITES : RecipeBookPage.PAGE_BACKWARD_SPRITES; - } + private enum Filter { + ALL, + MISSING, + UPGRADES; @Override - public void onClick(MouseButtonEvent click, boolean doubled) { - changePage(next ? 1 : -1); + public String toString() { + return "skyblocker.accessoryHelper.filter." + name(); } + } - @Override - protected void extractWidgetRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) { - graphics.blitSprite(RenderPipelines.GUI_TEXTURED, textures.get(true, isHovered()), getX(), getY(), getWidth(), getHeight()); - if (isHovered()) graphics.requestCursor(CursorTypes.POINTING_HAND); - } + private interface MagicPowerSource { + FlexibleItemStack icon(); - @Override - protected void updateWidgetNarration(NarrationElementOutput builder) {} + void extractTooltip(GuiGraphicsExtractor graphics, int mouseX, int mouseY); + + double pricePerMp(); + + void click(); } // TODO abstract away this and SkyblockRecipeTabButton @@ -388,6 +418,7 @@ public void onClick(MouseButtonEvent click, boolean doubled) { protected void clearDisplayStack() { super.clearDisplayStack(); } + @Override public @Nullable ItemStack getFocusedItem() { return isHovered() ? getDisplayStack() : null; @@ -478,6 +509,7 @@ private static class RecombobulateSource implements MagicPowerSource { private final FlexibleItemStack icon; private final double pricePerMp; private final List tooltip; + private RecombobulateSource(SkyblockItemRarity rarity) { this.icon = ItemRepository.getItemStack("RECOMBOBULATOR_3000", Ico.BARRIER); OptionalDouble opt = ItemUtils.getItemPrice("RECOMBOBULATOR_3000"); @@ -517,24 +549,28 @@ public void click() { } } - private interface MagicPowerSource { - FlexibleItemStack icon(); - - void extractTooltip(GuiGraphicsExtractor graphics, int mouseX, int mouseY); - - double pricePerMp(); + private class ArrowButton extends AbstractWidget { + private final boolean next; + private final WidgetSprites textures; - void click(); - } + ArrowButton(boolean next) { + super(0, 0, 12, 17, CommonComponents.EMPTY); + this.next = next; + this.textures = next ? RecipeBookPage.PAGE_FORWARD_SPRITES : RecipeBookPage.PAGE_BACKWARD_SPRITES; + } - private enum Filter { - ALL, - MISSING, - UPGRADES; + @Override + public void onClick(MouseButtonEvent click, boolean doubled) { + changePage(next ? 1 : -1); + } @Override - public String toString() { - return "skyblocker.accessoryHelper.filter." + name(); + protected void extractWidgetRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) { + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, textures.get(true, isHovered()), getX(), getY(), getWidth(), getHeight()); + if (isHovered()) graphics.requestCursor(CursorTypes.POINTING_HAND); } + + @Override + protected void updateWidgetNarration(NarrationElementOutput builder) {} } } From 84cb7f7e6f61d7388da401ae940c7a2248931b94 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Fri, 31 Jul 2026 00:05:35 +0200 Subject: [PATCH 6/9] some more storage overlay things (#2598) * some more storage overlay things * spotless * remember backpack should only work with the storage overlay * Fix punctuation * also search tooltip --------- Co-authored-by: Aaron <51387595+AzureAaron@users.noreply.github.com> --- .../categories/UIAndVisualsCategory.java | 8 ++ .../config/configs/UIAndVisualsConfig.java | 2 + .../storageoverlay/StorageOverlayScreen.java | 101 +++++++++++++----- .../render/gui/SearchableGridWidget.java | 8 ++ .../assets/skyblocker/lang/en_us.json | 2 + 5 files changed, 95 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java index bb3dfb68f05..caebc1582ca 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java @@ -289,6 +289,14 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig newValue -> config.uiAndVisuals.storageOverlay.rememberSearch = newValue) .controller(ConfigUtils.createBooleanController()) .build()) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.uiAndVisuals.storageOverlay.rememberOpened")) + .description(Component.translatable("skyblocker.config.uiAndVisuals.storageOverlay.rememberOpened.@Tooltip")) + .binding(defaults.uiAndVisuals.storageOverlay.rememberOpened, + () -> config.uiAndVisuals.storageOverlay.rememberOpened, + newValue -> config.uiAndVisuals.storageOverlay.rememberOpened = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) .build() ) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java index 0815fa80526..e45ad9fa9c1 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java @@ -126,6 +126,8 @@ public static class StorageOverlay { public boolean rememberSearch = false; + public boolean rememberOpened = false; + // present in case we need to patch it out for x or y reason public transient boolean doNotResetCursor = true; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java index 5d0195449d4..6b8a19655cf 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java @@ -7,11 +7,13 @@ import de.hysky.skyblocker.skyblock.item.background.ItemBackgroundManager; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextManager; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.gui.SearchableGridWidget; import de.hysky.skyblocker.utils.render.texture.FallbackedTexture; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.Font; @@ -22,6 +24,7 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.ContainerScreen; @@ -32,6 +35,7 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; +import net.minecraft.util.ARGB; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.Slot; @@ -42,6 +46,7 @@ import java.awt.Color; import java.util.ArrayList; +import java.util.BitSet; import java.util.Collection; import java.util.List; import java.util.Locale; @@ -65,9 +70,12 @@ public class StorageOverlayScreen extends AbstractContainerScreen { + if (!SkyblockerConfigManager.get().uiAndVisuals.storageOverlay.enabled || savedIndex < 0 || Minecraft.getInstance().gui.screen() instanceof StorageOverlayScreen || !command.equals("storage")) { + return command; + } else { + String c = getCommandForIndex(savedIndex); + savedIndex = -1; + return c.substring(1); + } + }); } public StorageOverlayScreen(StorageOverlayScreenHandler handler, ChestMenu defaultHandler, Component name, Inventory inventory, int height) { @@ -115,12 +132,16 @@ protected void switchOpenStorage(int index) { if (grid == null) return; savedScroll = grid.getScrollAmount(); + MessageScheduler.INSTANCE.sendMessageAfterCooldown(getCommandForIndex(index), true); + saveMousePosition = SkyblockerConfigManager.get().uiAndVisuals.storageOverlay.doNotResetCursor; + } + + private static String getCommandForIndex(int index) { if (index <= 8) { - MessageScheduler.INSTANCE.sendMessageAfterCooldown("/echest " + (index + 1), true); + return "/echest " + (index + 1); } else { - MessageScheduler.INSTANCE.sendMessageAfterCooldown("/backpack " + (index - 8), true); + return "/backpack " + (index - 8); } - saveMousePosition = SkyblockerConfigManager.get().uiAndVisuals.storageOverlay.doNotResetCursor; } protected static String getStorageName(int index) { @@ -146,6 +167,7 @@ private void hide(Button button) { private void home(Button button) { MessageScheduler.INSTANCE.sendMessageAfterCooldown("/storage", true); disableOnNextLoad = true; + savedIndex = -1; } private void toolkit(Button button) { @@ -206,6 +228,12 @@ protected void repositionElements() { this.inventoryLabelY += change; } + @Override + protected boolean isHovering(int left, int top, int w, int h, double xm, double ym) { + // prevent clicking slots through search bar + return super.isHovering(left, top, w, h, xm, ym) && (grid == null || grid.getGridRectangle().containsPoint((int) xm, (int) ym)); + } + @Override protected void init() { super.init(); @@ -250,24 +278,35 @@ public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mo @Override public void onClose() { + savedScroll = 0; if (SkyblockerConfigManager.get().uiAndVisuals.storageOverlay.rememberSearch && grid != null) { savedScroll = grid.getScrollAmount(); } else { savedSearch = ""; - savedScroll = 0; + } + if (SkyblockerConfigManager.get().uiAndVisuals.storageOverlay.rememberOpened && grid != null && grid.openBackpack != null) { + savedIndex = grid.openBackpack.index; + savedScroll = grid.getScrollAmount(); + } else { + savedIndex = -1; } super.onClose(); } @Override protected void extractSlot(GuiGraphicsExtractor graphics, Slot slot, int mouseX, int mouseY) { - if (slot.container instanceof Inventory) { + if (slot.container instanceof Inventory || grid == null) { super.extractSlot(graphics, slot, mouseX, mouseY); } else { //keep backpack slots within gui - graphics.enableScissor(-this.leftPos, 28, getWidth(), getHeight() - 8); + ScreenRectangle rectangle = grid.getGridRectangle(); + rectangle = new ScreenRectangle(rectangle.position().x() - leftPos, rectangle.position().y() - topPos, rectangle.width(), rectangle.height()); + graphics.enableScissor(rectangle.left(), rectangle.top(), rectangle.right(), rectangle.bottom()); super.extractSlot(graphics, slot, mouseX, mouseY); graphics.disableScissor(); + if (grid.openBackpack != null && !grid.openBackpack.matchedSlots.get(slot.getContainerSlot())) { + graphics.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, NOT_MATCHED_COLOR); + } } } @@ -381,7 +420,7 @@ protected Collection filterWidgets(String input) { @Override public boolean isMouseOver(double mouseX, double mouseY) { //let the mouse go though gui if the user is interacting with open backpack - if (openBackpack != null && openBackpack.isMouseOver(mouseX, mouseY)) { + if (hoveredSlot != null && getGridRectangle().containsPoint((int) mouseX, (int) mouseY)) { return false; } return super.isMouseOver(mouseX, mouseY); @@ -412,6 +451,7 @@ private class BackpackWidget extends AbstractWidget { private final int index; private final BackpackPreview.Storage storage; private final boolean open; + private final BitSet matchedSlots = new BitSet(); private BackpackWidget(int columns, int index, BackpackPreview.Storage storage, Boolean open) { @@ -438,17 +478,18 @@ private int size() { } public boolean matches(String filter) { - //keep open backpack displayed even if no match - if (open) return true; + matchedSlots.clear(); + final String filterLowerCase = filter.toLowerCase(Locale.ENGLISH); //matches if any item in backpack contains the filter word for (int i = 9; i < size(); ++i) { - ItemStack currentStack = storage.getStack(i); - if (currentStack.getDisplayName().getString().toLowerCase(Locale.ENGLISH).contains(filter.toLowerCase(Locale.ENGLISH))) { - return true; + ItemStack currentStack = open ? handler.getContainer().getItem(i) : storage.getStack(i); + if (currentStack.getDisplayName().getString().toLowerCase(Locale.ENGLISH).contains(filterLowerCase) || ItemUtils.getLoreLineIf(currentStack, s -> s.toLowerCase(Locale.ENGLISH).contains(filterLowerCase)) != null) { + matchedSlots.set(i); } } - return false; + //keep open backpack displayed even if no match + return matchedSlots.cardinality() != 0 || open; } @@ -508,25 +549,30 @@ private void renderCustomBackpack(GuiGraphicsExtractor graphics, int mouseX, int //render cached items for (int i = 9; i < size(); ++i) { ItemStack currentStack = storage.getStack(i); - if (currentStack.isEmpty()) continue; int itemX = x + (i - 9) % columns * SLOT_SIZE + 8; int itemY = y + (i - 9) / columns * SLOT_SIZE + SLOT_SIZE; - // draw custom backgrounds ect as well as item - ItemBackgroundManager.drawBackgrounds(currentStack, graphics, itemX, itemY); + if (!currentStack.isEmpty()) { + // draw custom backgrounds ect as well as item + ItemBackgroundManager.drawBackgrounds(currentStack, graphics, itemX, itemY); - if (ItemProtection.isItemProtected(currentStack)) { - ItemProtection.drawSlotIcon(graphics, itemX, itemY); - } + if (ItemProtection.isItemProtected(currentStack)) { + ItemProtection.drawSlotIcon(graphics, itemX, itemY); + } - graphics.item(currentStack, itemX, itemY); - graphics.itemDecorations(textRenderer, currentStack, itemX, itemY); - SlotTextManager.extractSlotText(graphics, textRenderer, null, currentStack, i, itemX, itemY); + graphics.item(currentStack, itemX, itemY); + graphics.itemDecorations(textRenderer, currentStack, itemX, itemY); + SlotTextManager.extractSlotText(graphics, textRenderer, null, currentStack, i, itemX, itemY); - //draw tooltip if hovered - if (mouseX > itemX && mouseX <= itemX + SLOT_SIZE && mouseY > itemY && mouseY <= itemY + SLOT_SIZE && mouseY > topPos && mouseY < topPos + StorageOverlayScreen.this.getHeight()) { - Identifier tooltipStyle = currentStack.get(DataComponents.TOOLTIP_STYLE); + //draw tooltip if hovered + if (graphics.containsPointInScissor(mouseX, mouseY) && mouseX > itemX && mouseX <= itemX + SLOT_SIZE && mouseY > itemY && mouseY <= itemY + SLOT_SIZE && mouseY > topPos && mouseY < topPos + StorageOverlayScreen.this.getHeight()) { + Identifier tooltipStyle = currentStack.get(DataComponents.TOOLTIP_STYLE); - graphics.setComponentTooltipForNextFrame(CLIENT.font, Screen.getTooltipFromItem(CLIENT, currentStack), mouseX, mouseY, tooltipStyle); + graphics.setComponentTooltipForNextFrame(CLIENT.font, Screen.getTooltipFromItem(CLIENT, currentStack), mouseX, mouseY, tooltipStyle); + } + } + + if (!matchedSlots.get(i)) { + graphics.fill(itemX, itemY, itemX + 16, itemY + 16, NOT_MATCHED_COLOR); } } } else { @@ -544,6 +590,9 @@ public void extractWidgetRenderState(GuiGraphicsExtractor graphics, int mouseX, if (open) { graphics.outline(getX(), getY(), getWidth(), getHeight(), Color.yellow.getRGB()); } + if (isHovered() && !open) { + graphics.fill(getX(), getY(), getRight(), getBottom(), ARGB.white(0.1f)); + } } @Override diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/SearchableGridWidget.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/SearchableGridWidget.java index 8d7bc9449f6..3f763ba2571 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/SearchableGridWidget.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/SearchableGridWidget.java @@ -16,6 +16,7 @@ import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.network.chat.Component; public abstract class SearchableGridWidget extends AbstractContainerWidget { @@ -76,6 +77,13 @@ public double getScrollAmount() { return widgetsContainer.scrollAmount(); } + /** + * @return the grid's rectangle. Does not include the search bar. + */ + public ScreenRectangle getGridRectangle() { + return widgetsContainer.getRectangle(); + } + protected void recreateGrid() { GridLayout newGrid = new GridLayout(); int columns = (getWidth() - AbstractScrollArea.SCROLLBAR_WIDTH) / expectedWidgetWidth; diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 746f549fae9..3b28034289f 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -1469,6 +1469,8 @@ "skyblocker.config.uiAndVisuals.storageOverlay.homeButton": "Home", "skyblocker.config.uiAndVisuals.storageOverlay.huntingToolkitButton": "Hunting Toolkit", "skyblocker.config.uiAndVisuals.storageOverlay.reloadButton": "No backpacks found :(. Click to reload storage.", + "skyblocker.config.uiAndVisuals.storageOverlay.rememberOpened": "Remember Opened Backpack/Ender Chest", + "skyblocker.config.uiAndVisuals.storageOverlay.rememberOpened.@Tooltip": "Reopens the last opened backpack/ender chest when running /storage.", "skyblocker.config.uiAndVisuals.storageOverlay.rememberSearch": "Remember Search", "skyblocker.config.uiAndVisuals.storageOverlay.rememberSearch.@Tooltip": "Saves search and scroll position after closing backpack.", "skyblocker.config.uiAndVisuals.storageOverlay.storagesPerRow": "Storages Per Row", From dbce16e839bd8a97a74cb8a09d6205dcb75cd2c9 Mon Sep 17 00:00:00 2001 From: LifeIsAParadox's Weblate <134264403+Weblate-LifeIsAParadox@users.noreply.github.com> Date: Fri, 31 Jul 2026 00:26:32 +0200 Subject: [PATCH 7/9] Translations update from hysky translate (#2600) Currently translated at 7.5% (140 of 1848 strings) Translation: Skyblocker/Skyblocker Translate-URL: https://translate.hysky.de/projects/Skyblocker/skyblocker/en_CA/ Co-authored-by: Aaron <51387595+AzureAaron@users.noreply.github.com> --- src/main/resources/assets/skyblocker/lang/en_ca.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/skyblocker/lang/en_ca.json b/src/main/resources/assets/skyblocker/lang/en_ca.json index b6bdb998aac..5afdb17c032 100644 --- a/src/main/resources/assets/skyblocker/lang/en_ca.json +++ b/src/main/resources/assets/skyblocker/lang/en_ca.json @@ -1,5 +1,5 @@ { - "skyblocker.config.uiAndVisuals.bars": "Health, Mana, Defence, Speed & XP Bars", + "skyblocker.config.uiAndVisuals.bars": "Fancy Bars", "skyblocker.config.dungeons.croesusHelper.@Tooltip": "Grey out chests that have already been opened.", "skyblocker.config.dungeons.livid": "Livid Colour", "skyblocker.config.dungeons.livid.enableLividColorText": "Send Livid Colour in Chat", @@ -110,5 +110,7 @@ "skyblocker.config.misc.cat.@Tooltip": "Adds a cat picture to the Hub's Community Centre.", "skyblocker.config.helpers.loadouts.enableLoadoutsHelper.@Tooltip": "Allows changing Loadouts, Armour Sets, and Equipment Sets by pressing the corresponding key.", "skyblocker.config.general.itemInfoDisplay.itemRarityBackgroundsLegacyColors": "Item Rarity Background Legacy Colours", - "skyblocker.config.general.itemInfoDisplay.itemRarityBackgroundsLegacyColors.@Tooltip": "Use the rarity colours from before the resource pack update." + "skyblocker.config.general.itemInfoDisplay.itemRarityBackgroundsLegacyColors.@Tooltip": "Use the rarity colours from before the resource pack update.", + "skyblocker.config.uiAndVisuals.bars.@Tag[0]": "Health, Mana, Defence, Vitality, Speed & XP Bars", + "skyblocker.config.uiAndVisuals.bars.enableBars.@Tooltip": "Enables the fancy Health, Mana, Defence, Vitality, Speed, and XP Bars." } From b6f84bb2588006b14d56849b433aa2000606da48 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 30 Jul 2026 18:32:45 -0400 Subject: [PATCH 8/9] 6.8.2 (#2609) --- CHANGELOG.md | 26 +++++++++++++++++++ gradle.properties | 2 +- .../hysky/skyblocker/config/CommonTags.java | 3 ++- .../categories/UIAndVisualsCategory.java | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff6ce83705b..f6222ec6247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +# Release 6.8.2 + +## Highlight +* Storage Overlay changes + * Add darkening effect to slots that do not match the search text + * Add an option to reopen the previous backpack when running /storage + * Add a small highlight to hovered backpacks/ender chests + * Fix search not indexing item tooltips + * Fix some things overlapping with the search bar + * Fix being able to interact with slots through the search bar +* Fix Kuudra Profit Calculation for enchantments +* Fix Hunting Box Helper +* Fix SkyBlock Item List exclusion zones not working sometimes +* Fix new waypoints not respecting group options +* Fix Fancy Bars config not mentioning the new Vitality bar + +## What's Changed +* fix new waypoints not respecting group options by @viciscat in https://github.com/SkyblockerMod/Skyblocker/pull/2597 +* Remove Config Check For SkyBlock Item List Exclusion Zones by @Alex33856 in https://github.com/SkyblockerMod/Skyblocker/pull/2599 +* some more storage overlay things by @viciscat in https://github.com/SkyblockerMod/Skyblocker/pull/2598 + + +**Full Changelog**: https://github.com/SkyblockerMod/Skyblocker/compare/v6.8.1+26.2...v6.8.2+26.2 + +___ + # Release 6.8.1 ## Highlight diff --git a/gradle.properties b/gradle.properties index 0d98491ea4d..8a88ea49ea5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -59,7 +59,7 @@ checkstyle_version=13.6.0 mod_publish_plugin_version=2.1.1 # Mod Properties -mod_version = 6.8.1 +mod_version = 6.8.2 maven_group = de.hysky archives_base_name = skyblocker modrinth_id=y6DuFGwJ diff --git a/src/main/java/de/hysky/skyblocker/config/CommonTags.java b/src/main/java/de/hysky/skyblocker/config/CommonTags.java index 948e79f4731..b2a75b8d152 100644 --- a/src/main/java/de/hysky/skyblocker/config/CommonTags.java +++ b/src/main/java/de/hysky/skyblocker/config/CommonTags.java @@ -16,8 +16,9 @@ public final class CommonTags { public static final Component ADDED_IN_6_7_0 = Component.literal("v6.7.0"); public static final Component ADDED_IN_6_8_0 = Component.literal("v6.8.0"); public static final Component ADDED_IN_6_8_1 = Component.literal("v6.8.1"); + public static final Component ADDED_IN_6_8_2 = Component.literal("v6.8.2"); - public static final Component LATEST_VERSION_TAG = ADDED_IN_6_8_1; + public static final Component LATEST_VERSION_TAG = ADDED_IN_6_8_2; /// Common tags for {@link net.minecraft.client.KeyMapping KeyMappings} to make them all easily searchable. public static final Component[] KEY_MAPPING = { Component.translatable("skyblocker.config.tag.keyBind"), Component.translatable("skyblocker.config.tag.keyMapping") }; diff --git a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java index caebc1582ca..f11b758a064 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java @@ -292,6 +292,7 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig .option(Option.createBuilder() .name(Component.translatable("skyblocker.config.uiAndVisuals.storageOverlay.rememberOpened")) .description(Component.translatable("skyblocker.config.uiAndVisuals.storageOverlay.rememberOpened.@Tooltip")) + .tags(CommonTags.ADDED_IN_6_8_2) .binding(defaults.uiAndVisuals.storageOverlay.rememberOpened, () -> config.uiAndVisuals.storageOverlay.rememberOpened, newValue -> config.uiAndVisuals.storageOverlay.rememberOpened = newValue) From 9fddbba01536b32c171bd0941e9e592d17f0e557 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Fri, 31 Jul 2026 01:40:19 +0200 Subject: [PATCH 9/9] fix weird clicky behavior in the screen of the overlay of the storage (#2610) --- CHANGELOG.md | 1 + .../skyblock/storageoverlay/StorageOverlayScreen.java | 5 +++-- src/main/resources/skyblocker.classtweaker | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6222ec6247..5a8d115ec2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * fix new waypoints not respecting group options by @viciscat in https://github.com/SkyblockerMod/Skyblocker/pull/2597 * Remove Config Check For SkyBlock Item List Exclusion Zones by @Alex33856 in https://github.com/SkyblockerMod/Skyblocker/pull/2599 * some more storage overlay things by @viciscat in https://github.com/SkyblockerMod/Skyblocker/pull/2598 +* fix weird clicky behavior in the screen of the overlay of the storage by @viciscat in https://github.com/SkyblockerMod/Skyblocker/pull/2610 **Full Changelog**: https://github.com/SkyblockerMod/Skyblocker/compare/v6.8.1+26.2...v6.8.2+26.2 diff --git a/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java index 6b8a19655cf..bc1a3ef9c78 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/storageoverlay/StorageOverlayScreen.java @@ -229,9 +229,10 @@ protected void repositionElements() { } @Override - protected boolean isHovering(int left, int top, int w, int h, double xm, double ym) { + protected boolean isHovering(Slot slot, double xm, double ym) { // prevent clicking slots through search bar - return super.isHovering(left, top, w, h, xm, ym) && (grid == null || grid.getGridRectangle().containsPoint((int) xm, (int) ym)); + // only affect the container and not the inventory slots + return super.isHovering(slot, xm, ym) && (grid == null || slot.container instanceof Inventory || grid.getGridRectangle().containsPoint((int) xm, (int) ym)); } @Override diff --git a/src/main/resources/skyblocker.classtweaker b/src/main/resources/skyblocker.classtweaker index 34f6598003e..d6f80c3bce3 100644 --- a/src/main/resources/skyblocker.classtweaker +++ b/src/main/resources/skyblocker.classtweaker @@ -55,6 +55,7 @@ accessible class net/minecraft/client/renderer/rendertype/RenderSetup$TextureBin # Custom Screens # Gets rid of a compiler error for Eclipse (I guess its more strict) accessible class net/minecraft/client/gui/components/AbstractSelectionList$Entry +extendable method net/minecraft/client/gui/screens/inventory/AbstractContainerScreen isHovering (Lnet/minecraft/world/inventory/Slot;DD)Z # Quick Nav accessible method net/minecraft/client/gui/screens/Screen addWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener;