From 4c398333b9802a9000cc65d50ae4a2d13f300ca8 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:57:43 +0300 Subject: Refactor container matcher implementations into interfaces --- .../utils/container/AbstractContainerMatcher.java | 17 +++ .../utils/container/AbstractContainerSolver.java | 37 +++++ .../utils/container/AbstractSlotTextAdder.java | 21 +++ .../utils/container/AbstractTooltipAdder.java | 18 +++ .../utils/container/ContainerSolver.java | 38 +++++ .../utils/container/ContainerSolverManager.java | 150 ++++++++++++++++++++ .../utils/container/RegexContainerMatcher.java | 68 +++++++++ .../utils/render/gui/AbstractContainerMatcher.java | 29 ---- .../utils/render/gui/ContainerSolver.java | 52 ------- .../utils/render/gui/ContainerSolverManager.java | 157 --------------------- 10 files changed, 349 insertions(+), 238 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractContainerMatcher.java (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java new file mode 100644 index 00000000..5509b9a4 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java @@ -0,0 +1,17 @@ +package de.hysky.skyblocker.utils.container; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import org.jetbrains.annotations.NotNull; + +public interface AbstractContainerMatcher { + /** + * Tests if the given screen should be handled by this matcher. + * @return {@code true} if this matcher should apply to the given screen, {@code false} otherwise + */ + boolean test(@NotNull HandledScreen screen); + + /** + * @return {@code true} if this matcher is enabled, {@code false} otherwise + */ + boolean isEnabled(); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java new file mode 100644 index 00000000..38bc32dd --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java @@ -0,0 +1,37 @@ +package de.hysky.skyblocker.utils.container; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.render.gui.ColorHighlight; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public interface AbstractContainerSolver extends AbstractContainerMatcher { + + List getColors(Int2ObjectMap slots); + + default void start(GenericContainerScreen screen) {} + + default void reset() {} + + default boolean onClickSlot(int slot, ItemStack stack, int screenId) { + return false; + } + + static void markHighlightsDirty() { + SkyblockerMod.getInstance().containerSolverManager.markDirty(); + } + + static void trimEdges(Int2ObjectMap slots, int rows) { + for (int i = 0; i < rows; i++) { + slots.remove(9 * i); + slots.remove(9 * i + 8); + } + for (int i = 1; i < 8; i++) { + slots.remove(i); + slots.remove((rows - 1) * 9 + i); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java new file mode 100644 index 00000000..4034e88d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.utils.container; + +import de.hysky.skyblocker.skyblock.item.slottext.SlotText; +import net.minecraft.screen.slot.Slot; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface AbstractSlotTextAdder extends AbstractContainerMatcher { + + /** + * This method will be called for each rendered slot. Consider using a switch statement on {@link Slot#id} if you wish to add different text to different slots. + * + * @return A list of positioned text to be rendered. Return {@link List#of()} if no text should be rendered. + * @implNote By minecraft's design, scaled text inexplicably moves around. + * It's also not anti-aliased, so it looks horribly jagged and unreadable when scaled down too much. + * So, limit your text to 3 characters (or roughly less than 20 width) if you want it to not look horrible. + */ + @NotNull + List getText(Slot slot); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java new file mode 100644 index 00000000..3cc84f35 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.utils.container; + +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface AbstractTooltipAdder extends AbstractContainerMatcher { + /** + * @implNote The first element of the lines list holds the item's display name, + * as it's a list of all lines that will be displayed in the tooltip. + */ + void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List lines); + + int getPriority(); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java new file mode 100644 index 00000000..6d3240ea --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java @@ -0,0 +1,38 @@ +package de.hysky.skyblocker.utils.container; + +import org.intellij.lang.annotations.Language; +import org.jetbrains.annotations.NotNull; + +import java.util.regex.Pattern; + +/** + * Simple implementation of a container solver. Extend this class to add a new gui solver, + * like terminal solvers or experiment solvers and add it to {@link ContainerSolverManager#solvers}. + */ +public abstract class ContainerSolver extends RegexContainerMatcher implements AbstractContainerSolver { + /** + * Utility constructor that will compile the given string into a pattern. + * + * @see #ContainerSolver(Pattern) + */ + protected ContainerSolver(@NotNull @Language("RegExp") String titlePattern) { + super(titlePattern); + } + + /** + * Creates a ContainerSolver that will be applied to screens with titles that match the given pattern. + * + * @param titlePattern The pattern to match the screen title against. + */ + protected ContainerSolver(@NotNull Pattern titlePattern) { + super(titlePattern); + } + + // A container solver that applies to every screen doesn't make sense, + // so we don't provide a constructor for that and force getTitlePattern to be @NotNull + @Override + public @NotNull Pattern getTitlePattern() { + assert super.getTitlePattern() != null; + return super.getTitlePattern(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java new file mode 100644 index 00000000..77833a67 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java @@ -0,0 +1,150 @@ +package de.hysky.skyblocker.utils.container; + +import com.mojang.blaze3d.systems.RenderSystem; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; +import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakeBagHelper; +import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakesHelper; +import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; +import de.hysky.skyblocker.skyblock.dungeon.CroesusHelper; +import de.hysky.skyblocker.skyblock.dungeon.CroesusProfit; +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.experiment.ChronomatronSolver; +import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver; +import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.gui.ColorHighlight; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. + */ +public class ContainerSolverManager { + private final AbstractContainerSolver[] solvers; + private AbstractContainerSolver currentSolver = null; + private List 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 AbstractContainerSolver[]{ + new ColorTerminal(), + new OrderTerminal(), + new StartsWithTerminal(), + new LightsOnTerminal(), + new CroesusHelper(), + new CroesusProfit(), + new ChronomatronSolver(), + new SuperpairsSolver(), + UltrasequencerSolver.INSTANCE, + new NewYearCakeBagHelper(), + NewYearCakesHelper.INSTANCE, + new ChocolateFactorySolver() + }; + } + + public AbstractContainerSolver getCurrentSolver() { + return currentSolver; + } + + public void init() { + ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { + ScreenEvents.afterRender(screen).register((screen1, context, mouseX, mouseY, delta) -> { + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.translate(((HandledScreenAccessor) genericContainerScreen).getX(), ((HandledScreenAccessor) genericContainerScreen).getY(), 300); + onDraw(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); + matrices.pop(); + }); + ScreenEvents.remove(screen).register(screen1 -> clearScreen()); + onSetScreen(genericContainerScreen); + } else { + clearScreen(); + } + }); + } + + public void onSetScreen(@NotNull GenericContainerScreen screen) { + String screenName = screen.getTitle().getString(); + for (AbstractContainerSolver solver : solvers) { + if (solver.isEnabled()) { + if (solver instanceof ContainerSolver containerSolver && containerSolver.test(screenName)) { + ++screenId; + currentSolver = containerSolver; + currentSolver.start(screen); + markDirty(); + + return; + } else if (solver.test(screen)) { + ++screenId; + currentSolver = solver; + currentSolver.start(screen); + markDirty(); + + return; + } + } + } + clearScreen(); + } + + public void clearScreen() { + if (currentSolver != null) { + currentSolver.reset(); + currentSolver = null; + } + } + + public void markDirty() { + highlights = null; + } + + /** + * @return Whether the click should be disallowed. + */ + public boolean onSlotClick(int slot, ItemStack stack) { + if (currentSolver != null) { + return currentSolver.onClickSlot(slot, stack, screenId); + } + + return false; + } + + public void onDraw(DrawContext context, List slots) { + if (currentSolver == null) + return; + if (highlights == null) + highlights = currentSolver.getColors(slotMap(slots)); + RenderSystem.enableDepthTest(); + RenderSystem.colorMask(true, true, true, false); + for (ColorHighlight highlight : highlights) { + Slot slot = slots.get(highlight.slot()); + int color = highlight.color(); + context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, color); + } + RenderSystem.colorMask(true, true, true, true); + } + + private Int2ObjectMap slotMap(List slots) { + Int2ObjectMap slotMap = new Int2ObjectRBTreeMap<>(); + for (int i = 0; i < slots.size(); i++) { + slotMap.put(i, slots.get(i).getStack()); + } + return slotMap; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java new file mode 100644 index 00000000..a8a8e3c2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java @@ -0,0 +1,68 @@ +package de.hysky.skyblocker.utils.container; + +import de.hysky.skyblocker.skyblock.ChestValue; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import org.intellij.lang.annotations.Language; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A regex implementation of {@link AbstractContainerMatcher} that matches the title of the screen. + */ +public abstract class RegexContainerMatcher implements AbstractContainerMatcher { + /** + * The title of the screen must match this pattern for this to be applied. Null means it will be applied to all screens. + * + * @implNote Don't end your regex with a {@code $} as {@link ChestValue} appends text to the end of the title, + * so the regex will stop matching if the player uses chest value. + */ + @Nullable + public final Pattern titlePattern; + + @Nullable + public String[] groups = null; + + @Override + public boolean test(@NotNull HandledScreen screen) { + return test(screen.getTitle().getString()); + } + + public boolean test(@NotNull String title) { + if (titlePattern == null) return true; + Matcher matcher = titlePattern.matcher(title); + if (matcher.matches()) { + int groupCount = matcher.groupCount(); + if (groupCount >= 1) { //No need to initialize the array if there are no groups + groups = new String[groupCount]; + for (int i = 0; i < groupCount; i++) { + groups[i] = matcher.group(i + 1); // +1 because first group is the whole match, which is useless + } + } + return true; + } + return false; + } + + protected RegexContainerMatcher() { + this((Pattern) null); + } + + protected RegexContainerMatcher(@NotNull @Language("RegExp") String titlePattern) { + this(Pattern.compile(titlePattern)); + } + + protected RegexContainerMatcher(@Nullable Pattern titlePattern) { + this.titlePattern = titlePattern; + } + + public @Nullable Pattern getTitlePattern() { + return titlePattern; + } + + public final @Nullable String[] getGroups() { + return groups; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractContainerMatcher.java deleted file mode 100644 index bf255218..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractContainerMatcher.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.hysky.skyblocker.utils.render.gui; - -import de.hysky.skyblocker.skyblock.ChestValue; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.regex.Pattern; - -public abstract class AbstractContainerMatcher { - /** - * The title of the screen must match this pattern for this to be applied. Null means it will be applied to all screens. - * @implNote Don't end your regex with a {@code $} as {@link ChestValue} appends text to the end of the title, - * so the regex will stop matching if the player uses chest value. - */ - @Nullable - public final Pattern titlePattern; - - protected AbstractContainerMatcher() { - this((Pattern) null); - } - - protected AbstractContainerMatcher(@NotNull String titlePattern) { - this(Pattern.compile(titlePattern)); - } - - protected AbstractContainerMatcher(@Nullable Pattern titlePattern) { - this.titlePattern = titlePattern; - } -} 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 9a9d0907..e69de29b 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 @@ -1,52 +0,0 @@ -package de.hysky.skyblocker.utils.render.gui; - -import de.hysky.skyblocker.SkyblockerMod; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.item.ItemStack; -import org.intellij.lang.annotations.Language; - -import java.util.List; -import java.util.regex.Pattern; - -/** - * Abstract class for gui solvers. Extend this class to add a new gui solver, like terminal solvers or experiment solvers. - */ -public abstract class ContainerSolver extends AbstractContainerMatcher { - protected ContainerSolver(@Language("RegExp") String titlePattern) { - super(titlePattern); - } - - protected abstract boolean isEnabled(); - - public final Pattern getName() { - return titlePattern; - } - - protected void start(GenericContainerScreen screen) { - } - - protected void reset() { - } - - protected void markHighlightsDirty() { - SkyblockerMod.getInstance().containerSolverManager.markDirty(); - } - - protected boolean onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) { - return false; - } - - protected abstract List getColors(String[] groups, Int2ObjectMap slots); - - protected final void trimEdges(Int2ObjectMap slots, int rows) { - for (int i = 0; i < rows; i++) { - slots.remove(9 * i); - slots.remove(9 * i + 8); - } - for (int i = 1; i < 8; i++) { - slots.remove(i); - slots.remove((rows - 1) * 9 + i); - } - } -} 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 79cc78f5..e69de29b 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 @@ -1,157 +0,0 @@ -package de.hysky.skyblocker.utils.render.gui; - -import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; -import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakeBagHelper; -import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakesHelper; -import de.hysky.skyblocker.skyblock.bazaar.ReorderHelper; -import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; -import de.hysky.skyblocker.skyblock.dungeon.CroesusHelper; -import de.hysky.skyblocker.skyblock.dungeon.CroesusProfit; -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.dwarven.CommissionHighlight; -import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver; -import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver; -import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver; -import de.hysky.skyblocker.utils.Utils; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. - */ -public class ContainerSolverManager { - private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); - private final ContainerSolver[] solvers; - private ContainerSolver currentSolver = null; - private String[] groups; - private List 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[]{ - new ColorTerminal(), - new OrderTerminal(), - new StartsWithTerminal(), - new LightsOnTerminal(), - new CroesusHelper(), - new CommissionHighlight(), - new CroesusProfit(), - new ChronomatronSolver(), - new SuperpairsSolver(), - UltrasequencerSolver.INSTANCE, - new NewYearCakeBagHelper(), - NewYearCakesHelper.INSTANCE, - new ChocolateFactorySolver(), - new ReorderHelper() - }; - } - - public ContainerSolver getCurrentSolver() { - return currentSolver; - } - - public void init() { - ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { - ScreenEvents.afterRender(screen).register((screen1, context, mouseX, mouseY, delta) -> { - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.translate(((HandledScreenAccessor) genericContainerScreen).getX(), ((HandledScreenAccessor) genericContainerScreen).getY(), 300); - onDraw(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); - matrices.pop(); - }); - ScreenEvents.remove(screen).register(screen1 -> clearScreen()); - onSetScreen(genericContainerScreen); - } else { - clearScreen(); - } - }); - } - - public void onSetScreen(@NotNull GenericContainerScreen screen) { - String screenName = screen.getTitle().getString(); - Matcher matcher = PLACEHOLDER_PATTERN.matcher(screenName); - for (ContainerSolver solver : solvers) { - if (solver.isEnabled()) { - 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++) { - groups[i] = matcher.group(i + 1); - } - currentSolver.start(screen); - markDirty(); - - return; - } - } - } - clearScreen(); - } - - public void clearScreen() { - if (currentSolver != null) { - currentSolver.reset(); - currentSolver = null; - } - } - - public void markDirty() { - highlights = null; - } - - /** - * @return Whether the click should be disallowed. - */ - public boolean onSlotClick(int slot, ItemStack stack) { - if (currentSolver != null) { - return currentSolver.onClickSlot(slot, stack, screenId, groups); - } - - return false; - } - - public void onDraw(DrawContext context, List slots) { - if (currentSolver == null) - return; - if (highlights == null) - highlights = currentSolver.getColors(groups, slotMap(slots)); - RenderSystem.enableDepthTest(); - RenderSystem.colorMask(true, true, true, false); - for (ColorHighlight highlight : highlights) { - Slot slot = slots.get(highlight.slot()); - int color = highlight.color(); - context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, color); - } - RenderSystem.colorMask(true, true, true, true); - } - - private Int2ObjectMap slotMap(List slots) { - Int2ObjectMap slotMap = new Int2ObjectRBTreeMap<>(); - for (int i = 0; i < slots.size(); i++) { - slotMap.put(i, slots.get(i).getStack()); - } - return slotMap; - } -} -- cgit From 8f540ffc0f2e6dc90f8c9a1ac249ff9185243d3c Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 21 Jun 2024 07:38:03 +0300 Subject: A lot of stuff. - Refactored SlotTextAdders to take in ItemStack and int slotId rather than Slot - Refactored the renderSlotText method from HandledScreenMixin into SlotTextManager and added an overloading function that takes in the itemstack, slot id, x and y and the previous function with the Slot parameter just delegates to it with the relevant fields from that Slot object - As a result of the above 2 changes the logic in CommunityShopAdder had to be changed too, now it figures out the screen from the method calls to `getText` rather than the Slot's inventory. - Fixed slot text not being rendered in backpack preview - Added private constructor for BackpackPreview (because it's all static methods anyway) --- .../hysky/skyblocker/utils/container/AbstractContainerSolver.java | 1 - .../de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java index 38bc32dd..d4c52212 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java @@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack; import java.util.List; public interface AbstractContainerSolver extends AbstractContainerMatcher { - List getColors(Int2ObjectMap slots); default void start(GenericContainerScreen screen) {} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java index 4034e88d..fce3fcf5 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.utils.container; import de.hysky.skyblocker.skyblock.item.slottext.SlotText; -import net.minecraft.screen.slot.Slot; +import net.minecraft.item.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -9,7 +9,7 @@ import java.util.List; public interface AbstractSlotTextAdder extends AbstractContainerMatcher { /** - * This method will be called for each rendered slot. Consider using a switch statement on {@link Slot#id} if you wish to add different text to different slots. + * This method will be called for each rendered slot. Consider using a switch statement on {@code slotId} if you wish to limit the text to specific slots. * * @return A list of positioned text to be rendered. Return {@link List#of()} if no text should be rendered. * @implNote By minecraft's design, scaled text inexplicably moves around. @@ -17,5 +17,5 @@ public interface AbstractSlotTextAdder extends AbstractContainerMatcher { * So, limit your text to 3 characters (or roughly less than 20 width) if you want it to not look horrible. */ @NotNull - List getText(Slot slot); + List getText(@NotNull ItemStack itemStack, int slotId); } -- cgit From 99dd2eb4e024c6b5d6355eef342af63649d9fb08 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 21 Jun 2024 07:43:33 +0300 Subject: Rename AbstractContainerMatcher and its extending interfaces to remove the `Abstract` prefix and rename simple implementations with a `Simple` prefix --- .../utils/container/AbstractContainerMatcher.java | 17 ------ .../utils/container/AbstractContainerSolver.java | 36 ------------ .../utils/container/AbstractSlotTextAdder.java | 2 +- .../utils/container/AbstractTooltipAdder.java | 2 +- .../utils/container/ContainerMatcher.java | 17 ++++++ .../utils/container/ContainerSolver.java | 68 +++++++++++----------- .../utils/container/ContainerSolverManager.java | 14 ++--- .../utils/container/RegexContainerMatcher.java | 4 +- .../utils/container/SimpleContainerSolver.java | 38 ++++++++++++ 9 files changed, 99 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/SimpleContainerSolver.java (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java deleted file mode 100644 index 5509b9a4..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerMatcher.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.hysky.skyblocker.utils.container; - -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import org.jetbrains.annotations.NotNull; - -public interface AbstractContainerMatcher { - /** - * Tests if the given screen should be handled by this matcher. - * @return {@code true} if this matcher should apply to the given screen, {@code false} otherwise - */ - boolean test(@NotNull HandledScreen screen); - - /** - * @return {@code true} if this matcher is enabled, {@code false} otherwise - */ - boolean isEnabled(); -} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java deleted file mode 100644 index d4c52212..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractContainerSolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.hysky.skyblocker.utils.container; - -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.utils.render.gui.ColorHighlight; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.item.ItemStack; - -import java.util.List; - -public interface AbstractContainerSolver extends AbstractContainerMatcher { - List getColors(Int2ObjectMap slots); - - default void start(GenericContainerScreen screen) {} - - default void reset() {} - - default boolean onClickSlot(int slot, ItemStack stack, int screenId) { - return false; - } - - static void markHighlightsDirty() { - SkyblockerMod.getInstance().containerSolverManager.markDirty(); - } - - static void trimEdges(Int2ObjectMap slots, int rows) { - for (int i = 0; i < rows; i++) { - slots.remove(9 * i); - slots.remove(9 * i + 8); - } - for (int i = 1; i < 8; i++) { - slots.remove(i); - slots.remove((rows - 1) * 9 + i); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java index fce3fcf5..5e13c644 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; -public interface AbstractSlotTextAdder extends AbstractContainerMatcher { +public interface AbstractSlotTextAdder extends ContainerMatcher { /** * This method will be called for each rendered slot. Consider using a switch statement on {@code slotId} if you wish to limit the text to specific slots. diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java index 3cc84f35..5da64f52 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -public interface AbstractTooltipAdder extends AbstractContainerMatcher { +public interface AbstractTooltipAdder extends ContainerMatcher { /** * @implNote The first element of the lines list holds the item's display name, * as it's a list of all lines that will be displayed in the tooltip. diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java new file mode 100644 index 00000000..52418f22 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java @@ -0,0 +1,17 @@ +package de.hysky.skyblocker.utils.container; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import org.jetbrains.annotations.NotNull; + +public interface ContainerMatcher { + /** + * Tests if the given screen should be handled by this matcher. + * @return {@code true} if this matcher should apply to the given screen, {@code false} otherwise + */ + boolean test(@NotNull HandledScreen screen); + + /** + * @return {@code true} if this matcher is enabled, {@code false} otherwise + */ + boolean isEnabled(); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java index 6d3240ea..f3cb400e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java @@ -1,38 +1,36 @@ package de.hysky.skyblocker.utils.container; -import org.intellij.lang.annotations.Language; -import org.jetbrains.annotations.NotNull; - -import java.util.regex.Pattern; - -/** - * Simple implementation of a container solver. Extend this class to add a new gui solver, - * like terminal solvers or experiment solvers and add it to {@link ContainerSolverManager#solvers}. - */ -public abstract class ContainerSolver extends RegexContainerMatcher implements AbstractContainerSolver { - /** - * Utility constructor that will compile the given string into a pattern. - * - * @see #ContainerSolver(Pattern) - */ - protected ContainerSolver(@NotNull @Language("RegExp") String titlePattern) { - super(titlePattern); - } - - /** - * Creates a ContainerSolver that will be applied to screens with titles that match the given pattern. - * - * @param titlePattern The pattern to match the screen title against. - */ - protected ContainerSolver(@NotNull Pattern titlePattern) { - super(titlePattern); - } - - // A container solver that applies to every screen doesn't make sense, - // so we don't provide a constructor for that and force getTitlePattern to be @NotNull - @Override - public @NotNull Pattern getTitlePattern() { - assert super.getTitlePattern() != null; - return super.getTitlePattern(); - } +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.render.gui.ColorHighlight; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public interface ContainerSolver extends ContainerMatcher { + List getColors(Int2ObjectMap slots); + + default void start(GenericContainerScreen screen) {} + + default void reset() {} + + default boolean onClickSlot(int slot, ItemStack stack, int screenId) { + return false; + } + + static void markHighlightsDirty() { + SkyblockerMod.getInstance().containerSolverManager.markDirty(); + } + + static void trimEdges(Int2ObjectMap slots, int rows) { + for (int i = 0; i < rows; i++) { + slots.remove(9 * i); + slots.remove(9 * i + 8); + } + for (int i = 1; i < 8; i++) { + slots.remove(i); + slots.remove((rows - 1) * 9 + i); + } + } } 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 77833a67..1e2bce16 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java @@ -29,11 +29,11 @@ import org.jetbrains.annotations.NotNull; import java.util.List; /** - * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. + * Manager class for {@link SimpleContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link SimpleContainerSolver} and register it in {@link #ContainerSolverManager()}. */ public class ContainerSolverManager { - private final AbstractContainerSolver[] solvers; - private AbstractContainerSolver currentSolver = null; + private final ContainerSolver[] solvers; + private ContainerSolver currentSolver = null; private List 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). @@ -41,7 +41,7 @@ public class ContainerSolverManager { private int screenId = 0; public ContainerSolverManager() { - solvers = new AbstractContainerSolver[]{ + solvers = new ContainerSolver[]{ new ColorTerminal(), new OrderTerminal(), new StartsWithTerminal(), @@ -57,7 +57,7 @@ public class ContainerSolverManager { }; } - public AbstractContainerSolver getCurrentSolver() { + public ContainerSolver getCurrentSolver() { return currentSolver; } @@ -81,9 +81,9 @@ public class ContainerSolverManager { public void onSetScreen(@NotNull GenericContainerScreen screen) { String screenName = screen.getTitle().getString(); - for (AbstractContainerSolver solver : solvers) { + for (ContainerSolver solver : solvers) { if (solver.isEnabled()) { - if (solver instanceof ContainerSolver containerSolver && containerSolver.test(screenName)) { + if (solver instanceof SimpleContainerSolver containerSolver && containerSolver.test(screenName)) { ++screenId; currentSolver = containerSolver; currentSolver.start(screen); diff --git a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java index a8a8e3c2..4df0fe1a 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java @@ -10,9 +10,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; /** - * A regex implementation of {@link AbstractContainerMatcher} that matches the title of the screen. + * A regex implementation of {@link ContainerMatcher} that matches the title of the screen. */ -public abstract class RegexContainerMatcher implements AbstractContainerMatcher { +public abstract class RegexContainerMatcher implements ContainerMatcher { /** * The title of the screen must match this pattern for this to be applied. Null means it will be applied to all screens. * diff --git a/src/main/java/de/hysky/skyblocker/utils/container/SimpleContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/SimpleContainerSolver.java new file mode 100644 index 00000000..7d8b7417 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/SimpleContainerSolver.java @@ -0,0 +1,38 @@ +package de.hysky.skyblocker.utils.container; + +import org.intellij.lang.annotations.Language; +import org.jetbrains.annotations.NotNull; + +import java.util.regex.Pattern; + +/** + * Simple implementation of a container solver. Extend this class to add a new gui solver, + * like terminal solvers or experiment solvers and add it to {@link ContainerSolverManager#solvers}. + */ +public abstract class SimpleContainerSolver extends RegexContainerMatcher implements ContainerSolver { + /** + * Utility constructor that will compile the given string into a pattern. + * + * @see #SimpleContainerSolver(Pattern) + */ + protected SimpleContainerSolver(@NotNull @Language("RegExp") String titlePattern) { + super(titlePattern); + } + + /** + * Creates a ContainerSolver that will be applied to screens with titles that match the given pattern. + * + * @param titlePattern The pattern to match the screen title against. + */ + protected SimpleContainerSolver(@NotNull Pattern titlePattern) { + super(titlePattern); + } + + // A container solver that applies to every screen doesn't make sense, + // so we don't provide a constructor for that and force getTitlePattern to be @NotNull + @Override + public @NotNull Pattern getTitlePattern() { + assert super.getTitlePattern() != null; + return super.getTitlePattern(); + } +} -- cgit From f26ac1e5a63d47d73995e22b12ebdcbc0e26a57f Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 21 Jun 2024 07:47:26 +0300 Subject: Oops, missed a few --- .../utils/container/AbstractSlotTextAdder.java | 21 --------------------- .../utils/container/AbstractTooltipAdder.java | 18 ------------------ .../skyblocker/utils/container/SlotTextAdder.java | 21 +++++++++++++++++++++ .../skyblocker/utils/container/TooltipAdder.java | 18 ++++++++++++++++++ 4 files changed, 39 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/container/TooltipAdder.java (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java deleted file mode 100644 index 5e13c644..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractSlotTextAdder.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.hysky.skyblocker.utils.container; - -import de.hysky.skyblocker.skyblock.item.slottext.SlotText; -import net.minecraft.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public interface AbstractSlotTextAdder extends ContainerMatcher { - - /** - * This method will be called for each rendered slot. Consider using a switch statement on {@code slotId} if you wish to limit the text to specific slots. - * - * @return A list of positioned text to be rendered. Return {@link List#of()} if no text should be rendered. - * @implNote By minecraft's design, scaled text inexplicably moves around. - * It's also not anti-aliased, so it looks horribly jagged and unreadable when scaled down too much. - * So, limit your text to 3 characters (or roughly less than 20 width) if you want it to not look horrible. - */ - @NotNull - List getText(@NotNull ItemStack itemStack, int slotId); -} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java deleted file mode 100644 index 5da64f52..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/container/AbstractTooltipAdder.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.hysky.skyblocker.utils.container; - -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -public interface AbstractTooltipAdder extends ContainerMatcher { - /** - * @implNote The first element of the lines list holds the item's display name, - * as it's a list of all lines that will be displayed in the tooltip. - */ - void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List lines); - - int getPriority(); -} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java new file mode 100644 index 00000000..c0e4bc1c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.utils.container; + +import de.hysky.skyblocker.skyblock.item.slottext.SlotText; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface SlotTextAdder extends ContainerMatcher { + + /** + * This method will be called for each rendered slot. Consider using a switch statement on {@code slotId} if you wish to limit the text to specific slots. + * + * @return A list of positioned text to be rendered. Return {@link List#of()} if no text should be rendered. + * @implNote By minecraft's design, scaled text inexplicably moves around. + * It's also not anti-aliased, so it looks horribly jagged and unreadable when scaled down too much. + * So, limit your text to 3 characters (or roughly less than 20 width) if you want it to not look horrible. + */ + @NotNull + List getText(@NotNull ItemStack itemStack, int slotId); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/TooltipAdder.java new file mode 100644 index 00000000..2ff3fdf1 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/container/TooltipAdder.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.utils.container; + +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface TooltipAdder extends ContainerMatcher { + /** + * @implNote The first element of the lines list holds the item's display name, + * as it's a list of all lines that will be displayed in the tooltip. + */ + void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List lines); + + int getPriority(); +} -- cgit From 3de616fcaca8e39a4d1caef6fdd4f984adb7e000 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:12:11 +0300 Subject: Change slot text to have multiple states The enum SlotTextState is very self-descriptive if you wonder what the states are --- .../java/de/hysky/skyblocker/utils/container/SlotTextAdder.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java index c0e4bc1c..2ee41820 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.utils.container; +import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.slottext.SlotText; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextState; import net.minecraft.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -18,4 +20,9 @@ public interface SlotTextAdder extends ContainerMatcher { */ @NotNull List getText(@NotNull ItemStack itemStack, int slotId); + + @Override + default boolean isEnabled() { + return SkyblockerConfigManager.get().general.itemInfoDisplay.slotText != SlotTextState.DISABLED; + } } -- cgit From 1a550c6a77581a247571da6ce0c5f232525e79e8 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:03:05 +0300 Subject: Un-debug some stuff in Utils for convenience --- src/main/java/de/hysky/skyblocker/utils/Utils.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java index 042095d1..4de32710 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Utils.java +++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.utils; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.util.UndashedUuid; +import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.mixins.accessors.MessageHandlerAccessor; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; @@ -17,7 +18,6 @@ import net.azureaaron.hmapi.network.packet.s2c.HelloS2CPacket; import net.azureaaron.hmapi.network.packet.s2c.HypixelS2CPacket; import net.azureaaron.hmapi.network.packet.v1.s2c.LocationUpdateS2CPacket; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; @@ -239,9 +239,8 @@ public class Utils { public static void updatePlayerPresenceFromScoreboard(MinecraftClient client) { List sidebar = STRING_SCOREBOARD; - FabricLoader fabricLoader = FabricLoader.getInstance(); if (client.world == null || client.isInSingleplayer() || sidebar.isEmpty()) { - if (fabricLoader.isDevelopmentEnvironment()) { + if (Debug.debugEnabled()) { sidebar = Collections.emptyList(); } else { isOnSkyblock = false; @@ -249,13 +248,13 @@ public class Utils { } } - if (sidebar.isEmpty() && !fabricLoader.isDevelopmentEnvironment()) return; + if (sidebar.isEmpty() && !Debug.debugEnabled()) return; - if (fabricLoader.isDevelopmentEnvironment() || isConnectedToHypixel(client)) { + if (Debug.debugEnabled() || isConnectedToHypixel(client)) { if (!isOnHypixel) { isOnHypixel = true; } - if (fabricLoader.isDevelopmentEnvironment() || sidebar.getFirst().contains("SKYBLOCK") || sidebar.getFirst().contains("SKIBLOCK")) { + if (Debug.debugEnabled() || sidebar.getFirst().contains("SKYBLOCK") || sidebar.getFirst().contains("SKIBLOCK")) { if (!isOnSkyblock) { if (!isInjected) { isInjected = true; -- cgit From 147ff2ea47d282e6faf81a85f1053b49f6ee73ff Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:28:17 +0300 Subject: Rebase onto master --- .../de/hysky/skyblocker/utils/container/ContainerSolverManager.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/main/java/de/hysky/skyblocker/utils') 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 1e2bce16..6194852b 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java @@ -11,6 +11,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.dwarven.CommissionHighlight; import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver; import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver; import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver; @@ -49,6 +50,7 @@ public class ContainerSolverManager { new CroesusHelper(), new CroesusProfit(), new ChronomatronSolver(), + new CommissionHighlight(), new SuperpairsSolver(), UltrasequencerSolver.INSTANCE, new NewYearCakeBagHelper(), -- cgit From e316a165d8f7f812afa6d3c9f2f0f576fd1e6f93 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:37:05 +0300 Subject: Change tooltip manager to allow adding tooltips on non-handled screens --- .../java/de/hysky/skyblocker/utils/container/ContainerMatcher.java | 4 ++-- .../de/hysky/skyblocker/utils/container/RegexContainerMatcher.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java index 52418f22..61d3821e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.utils.container; -import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.Screen; import org.jetbrains.annotations.NotNull; public interface ContainerMatcher { @@ -8,7 +8,7 @@ public interface ContainerMatcher { * Tests if the given screen should be handled by this matcher. * @return {@code true} if this matcher should apply to the given screen, {@code false} otherwise */ - boolean test(@NotNull HandledScreen screen); + boolean test(@NotNull Screen screen); /** * @return {@code true} if this matcher is enabled, {@code false} otherwise diff --git a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java index 4df0fe1a..4f9d49ae 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.utils.container; import de.hysky.skyblocker.skyblock.ChestValue; -import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.Screen; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,7 +26,7 @@ public abstract class RegexContainerMatcher implements ContainerMatcher { public String[] groups = null; @Override - public boolean test(@NotNull HandledScreen screen) { + public boolean test(@NotNull Screen screen) { return test(screen.getTitle().getString()); } -- cgit From a846b52122422887e464d83ca01f0b771f3882f5 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:55:03 +0800 Subject: Clean up rebased code --- .../de/hysky/skyblocker/utils/container/ContainerSolverManager.java | 4 +++- src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/utils') 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 6194852b..b67b9edf 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolverManager.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakeBagHelper; import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakesHelper; +import de.hysky.skyblocker.skyblock.bazaar.ReorderHelper; import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; import de.hysky.skyblocker.skyblock.dungeon.CroesusHelper; import de.hysky.skyblocker.skyblock.dungeon.CroesusProfit; @@ -55,7 +56,8 @@ public class ContainerSolverManager { UltrasequencerSolver.INSTANCE, new NewYearCakeBagHelper(), NewYearCakesHelper.INSTANCE, - new ChocolateFactorySolver() + new ChocolateFactorySolver(), + new ReorderHelper() }; } diff --git a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java index 2ee41820..4caf8cea 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java @@ -4,7 +4,9 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.slottext.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextState; import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -19,7 +21,7 @@ public interface SlotTextAdder extends ContainerMatcher { * So, limit your text to 3 characters (or roughly less than 20 width) if you want it to not look horrible. */ @NotNull - List getText(@NotNull ItemStack itemStack, int slotId); + List getText(@Nullable Slot slot, @NotNull ItemStack stack, int slotId); @Override default boolean isEnabled() { -- cgit From 14d4abe61f1344f29a9eebb73d6a3d7004dfc2d5 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:46:14 +0800 Subject: Code review part 1 --- .../java/de/hysky/skyblocker/utils/container/ContainerMatcher.java | 5 ++++- .../java/de/hysky/skyblocker/utils/container/ContainerSolver.java | 4 +++- .../java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java | 0 .../de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java | 0 4 files changed, 7 insertions(+), 2 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolver.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java index 61d3821e..159f399e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerMatcher.java @@ -3,11 +3,14 @@ package de.hysky.skyblocker.utils.container; import net.minecraft.client.gui.screen.Screen; import org.jetbrains.annotations.NotNull; -public interface ContainerMatcher { +import java.util.function.Predicate; + +public interface ContainerMatcher extends Predicate { /** * Tests if the given screen should be handled by this matcher. * @return {@code true} if this matcher should apply to the given screen, {@code false} otherwise */ + @Override boolean test(@NotNull Screen screen); /** diff --git a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java index f3cb400e..c6162049 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/ContainerSolver.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.utils.container; import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.Resettable; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; @@ -8,11 +9,12 @@ import net.minecraft.item.ItemStack; import java.util.List; -public interface ContainerSolver extends ContainerMatcher { +public interface ContainerSolver extends ContainerMatcher, Resettable { List getColors(Int2ObjectMap slots); default void start(GenericContainerScreen screen) {} + @Override default void reset() {} default boolean onClickSlot(int slot, ItemStack stack, int screenId) { 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 deleted file mode 100644 index e69de29b..00000000 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 deleted file mode 100644 index e69de29b..00000000 -- cgit From eb2ac7c20ca00da5c8998aad291584b76186ec5f Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 24 Jul 2024 00:41:38 +0800 Subject: Rename slot text option to slotTextMode --- src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/utils') diff --git a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java index 4caf8cea..72f92547 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/SlotTextAdder.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.utils.container; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.slottext.SlotText; -import de.hysky.skyblocker.skyblock.item.slottext.SlotTextState; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextMode; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; import org.jetbrains.annotations.NotNull; @@ -25,6 +25,6 @@ pu