diff options
author | LifeIsAParadox <LifeIsAParadox@users.noreply.github.com> | 2021-10-10 22:50:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-10 22:50:24 +0200 |
commit | 37d1379d65821e632e5e3e2bef4e3946adf4c5df (patch) | |
tree | 32aaa7eea851c94771c01ecc0ec5a456228680b3 /src/main/java | |
parent | 5fb19e61283bc5a471ab31e96acdd0e5f1b39d1c (diff) | |
parent | d262e35832bec5ae33c19240204dd8490e4eef1e (diff) | |
download | Skyblocker-37d1379d65821e632e5e3e2bef4e3946adf4c5df.tar.gz Skyblocker-37d1379d65821e632e5e3e2bef4e3946adf4c5df.tar.bz2 Skyblocker-37d1379d65821e632e5e3e2bef4e3946adf4c5df.zip |
Merge pull request #19 from ExternalTime/terminal-solvers
Added terminal solvers
Diffstat (limited to 'src/main/java')
12 files changed, 408 insertions, 38 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java new file mode 100644 index 00000000..b3a50697 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; +import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; +import net.fabricmc.api.ClientModInitializer; + +public class SkyblockerInitializer implements ClientModInitializer { + @Override + public void onInitializeClient() { + HotbarSlotLock.init(); + SkyblockerConfig.init(); + PriceInfoTooltip.init(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 8baba403..6c6a6d2a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,44 +1,42 @@ package me.xmrvizzy.skyblocker; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; +import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; -import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; -import me.xmrvizzy.skyblocker.utils.RenderUtils; import me.xmrvizzy.skyblocker.utils.Utils; -import net.fabricmc.api.ClientModInitializer; import net.minecraft.client.MinecraftClient; -public class SkyblockerMod implements ClientModInitializer { - public static final String NAMESPACE = "skyblocker"; - private static int TICKS = 0; - - @Override - public void onInitializeClient() { - HotbarSlotLock.init(); - SkyblockerConfig.init(); - PriceInfoTooltip.init(); - } - - - public static void onTick() { - MinecraftClient client = MinecraftClient.getInstance(); - if (client == null) return; - - TICKS++; - if (TICKS % 4 == 0) - try { - if(Utils.isDungeons){ - DungeonBlaze.DungeonBlaze(); - } - }catch(Exception e) { - //System.out.println("Blazesolver: " + e); - } - if (TICKS % 20 == 0) { - if (client.world != null && !client.isInSingleplayer()) - Utils.sbChecker(); - - TICKS = 0; - } - } +public class SkyblockerMod { + public static final String NAMESPACE = "skyblocker"; + private static final SkyblockerMod instance = new SkyblockerMod(); + public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); + + private SkyblockerMod() { + } + + public static SkyblockerMod getInstance() { + return instance; + } + + private int ticks = 0; + + public void onTick() { + MinecraftClient client = MinecraftClient.getInstance(); + if (client == null) return; + + ticks++; + if (ticks % 4 == 0) + try { + if (Utils.isDungeons) { + DungeonBlaze.DungeonBlaze(); + } + } catch (Exception e) { + //System.out.println("Blazesolver: " + e); + } + if (ticks % 20 == 0) { + if (client.world != null && !client.isInSingleplayer()) + Utils.sbChecker(); + + ticks = 0; + } + } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 5a085818..dd5190e5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -54,6 +54,14 @@ public class SkyblockerConfig implements ConfigData { public boolean solveThreeWeirdos = true; public boolean blazesolver = true; public boolean solveTrivia = true; + @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + public Terminals terminals = new Terminals(); + } + + public static class Terminals { + public boolean solveColor = true; + public boolean solveOrder = true; + public boolean solveStartsWith = true; } public static class DwarvenMines { diff --git a/src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java b/src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java new file mode 100644 index 00000000..c4380eab --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java @@ -0,0 +1,4 @@ +package me.xmrvizzy.skyblocker.container; + +public record ColorHighlight(int slot, int color) { +}
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java new file mode 100644 index 00000000..5c3e1e5e --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java @@ -0,0 +1,35 @@ +package me.xmrvizzy.skyblocker.container; + +import net.minecraft.item.ItemStack; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public abstract class ContainerSolver { + private final Pattern CONTAINER_NAME; + protected final static int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; + + public ContainerSolver(String containerName) { + CONTAINER_NAME = Pattern.compile(containerName); + } + + public abstract boolean isEnabled(); + + public Pattern getName() { + return CONTAINER_NAME; + } + + public abstract List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots); + + public void trimEdges(Map<Integer, ItemStack> 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/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java new file mode 100644 index 00000000..7dd34669 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java @@ -0,0 +1,84 @@ +package me.xmrvizzy.skyblocker.container; + +import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; +import net.minecraft.client.gui.DrawableHelper; +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.Map; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ContainerSolverManager extends DrawableHelper { + private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); + private final ContainerSolver[] solvers; + private ContainerSolver currentSolver = null; + private String[] groups; + private List<ColorHighlight> highlights; + + public ContainerSolverManager() { + solvers = new ContainerSolver[]{ + new ColorTerminal(), + new OrderTerminal(), + new StartsWithTerminal(), + }; + } + + 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()) { + currentSolver = solver; + groups = new String[matcher.groupCount()]; + for (int i = 0; i < groups.length; i++) + groups[i] = matcher.group(i + 1); + return; + } + } + } + currentSolver = null; + } + + public void clearScreen() { + currentSolver = null; + } + + public void markDirty() { + highlights = null; + } + + public void onDraw(MatrixStack matrices, List<Slot> slots) { + if (currentSolver == null) + return; + if (highlights == null) + highlights = currentSolver.getColors(groups, slotMap(slots)); + RenderSystem.disableDepthTest(); + RenderSystem.colorMask(true, true, true, false); + for (ColorHighlight highlight : highlights) { + Slot slot = slots.get(highlight.slot()); + int color = highlight.color(); + fillGradient(matrices, slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); + } + RenderSystem.colorMask(true, true, true, true); + RenderSystem.enableDepthTest(); + } + + private Map<Integer, ItemStack> slotMap(List<Slot> slots) { + Map<Integer, ItemStack> slotMap = new TreeMap<>(); + for (int i = 0; i < slots.size(); i++) + slotMap.put(i, slots.get(i).getStack()); + return slotMap; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenHandlerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenHandlerMixin.java new file mode 100644 index 00000000..be8d454d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenHandlerMixin.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.List; + +@Mixin(GenericContainerScreenHandler.class) +public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler { + protected GenericContainerScreenHandlerMixin(@Nullable ScreenHandlerType<?> type, int syncId) { + super(type, syncId); + } + + @Override + public void setStackInSlot(int slot, int revision, ItemStack stack) { + SkyblockerMod.getInstance().containerSolverManager.markDirty(); + super.setStackInSlot(slot, revision, stack); + } + + @Override + public void updateSlotStacks(int revision, List<ItemStack> stacks, ItemStack cursorStack) { + SkyblockerMod.getInstance().containerSolverManager.markDirty(); + super.updateSlotStacks(revision, stacks, cursorStack); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java new file mode 100644 index 00000000..3e6bf16a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java @@ -0,0 +1,31 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(GenericContainerScreen.class) +public abstract class GenericContainerScreenMixin extends HandledScreen<GenericContainerScreenHandler> { + @Shadow + @Final + private int rows; + + public GenericContainerScreenMixin(GenericContainerScreenHandler handler, PlayerInventory inventory, Text title) { + super(handler, inventory, title); + } + + @Override + protected void drawForeground(MatrixStack matrices, int mouseX, int mouseY) { + super.drawForeground(matrices, mouseX, mouseY); + if (Utils.isSkyblock) + SkyblockerMod.getInstance().containerSolverManager.onDraw(matrices, this.handler.slots.subList(0, rows * 9)); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java index 5ef5b0b4..21730e69 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -1,9 +1,12 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.network.ClientPlayerEntity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -19,11 +22,20 @@ public class MinecraftClientMixin { @Inject(method = "tick", at = @At("HEAD")) public void tick(CallbackInfo ci) { - SkyblockerMod.onTick(); + SkyblockerMod.getInstance().onTick(); } @Inject(method = "handleInputEvents", at = @At("HEAD")) public void handleInputEvents(CallbackInfo ci) { if (Utils.isSkyblock) HotbarSlotLock.handleInputEvents(player); } + + @Inject(method = "setScreen", at = @At("HEAD")) + public void onSetScreen(Screen screen, CallbackInfo ci) { + ContainerSolverManager manager = SkyblockerMod.getInstance().containerSolverManager; + if(Utils.isSkyblock && screen instanceof GenericContainerScreen) + manager.onSetScreen((GenericContainerScreen) screen); + else + manager.clearScreen(); + } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java new file mode 100644 index 00000000..6b51754d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java @@ -0,0 +1,61 @@ +package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.container.ColorHighlight; +import me.xmrvizzy.skyblocker.container.ContainerSolver; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +import java.util.*; + + +public class ColorTerminal extends ContainerSolver { + private static final Map<String, DyeColor> colorFromName; + private DyeColor targetColor; + private static final Map<Item, DyeColor> itemColor; + + public ColorTerminal() { + super("^Select all the ([A-Z ]+) items!$"); + } + + @Override + public boolean isEnabled() { + targetColor = null; + return SkyblockerConfig.get().locations.dungeons.terminals.solveColor; + } + + @Override + public List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) { + trimEdges(slots, 6); + List<ColorHighlight> highlights = new ArrayList<>(); + if(targetColor == null) + targetColor = colorFromName.get(groups[0]); + for(Map.Entry<Integer, ItemStack> slot : slots.entrySet()) { + ItemStack itemStack = slot.getValue(); + if(!itemStack.hasEnchantments() && targetColor.equals(itemColor.get(itemStack.getItem()))) + highlights.add(new ColorHighlight(slot.getKey(), GREEN_HIGHLIGHT)); + } + return highlights; + } + + + static { + colorFromName = new HashMap<>(); + for (DyeColor color : DyeColor.values()) + colorFromName.put(color.getName().toUpperCase(Locale.ROOT), color); + colorFromName.put("SILVER", DyeColor.LIGHT_GRAY); + + itemColor = new HashMap<>(); + for (DyeColor color : DyeColor.values()) + for (String item : new String[]{"dye", "wool", "stained_glass", "terracotta"}) + itemColor.put(Registry.ITEM.get(new Identifier(color.getName() + '_' + item)), color); + itemColor.put(Items.BONE_MEAL, DyeColor.WHITE); + itemColor.put(Items.LAPIS_LAZULI, DyeColor.BLUE); + itemColor.put(Items.COCOA_BEANS, DyeColor.BROWN); + itemColor.put(Items.INK_SAC, DyeColor.BLACK); + } +}
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java new file mode 100644 index 00000000..c61395f4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java @@ -0,0 +1,58 @@ +package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.container.ColorHighlight; +import me.xmrvizzy.skyblocker.container.ContainerSolver; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class OrderTerminal extends ContainerSolver { + private final int PANES_NUM = 14; + private int[] orderedSlots; + private int currentNum = Integer.MAX_VALUE; + + public OrderTerminal() { + super("^Click in order!$"); + } + + @Override + public boolean isEnabled() { + orderedSlots = null; + currentNum = 0; + return SkyblockerConfig.get().locations.dungeons.terminals.solveOrder; + } + + @Override + public List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) { + if(orderedSlots == null && !orderSlots(slots)) + return Collections.emptyList(); + while(currentNum < PANES_NUM && Items.LIME_STAINED_GLASS_PANE.equals(slots.get(orderedSlots[currentNum]).getItem())) + currentNum++; + List<ColorHighlight> highlights = new ArrayList<>(3); + int last = Integer.min(3, PANES_NUM - currentNum); + for(int i = 0; i < last; i++) { + highlights.add(new ColorHighlight(orderedSlots[currentNum + i], (224 - 64 * i) << 24 | 64 << 16 | 96 << 8 | 255)); + } + return highlights; + } + + public boolean orderSlots(Map<Integer, ItemStack> slots) { + trimEdges(slots, 4); + orderedSlots = new int[PANES_NUM]; + for(Map.Entry<Integer, ItemStack> slot : slots.entrySet()) { + if(Items.AIR.equals(slot.getValue().getItem())) { + orderedSlots = null; + return false; + } + else + orderedSlots[slot.getValue().getCount() - 1] = slot.getKey(); + } + currentNum = 0; + return true; + } +}
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java new file mode 100644 index 00000000..7c56746f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java @@ -0,0 +1,34 @@ +package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.container.ColorHighlight; +import me.xmrvizzy.skyblocker.container.ContainerSolver; +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class StartsWithTerminal extends ContainerSolver { + public StartsWithTerminal() { + super("^What starts with: '([A-Z])'\\?$"); + } + + @Override + public boolean isEnabled() { + return SkyblockerConfig.get().locations.dungeons.terminals.solveStartsWith; + } + + @Override + public List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) { + trimEdges(slots, 6); + String prefix = groups[0]; + List<ColorHighlight> highlights = new ArrayList<>(); + for(Map.Entry<Integer, ItemStack> slot : slots.entrySet()) { + ItemStack stack = slot.getValue(); + if(!stack.hasEnchantments() && stack.getName().getString().startsWith(prefix)) + highlights.add(new ColorHighlight(slot.getKey(), GREEN_HIGHLIGHT)); + } + return highlights; + } +}
\ No newline at end of file |