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 --- src/main/java/de/hysky/skyblocker/debug/Debug.java | 1 + .../de/hysky/skyblocker/debug/SnapshotDebug.java | 32 ++++++++++++++++++++++ .../de/hysky/skyblocker/mixin/ArmorTrimMixin.java | 2 +- .../hysky/skyblocker/mixin/DrawContextMixin.java | 2 +- .../hysky/skyblocker/mixin/DyeableItemMixin.java | 2 +- .../de/hysky/skyblocker/mixin/InGameHudMixin.java | 9 ++---- .../hysky/skyblocker/skyblock/TeleportOverlay.java | 3 +- .../skyblock/dungeon/puzzle/TicTacToe.java | 3 +- .../skyblock/dungeon/secrets/DungeonManager.java | 9 +++--- .../skyblocker/skyblock/item/CustomItemNames.java | 2 +- .../skyblocker/skyblock/item/MuseumItemCache.java | 2 +- .../skyblock/item/tooltip/ItemTooltip.java | 4 +-- .../skyblocker/utils/render/MatrixHelper.java | 30 ++++++++++++++++++++ .../skyblocker/utils/render/RenderHelper.java | 25 +++++++---------- 14 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/MatrixHelper.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java index 86adcac6..5a9d221b 100644 --- a/src/main/java/de/hysky/skyblocker/debug/Debug.java +++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java @@ -20,6 +20,7 @@ public class Debug { public static void init() { if (debugEnabled()) { + SnapshotDebug.init(); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("debug") .then(dumpPlayersCommand()) .then(ItemUtils.dumpHeldItemNbtCommand()) diff --git a/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java b/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java new file mode 100644 index 00000000..bd4abd2c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java @@ -0,0 +1,32 @@ +package de.hysky.skyblocker.debug; + +import de.hysky.skyblocker.utils.render.RenderHelper; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.SharedConstants; +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class SnapshotDebug { + private static final float[] RED = { 1.0f, 0.0f, 0.0f }; + private static final float ALPHA = 0.5f; + private static final float LINE_WIDTH = 8f; + + private static boolean isInSnapshot() { + return !SharedConstants.getGameVersion().isStable(); + } + + static void init() { + if (isInSnapshot()) { + WorldRenderEvents.AFTER_TRANSLUCENT.register(SnapshotDebug::renderTest); + } + } + + private static void renderTest(WorldRenderContext wrc) { + RenderHelper.renderFilledWithBeaconBeam(wrc, new BlockPos(175, 63, -14), RED, ALPHA, true); + RenderHelper.renderLinesFromPoints(wrc, new Vec3d[] { new Vec3d(173, 66, -7.5), new Vec3d(178, 66, -7.5) }, RED, ALPHA, LINE_WIDTH, false); + RenderHelper.renderQuad(wrc, new Vec3d[] { new Vec3d(183, 66, -16), new Vec3d(183, 63, -16), new Vec3d(183, 63, -14), new Vec3d(183, 66, -14) }, RED, ALPHA, false); + RenderHelper.renderText(wrc, Text.of("Skyblocker on " + SharedConstants.getGameVersion().getName() + "!"), new Vec3d(175.5, 67.5, -7.5), false); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java index b9bdb523..e13c41ee 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java @@ -18,7 +18,7 @@ import java.util.Optional; public class ArmorTrimMixin { @ModifyReturnValue(method = "getTrim", at = @At("RETURN")) - private static Optional skyblocker$customArmorTrims(@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional original, @Local ItemStack stack) { + private static Optional skyblocker$customArmorTrims(@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional original, @Local(argsOnly = true) ItemStack stack) { if (Utils.isOnSkyblock()) { Object2ObjectOpenHashMap customTrims = SkyblockerConfigManager.get().general.customArmorTrims; String itemUuid = ItemUtils.getItemUuid(stack); diff --git a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java index b33a8b23..e2979040 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java @@ -65,7 +65,7 @@ public abstract class DrawContextMixin { @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 ItemStack stack) { + 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/DyeableItemMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java index 64f6a452..b20b58b5 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(DyeableItem.class) public interface DyeableItemMixin { @ModifyReturnValue(method = "getColor", at = @At("RETURN")) - private int skyblocker$customDyeColor(int originalColor, ItemStack stack) { + private static int skyblocker$customDyeColor(int originalColor, ItemStack stack) { if (Utils.isOnSkyblock()) { String itemUuid = ItemUtils.getItemUuid(stack); diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java index b0970b4b..fc0d58b7 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java @@ -50,17 +50,12 @@ public abstract class InGameHudMixin { @Unique private final FancyStatusBars statusBars = new FancyStatusBars(); - @Shadow - private int scaledHeight; - @Shadow - private int scaledWidth; - @Shadow @Final private MinecraftClient client; @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(float tickDelta, DrawContext context, CallbackInfo ci, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) { + 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); @@ -88,7 +83,7 @@ public abstract class InGameHudMixin { private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) { if (!Utils.isOnSkyblock()) return; - if (statusBars.render(context, scaledWidth, scaledHeight)) + if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight())) ci.cancel(); if (Utils.isInDungeons() && DungeonScore.isDungeonStarted()) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java index e572d9dc..bc0eede8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java @@ -9,6 +9,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.hit.BlockHitResult; @@ -83,7 +84,7 @@ public class TeleportOverlay { private static void render(WorldRenderContext wrc, int range) { if (client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.crosshairTarget instanceof BlockHitResult blockHitResult && client.crosshairTarget.squaredDistanceTo(client.player) < range * range) { render(wrc, blockHitResult); - } else if (client.interactionManager != null && range > client.interactionManager.getReachDistance()) { + } else if (client.interactionManager != null && range > client.player.getAttributeInstance(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE).getValue()) { @SuppressWarnings("DataFlowIssue") HitResult result = client.player.raycast(range, wrc.tickDelta(), false); if (result.getType() == HitResult.Type.BLOCK && result instanceof BlockHitResult blockHitResult) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java index a9b88b3d..e4c51e69 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java @@ -8,7 +8,6 @@ import de.hysky.skyblocker.utils.tictactoe.TicTacToeUtils; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.item.FilledMapItem; import net.minecraft.item.map.MapState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; @@ -54,7 +53,7 @@ public class TicTacToe extends DungeonPuzzle { char[][] board = new char[3][3]; for (ItemFrameEntity itemFrame : itemFramesThatHoldMaps) { - MapState mapState = client.world.getMapState(FilledMapItem.getMapName(itemFrame.getMapId().getAsInt())); + MapState mapState = client.world.getMapState(itemFrame.getMapId()); if (mapState == null) continue; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java index 86997cd3..c90f1134 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java @@ -35,6 +35,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; +import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.CommandSource; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.command.argument.PosArgument; @@ -244,8 +245,8 @@ public class DungeonManager { .then(literal("markAsMissing").then(markSecretsCommand(false))) .then(literal("getRelativePos").executes(DungeonManager::getRelativePos)) .then(literal("getRelativeTargetPos").executes(DungeonManager::getRelativeTargetPos)) - .then(literal("addWaypoint").then(addCustomWaypointCommand(false))) - .then(literal("addWaypointRelatively").then(addCustomWaypointCommand(true))) + .then(literal("addWaypoint").then(addCustomWaypointCommand(false, registryAccess))) + .then(literal("addWaypointRelatively").then(addCustomWaypointCommand(true, registryAccess))) .then(literal("removeWaypoint").then(removeCustomWaypointCommand(false))) .then(literal("removeWaypointRelatively").then(removeCustomWaypointCommand(true))) )))); @@ -385,11 +386,11 @@ public class DungeonManager { return Command.SINGLE_SUCCESS; } - private static RequiredArgumentBuilder addCustomWaypointCommand(boolean relative) { + private static RequiredArgumentBuilder addCustomWaypointCommand(boolean relative, CommandRegistryAccess registryAccess) { return argument("pos", BlockPosArgumentType.blockPos()) .then(argument("secretIndex", IntegerArgumentType.integer()) .then(argument("category", SecretWaypoint.Category.CategoryArgumentType.category()) - .then(argument("name", TextArgumentType.text()).executes(context -> { + .then(argument("name", TextArgumentType.text(registryAccess)).executes(context -> { // TODO Less hacky way with custom ClientBlockPosArgumentType BlockPos pos = context.getArgument("pos", PosArgument.class).toAbsoluteBlockPos(new ServerCommandSource(null, context.getSource().getPosition(), context.getSource().getRotation(), null, 0, null, null, null, null)); return relative ? addCustomWaypointRelative(context, pos) : addCustomWaypoint(context, pos); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java index e47444cf..e1af788e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java @@ -26,7 +26,7 @@ public class CustomItemNames { .then(ClientCommandManager.literal("custom") .then(ClientCommandManager.literal("renameItem") .executes(context -> renameItem(context.getSource(), null)) - .then(ClientCommandManager.argument("textComponent", TextArgumentType.text()) + .then(ClientCommandManager.argument("textComponent", TextArgumentType.text(registryAccess)) .executes(context -> renameItem(context.getSource(), context.getArgument("textComponent", Text.class))))))); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java b/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java index ae908245..a076277a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java @@ -86,7 +86,7 @@ public class MuseumItemCache { for (Map.Entry donatedSet : donatedSets.entrySet()) { //Item is plural here because the nbt is a list String itemsData = donatedSet.getValue().getAsJsonObject().get("items").getAsJsonObject().get("data").getAsString(); - NbtList items = NbtIo.readCompressed(new ByteArrayInputStream(Base64.getDecoder().decode(itemsData)), NbtTagSizeTracker.ofUnlimitedBytes()).getList("i", NbtElement.COMPOUND_TYPE); + NbtList items = NbtIo.readCompressed(new ByteArrayInputStream(Base64.getDecoder().decode(itemsData)), NbtSizeTracker.ofUnlimitedBytes()).getList("i", NbtElement.COMPOUND_TYPE); for (int i = 0; i < items.size(); i++) { NbtCompound tag = items.getCompound(i).getCompound("tag"); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index ea24dc63..562c244c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -202,8 +202,8 @@ public class ItemTooltip { String uuid = ItemUtils.getItemUuid(stack); boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); - if (!hasCustomDye && stack.getItem() instanceof DyeableItem item && item.hasColor(stack)) { - String colorHex = String.format("%06X", item.getColor(stack)); + if (!hasCustomDye && DyeableItem.hasColor(stack)) { + String colorHex = String.format("%06X", DyeableItem.getColor(stack)); String expectedHex = ExoticTooltip.getExpectedHex(internalID); boolean correctLine = false; 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 3c967b384500d117c23fa5d1cb23bc415a5d6324 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 15 Feb 2024 23:31:04 -0500 Subject: 24w07a & Mixin Extras update --- .../java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java | 2 +- src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java | 1 - src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java | 2 +- src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java | 2 +- src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java | 2 +- .../hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java | 2 +- .../java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java index 743f949f..b3471972 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +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; diff --git a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java index dfa886c4..84467c9b 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java @@ -30,7 +30,6 @@ public abstract class FarmlandBlockMixin extends Block { return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original; } - @SuppressWarnings("deprecation") @Override public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { return SHAPE; diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java index dd38e15a..b6c44072 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java @@ -4,7 +4,7 @@ import org.slf4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.utils.Utils; diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java index 50f478b8..44f39d21 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java @@ -8,7 +8,7 @@ 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.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache; diff --git a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java index 2cfb658a..40b6995a 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.mixin; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.utils.Utils; import net.minecraft.scoreboard.Scoreboard; import org.slf4j.Logger; diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java index 47c8780f..d6863b18 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java @@ -4,7 +4,7 @@ import org.slf4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; import de.hysky.skyblocker.utils.Utils; diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java index 78c4bac1..5df018e4 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.mixin; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; -- cgit From 4f4d3f480d75293a2f19f799423a282a4f03b421 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 18 Feb 2024 02:15:26 -0500 Subject: Hud Render Events --- .../hysky/skyblocker/events/HudRenderEvents.java | 50 ++++++++++++++++++++++ .../de/hysky/skyblocker/mixin/InGameHudMixin.java | 42 ++++++++++++++++++ .../mixin/accessor/LayeredDrawerAccessor.java | 15 +++++++ 3 files changed, 107 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java create mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java b/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java new file mode 100644 index 00000000..13e70498 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java @@ -0,0 +1,50 @@ +package de.hysky.skyblocker.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.client.gui.DrawContext; + +/** + * HUD render events that allow for proper layering between different HUD elements. + * This should always be preferred over Fabric's {@link net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback}. + * + * Perhaps in the future this system could be PR'd to Fabric. + */ +public class HudRenderEvents { + /** + * Called after the hotbar, status bars, and experience bar have been rendered. + */ + public static final Event AFTER_MAIN_HUD = createEventForStage(); + + /** + * Called before the {@link net.minecraft.client.gui.hud.ChatHud} is rendered. + */ + public static final Event BEFORE_CHAT = createEventForStage(); + + /** + * Called after the entire HUD is rendered. + */ + public static final Event LAST = createEventForStage(); + + private static Event createEventForStage() { + return EventFactory.createArrayBacked(HudRenderStage.class, listeners -> (context, tickDelta) -> { + for (HudRenderStage listener : listeners) { + listener.onRender(context, tickDelta); + } + }); + } + + /** + * @implNote Similar to Fabric's {@link net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback} + */ + @FunctionalInterface + public interface HudRenderStage { + /** + * Called sometime during a specific HUD render stage. + * + * @param drawContext The {@link DrawContext} instance + * @param tickDelta Progress for linearly interpolating between the previous and current game state + */ + void onRender(DrawContext context, float tickDelta); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java index fc0d58b7..3dff4d6f 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java @@ -6,6 +6,8 @@ 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.mixin.accessor.LayeredDrawerAccessor; import de.hysky.skyblocker.skyblock.dungeon.DungeonMap; import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; import de.hysky.skyblocker.skyblock.dungeon.DungeonScoreHUD; @@ -19,15 +21,18 @@ 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.List; import java.util.function.Supplier; import java.util.regex.Pattern; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -54,6 +59,10 @@ public abstract class InGameHudMixin { @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()) { @@ -121,4 +130,37 @@ public abstract class InGameHudMixin { ci.cancel(); } } + + /** + * Hopefully other mods don't add stages into these two drawers... + * + * @implNote Check this every update to see if the indexes of each layer have changed. + */ + @Inject(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/InGameHud;layeredDrawer:Lnet/minecraft/client/gui/LayeredDrawer;", opcode = Opcodes.GETFIELD)) + private void skyblocker$beforeDrawersInitialized(CallbackInfo ci, @Local(ordinal = 0) LayeredDrawer persistentDrawer, @Local(ordinal = 1) LayeredDrawer intermittentDrawer) { + List persistentLayers = ((LayeredDrawerAccessor) persistentDrawer).getLayers(); + + //After Main HUD - stage index is 2 + LayeredDrawer.Layer mainHudLayer = persistentLayers.get(2); + + persistentLayers.set(2, (context, tickDelta) -> { + mainHudLayer.render(context, tickDelta); + HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); + }); + + List intermittentLayers = ((LayeredDrawerAccessor) intermittentDrawer).getLayers(); + + //Before Chat - stage index is 5 + LayeredDrawer.Layer chatLayer = intermittentLayers.get(5); + + intermittentLayers.set(5, (context, tickDelta) -> { + HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); + chatLayer.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/accessor/LayeredDrawerAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java new file mode 100644 index 00000000..26110ca9 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java @@ -0,0 +1,15 @@ +package de.hysky.skyblocker.mixin.accessor; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.gui.LayeredDrawer; + +@Mixin(LayeredDrawer.class) +public interface LayeredDrawerAccessor { + + @Accessor + List getLayers(); +} -- 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') 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 4e2924407645b04c30d4a2823a1d9d0983c2c790 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 2 Mar 2024 15:16:27 -0500 Subject: 24w09a --- src/main/java/de/hysky/skyblocker/debug/Debug.java | 2 +- .../de/hysky/skyblocker/mixin/ArmorTrimMixin.java | 34 --------- .../skyblocker/mixin/ComponentHolderMixin.java | 39 ++++++++++ .../hysky/skyblocker/mixin/DyeableItemMixin.java | 29 -------- .../skyblocker/mixin/DyedColorComponentMixin.java | 34 +++++++++ .../hysky/skyblocker/mixin/HandledScreenMixin.java | 2 +- .../mixin/accessor/ItemStackAccessor.java | 14 ---- .../skyblocker/skyblock/dungeon/CroesusHelper.java | 8 ++- .../skyblocker/skyblock/dungeon/CroesusProfit.java | 7 +- .../skyblocker/skyblock/dungeon/DungeonMap.java | 25 +++---- .../dungeon/partyfinder/OptionDropdownWidget.java | 1 - .../skyblock/dungeon/partyfinder/PartyEntry.java | 20 +++--- .../dungeon/partyfinder/PartyFinderScreen.java | 12 ++-- .../skyblock/dungeon/secrets/DungeonManager.java | 5 +- .../skyblocker/skyblock/end/EndHudWidget.java | 7 +- .../hysky/skyblocker/skyblock/entity/MobGlow.java | 22 +++--- .../skyblocker/skyblock/garden/FarmingHud.java | 2 +- .../skyblocker/skyblock/garden/VisitorHelper.java | 28 ++++---- .../skyblock/item/CustomArmorDyeColors.java | 4 +- .../skyblocker/skyblock/item/CustomArmorTrims.java | 6 +- .../skyblock/item/tooltip/BackpackPreview.java | 69 ++++++++++-------- .../skyblock/item/tooltip/ItemTooltip.java | 14 ++-- .../skyblock/itemlist/ItemStackBuilder.java | 83 +++++++++++----------- .../skyblock/itemlist/SearchResultsWidget.java | 10 +-- .../skyblocker/skyblock/quicknav/QuickNav.java | 7 +- .../skyblock/special/SpecialEffects.java | 58 ++++++--------- .../java/de/hysky/skyblocker/utils/ItemUtils.java | 64 +++++++++++------ .../datafixer/ItemStackComponentizationFixer.java | 26 +++++++ 28 files changed, 339 insertions(+), 293 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java index 5a9d221b..31823ab0 100644 --- a/src/main/java/de/hysky/skyblocker/debug/Debug.java +++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java @@ -23,7 +23,7 @@ public class Debug { SnapshotDebug.init(); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("debug") .then(dumpPlayersCommand()) - .then(ItemUtils.dumpHeldItemNbtCommand()) + .then(ItemUtils.dumpHeldItemCommand()) ))); } } diff --git a/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java deleted file mode 100644 index e13c41ee..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.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.CustomArmorTrims; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.item.ItemStack; -import net.minecraft.item.trim.ArmorTrim; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import java.util.Optional; - -@Mixin(ArmorTrim.class) -public class ArmorTrimMixin { - - @ModifyReturnValue(method = "getTrim", at = @At("RETURN")) - private static Optional<ArmorTrim> skyblocker$customArmorTrims(@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional<ArmorTrim> original, @Local(argsOnly = true) ItemStack stack) { - if (Utils.isOnSkyblock()) { - Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customTrims = SkyblockerConfigManager.get().general.customArmorTrims; - String itemUuid = ItemUtils.getItemUuid(stack); - - if (customTrims.containsKey(itemUuid)) { - CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid); - return CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, original); - } - } - - return original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java new file mode 100644 index 00000000..c8c57d6d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java @@ -0,0 +1,39 @@ +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> T skyblocker$customArmorTrims(T original, DataComponentType<? extends T> dataComponentType) { + if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) { + if (dataComponentType == DataComponentTypes.TRIM) { + Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> 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/DyeableItemMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java deleted file mode 100644 index b20b58b5..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -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.item.DyeableItem; -import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(DyeableItem.class) -public interface DyeableItemMixin { - @ModifyReturnValue(method = "getColor", at = @At("RETURN")) - private static int skyblocker$customDyeColor(int originalColor, ItemStack stack) { - if (Utils.isOnSkyblock()) { - String itemUuid = ItemUtils.getItemUuid(stack); - - if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) { - return CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid)); - } - - return SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor); - } - - return originalColor; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java new file mode 100644 index 00000000..2682fc6d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java @@ -0,0 +1,34 @@ +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/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java index 7d2f849e..73a0bfdb 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java @@ -205,7 +205,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen // Prevent selling to NPC shops ItemStack sellStack = this.handler.slots.get(49).getStack(); - if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getNbtTooltip(sellStack, text -> text.contains("buyback")) != null) { + if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) { if (slotId != 49 && ItemProtection.isItemProtected(stack)) { ci.cancel(); return; diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java deleted file mode 100644 index e3bd69aa..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.item.ItemStack; -import net.minecraft.text.Style; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ItemStack.class) -public interface ItemStackAccessor { - @Accessor - static Style getLORE_STYLE() { - throw new UnsupportedOperationException(); - } -} 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 01422770..5bd44707 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java @@ -1,8 +1,10 @@ package de.hysky.skyblocker.skyblock.dungeon; 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 net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; import java.util.ArrayList; @@ -25,10 +27,10 @@ public class CroesusHelper extends ContainerSolver { List<ColorHighlight> highlights = new ArrayList<>(); for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) { ItemStack stack = entry.getValue(); - if (stack != null && stack.getNbt() != null) { - if (stack.getNbt().toString().contains("Opened Chest:")) { + if (stack != null && stack.contains(DataComponentTypes.LORE)) { + if (ItemUtils.getLoreLineIf(stack, s -> s.contains("Opened Chest:")) != null) { highlights.add(ColorHighlight.gray(entry.getKey())); - } else if (stack.getNbt().toString().contains("No more Chests to open!")) { + } else if (ItemUtils.getLoreLineIf(stack, s -> s.contains("No more Chests to open!")) != null) { highlights.add(ColorHighlight.red(entry.getKey())); } } 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 ca166915..8933a447 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 net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; @@ -37,7 +38,7 @@ public class CroesusProfit extends ContainerSolver { for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) { ItemStack stack = entry.getValue(); - if (stack != null && stack.getNbt() != null && stack.getName().toString().contains("Chest")) { + if (stack != null && stack.contains(DataComponentTypes.LORE) && ItemUtils.getLoreLineIf(stack, s -> s.contains("Chest")) != null) { long value = valueChest(stack); if (value > bestValue) { secondBestChest = bestChest; @@ -53,7 +54,7 @@ public class CroesusProfit extends ContainerSolver { for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) { ItemStack stack = entry.getValue(); - if (stack != null && stack.getNbt() != null) { + if (stack != null && stack.contains(DataComponentTypes.LORE)) { if (stack.equals(bestChest)) { highlights.add(ColorHighlight.green(entry.getKey())); } else if (stack.equals(secondBestChest) && secondBestValue > dungeonKeyPriceData) { @@ -71,7 +72,7 @@ public class CroesusProfit extends ContainerSolver { List<String> chestItems = new ArrayList<>(); boolean processingContents = false; - for (Text line : ItemUtils.getNbtTooltips(chest)) { + for (Text line : ItemUtils.getLore(chest)) { String lineString = line.getString(); if (lineString.contains("Contents")) { processingContents = 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 878b7a35..7a6cdcd0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java @@ -14,14 +14,16 @@ import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.MapRenderer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.MapIdComponent; import net.minecraft.item.FilledMapItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.map.MapState; public class DungeonMap { - private static final int DEFAULT_MAP_ID = 1024; - private static Integer cachedMapId = null; + private static final MapIdComponent DEFAULT_MAP_ID_COMPONENT = new MapIdComponent(1024); + private static MapIdComponent cachedMapIdComponent = null; public static void init() { HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> render(context)); @@ -35,11 +37,11 @@ public class DungeonMap { ClientPlayConnectionEvents.JOIN.register((handler, sender,