diff options
Diffstat (limited to 'src/main')
4 files changed, 21 insertions, 8 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java index 9097ed0f..4d4dae83 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java @@ -216,7 +216,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen } if (currentSolver != null) { - SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack, this.handler.getCursorStack()); + SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack); } // Experiment Solvers 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 56f06fb5..0bfb896e 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 @@ -15,6 +15,7 @@ import java.util.function.Predicate; public class StartsWithTerminal extends ContainerSolver { private final Int2ObjectOpenHashMap<ItemState> trackedItemStates = new Int2ObjectOpenHashMap<>(); + private int lastKnownScreenId = Integer.MIN_VALUE; public StartsWithTerminal() { super("^What starts with: '([A-Z])'\\?$"); @@ -49,7 +50,7 @@ public class StartsWithTerminal extends ContainerSolver { } @Override - protected void onClickSlot(int slot, ItemStack stack, ItemStack cursorStack, String[] groups) { + protected void 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; @@ -57,10 +58,15 @@ public class StartsWithTerminal extends ContainerSolver { String prefix = groups[0]; //If the item stack's name starts with the correct letter - //Also, since Hypixel closes & reopens the GUI after every click we check if the cursor stack is empty to avoid marking item's as clicked if the server lags and - //you can click multiple things before the GUI closes - in this event only the first click item click is counted - if (stack.getName().getString().startsWith(prefix) && (cursorStack == null || cursorStack.isEmpty()) && !state.clicked()) { + //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; } //In the future we could add an else branch and return a boolean to cancel the click since it would be wrong @@ -91,6 +97,7 @@ public class StartsWithTerminal extends ContainerSolver { private void clearState() { trackedItemStates.clear(); + lastKnownScreenId = Integer.MIN_VALUE; } private static boolean allEntriesMatch(ObjectSet<Int2ObjectMap.Entry<ItemStack>> entries, Predicate<Int2ObjectMap.Entry<ItemStack>> predicate) { diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java index 16fa7411..e2e057b3 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java @@ -34,7 +34,7 @@ public abstract class ContainerSolver { SkyblockerMod.getInstance().containerSolverManager.markDirty(); } - protected void onClickSlot(int slot, ItemStack stack, ItemStack cursorStack, String[] groups) { + protected void onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { } protected abstract List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots); diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java index 40e36622..440809d9 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java @@ -36,6 +36,10 @@ public class ContainerSolverManager { private ContainerSolver currentSolver = null; private String[] groups; private List<ColorHighlight> highlights; + /** + * Useful for keeping track of a solver's state in a Screen instance, such as if Hypixel closes & reopens a screen after every click (as they do with terminals). + */ + private int screenId = 0; public ContainerSolverManager() { solvers = new ContainerSolver[]{ @@ -82,6 +86,7 @@ public class ContainerSolverManager { matcher.usePattern(solver.getName()); matcher.reset(); if (matcher.matches()) { + ++screenId; currentSolver = solver; groups = new String[matcher.groupCount()]; for (int i = 0; i < groups.length; i++) { @@ -89,6 +94,7 @@ public class ContainerSolverManager { } currentSolver.start(screen); markDirty(); + return; } } @@ -107,9 +113,9 @@ public class ContainerSolverManager { highlights = null; } - public void onSlotClick(int slot, ItemStack stack, ItemStack cursorStack) { + public void onSlotClick(int slot, ItemStack stack) { if (currentSolver != null) { - currentSolver.onClickSlot(slot, stack, cursorStack, groups); + currentSolver.onClickSlot(slot, stack, screenId, groups); } } |