aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java15
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java10
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);
}
}