aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorPeyton Brown <81496880+PeytonBrown@users.noreply.github.com>2025-06-27 15:43:36 -0400
committerGitHub <noreply@github.com>2025-06-27 15:43:36 -0400
commit8c905f6b955d17db5b27e3643fefeeaf1d1f2b85 (patch)
treeaa0149b95b389a0c577775fa654697e771c92dc0 /src/main/java
parent7ecd9c630b64286a84dd207c3a13d6c3b921557b (diff)
downloadSkyblocker-8c905f6b955d17db5b27e3643fefeeaf1d1f2b85.tar.gz
Skyblocker-8c905f6b955d17db5b27e3643fefeeaf1d1f2b85.tar.bz2
Skyblocker-8c905f6b955d17db5b27e3643fefeeaf1d1f2b85.zip
Same Color Terminal Solver (#1372)
* Initial Implementation * use common empty list * changed to return a unmodifiableMap * Use ImmutableMap
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/SameColorTerminal.java111
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/TerminalSolver.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java3
6 files changed, 126 insertions, 2 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
index 9be3165a..6956e635 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -321,6 +321,13 @@ public class DungeonsCategory {
newValue -> config.dungeons.terminals.solveStartsWith = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("skyblocker.config.dungeons.terminals.solveSameColor"))
+ .binding(defaults.dungeons.terminals.solveSameColor,
+ () -> config.dungeons.terminals.solveSameColor,
+ newValue -> config.dungeons.terminals.solveSameColor = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("skyblocker.config.dungeons.terminals.blockIncorrectClicks"))
.binding(defaults.dungeons.terminals.blockIncorrectClicks,
diff --git a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
index 2b605bcc..c66c7d32 100644
--- a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
@@ -159,6 +159,9 @@ public class DungeonsConfig {
@SerialEntry
public boolean solveColor = true;
+ @SerialEntry
+ public boolean solveSameColor = true;
+
@SerialEntry
public boolean solveOrder = true;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/SameColorTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/SameColorTerminal.java
new file mode 100644
index 00000000..8bf01ab7
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/SameColorTerminal.java
@@ -0,0 +1,111 @@
+package de.hysky.skyblocker.skyblock.dungeon.terminal;
+
+import com.google.common.collect.ImmutableMap;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.slottext.SlotText;
+import de.hysky.skyblocker.utils.container.SimpleContainerSolver;
+import de.hysky.skyblocker.utils.container.SlotTextAdder;
+import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2IntMap;
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.screen.slot.Slot;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+/**
+ * Solver for the "Change all to same color!" terminal.
+ * It displays the minimal number of clicks required to change each pane
+ * to the most common color in the grid.
+ */
+public final class SameColorTerminal extends SimpleContainerSolver implements TerminalSolver, SlotTextAdder {
+ public static final SameColorTerminal INSTANCE = new SameColorTerminal();
+ private static final Item[] ORDER = new Item[]{
+ Items.RED_STAINED_GLASS_PANE,
+ Items.ORANGE_STAINED_GLASS_PANE,
+ Items.YELLOW_STAINED_GLASS_PANE,
+ Items.GREEN_STAINED_GLASS_PANE,
+ Items.BLUE_STAINED_GLASS_PANE
+ };
+ private static final ImmutableMap<Item, Integer> INDEX;
+
+ static {
+ ImmutableMap.Builder<Item, Integer> builder = ImmutableMap.builderWithExpectedSize(ORDER.length);
+ for (int i = 0; i < ORDER.length; i++) {
+ builder.put(ORDER[i], i);
+ }
+ INDEX = builder.build();
+ }
+
+ private final Int2IntMap clickMap = new Int2IntOpenHashMap();
+
+ private SameColorTerminal() {
+ super("^Change all to same color!$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ clickMap.clear();
+ return SkyblockerConfigManager.get().dungeons.terminals.solveSameColor;
+ }
+
+ private void computeClicks(Int2ObjectMap<ItemStack> slots) {
+ clickMap.clear();
+ int[] counts = new int[ORDER.length];
+ Int2IntMap slotColors = new Int2IntOpenHashMap();
+
+ for (Int2ObjectMap.Entry<ItemStack> entry : slots.int2ObjectEntrySet()) {
+ Item item = entry.getValue().getItem();
+ Integer idx = INDEX.get(item);
+ if (idx != null) {
+ slotColors.put(entry.getIntKey(), idx.intValue());
+ counts[idx]++;
+ }
+ }
+ if (slotColors.isEmpty()) {
+ return;
+ }
+
+ int target = 0;
+ for (int i = 1; i < counts.length; i++) {
+ if (counts[i] > counts[target]) target = i;
+ }
+
+ for (Int2IntMap.Entry entry : slotColors.int2IntEntrySet()) {
+ int slot = entry.getIntKey();
+ int color = entry.getIntValue();
+ int diffForward = Math.floorMod(target - color, ORDER.length);
+ int diffBackward = Math.floorMod(color - target, ORDER.length);
+ int clicks = diffForward <= diffBackward ? diffForward : -diffBackward;
+ clickMap.put(slot, clicks);
+ }
+ }
+
+ @Override
+ public List<ColorHighlight> getColors(Int2ObjectMap<ItemStack> slots) {
+ computeClicks(slots);
+ return List.of();
+ }
+
+ @Override
+ public boolean onClickSlot(int slot, ItemStack stack, int screenId) {
+ if (clickMap.containsKey(slot) && clickMap.get(slot) == 0) {
+ return shouldBlockIncorrectClicks();
+ }
+ return false;
+ }
+
+ @Override
+ public @NotNull List<SlotText> getText(@Nullable Slot slot, @NotNull ItemStack stack, int slotId) {
+ int clicks = clickMap.getOrDefault(slotId, 0);
+ if (clicks == 0) return List.of();
+ return SlotText.topLeftList(Text.literal(String.valueOf(clicks)).formatted(Formatting.GOLD));
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/TerminalSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/TerminalSolver.java
index cf384f08..7344653e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/TerminalSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/TerminalSolver.java
@@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-public sealed interface TerminalSolver permits ColorTerminal, LightsOnTerminal, OrderTerminal, StartsWithTerminal {
+public sealed interface TerminalSolver permits ColorTerminal, LightsOnTerminal, OrderTerminal, SameColorTerminal, StartsWithTerminal {
default boolean shouldBlockIncorrectClicks() {
return SkyblockerConfigManager.get().dungeons.terminals.blockIncorrectClicks;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java
index d537650e..d031a180 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java
@@ -5,6 +5,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.WardrobeKeybinds;
import de.hysky.skyblocker.skyblock.bazaar.BazaarHelper;
import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver;
+import de.hysky.skyblocker.skyblock.dungeon.terminal.SameColorTerminal;
import de.hysky.skyblocker.skyblock.hunting.AttributeLevelHelper;
import de.hysky.skyblocker.skyblock.item.slottext.adders.*;
import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen;
@@ -59,6 +60,7 @@ public class SlotTextManager {
new NewYearCakeAdder(),
WardrobeKeybinds.INSTANCE,
new SkyblockGuideAdder(),
+ SameColorTerminal.INSTANCE,
AttributeLevelHelper.INSTANCE
};
private static final ArrayList<SlotTextAdder> currentScreenAdders = new ArrayList<>();
diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java
index 580e9d29..23e79b57 100644
--- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java
+++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java
@@ -15,6 +15,7 @@ import de.hysky.skyblocker.skyblock.dungeon.terminal.ColorTerminal;
import de.hysky.skyblocker.skyblock.dungeon.terminal.LightsOnTerminal;
import de.hysky.skyblocker.skyblock.dungeon.terminal.OrderTerminal;
import de.hysky.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal;
+import de.hysky.skyblocker.skyblock.dungeon.terminal.SameColorTerminal;
import de.hysky.skyblocker.skyblock.dwarven.CommissionHighlight;
import de.hysky.skyblocker.skyblock.dwarven.fossil.FossilSolver;
import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver;
@@ -59,9 +60,9 @@ public class ContainerSolverManager {
BitsHelper.INSTANCE,
new RaffleTaskHighlight(),
new FossilSolver(),
+ SameColorTerminal.INSTANCE,
new CopyUnderbidPrice(),
new HuntingBoxHelper()
-
};
private static ContainerSolver currentSolver = null;
private static List<ColorHighlight> highlights;