diff options
| author | Peyton Brown <81496880+PeytonBrown@users.noreply.github.com> | 2025-06-27 15:43:36 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-27 15:43:36 -0400 |
| commit | 8c905f6b955d17db5b27e3643fefeeaf1d1f2b85 (patch) | |
| tree | aa0149b95b389a0c577775fa654697e771c92dc0 /src/main/java | |
| parent | 7ecd9c630b64286a84dd207c3a13d6c3b921557b (diff) | |
| download | Skyblocker-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')
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; |
