From a0588bc0fce38990f06e66b5be9c89417217408f Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Mon, 5 Feb 2024 22:09:46 -0500
Subject: 24w05a/b
---
.../skyblocker/utils/render/MatrixHelper.java | 30 ++++++++++++++++++++++
.../skyblocker/utils/render/RenderHelper.java | 25 ++++++++----------
2 files changed, 40 insertions(+), 15 deletions(-)
create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/MatrixHelper.java
(limited to 'src/main/java/de/hysky/skyblocker/utils/render')
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/MatrixHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/MatrixHelper.java
new file mode 100644
index 00000000..220dbf86
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/render/MatrixHelper.java
@@ -0,0 +1,30 @@
+package de.hysky.skyblocker.utils.render;
+
+import org.joml.Matrix4f;
+
+import net.minecraft.client.util.math.MatrixStack;
+
+/**
+ * Matrix helper methods
+ */
+public interface MatrixHelper {
+
+ /**
+ * Copies the {@code matrix} into a new {@link Matrix4f}. This is necessary otherwise
+ * any transformations applied will affect other uses of the same matrix.
+ */
+ static Matrix4f copyOf(Matrix4f matrix) {
+ return new Matrix4f(matrix);
+ }
+
+ /**
+ * Creates a blank {@link MatrixStack} and sets it's position matrix to the supplied
+ * {@code positionMatrix}.
+ */
+ static MatrixStack toStack(Matrix4f positionMatrix) {
+ MatrixStack matrices = new MatrixStack();
+ matrices.peek().getPositionMatrix().set(positionMatrix);
+
+ return matrices;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
index da179d0e..4d97e733 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
@@ -26,6 +26,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
+
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Vector3f;
@@ -243,15 +244,13 @@ public class RenderHelper {
}
public static void renderQuad(WorldRenderContext context, Vec3d[] points, float[] colorComponents, float alpha, boolean throughWalls) {
+ Matrix4f positionMatrix = new Matrix4f();
Vec3d camera = context.camera().getPos();
- MatrixStack matrices = context.matrixStack();
- matrices.push();
- matrices.translate(-camera.x, -camera.y, -camera.z);
+ positionMatrix.translate((float) -camera.x, (float) -camera.y, (float) -camera.z);
Tessellator tessellator = RenderSystem.renderThreadTesselator();
BufferBuilder buffer = tessellator.getBuffer();
- Matrix4f positionMatrix = matrices.peek().getPositionMatrix();
RenderSystem.setShader(GameRenderer::getPositionColorProgram);
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
@@ -268,8 +267,6 @@ public class RenderHelper {
RenderSystem.enableCull();
RenderSystem.depthFunc(GL11.GL_LEQUAL);
-
- matrices.pop();
}
public static void renderText(WorldRenderContext context, Text text, Vec3d pos, boolean throughWalls) {
@@ -290,19 +287,18 @@ public class RenderHelper {
* @param throughWalls whether the text should be able to be seen through walls or not.
*/
public static void renderText(WorldRenderContext context, OrderedText text, Vec3d pos, float scale, float yOffset, boolean throughWalls) {
- MatrixStack matrices = context.matrixStack();
- Vec3d camera = context.camera().getPos();
+ Matrix4f positionMatrix = new Matrix4f();
+ Camera camera = context.camera();
+ Vec3d cameraPos = camera.getPos();
TextRenderer textRenderer = client.textRenderer;
scale *= 0.025f;
- matrices.push();
- matrices.translate(pos.getX() - camera.getX(), pos.getY() - camera.getY(), pos.getZ() - camera.getZ());
- matrices.peek().getPositionMatrix().mul(RenderSystem.getModelViewMatrix());
- matrices.multiply(context.camera().getRotation());
- matrices.scale(-scale, -scale, scale);
+ positionMatrix
+ .translate((float) (pos.getX() - cameraPos.getX()), (float) (pos.getY() - cameraPos.getY()), (float) (pos.getZ() - cameraPos.getZ()))
+ .rotate(camera.getRotation())
+ .scale(-scale, -scale, scale);
- Matrix4f positionMatrix = matrices.peek().getPositionMatrix();
float xOffset = -textRenderer.getWidth(text) / 2f;
Tessellator tessellator = RenderSystem.renderThreadTesselator();
@@ -315,7 +311,6 @@ public class RenderHelper {
consumers.draw();
RenderSystem.depthFunc(GL11.GL_LEQUAL);
- matrices.pop();
}
/**
--
cgit
From cc00542e78fd87e0b554ab2a74d1cb193feabbb2 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Sun, 18 Feb 2024 02:40:37 -0500
Subject: Migrate to HudRenderEvents
The Dwarven HUD & End HUD will be moved later due to the tab hud doing
stuff with the z value.
---
src/main/java/de/hysky/skyblocker/SkyblockerMod.java | 1 +
.../java/de/hysky/skyblocker/mixin/InGameHudMixin.java | 9 ---------
.../de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java | 13 ++++++++++++-
.../skyblocker/skyblock/dungeon/DungeonScoreHUD.java | 16 ++++++++++++----
.../skyblock/dungeon/FireFreezeStaffTimer.java | 4 ++--
.../hysky/skyblocker/skyblock/dwarven/CrystalsHud.java | 6 +++---
.../skyblocker/utils/render/title/TitleContainer.java | 6 +++---
7 files changed, 33 insertions(+), 22 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/utils/render')
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index e0815eee..3336cefb 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -136,6 +136,7 @@ public class SkyblockerMod implements ClientModInitializer {
LividColor.init();
FishingHelper.init();
DungeonMap.init();
+ DungeonScoreHUD.init();
DungeonManager.init();
DungeonBlaze.init();
Waterboard.init();
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
index 3dff4d6f..b71ee8c4 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
@@ -8,10 +8,6 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.mixin.accessor.LayeredDrawerAccessor;
-import de.hysky.skyblocker.skyblock.dungeon.DungeonMap;
-import de.hysky.skyblocker.skyblock.dungeon.DungeonScore;
-import de.hysky.skyblocker.skyblock.dungeon.DungeonScoreHUD;
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
import de.hysky.skyblocker.skyblock.item.ItemProtection;
@@ -94,11 +90,6 @@ public abstract class InGameHudMixin {
return;
if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight()))
ci.cancel();
-
- if (Utils.isInDungeons() && DungeonScore.isDungeonStarted()) {
- if (SkyblockerConfigManager.get().locations.dungeons.enableMap && !DungeonManager.isInBoss()) DungeonMap.render(context.getMatrices());
- if (SkyblockerConfigManager.get().locations.dungeons.dungeonScore.enableScoreHUD) DungeonScoreHUD.render(context);
- }
}
@Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true)
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
index f2986ec0..878b7a35 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
@@ -1,11 +1,15 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
+import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.render.MapRenderer;
import net.minecraft.client.render.VertexConsumerProvider;
@@ -20,6 +24,7 @@ public class DungeonMap {
private static Integer cachedMapId = null;
public static void init() {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> render(context));
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
.then(ClientCommandManager.literal("dungeon")
@@ -30,7 +35,7 @@ public class DungeonMap {
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> reset());
}
- public static void render(MatrixStack matrices) {
+ private static void render(MatrixStack matrices) {
MinecraftClient client = MinecraftClient.getInstance();
if (client.player == null || client.world == null) return;
@@ -62,6 +67,12 @@ public class DungeonMap {
} else return cachedMapId != null ? cachedMapId : DEFAULT_MAP_ID;
}
+ private static void render(DrawContext context) {
+ if (Utils.isInDungeons() && DungeonScore.isDungeonStarted() && !DungeonManager.isInBoss() && SkyblockerConfigManager.get().locations.dungeons.enableMap) {
+ render(context.getMatrices());
+ }
+ }
+
private static void reset() {
cachedMapId = null;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
index 1dfb1b95..8d402172 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
@@ -1,6 +1,8 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
+import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
@@ -11,13 +13,19 @@ public class DungeonScoreHUD {
private DungeonScoreHUD() {
}
+ public static void init() {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> render(context));
+ }
+
//This is 4+5 wide, needed to offset the extra width from bold numbers (3×1 wide) in S+ and the "+" (6 wide) so that it doesn't go off the screen if the score is S+ and the hud element is at the right edge of the screen
private static final Text extraSpace = Text.literal(" ").append(Text.literal(" ").formatted(Formatting.BOLD));
- public static void render(DrawContext context) {
- int x = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreX;
- int y = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreY;
- render(context, x, y);
+ private static void render(DrawContext context) {
+ if (Utils.isInDungeons() && DungeonScore.isDungeonStarted() && SkyblockerConfigManager.get().locations.dungeons.dungeonScore.enableScoreHUD) {
+ int x = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreX;
+ int y = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreY;
+ render(context, x, y);
+ }
}
public static void render(DrawContext context, int x, int y) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
index e5d4f078..7c0aab4c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
@@ -1,9 +1,9 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
@@ -14,7 +14,7 @@ public class FireFreezeStaffTimer {
private static long fireFreezeTimer;
public static void init() {
- HudRenderCallback.EVENT.register(FireFreezeStaffTimer::onDraw);
+ HudRenderEvents.BEFORE_CHAT.register(FireFreezeStaffTimer::onDraw);
ClientReceiveMessageEvents.GAME.register(FireFreezeStaffTimer::onChatMessage);
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> FireFreezeStaffTimer.reset());
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
index 79e81ad0..8d5a6313 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
@@ -2,11 +2,11 @@ package de.hysky.skyblocker.skyblock.dwarven;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
@@ -34,7 +34,7 @@ public class CrystalsHud {
.then(ClientCommandManager.literal("crystals")
.executes(Scheduler.queueOpenScreenCommand(CrystalsHudConfigScreen::new))))));
- HudRenderCallback.EVENT.register((context, tickDelta) -> {
+ HudRenderEvents.BEFORE_CHAT.register((context, tickDelta) -> {
if (!SkyblockerConfigManager.get().locations.dwarvenMines.crystalsHud.enabled
|| CLIENT.player == null
|| !visible) {
@@ -65,7 +65,7 @@ public class CrystalsHud {
//and set position and scale
MatrixStack matrices = context.getMatrices();
matrices.push();
- matrices.translate(hudX, hudY, 200f);
+ matrices.translate(hudX, hudY, 0f);
matrices.scale(scale, scale, 0f);
//draw map texture
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/title/TitleContainer.java b/src/main/java/de/hysky/skyblocker/utils/render/title/TitleContainer.java
index 487e3d8b..a115bb2b 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/title/TitleContainer.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/title/TitleContainer.java
@@ -2,10 +2,10 @@ package de.hysky.skyblocker.utils.render.title;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
@@ -26,7 +26,7 @@ public class TitleContainer {
private static final Set
titles = new LinkedHashSet<>();
public static void init() {
- HudRenderCallback.EVENT.register(TitleContainer::render);
+ HudRenderEvents.BEFORE_CHAT.register(TitleContainer::render);
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
.then(ClientCommandManager.literal("titleContainer")
@@ -148,7 +148,7 @@ public class TitleContainer {
//Translate the matrix to the texts position and scale
context.getMatrices().push();
- context.getMatrices().translate(title.x, title.y, 200);
+ context.getMatrices().translate(title.x, title.y, 0);
context.getMatrices().scale(scale, scale, scale);
//Draw text
--
cgit
From 12070a41687893c564e4d2c1ad9b6ed379f92cae Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Thu, 25 Apr 2024 21:28:22 -0400
Subject: Fix "What starts with" terminal solver
---
.../hysky/skyblocker/mixin/HandledScreenMixin.java | 6 +
.../newyearcakes/NewYearCakeBagHelper.java | 4 +-
.../newyearcakes/NewYearCakesHelper.java | 7 +-
.../skyblocker/skyblock/dungeon/CroesusHelper.java | 10 +-
.../skyblocker/skyblock/dungeon/CroesusProfit.java | 11 +-
.../skyblock/dungeon/terminal/ColorTerminal.java | 7 +-
.../skyblock/dungeon/terminal/OrderTerminal.java | 10 +-
.../dungeon/terminal/StartsWithTerminal.java | 130 +++++++++++++++++----
.../skyblock/experiment/ChronomatronSolver.java | 8 +-
.../skyblock/experiment/SuperpairsSolver.java | 7 +-
.../skyblock/experiment/UltrasequencerSolver.java | 4 +-
.../utils/render/gui/ContainerSolver.java | 9 +-
.../utils/render/gui/ContainerSolverManager.java | 14 ++-
13 files changed, 165 insertions(+), 62 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/utils/render')
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
index 681b0cbd..9097ed0f 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
@@ -165,6 +165,8 @@ public abstract class HandledScreenMixin extends Screen
/**
* The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks)
* For example, using the drop key bind while hovering over an item will invoke this method to drop the players item
+ *
+ * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)}
*/
@Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true)
private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) {
@@ -213,6 +215,10 @@ public abstract class HandledScreenMixin extends Screen
}
}
+ if (currentSolver != null) {
+ SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack, this.handler.getCursorStack());
+ }
+
// Experiment Solvers
if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
switch (experimentSolver) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java
index e0d67fbe..9b2080a3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java
@@ -3,12 +3,12 @@ package de.hysky.skyblocker.skyblock.accessories.newyearcakes;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.MinecraftClient;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
import java.util.List;
-import java.util.Map;
public class NewYearCakeBagHelper extends ContainerSolver {
public NewYearCakeBagHelper() {
@@ -21,7 +21,7 @@ public class NewYearCakeBagHelper extends ContainerSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
MinecraftClient client = MinecraftClient.getInstance();
if (client.player != null) {
for (Slot slot : client.player.currentScreenHandler.slots) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java
index b722849b..2fdcf3b4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java
@@ -4,6 +4,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -64,14 +65,14 @@ public class NewYearCakesHelper extends ContainerSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
String profile = Utils.getProfile();
if (cakes.isEmpty() || !cakes.containsKey(profile) || cakes.containsKey(profile) && cakes.get(profile).isEmpty()) return List.of();
List highlights = new ArrayList<>();
- for (Map.Entry entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry entry : slots.int2ObjectEntrySet()) {
int year = getCakeYear(entry.getValue());
if (year >= 0 && cakes.containsKey(profile)) {
- highlights.add(cakes.get(profile).contains(year) ? ColorHighlight.red(entry.getKey()) : ColorHighlight.green(entry.getKey()));
+ highlights.add(cakes.get(profile).contains(year) ? ColorHighlight.red(entry.getIntKey()) : ColorHighlight.green(entry.getIntKey()));
}
}
return highlights;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java
index 5bd44707..0bc34c57 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java
@@ -4,12 +4,12 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class CroesusHelper extends ContainerSolver {
@@ -23,15 +23,15 @@ public class CroesusHelper extends ContainerSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
List highlights = new ArrayList<>();
- for (Map.Entry entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry entry : slots.int2ObjectEntrySet()) {
ItemStack stack = entry.getValue();
if (stack != null && stack.contains(DataComponentTypes.LORE)) {
if (ItemUtils.getLoreLineIf(stack, s -> s.contains("Opened Chest:")) != null) {
- highlights.add(ColorHighlight.gray(entry.getKey()));
+ highlights.add(ColorHighlight.gray(entry.getIntKey()));
} else if (ItemUtils.getLoreLineIf(stack, s -> s.contains("No more Chests to open!")) != null) {
- highlights.add(ColorHighlight.red(entry.getKey()));
+ highlights.add(ColorHighlight.red(entry.getIntKey()));
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java
index e82e6eec..263bc383 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java
@@ -6,6 +6,7 @@ import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
@@ -32,13 +33,13 @@ public class CroesusProfit extends ContainerSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
List highlights = new ArrayList<>();
ItemStack bestChest = null, secondBestChest = null;
long bestValue = 0, secondBestValue = 0; // If negative value of chest - it is out of the question
long dungeonKeyPriceData = getItemPrice("DUNGEON_CHEST_KEY") * 2; // lesser ones don't worth the hassle
- for (Map.Entry entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry entry : slots.int2ObjectEntrySet()) {
ItemStack stack = entry.getValue();
if (stack != null && stack.contains(DataComponentTypes.LORE) && ItemUtils.getLoreLineIf(stack, s -> s.contains("Chest")) != null) {
long value = valueChest(stack);
@@ -54,13 +55,13 @@ public class CroesusProfit extends ContainerSolver {
}
}
- for (Map.Entry entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry entry : slots.int2ObjectEntrySet()) {
ItemStack stack = entry.getValue();
if (stack != null && stack.contains(DataComponentTypes.LORE)) {
if (stack.equals(bestChest)) {
- highlights.add(ColorHighlight.green(entry.getKey()));
+ highlights.add(ColorHighlight.green(entry.getIntKey()));
} else if (stack.equals(secondBestChest) && secondBestValue > dungeonKeyPriceData) {
- highlights.add(ColorHighlight.yellow(entry.getKey()));
+ highlights.add(ColorHighlight.yellow(entry.getIntKey()));
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
index f02bfca6..933fefa9 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
@@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
@@ -32,7 +33,7 @@ public class ColorTerminal extends ContainerSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
trimEdges(slots, 6);
List highlights = new ArrayList<>();
String colorString = groups[0];
@@ -43,10 +44,10 @@ public class ColorTerminal extends ContainerSolver {
return Collections.emptyList();
}
}
- for (Map.Entry slot : slots.entrySet()) {
+ for (Int2ObjectMap.Entry slot : slots.int2ObjectEntrySet()) {
ItemStack itemStack = slot.getValue();
if (!itemStack.hasGlint() && targetColor.equals(itemColor.get(itemStack.getItem()))) {
- highlights.add(ColorHighlight.green(slot.getKey()));
+ highlights.add(ColorHighlight.green(slot.getIntKey()));
}
}
return highlights;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
index b2636373..4789e0f4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
@@ -3,13 +3,13 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
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;
@@ -28,7 +28,7 @@ public class OrderTerminal extends ContainerSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
if(orderedSlots == null && !orderSlots(slots))
return Collections.emptyList();
while(currentNum < PANES_NUM && Items.LIME_STAINED_GLASS_PANE.equals(slots.get(orderedSlots[currentNum]).getItem()))
@@ -41,16 +41,16 @@ public class OrderTerminal extends ContainerSolver {
return highlights;
}
- public boolean orderSlots(Map slots) {
+ public boolean orderSlots(Int2ObjectMap slots) {
trimEdges(slots, 4);
orderedSlots = new int[PANES_NUM];
- for(Map.Entry slot : slots.entrySet()) {
+ for(Int2ObjectMap.Entry slot : slots.int2ObjectEntrySet()) {
if(Items.AIR.equals(slot.getValue().getItem())) {
orderedSlots = null;
return false;
}
else
- orderedSlots[slot.getValue().getCount() - 1] = slot.getKey();
+ orderedSlots[slot.getValue().getCount() - 1] = slot.getIntKey();
}
currentNum = 0;
return true;
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 f5b8edb1..56f06fb5 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
@@ -3,33 +3,117 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectSet;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
+import java.util.function.Predicate;
public class StartsWithTerminal extends ContainerSolver {
- public StartsWithTerminal() {
- super("^What starts with: '([A-Z])'\\?$");
- }
-
- @Override
- protected boolean isEnabled() {
- return SkyblockerConfigManager.get().locations.dungeons.terminals.solveStartsWith;
- }
-
- @Override
- protected List getColors(String[] groups, Map slots) {
- trimEdges(slots, 6);
- String prefix = groups[0];
- List highlights = new ArrayList<>();
- for (Map.Entry slot : slots.entrySet()) {
- ItemStack stack = slot.getValue();
- if (!stack.hasGlint() && stack.getName().getString().startsWith(prefix)) {
- highlights.add(ColorHighlight.green(slot.getKey()));
- }
- }
- return highlights;
- }
+ private final Int2ObjectOpenHashMap trackedItemStates = new Int2ObjectOpenHashMap<>();
+
+ public StartsWithTerminal() {
+ super("^What starts with: '([A-Z])'\\?$");
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ return SkyblockerConfigManager.get().locations.dungeons.terminals.solveStartsWith;
+ }
+
+ @Override
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
+ trimEdges(slots, 6);
+ setupState(slots);
+
+ String prefix = groups[0];
+ List highlights = new ArrayList<>();
+
+ for (Int2ObjectMap.Entry slot : slots.int2ObjectEntrySet()) {
+ ItemStack stack = slot.getValue();
+ ItemState state = trackedItemStates.getOrDefault(slot.getIntKey(), ItemState.DEFAULT);
+
+ //If the item hasn't been marked as clicked and it matches the starts with condition
+ //We keep track of the clicks ourselves instead of using the enchantment glint because some items like nether stars have the glint override component by default
+ //so even if Hypixel tries to change that to the same thing it was before (true) it won't work and the solver would permanently consider the item to be clicked
+ //even if it hasn't been yet
+ if (!state.clicked() && stack.getName().getString().startsWith(prefix)) {
+ highlights.add(ColorHighlight.green(slot.getIntKey()));
+ }
+ }
+ return highlights;
+ }
+
+ @Override
+ protected void onClickSlot(int slot, ItemStack stack, ItemStack cursorStack, String[] groups) {
+ //Some random glass pane was clicked or something
+ if (!trackedItemStates.containsKey(slot) || stack == null || stack.isEmpty()) return;
+
+ ItemState state = trackedItemStates.get(slot);
+ 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()) {
+ trackedItemStates.put(slot, state.click());
+ }
+ //In the future we could add an else branch and return a boolean to cancel the click since it would be wrong
+
+ return;
+ }
+
+ //We only setup the state when all items aren't null or empty. This prevents the state from being reset due to unsent items or server lag spikes/bad TPS (fix ur servers Hypixel)
+ private void setupState(Int2ObjectMap usefulSlots) {
+ Predicate> notNullOrEmpty = e -> e.getValue() != null && !e.getValue().isEmpty();
+
+ if (allEntriesMatch(usefulSlots.int2ObjectEntrySet(), notNullOrEmpty)) {
+ //If the state hasn't been setup then we will do that
+ if (trackedItemStates.isEmpty()) {
+ for (Int2ObjectMap.Entry entry : usefulSlots.int2ObjectEntrySet()) {
+ trackedItemStates.put(entry.getIntKey(), ItemState.of(entry.getValue().getItem()));
+ }
+ } else { //If the state is setup then we verify that it hasn't changed since last time, and if it has then we will clear it and call this method again to set it up
+ //Checks whether the trackedItemStates contains the slot id and if it does it checks whether the tracked state's item is a 1:1 match
+ Predicate> doesItemMatch = e -> trackedItemStates.containsKey(e.getIntKey()) && trackedItemStates.get(e.getIntKey()).itemMatches(e.getValue().getItem());
+
+ if (!allEntriesMatch(usefulSlots.int2ObjectEntrySet(), doesItemMatch)) {
+ clearState();
+ setupState(usefulSlots);
+ }
+ }
+ }
+ }
+
+ private void clearState() {
+ trackedItemStates.clear();
+ }
+
+ private static boolean allEntriesMatch(ObjectSet> entries, Predicate> predicate) {
+ for (Int2ObjectMap.Entry entry : entries) {
+ if (!predicate.test(entry)) return false;
+ }
+
+ return true;
+ }
+
+ private record ItemState(Item item, boolean clicked) {
+ private static final ItemState DEFAULT = new ItemState(null, false);
+
+ boolean itemMatches(Item item) {
+ return this.item.equals(item);
+ }
+
+ ItemState click() {
+ return new ItemState(item, true);
+ }
+
+ static ItemState of(Item item) {
+ return new ItemState(item, false);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java
index 08e61d04..98738112 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java
@@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMap;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.inventory.Inventory;
@@ -14,7 +15,6 @@ import net.minecraft.item.Items;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class ChronomatronSolver extends ExperimentSolver {
public static final ImmutableMap- TERRACOTTA_TO_GLASS = ImmutableMap.ofEntries(
@@ -103,11 +103,11 @@ public class ChronomatronSolver extends ExperimentSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
List highlights = new ArrayList<>();
if (getState() == State.SHOW && chronomatronSlots.size() > chronomatronCurrentOrdinal) {
- for (Map.Entry indexStack : slots.entrySet()) {
- int index = indexStack.getKey();
+ for (Int2ObjectMap.Entry indexStack : slots.int2ObjectEntrySet()) {
+ int index = indexStack.getIntKey();
ItemStack stack = indexStack.getValue();
Item item = chronomatronSlots.get(chronomatronCurrentOrdinal);
if (stack.isOf(item) || TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java
index c34abca1..e7502c89 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.experiment;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.item.ItemStack;
@@ -62,11 +63,11 @@ public class SuperpairsSolver extends ExperimentSolver {
}
@Override
- protected List getColors(String[] groups, Map displaySlots) {
+ protected List getColors(String[] groups, Int2ObjectMap displaySlots) {
List highlights = new ArrayList<>();
if (getState() == State.SHOW) {
- for (Map.Entry indexStack : displaySlots.entrySet()) {
- int index = indexStack.getKey();
+ for (Int2ObjectMap.Entry indexStack : displaySlots.int2ObjectEntrySet()) {
+ int index = indexStack.getIntKey();
ItemStack displayStack = indexStack.getValue();
ItemStack stack = getSlots().get(index);
if (stack != null && !ItemStack.areEqual(stack, displayStack)) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java
index 4e87b237..3f1fc72d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.experiment;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.inventory.Inventory;
@@ -9,7 +10,6 @@ import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class UltrasequencerSolver extends ExperimentSolver {
public static final UltrasequencerSolver INSTANCE = new UltrasequencerSolver();
@@ -76,7 +76,7 @@ public class UltrasequencerSolver extends ExperimentSolver {
}
@Override
- protected List getColors(String[] groups, Map slots) {
+ protected List getColors(String[] groups, Int2ObjectMap slots) {
return getState() == State.SHOW && ultrasequencerNextSlot != 0 ? List.of(ColorHighlight.green(ultrasequencerNextSlot)) : new ArrayList<>();
}
}
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 80a1ba9d..16fa7411 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,11 +1,11 @@
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 java.util.List;
-import java.util.Map;
import java.util.regex.Pattern;
/**
@@ -34,9 +34,12 @@ public abstract class ContainerSolver {
SkyblockerMod.getInstance().containerSolverManager.markDirty();
}
- protected abstract List getColors(String[] groups, Map slots);
+ protected void onClickSlot(int slot, ItemStack stack, ItemStack cursorStack, String[] groups) {
+ }
+
+ protected abstract List getColors(String[] groups, Int2ObjectMap slots);
- protected void trimEdges(Map slots, int rows) {
+ protected void trimEdges(Int2ObjectMap slots, int rows) {
for (int i = 0; i < rows; i++) {
slots.remove(9 * i);
slots.remove(9 * i + 8);
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 e5b2dddb..40e36622 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
@@ -13,6 +13,8 @@ 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;
@@ -22,8 +24,6 @@ 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;
@@ -107,6 +107,12 @@ public class ContainerSolverManager {
highlights = null;
}
+ public void onSlotClick(int slot, ItemStack stack, ItemStack cursorStack) {
+ if (currentSolver != null) {
+ currentSolver.onClickSlot(slot, stack, cursorStack, groups);
+ }
+ }
+
public void onDraw(DrawContext context, List slots) {
if (currentSolver == null)
return;
@@ -122,8 +128,8 @@ public class ContainerSolverManager {
RenderSystem.colorMask(true, true, true, true);
}
- private Map slotMap(List slots) {
- Map slotMap = new TreeMap<>();
+ private Int2ObjectMap slotMap(List slots) {
+ Int2ObjectMap slotMap = new Int2ObjectRBTreeMap<>();
for (int i = 0; i < slots.size(); i++) {
slotMap.put(i, slots.get(i).getStack());
}
--
cgit
From 625b6b92e338f79e7b4f3a90a656d2f3e997f912 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Fri, 26 Apr 2024 16:03:24 -0400
Subject: Rework terminal click marking to fix an edge case
---
.../de/hysky/skyblocker/mixin/HandledScreenMixin.java | 2 +-
.../skyblock/dungeon/terminal/StartsWithTerminal.java | 15 +++++++++++----
.../skyblocker/utils/render/gui/ContainerSolver.java | 2 +-
.../utils/render/gui/ContainerSolverManager.java | 10 ++++++++--
4 files changed, 21 insertions(+), 8 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/utils/render')
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 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 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> entries, Predicate> 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 getColors(String[] groups, Int2ObjectMap 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 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);
}
}
--
cgit
From d24bac4d728d8ea9264e08934fb863771bcca5e2 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Fri, 26 Apr 2024 20:00:18 -0400
Subject: Pluralize the mixin and accessor packages
---
.../skyblocker/config/SkyblockerConfigManager.java | 2 +-
.../mixin/AbstractInventoryScreenMixin.java | 19 --
.../de/hysky/skyblocker/mixin/BatEntityMixin.java | 21 --
.../mixin/ClientPlayNetworkHandlerMixin.java | 106 ---------
.../skyblocker/mixin/ClientPlayerEntityMixin.java | 82 -------
.../mixin/CommandTreeS2CPacketMixin.java | 21 --
.../skyblocker/mixin/ComponentHolderMixin.java | 39 ----
.../hysky/skyblocker/mixin/DataTrackerMixin.java | 51 ----
.../hysky/skyblocker/mixin/DrawContextMixin.java | 71 ------
.../skyblocker/mixin/DyedColorComponentMixin.java | 34 ---
.../mixin/EntityRenderDispatcherMixin.java | 18 --
.../hysky/skyblocker/mixin/FarmlandBlockMixin.java | 37 ---
.../mixin/GenericContainerScreenHandlerMixin.java | 38 ---
.../hysky/skyblocker/mixin/HandledScreenMixin.java | 258 ---------------------
.../mixin/HandledScreenProviderMixin.java | 101 --------
.../de/hysky/skyblocker/mixin/InGameHudMixin.java | 144 ------------
.../mixin/InGameOverlayRendererMixin.java | 22 --
.../skyblocker/mixin/InventoryScreenMixin.java | 18 --
.../de/hysky/skyblocker/mixin/ItemStackMixin.java | 98 --------
.../de/hysky/skyblocker/mixin/LeverBlockMixin.java | 29 ---
.../mixin/LivingEntityRendererMixin.java | 18 --
.../skyblocker/mixin/MinecraftClientMixin.java | 60 -----
.../java/de/hysky/skyblocker/mixin/MouseMixin.java | 19 --
.../skyblocker/mixin/PlayerInventoryMixin.java | 21 --
.../hysky/skyblocker/mixin/PlayerListHudMixin.java | 57 -----
.../skyblocker/mixin/PlayerSkinProviderMixin.java | 18 --
.../skyblocker/mixin/PlayerSkinTextureMixin.java | 40 ----
.../de/hysky/skyblocker/mixin/RenderFishMixin.java | 26 ---
.../de/hysky/skyblocker/mixin/ScoreboardMixin.java | 16 --
.../SocialInteractionsPlayerListWidgetMixin.java | 24 --
.../de/hysky/skyblocker/mixin/WindowMixin.java | 16 --
.../hysky/skyblocker/mixin/WorldRendererMixin.java | 48 ----
.../YggdrasilMinecraftSessionServiceMixin.java | 20 --
.../mixin/YggdrasilServicesKeyInfoMixin.java | 60 -----
.../accessor/BeaconBlockEntityRendererInvoker.java | 16 --
.../mixin/accessor/DrawContextInvoker.java | 21 --
.../mixin/accessor/EndermanEntityAccessor.java | 17 --
.../skyblocker/mixin/accessor/FrustumInvoker.java | 14 --
.../mixin/accessor/HandledScreenAccessor.java | 26 ---
.../mixin/accessor/MessageHandlerAccessor.java | 14 --
.../mixin/accessor/PlayerListHudAccessor.java | 16 --
.../mixin/accessor/RecipeBookWidgetAccessor.java | 15 --
.../skyblocker/mixin/accessor/ScreenAccessor.java | 14 --
.../mixin/accessor/SkullBlockEntityAccessor.java | 18 --
.../skyblocker/mixin/accessor/SlotAccessor.java | 17 --
.../mixin/accessor/WorldRendererAccessor.java | 13 --
.../mixin/discordipc/ConnectionMixin.java | 20 --
.../mixins/AbstractInventoryScreenMixin.java | 19 ++
.../de/hysky/skyblocker/mixins/BatEntityMixin.java | 21 ++
.../mixins/ClientPlayNetworkHandlerMixin.java | 106 +++++++++
.../skyblocker/mixins/ClientPlayerEntityMixin.java | 82 +++++++
.../mixins/CommandTreeS2CPacketMixin.java | 21 ++
.../skyblocker/mixins/ComponentHolderMixin.java | 39 ++++
.../hysky/skyblocker/mixins/DataTrackerMixin.java | 51 ++++
.../hysky/skyblocker/mixins/DrawContextMixin.java | 71 ++++++
.../skyblocker/mixins/DyedColorComponentMixin.java | 34 +++
.../mixins/EntityRenderDispatcherMixin.java | 18 ++
.../skyblocker/mixins/FarmlandBlockMixin.java | 37 +++
.../mixins/GenericContainerScreenHandlerMixin.java | 38 +++
.../skyblocker/mixins/HandledScreenMixin.java | 258 +++++++++++++++++++++
.../mixins/HandledScreenProviderMixin.java | 101 ++++++++
.../de/hysky/skyblocker/mixins/InGameHudMixin.java | 144 ++++++++++++
.../mixins/InGameOverlayRendererMixin.java | 22 ++
.../skyblocker/mixins/InventoryScreenMixin.java | 18 ++
.../de/hysky/skyblocker/mixins/ItemStackMixin.java | 98 ++++++++
.../hysky/skyblocker/mixins/LeverBlockMixin.java | 29 +++
.../mixins/LivingEntityRendererMixin.java | 18 ++
.../skyblocker/mixins/MinecraftClientMixin.java | 60 +++++
.../de/hysky/skyblocker/mixins/MouseMixin.java | 19 ++
.../skyblocker/mixins/PlayerInventoryMixin.java | 21 ++
.../skyblocker/mixins/PlayerListHudMixin.java | 57 +++++
.../skyblocker/mixins/PlayerSkinProviderMixin.java | 18 ++
.../skyblocker/mixins/PlayerSkinTextureMixin.java | 40 ++++
.../hysky/skyblocker/mixins/RenderFishMixin.java | 26 +++
.../hysky/skyblocker/mixins/ScoreboardMixin.java | 16 ++
.../SocialInteractionsPlayerListWidgetMixin.java | 24 ++
.../de/hysky/skyblocker/mixins/WindowMixin.java | 16 ++
.../skyblocker/mixins/WorldRendererMixin.java | 48 ++++
.../YggdrasilMinecraftSessionServiceMixin.java | 20 ++
.../mixins/YggdrasilServicesKeyInfoMixin.java | 60 +++++
.../BeaconBlockEntityRendererInvoker.java | 16 ++
.../mixins/accessors/DrawContextInvoker.java | 21 ++
.../mixins/accessors/EndermanEntityAccessor.java | 17 ++
.../mixins/accessors/FrustumInvoker.java | 14 ++
.../mixins/accessors/HandledScreenAccessor.java | 26 +++
.../mixins/accessors/MessageHandlerAccessor.java | 14 ++
.../mixins/accessors/PlayerListHudAccessor.java | 16 ++
.../mixins/accessors/RecipeBookWidgetAccessor.java | 15 ++
.../mixins/accessors/ScreenAccessor.java | 14 ++
.../mixins/accessors/SkullBlockEntityAccessor.java | 18 ++
.../skyblocker/mixins/accessors/SlotAccessor.java | 17 ++
.../mixins/accessors/WorldRendererAccessor.java | 13 ++
.../mixins/discordipc/ConnectionMixin.java | 20 ++
.../de/hysky/skyblocker/skyblock/ChestValue.java | 4 +-
.../skyblocker/skyblock/WarpAutocomplete.java | 2 +-
.../auction/AuctionHouseScreenHandler.java | 2 +-
.../skyblocker/skyblock/chat/ChatRulesHandler.java | 2 +-
.../skyblock/dungeon/partyfinder/PartyEntry.java | 2 +-
.../item/tooltip/CompactorDeletorPreview.java | 2 +-
.../skyblock/itemlist/ItemListWidget.java | 3 +-
.../skyblock/quicknav/QuickNavButton.java | 2 +-
.../skyblock/tabhud/util/PlayerListMgr.java | 2 +-
.../skyblocker/utils/render/FrustumUtils.java | 4 +-
.../skyblocker/utils/render/RenderHelper.java | 4 +-
.../utils/render/gui/AbstractCustomHypixelGUI.java | 2 +-
.../utils/render/gui/ContainerSolverManager.java | 3 +-
src/main/resources/skyblocker.mixins.json | 26 +--
107 files changed, 1903 insertions(+), 1901 deletions(-)
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java
delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java
create mode 100644 src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java
(limited to 'src/main/java/de/hysky/skyblocker/utils/render')
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
index 70578822..31f1357d 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
@@ -4,7 +4,7 @@ import com.google.gson.FieldNamingPolicy;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.categories.*;
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import dev.isxander.yacl3.api.YetAnotherConfigLib;
import dev.isxander.yacl3.config.v2.api.ConfigClassHandler;
diff --git a/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java
deleted file mode 100644
index d0d4b9f7..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
-
-@Mixin(AbstractInventoryScreen.class)
-public class AbstractInventoryScreenMixin {
-
- @Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true)
- private void skyblocker$dontDrawStatusEffects(CallbackInfo ci) {
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java
deleted file mode 100644
index fa97e546..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
-import net.minecraft.entity.EntityType;
-import net.minecraft.entity.mob.AmbientEntity;
-import net.minecraft.entity.passive.BatEntity;
-import net.minecraft.world.World;
-import org.spongepowered.asm.mixin.Mixin;
-
-@Mixin(BatEntity.class)
-public abstract class BatEntityMixin extends AmbientEntity {
- protected BatEntityMixin(EntityType extends AmbientEntity> entityType, World world) {
- super(entityType, world);
- }
-
- @Override
- public void onRemoved() {
- super.onRemoved();
- DungeonManager.onBatRemoved(this);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
deleted file mode 100644
index b3471972..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import com.llamalad7.mixinextras.sugar.Local;
-import de.hysky.skyblocker.skyblock.FishingHelper;
-import de.hysky.skyblocker.skyblock.dungeon.DungeonScore;
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
-import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
-import de.hysky.skyblocker.skyblock.end.EnderNodes;
-import de.hysky.skyblocker.skyblock.end.TheEnd;
-import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual;
-import de.hysky.skyblocker.utils.SlayerUtils;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.Blocks;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.client.world.ClientWorld;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityStatuses;
-import net.minecraft.entity.ItemEntity;
-import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
-import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket;
-import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
-import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
-import net.minecraft.util.Identifier;
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(ClientPlayNetworkHandler.class)
-public abstract class ClientPlayNetworkHandlerMixin {
- @Shadow
- private ClientWorld world;
-
- @Inject(method = "onBlockUpdate", at = @At("RETURN"))
- private void skyblocker$onBlockUpdate(BlockUpdateS2CPacket packet, CallbackInfo ci) {
- if (Utils.isInTheEnd() && SlayerUtils.isInSlayer()) {
- BeaconHighlighter.beaconPositions.remove(packet.getPos());
- if (packet.getState().isOf(Blocks.BEACON)) {
- BeaconHighlighter.beaconPositions.add(packet.getPos());
- }
- }
- }
-
- @Inject(method = "method_37472", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V"))
- private void skyblocker$onItemDestroy(int entityId, CallbackInfo ci) {
- if (world.getEntityById(entityId) instanceof ItemEntity itemEntity) {
- DungeonManager.onItemPickup(itemEntity);
- }
- }
-
- @ModifyVariable(method = "onItemPickupAnimation", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V", ordinal = 0))
- private ItemEntity skyblocker$onItemPickup(ItemEntity itemEntity) {
- DungeonManager.onItemPickup(itemEntity);
- return itemEntity;
- }
-
- @WrapWithCondition(method = "onEntityPassengersSet", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;)V", remap = false))
- private boolean skyblocker$cancelEntityPassengersWarning(Logger instance, String msg) {
- return !Utils.isOnHypixel();
- }
-
- @WrapWithCondition(method = "onPlayerList", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
- private boolean skyblocker$cancelPlayerListWarning(Logger instance, String format, Object arg1, Object arg2) {
- return !Utils.isOnHypixel();
- }
-
- @Inject(method = "onPlaySound", at = @At("RETURN"))
- private void skyblocker$onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) {
- FishingHelper.onSound(packet);
- }
-
- @WrapWithCondition(method = "warnOnUnknownPayload", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
- private boolean skyblocker$dropBadlionPacketWarnings(Logger instance, String message, Object identifier) {
- return !(Utils.isOnHypixel() && ((Identifier) identifier).getNamespace().equals("badlion"));
- }
-
- @WrapWithCondition(method = { "onScoreboardScoreUpdate", "onScoreboardScoreReset" }, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
- private boolean skyblocker$cancelUnknownScoreboardObjectiveWarnings(Logger instance, String message, Object objectiveName) {
- return !Utils.isOnHypixel();
- }
-
- @WrapWithCondition(method = "onTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V", remap = false))
- private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) {
- return !Utils.isOnHypixel();
- }
-
- @Inject(method = "onParticle", at = @At("RETURN"))
- private void skyblocker$onParticle(ParticleS2CPacket packet, CallbackInfo ci) {
- MythologicalRitual.onParticle(packet);
- EnderNodes.onParticle(packet);
- }
-
- @ModifyExpressionValue(method = "onEntityStatus", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/EntityStatusS2CPacket;getEntity(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;"))
- private Entity skyblocker$onEntityDeath(Entity entity, @Local(argsOnly = true) EntityStatusS2CPacket packet) {
- if (packet.getStatus() == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) {
- DungeonScore.handleEntityDeath(entity);
- TheEnd.onEntityDeath(entity);
- }
- return entity;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java
deleted file mode 100644
index 8fb2fda4..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.mojang.authlib.GameProfile;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen;
-import de.hysky.skyblocker.skyblock.auction.EditBidPopup;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.skyblock.rift.HealingMelonIndicator;
-import de.hysky.skyblocker.skyblock.searchoverlay.OverlayScreen;
-import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.entity.SignBlockEntity;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.network.AbstractClientPlayerEntity;
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.client.world.ClientWorld;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-@Mixin(ClientPlayerEntity.class)
-public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
- @Shadow
- @Final
- protected MinecraftClient client;
-
- public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
- super(world, profile);
- }
-
- @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true)
- public void skyblocker$dropSelectedItem(CallbackInfoReturnable cir) {
- if (Utils.isOnSkyblock() && (ItemProtection.isItemProtected(this.getInventory().getMainHandStack()) || HotbarSlotLock.isLocked(this.getInventory().selectedSlot))
- && (!SkyblockerConfigManager.get().locations.dungeons.allowDroppingProtectedItems || !Utils.isInDungeons())) {
- cir.setReturnValue(false);
- }
- }
-
- @Inject(method = "updateHealth", at = @At("RETURN"))
- public void skyblocker$updateHealth(CallbackInfo ci) {
- HealingMelonIndicator.updateHealth();
- }
-
- @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true)
- public void skyblocker$redirectEditSignScreen(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) {
- // Fancy Party Finder
- if (!PartyFinderScreen.isInKuudraPartyFinder && client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted() && sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) {
- partyFinderScreen.updateSign(sign, front);
- callbackInfo.cancel();
- return;
- }
-
- if (client.currentScreen instanceof AuctionViewScreen auctionViewScreen) {
- this.client.setScreen(new EditBidPopup(auctionViewScreen, sign, front, auctionViewScreen.minBid));
- callbackInfo.cancel();
- }
-
- // Search Overlay
- if (client.currentScreen != null) {
- if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) {
- if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) {
- SearchOverManager.updateSign(sign, front, true);
- client.setScreen(new OverlayScreen(Text.of("")));
- callbackInfo.cancel();
- }
- } else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) {
- if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) {
- SearchOverManager.updateSign(sign, front, false);
- client.setScreen(new OverlayScreen(Text.of("")));
- callbackInfo.cancel();
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java
deleted file mode 100644
index 1cc1b8de..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.mojang.brigadier.tree.CommandNode;
-import com.mojang.brigadier.tree.LiteralCommandNode;
-import de.hysky.skyblocker.skyblock.WarpAutocomplete;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.command.CommandSource;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(targets = "net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket$CommandTree")
-public class CommandTreeS2CPacketMixin {
- @ModifyExpressionValue(method = "getNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/CommandTreeS2CPacket$CommandTree;getNode(I)Lcom/mojang/brigadier/tree/CommandNode;", ordinal = 1))
- public CommandNode extends CommandSource> modifyCommandSuggestions(CommandNode original) {
- if (Utils.isOnHypixel() && WarpAutocomplete.commandNode != null && original instanceof LiteralCommandNode> literalCommandNode && literalCommandNode.getLiteral().equals("warp")) {
- return WarpAutocomplete.commandNode;
- }
- return original;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java
deleted file mode 100644
index c8c57d6d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.CustomArmorTrims;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import net.minecraft.component.ComponentHolder;
-import net.minecraft.component.DataComponentType;
-import net.minecraft.component.DataComponentTypes;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.trim.ArmorTrim;
-
-@Mixin(ComponentHolder.class)
-public interface ComponentHolderMixin {
-
- @SuppressWarnings("unchecked")
- @ModifyReturnValue(method = "get", at = @At("RETURN"))
- private T skyblocker$customArmorTrims(T original, DataComponentType extends T> dataComponentType) {
- if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) {
- if (dataComponentType == DataComponentTypes.TRIM) {
- Object2ObjectOpenHashMap customTrims = SkyblockerConfigManager.get().general.customArmorTrims;
- String itemUuid = ItemUtils.getItemUuid(stack);
-
- if (customTrims.containsKey(itemUuid)) {
- CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid);
- return (T) CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, (ArmorTrim) original);
- }
- }
- }
-
- return original;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
deleted file mode 100644
index a0b5de84..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.sugar.Local;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.mixin.accessor.EndermanEntityAccessor;
-import de.hysky.skyblocker.skyblock.entity.MobGlow;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.Blocks;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.data.DataTracked;
-import net.minecraft.entity.data.DataTracker;
-import net.minecraft.sound.SoundEvents;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import java.util.Optional;
-
-@Mixin(DataTracker.class)
-public abstract class DataTrackerMixin {
- @Shadow
- @Final
- private DataTracked trackedEntity;
-
- @SuppressWarnings("ConstantValue")
- @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V"))
- private void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry entry, @Local DataTracker.SerializedEntry serializedEntry) {
- if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional> value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional>) serializedEntry.value()).isEmpty()) {
- MinecraftClient client = MinecraftClient.getInstance();
- if (trackedEntity instanceof Entity entity && MobGlow.getArmorStands(entity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) {
- client.inGameHud.setTitleTicks(5, 20, 10);
- client.inGameHud.setTitle(Text.literal("Yang Glyph!").formatted(Formatting.RED));
- client.player.playSound(SoundEvents.BLOCK_NOTE_BLOCK_PLING.value(), 100f, 0.1f);
- }
- }
- }
-
- @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"})
- @Inject(method = "copyToFrom", at = @At(value = "NEW", target = "Ljava/lang/IllegalStateException;"), cancellable = true)
- public void skyblocker$ignoreInvalidDataExceptions(CallbackInfo ci) {
- //These exceptions cause annoying small lag spikes for some reason
- if (Utils.isOnHypixel()) ci.cancel();
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java
deleted file mode 100644
index 6654bae6..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.sugar.Local;
-import com.llamalad7.mixinextras.sugar.ref.LocalRef;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.AttributeShards;
-import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.util.Formatting;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(DrawContext.class)
-public abstract class DrawContextMixin {
- @Shadow
- @Final
- private MatrixStack matrices;
-
- @Shadow
- public abstract int drawText(TextRenderer textRenderer, @Nullable String text, int x, int y, int color, boolean shadow);
-
- @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD"))
- private void skyblocker$renderAttributeShardDisplay(CallbackInfo ci, @Local(argsOnly = true) TextRenderer textRenderer, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true, ordinal = 0) int x, @Local(argsOnly = true, ordinal = 1) int y, @Local(argsOnly = true) LocalRef countOverride) {
- if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return;
-
- if (Utils.isOnSkyblock()) {
- NbtCompound customData = ItemUtils.getCustomData(stack);
-
- if (ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) {
- NbtCompound attributesTag = customData.getCompound("attributes");
- String[] attributes = attributesTag.getKeys().toArray(String[]::new);
-
- if (attributes.length != 0) {
- String attributeId = attributes[0];
- int attributeLevel = attributesTag.getInt(attributeId);
-
- //Set item count
- countOverride.set(Integer.toString(attributeLevel));
-
- //Draw the attribute name
- this.matrices.push();
- this.matrices.translate(0f, 0f, 200f);
-
- String attributeInitials = AttributeShards.getShortName(attributeId);
-
- this.drawText(textRenderer, attributeInitials, x, y, Formatting.AQUA.getColorValue(), true);
-
- this.matrices.pop();
- }
- }
- }
- }
-
- @ModifyExpressionValue(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V",
- at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ItemCooldownManager;getCooldownProgress(Lnet/minecraft/item/Item;F)F"))
- private float skyblocker$modifyItemCooldown(float cooldownProgress, @Local(argsOnly = true) ItemStack stack) {
- return Utils.isOnSkyblock() && ItemCooldowns.isOnCooldown(stack) ? ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent() : cooldownProgress;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java
deleted file mode 100644
index 2682fc6d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import com.llamalad7.mixinextras.sugar.Local;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.component.type.DyedColorComponent;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.math.ColorHelper;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(DyedColorComponent.class)
-public record DyedColorComponentMixin() {
-
- @ModifyReturnValue(method = "getColor", at = @At("RETURN"))
- private static int skyblocker$customDyeColor(int originalColor, @Local(argsOnly = true) ItemStack stack) {
- if (Utils.isOnSkyblock()) {
- String itemUuid = ItemUtils.getItemUuid(stack);
-
- if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) {
- return ColorHelper.Argb.fullAlpha(CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid)));
- }
-
- return ColorHelper.Argb.fullAlpha(SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor));
- }
-
- return originalColor;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
deleted file mode 100644
index 5cf88588..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.debug.Debug;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.render.entity.EntityRenderDispatcher;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.decoration.ArmorStandEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(EntityRenderDispatcher.class)
-public class EntityRenderDispatcherMixin {
- @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1))
- private boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) {
- return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java
deleted file mode 100644
index 84467c9b..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.FarmlandBlock;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.shape.VoxelShape;
-import net.minecraft.util.shape.VoxelShapes;
-import net.minecraft.world.BlockView;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(FarmlandBlock.class)
-public abstract class FarmlandBlockMixin extends Block {
- @Shadow
- @Final
- protected static VoxelShape SHAPE;
-
- protected FarmlandBlockMixin(Settings settings) {
- super(settings);
- }
-
- @ModifyReturnValue(method = "getOutlineShape", at = @At("RETURN"))
- private VoxelShape skyblocker$replaceOutlineShape(VoxelShape original) {
- return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original;
- }
-
- @Override
- public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
- return SHAPE;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java
deleted file mode 100644
index a7843ba2..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import net.minecraft.client.MinecraftClient;
-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) {
- super.setStackInSlot(slot, revision, stack);
- SkyblockerMod.getInstance().containerSolverManager.markDirty();
- if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) {
- screen.markDirty();
- }
- }
-
- @Override
- public void updateSlotStacks(int revision, List stacks, ItemStack cursorStack) {
- super.updateSlotStacks(revision, stacks, cursorStack);
- SkyblockerMod.getInstance().containerSolverManager.markDirty();
- if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) {
- screen.markDirty();
- }
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
deleted file mode 100644
index 4d4dae83..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.sugar.Local;
-import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver;
-import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver;
-import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver;
-import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver;
-import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
-import de.hysky.skyblocker.skyblock.item.WikiLookup;
-import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
-import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.HandledScreen;
-import net.minecraft.inventory.SimpleInventory;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.screen.GenericContainerScreenHandler;
-import net.minecraft.screen.ScreenHandler;
-import net.minecraft.screen.slot.Slot;
-import net.minecraft.screen.slot.SlotActionType;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-
-@Mixin(HandledScreen.class)
-public abstract class HandledScreenMixin extends Screen {
- /**
- * This is the slot id returned for when a click is outside the screen's bounds
- */
- @Unique
- private static final int OUT_OF_BOUNDS_SLOT = -999;
-
- @Unique
- private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
-
- @Unique
- private static final Set FILLER_ITEMS = Set.of(
- " ", // Empty menu item
- "Locked Page",
- "Quick Crafting Slot",
- "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax
- "Locked Backpack Slot 3",
- "Locked Backpack Slot 4",
- "Locked Backpack Slot 5",
- "Locked Backpack Slot 6",
- "Locked Backpack Slot 7",
- "Locked Backpack Slot 8",
- "Locked Backpack Slot 9",
- "Locked Backpack Slot 10",
- "Locked Backpack Slot 11",
- "Locked Backpack Slot 12",
- "Locked Backpack Slot 13",
- "Locked Backpack Slot 14",
- "Locked Backpack Slot 15",
- "Locked Backpack Slot 16",
- "Locked Backpack Slot 17",
- "Locked Backpack Slot 18",
- "Preparing"
- );
-
- @Shadow
- @Nullable
- protected Slot focusedSlot;
-
- @Shadow
- @Final
- protected T handler;
-
- protected HandledScreenMixin(Text title) {
- super(title);
- }
-
- @Inject(at = @At("HEAD"), method = "keyPressed")
- public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) {
- if (this.client != null && this.focusedSlot != null && keyCode != 256) {
- //wiki lookup
- if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) {
- WikiLookup.openWiki(this.focusedSlot, client.player);
- }
- //item protection
- if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) {
- ItemProtection.handleKeyPressed(this.focusedSlot.getStack());
- }
- }
- }
-
- @Inject(at = @At("HEAD"), method = "mouseClicked")
- public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) {
- if (SkyblockerConfigManager.get().locations.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar")))
- VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer);
- }
-
- @SuppressWarnings("DataFlowIssue")
- // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method.
- @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true)
- public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) {
- if (!Utils.isOnSkyblock()) return;
-
- // Hide Empty Tooltips
- if (SkyblockerConfigManager.get().general.hideEmptyTooltips && stack.getName().getString().equals(" ")) {
- ci.cancel();
- }
-
- // Backpack Preview
- boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown();
- if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) {
- ci.cancel();
- }
-
- // Compactor Preview
- if (SkyblockerConfigManager.get().general.compactorDeletorPreview) {
- Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack));
- if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) {
- ci.cancel();
- }
- }
- }
-
- @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0))
- private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) {
- return skyblocker$experimentSolvers$getStack(focusedSlot, stack);
- }
-
- @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0)
- private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) {
- return skyblocker$experimentSolvers$getStack(slot, stack);
- }
-
- /**
- * Redirects getStack calls to account for different stacks in experiment solvers.
- */
- @Unique
- private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) {
- ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver();
- if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
- ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex());
- return itemStack == null ? stack : itemStack;
- }
- return stack;
- }
-
- /**
- * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks)
- * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item
- *
- * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)}
- */
- @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true)
- private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) {
- if (!Utils.isOnSkyblock()) return;
-
- // Item Protection
- // When you try and drop the item by picking it up then clicking outside the screen
- if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) {
- ci.cancel();
- return;
- }
-
- if (slot == null) return;
- String title = getTitle().getString();
- ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack());
- ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver();
-
- // Prevent clicks on filler items
- if (SkyblockerConfigManager.get().general.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) &&
- // Allow clicks in Ultrasequencer and Superpairs
- (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().general.experiments.enableUltrasequencerSolver)) {
- ci.cancel();
- return;
- }
- // Item Protection
- // When you click your drop key while hovering over an item
- if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) {
- ci.cancel();
- return;
- }
- // Prevent salvaging
- if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) {
- ci.cancel();
- return;
- }
- if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) {
- VisitorHelper.onSlotClick(slot, slotId, title);
-
- // Prevent selling to NPC shops
- ItemStack sellStack = this.handler.slots.get(49).getStack();
- if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) {
- if (slotId != 49 && ItemProtection.isItemProtected(stack)) {
- ci.cancel();
- return;
- }
- }
- }
-
- if (currentSolver != null) {
- SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack);
- }
-
- // Experiment Solvers
- if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
- switch (experimentSolver) {
- case ChronomatronSolver chronomatronSolver -> {
- Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal());
- if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) {
- chronomatronSolver.setState(ExperimentSolver.State.END);
- }
- }
-
- case SuperpairsSolver superpairsSolver -> {
- superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex());
- superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY);
- }
-
- case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> {
- int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1;
- ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END));
- }
-
- default -> { /*Do Nothing*/ }
- }
- }
- }
-
- @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V"))
- private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) {
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds)
- ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y);
- // Item protection
- if (ItemProtection.isItemProtected(slot.getStack())) {
- RenderSystem.enableBlend();
- context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16);
- RenderSystem.disableBlend();
- }
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
deleted file mode 100644
index 40534a43..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen;
-import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler;
-import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler;
-import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.ingame.HandledScreens;
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.screen.GenericContainerScreenHandler;
-import net.minecraft.screen.ScreenHandler;
-import net.minecraft.screen.ScreenHandlerType;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(HandledScreens.Provider.class)
-public interface HandledScreenProviderMixin {
-
- @Inject(method = "open", at = @At("HEAD"), cancellable = true)
- default void skyblocker$open(Text name, ScreenHandlerType type, MinecraftClient client, int id, CallbackInfo ci) {
- ClientPlayerEntity player = client.player;
- if (player == null) return;
- if (!Utils.isOnSkyblock()) return;
- T screenHandler = type.create(id, player.getInventory());
- String nameLowercase = name.getString().toLowerCase();
-
- switch (screenHandler) {
- // Better party finder
- case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.betterPartyFinder && PartyFinderScreen.possibleInventoryNames.contains(nameLowercase) -> {
- if (client.currentScreen != null) {
- String lowerCase = client.currentScreen.getTitle().getString().toLowerCase();
- if (lowerCase.contains("group builder")) return;
- if (lowerCase.contains("select tier")) {
- PartyFinderScreen.isInKuudraPartyFinder = true;
- } else if (lowerCase.contains("catacombs")) {
- PartyFinderScreen.isInKuudraPartyFinder = false;
- }
- }
-
- if (PartyFinderScreen.isInKuudraPartyFinder) return;
- client.player.currentScreenHandler = containerScreenHandler;
-
- switch (client.currentScreen) {
- case PartyFinderScreen screen -> screen.updateHandler(containerScreenHandler, name);
- case null, default -> client.setScreen(new PartyFinderScreen(containerScreenHandler, player.getInventory(), name));
- }
-
- ci.cancel();
- }
-
- // Fancy AH
- case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("auctions browser") || nameLowercase.contains("auctions: ")) -> {
- AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, false);
- client.player.currentScreenHandler = auctionHouseScreenHandler;
-
- switch (client.currentScreen) {
- case AuctionBrowserScreen auctionBrowserScreen -> auctionBrowserScreen.changeHandler(auctionHouseScreenHandler);
- case null, default -> client.setScreen(new AuctionBrowserScreen(auctionHouseScreenHandler, client.player.getInventory()));
- }
-
- ci.cancel();
- }
-
- case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && nameLowercase.contains("auction view") -> {
- AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, true);
- client.player.currentScreenHandler = auctionHouseScreenHandler;
-
- switch (client.currentScreen) {
- case AuctionViewScreen auctionViewScreen -> auctionViewScreen.changeHandler(auctionHouseScreenHandler);
- case null, default -> client.setScreen(new AuctionViewScreen(auctionHouseScreenHandler, client.player.getInventory(), name));
- }
-
- ci.cancel();
- }
-
- case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("confirm purchase") || nameLowercase.contains("confirm bid")) && client.currentScreen instanceof AuctionViewScreen auctionViewScreen -> {
- client.setScreen(auctionViewScreen.getConfirmPurchasePopup(name));
- client.player.currentScreenHandler = containerScreenHandler;
- ci.cancel();
- }
-
- // Fancy crafting table
- case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyCraftingTable && name.getString().toLowerCase().contains("craft item") -> {
- SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory());
- client.player.currentScreenHandler = skyblockCraftingTableScreenHandler;
- client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item")));
- ci.cancel();
- }
-
- case null, default -> {}
- }
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
deleted file mode 100644
index 3b419cc5..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.sugar.Local;
-import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
-import de.hysky.skyblocker.events.HudRenderEvents;
-import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
-import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
-import de.hysky.skyblocker.utils.Utils;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.LayeredDrawer;
-import net.minecraft.client.gui.hud.InGameHud;
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.item.ItemStack;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
-
-import java.util.function.Supplier;
-import java.util.regex.Pattern;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyArg;
-import org.spongepowered.asm.mixin.injection.Slice;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Environment(EnvType.CLIENT)
-@Mixin(InGameHud.class)
-public abstract class InGameHudMixin {
- @Unique
- private static final Supplier SLOT_LOCK_ICON = () -> SkyblockerConfigManager.get().general.itemProtection.slotLockStyle.tex;
-
- @Unique
- private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
- @Unique
- private static final Pattern DICER_TITLE_BLACKLIST = Pattern.compile(".+? DROP!");
-
- @Unique
- private final FancyStatusBars statusBars = new FancyStatusBars();
-
- @Shadow
- @Final
- private MinecraftClient client;
-
- @Shadow
- @Final
- private LayeredDrawer layeredDrawer;
-
- @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0))
- public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) {
- if (Utils.isOnSkyblock()) {
- // slot lock
- if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y);
- if (HotbarSlotLock.isLocked(index)) {
- RenderSystem.enableBlend();
- context.drawTexture(SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16);
- RenderSystem.disableBlend();
- }
- //item protection
- if (ItemProtection.isItemProtected(player.getInventory().main.get(index))) {
- RenderSystem.enableBlend();
- context.drawTexture(ITEM_PROTECTION, x, y, 0, 0, 16, 16, 16, 16);
- RenderSystem.disableBlend();
- }
- }
- }
-
- @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true)
- private void skyblocker$renderExperienceBar(CallbackInfo ci) {
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
- ci.cancel();
- }
-
- @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true)
- private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) {
- if (!Utils.isOnSkyblock())
- return;
- if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight()))
- ci.cancel();
- }
-
- @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true)
- private void skyblocker$renderMountHealth(CallbackInfo ci) {
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
- ci.cancel();
- }
-
- @Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"), cancellable = true)
- private void skyblocker$dontRenderStatusEffects(CallbackInfo ci) {
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
- }
-
- @ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getAttackCooldownProgress(F)F"))
- private float skyblocker$modifyAttackIndicatorCooldown(float cooldownProgress) {
- if (Utils.isOnSkyblock() && client.player != null) {
- ItemStack stack = client.player.getMainHandStack();
- if (ItemCooldowns.isOnCooldown(stack)) {
- return ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent();
- }
- }
-
- return cooldownProgress;
- }
-
- @Inject(method = "setTitle", at = @At("HEAD"), cancellable = true)
- private void skyblocker$dicerTitlePrevent(Text title, CallbackInfo ci) {
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.garden.dicerTitlePrevent && title != null && DICER_TITLE_BLACKLIST.matcher(title.getString()).matches()) {
- ci.cancel();
- }
- }
-
- @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 2))
- private LayeredDrawer.Layer skyblocker$afterMainHud(LayeredDrawer.Layer mainHudLayer) {
- return (context, tickDelta) -> {
- mainHudLayer.render(context, tickDelta);
- HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta);
- };
- }
-
- @ModifyArg(method = "", slice = @Slice(from = @At(value = "NEW", target = "Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 1)), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 5))
- private LayeredDrawer.Layer skyblocker$beforeChat(LayeredDrawer.Layer beforeChatLayer) {
- return (context, tickDelta) -> {
- HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta);
- beforeChatLayer.render(context, tickDelta);
- };
- }
-
- @Inject(method = "", at = @At("TAIL"))
- private void skyblocker$afterDrawersInitialized(CallbackInfo ci) {
- this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
deleted file mode 100644
index 4775ce2d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import net.minecraft.client.gui.hud.InGameOverlayRenderer;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.ModifyArg;
-
-@Mixin(InGameOverlayRenderer.class)
-public class InGameOverlayRendererMixin {
-
- @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;"))
- private static float configureFlameHeight(float y) {
- return y - (0.5f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameHeight / 200.0f));
- }
-
- @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;"))
- private static float configureFlameOpacity(float opacity) {
- return opacity - (0.8f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameOpacity / 125.0f));
- }
-
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java
deleted file mode 100644
index 8e6b9230..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.gui.screen.ingame.InventoryScreen;
-import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(InventoryScreen.class)
-public abstract class InventoryScreenMixin {
- @ModifyExpressionValue(method = "", at = @At(value = "NEW", target = "net/minecraft/client/gui/screen/recipebook/RecipeBookWidget"))
- private RecipeBookWidget skyblocker$replaceRecipeBook(RecipeBookWidget original) {
- return SkyblockerConfigManager.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
deleted file mode 100644
index 39184852..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import it.unimi.dsi.fastutil.ints.IntIntPair;
-import net.minecraft.item.ItemStack;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(ItemStack.class)
-public abstract class ItemStackMixin {
-
- @Shadow
- public abstract int getDamage();
-
- @Shadow
- public abstract void setDamage(int damage);
-
- @Unique
- private int maxDamage;
-
- @ModifyReturnValue(method = "getName", at = @At("RETURN"))
- private Text skyblocker$customItemNames(Text original) {
- if (Utils.isOnSkyblock()) {
- return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(ItemUtils.getItemUuid((ItemStack) (Object) this), original);
- }
-
- return original;
- }
-
- /**
- * Updates the durability of this item stack every tick when in the inventory.
- */
- @Inject(method = "inventoryTick", at = @At("TAIL"))
- private void skyblocker$updateDamage(CallbackInfo ci) {
- if (!skyblocker$shouldProcess()) {
- return;
- }
- skyblocker$getAndCacheDurability();
- }
-
- @ModifyReturnValue(method = "getDamage", at = @At("RETURN"))
- private int skyblocker$handleDamage(int original) {
- // If the durability is already calculated, the original value should be the damage
- if (!skyblocker$shouldProcess() || maxDamage != 0) {
- return original;
- }
- return skyblocker$getAndCacheDurability() ? getDamage() : original;
- }
-
- @ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN"))
- private int skyblocker$handleMaxDamage(int original) {
- if (!skyblocker$shouldProcess()) {
- return original;
- }
- // If the max damage is already calculated, return it
- if (maxDamage != 0) {
- return maxDamage;
- }
- return skyblocker$getAndCacheDurability() ? maxDamage : original;
- }
-
- @ModifyReturnValue(method = "isDamageable", at = @At("RETURN"))
- private boolean skyblocker$handleDamageable(boolean original) {
- return skyblocker$shouldProcess() || original;
- }
-
- @ModifyReturnValue(method = "isDamaged", at = @At("RETURN"))
- private boolean skyblocker$handleDamaged(boolean original) {
- return skyblocker$shouldProcess() || original;
- }
-
- @Unique
- private boolean skyblocker$shouldProcess() {
- return Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel && ItemUtils.hasCustomDurability((ItemStack) (Object) this);
- }
-
- @Unique
- private boolean skyblocker$getAndCacheDurability() {
- // Calculate the durability
- IntIntPair durability = ItemUtils.getDurability((ItemStack) (Object) this);
- // Return if calculating the durability failed
- if (durability == null) {
- return false;
- }
- // Saves the calculated durability
- maxDamage = durability.rightInt();
- setDamage(durability.rightInt() - durability.leftInt());
- return true;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java
deleted file mode 100644
index a1cfe44b..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.dungeon.OldLever;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.LeverBlock;
-import net.minecraft.block.WallMountedBlock;
-import net.minecraft.util.shape.VoxelShape;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-import com.llamalad7.mixinextras.sugar.Local;
-
-@Mixin(LeverBlock.class)
-public abstract class LeverBlockMixin extends WallMountedBlock {
- protected LeverBlockMixin(Settings settings) {
- super(settings);
- }
-
- @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true)
- public void skyblocker$onGetOutlineShape(CallbackInfoReturnable cir, @Local(argsOnly = true) BlockState state) {
- if (Utils.isOnSkyblock()) {
- VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING));
- if (shape != null) cir.setReturnValue(shape);
- }
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
deleted file mode 100644
index cf927f0c..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.debug.Debug;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.render.entity.LivingEntityRenderer;
-import net.minecraft.entity.LivingEntity;
-import net.minecraft.entity.decoration.ArmorStandEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(LivingEntityRenderer.class)
-public class LivingEntityRendererMixin {
- @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z"))
- private boolean skyblocker$armorStandVisible(boolean visible, T entity) {
- return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
deleted file mode 100644
index a9f2ae5e..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen;
-import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.DownloadingTerrainScreen;
-import net.minecraft.client.gui.screen.ReconfiguringScreen;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.client.network.ClientPlayerEntity;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyArg;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(MinecraftClient.class)
-public abstract class MinecraftClientMixin {
-
- @Shadow
- @Nullable
- public abstract ClientPlayNetworkHandler getNetworkHandler();
-
- @Shadow
- @Nullable
- public ClientPlayerEntity player;
-
- @Inject(method = "handleInputEvents", at = @At("HEAD"))
- public void skyblocker$handleInputEvents(CallbackInfo ci) {
- if (Utils.isOnSkyblock()) {
- HotbarSlotLock.handleInputEvents(player);
- ItemProtection.handleHotbarKeyPressed(player);
- }
- }
-
- //Remove Downloading Terrain Screen and Reconfiguring Screen
- @ModifyVariable(at = @At("HEAD"), method = "setScreen", ordinal = 0, argsOnly = true)
- public Screen modifySetScreen(Screen screen) {
- if (Utils.isOnHypixel()) {
- return switch (screen) {
- case DownloadingTerrainScreen _s -> null;
- case ReconfiguringScreen _s when this.getNetworkHandler() != null -> new ReconfiguringPlaceholderScreen(this.getNetworkHandler().getConnection());
-
- case null, default -> screen;
- };
- }
- return screen;
- }
-
- @ModifyArg(method = "joinWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reset(Lnet/minecraft/client/gui/screen/Screen;)V"), index = 0)
- private Screen modifyJoinWorld(Screen screen) {
- return Utils.isOnSkyblock() ? new JoinWorldPlaceholderScreen() : screen;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java
deleted file mode 100644
index 33c3f487..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.skyblock.garden.LowerSensitivity;
-import net.minecraft.client.Mouse;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(Mouse.class)
-public class MouseMixin {
-
- @ModifyExpressionValue(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", ordinal = 0))
- public Object skyblocker$gardenMouseLock(Object original) {
- if (LowerSensitivity.isSensitivityLowered())
- return -1 / 3d;
- else return original;
-
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
deleted file mode 100644
index 4795a28b..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import de.hysky.skyblocker.skyblock.crimson.kuudra.ArrowPoisonWarning;
-import net.minecraft.entity.player.PlayerInventory;
-
-@Mixin(PlayerInventory.class)
-public class PlayerInventoryMixin {
- @Shadow
- public int selectedSlot;
-
- @Inject(method = "scrollInHotbar", at = @At("TAIL"))
- private void skyblocker$onHotbarScroll(CallbackInfo ci) {
- ArrowPoisonWarning.tryWarn(selectedSlot);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java
deleted file mode 100644
index 88ca7c67..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.tabhud.TabHud;
-import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
-import de.hysky.skyblocker.utils.Utils;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.hud.PlayerListHud;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import com.llamalad7.mixinextras.sugar.Local;
-
-@Environment(EnvType.CLIENT)
-@Mixin(PlayerListHud.class)
-public class PlayerListHudMixin {
- @Shadow
- private Text footer;
-
- @Inject(at = @At("HEAD"), method = "render", cancellable = true)
- public void skyblocker$renderTabHud(CallbackInfo info, @Local(argsOnly = true) DrawContext context, @Local(argsOnly = true) int w) {
- if (!Utils.isInDungeons() || !SkyblockerConfigManager.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) {
- return;
- }
-
- ClientPlayNetworkHandler nwH = MinecraftClient.getInstance().getNetworkHandler();
- if (nwH == null) {
- return;
- }
-
- int h = MinecraftClient.getInstance().getWindow().getScaledHeight();
- float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f;
- w = (int) (w / scale);
- h = (int) (h / scale);
-
- PlayerListMgr.updateFooter(footer);
-
- try {
- ScreenMaster.render(context, w,h);
- // Screen screen = Screen.getCorrect(w, h, footer);
- // screen.render(context);
- info.cancel();
- } catch (Exception e) {
- TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e);
- }
- }
-
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java
deleted file mode 100644
index b6c44072..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-
-import de.hysky.skyblocker.utils.Utils;
-
-@Mixin(targets = "net.minecraft.client.texture.PlayerSkinProvider$1")
-public class PlayerSkinProviderMixin {
-
- @WrapWithCondition(method = "method_54647", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
- private static boolean skyblocker$dontLogInvalidSignatureWarnings(Logger logger, String message, Object profileId) {
- return !Utils.isOnHypixel();
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java
deleted file mode 100644
index 44f39d21..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.texture.NativeImage;
-import net.minecraft.client.texture.PlayerSkinTexture;
-
-@Mixin(PlayerSkinTexture.class)
-public class PlayerSkinTextureMixin {
- @Shadow
- @Final
- private String url;
-
- @Unique
- private boolean isSkyblockSkinTexture;
-
- @Inject(method = "remapTexture", at = @At("HEAD"))
- private void skyblocker$determineSkinSource(CallbackInfoReturnable cir) {
- if (Utils.isOnSkyblock()) {
- int skinHash = PlayerHeadHashCache.getSkinHash(this.url).hashCode();
- this.isSkyblockSkinTexture = PlayerHeadHashCache.contains(skinHash);
- }
- }
-
- @WrapWithCondition(method = "remapTexture", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/PlayerSkinTexture;stripAlpha(Lnet/minecraft/client/texture/NativeImage;IIII)V"))
- private boolean skyblocker$dontStripAlphaValues(NativeImage image, int x1, int y1, int x2, int y2) {
- return !(SkyblockerConfigManager.get().general.dontStripSkinAlphaValues && this.isSkyblockSkinTexture);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java b/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java
deleted file mode 100644
index e74bbaea..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.FishingBobberEntityRenderer;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.entity.projectile.FishingBobberEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(FishingBobberEntityRenderer.class)
-public abstract class RenderFishMixin {
-
- @Inject(method = "render", at = @At("HEAD"), cancellable = true)
- private void skyblocker$render(FishingBobberEntity fishingBobberEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) {
- //if rendered bobber is not the players and option to hide others is enabled do not render the bobber
- if (Utils.isOnSkyblock() && fishingBobberEntity.getPlayerOwner() != MinecraftClient.getInstance().player && SkyblockerConfigManager.get().general.fishing.hideOtherPlayersRods) {
- ci.cancel();
- }
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java
deleted file mode 100644
index 40b6995a..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.scoreboard.Scoreboard;
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(Scoreboard.class)
-public abstract class ScoreboardMixin {
- @WrapWithCondition(method = "addTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
- private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object arg) {
- return !Utils.isOnHypixel();
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java b/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java
deleted file mode 100644
index cad7cf38..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import java.util.Map;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
-import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListEntry;
-import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListWidget;
-
-@Mixin(SocialInteractionsPlayerListWidget.class)
-public class SocialInteractionsPlayerListWidgetMixin {
-
- @WrapOperation(method = "setPlayers", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", remap = false))
- private Object skyblocker$hideInvalidPlayers(Map