diff options
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal')
5 files changed, 75 insertions, 8 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java index 01673f23..833e85a3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory; import java.util.*; -public class ColorTerminal extends ContainerSolver { +public class ColorTerminal extends ContainerSolver implements TerminalSolver { private static final Logger LOGGER = LoggerFactory.getLogger(ColorTerminal.class.getName()); private static final Map<String, DyeColor> colorFromName; private DyeColor targetColor; @@ -53,6 +53,14 @@ public class ColorTerminal extends ContainerSolver { return highlights; } + @Override + protected boolean onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { + if (stack.hasGlint() || !targetColor.equals(itemColor.get(stack.getItem()))) { + return shouldBlockIncorrectClicks(); + } + + return false; + } static { colorFromName = new HashMap<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/LightsOnTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/LightsOnTerminal.java new file mode 100644 index 00000000..67b51c22 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/LightsOnTerminal.java @@ -0,0 +1,37 @@ +package de.hysky.skyblocker.skyblock.dungeon.terminal; + +import java.util.List; + +import de.hysky.skyblocker.utils.render.gui.ColorHighlight; +import de.hysky.skyblocker.utils.render.gui.ContainerSolver; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +/** + * The terminal where you change all the panes that are red to green. + * + * This doesn't solve the terminal because you don't need a solver for it, but rather to simply allow for click blocking. + */ +public class LightsOnTerminal extends ContainerSolver implements TerminalSolver { + private static final List<ColorHighlight> EMPTY = List.of(); + + public LightsOnTerminal() { + super("^Correct all the panes!$"); + } + + @Override + protected boolean isEnabled() { + return shouldBlockIncorrectClicks(); + } + + @Override + protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) { + return EMPTY; + } + + @Override + protected boolean onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { + return stack.isOf(Items.LIME_STAINED_GLASS_PANE); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java index d8d9a63a..e980a136 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class OrderTerminal extends ContainerSolver { +public class OrderTerminal extends ContainerSolver implements TerminalSolver { private final int PANES_NUM = 14; private int[] orderedSlots; private int currentNum = Integer.MAX_VALUE; @@ -55,4 +55,15 @@ public class OrderTerminal extends ContainerSolver { currentNum = 0; return true; } + + @Override + protected boolean onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { + if (stack == null || stack.isEmpty()) return false; + + if (!stack.isOf(Items.RED_STAINED_GLASS_PANE) || stack.getCount() != currentNum + 1) { + return shouldBlockIncorrectClicks(); + } + + return false; + } }
\ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java index c4cc8e47..51a778a5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -public class StartsWithTerminal extends ContainerSolver { +public class StartsWithTerminal extends ContainerSolver implements TerminalSolver { private final Int2ObjectOpenHashMap<ItemState> trackedItemStates = new Int2ObjectOpenHashMap<>(); private int lastKnownScreenId = Integer.MIN_VALUE; @@ -50,9 +50,9 @@ public class StartsWithTerminal extends ContainerSolver { } @Override - protected void onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { + protected boolean onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { //Some random glass pane was clicked or something - if (!trackedItemStates.containsKey(slot) || stack == null || stack.isEmpty()) return; + if (!trackedItemStates.containsKey(slot) || stack == null || stack.isEmpty()) return false; ItemState state = trackedItemStates.get(slot); String prefix = groups[0]; @@ -61,16 +61,17 @@ public class StartsWithTerminal extends ContainerSolver { //Also, since Hypixel closes & reopens the GUI after every click we check if the last known screen id is the same that way in case the server lags and //either a player tries to click a second item or if the player puts the clicked item back and tries to click another that we don't mark multiple items //as clicked when only the first one will count. - + //While Hypixel does use a different syncId each time they open the screen we opt to use our own so as to avoid them potentially changing that //and in turn breaking this logic if (stack.getName().getString().startsWith(prefix) && !state.clicked() && lastKnownScreenId != screenId) { trackedItemStates.put(slot, state.click()); lastKnownScreenId = screenId; + } else { + return shouldBlockIncorrectClicks(); } - //In the future we could add an else branch and return a boolean to cancel the click since it would be wrong - return; + return false; } //We only setup the state when all items aren't null or empty. This prevents the state from being reset due to unsent items or server lag spikes/bad TPS (fix ur servers Hypixel) 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 new file mode 100644 index 00000000..7a7cd6bb --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/TerminalSolver.java @@ -0,0 +1,10 @@ +package de.hysky.skyblocker.skyblock.dungeon.terminal; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; + +public interface TerminalSolver { + + default boolean shouldBlockIncorrectClicks() { + return SkyblockerConfigManager.get().dungeons.terminals.blockIncorrectClicks; + } +} |