diff options
Diffstat (limited to 'src')
8 files changed, 195 insertions, 2 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 89873085..6c6a6d2a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker; +import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; @@ -7,6 +8,7 @@ import net.minecraft.client.MinecraftClient; public class SkyblockerMod { public static final String NAMESPACE = "skyblocker"; private static final SkyblockerMod instance = new SkyblockerMod(); + public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); private SkyblockerMod() { } 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..836d38a6 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java @@ -0,0 +1,78 @@ +package me.xmrvizzy.skyblocker.container; + +import com.mojang.blaze3d.systems.RenderSystem; +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[]{ + }; + } + + 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 e5f1b829..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; @@ -26,4 +29,13 @@ public class MinecraftClientMixin { 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/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 74a7a3cb..acf0ef45 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -9,8 +9,9 @@ "InGameHudMixin", "ItemRendererMixin", "MinecraftClientMixin", - "AccessorWorldRenderer" - + "AccessorWorldRenderer", + "GenericContainerScreenMixin", + "GenericContainerScreenHandlerMixin" ], "injectors": { "defaultRequire": 1 |