From 95faf143b98d5d5edc3c711e4d22e5f2115119a7 Mon Sep 17 00:00:00 2001 From: alexia Date: Sat, 7 Oct 2023 00:59:15 +0200 Subject: Hook actual durability for Pickonimbus/Drills Instead of the previous DrawContext hack. Confirmed working with Durability Notifier on Fabric 1.20.2. --- .../skyblocker/mixin/DrawContextMixin.java | 66 ---------------------- .../me/xmrvizzy/skyblocker/mixin/ItemMixin.java | 30 ++++++++++ .../xmrvizzy/skyblocker/mixin/ItemStackMixin.java | 29 ++++++++++ 3 files changed, 59 insertions(+), 66 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java index 356095ab..2cb83e87 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java @@ -2,7 +2,6 @@ package me.xmrvizzy.skyblocker.mixin; import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import com.mojang.blaze3d.systems.RenderSystem; import dev.cbyrne.betterinject.annotations.Arg; import dev.cbyrne.betterinject.annotations.Inject; @@ -12,12 +11,10 @@ import me.xmrvizzy.skyblocker.utils.ItemUtils; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.Formatting; -import net.minecraft.util.math.ColorHelper; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -25,78 +22,15 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import java.awt.Color; -import java.util.regex.Pattern; - @Mixin(DrawContext.class) public abstract class DrawContextMixin { @Shadow @Final private MatrixStack matrices; - @Shadow - public abstract void fill(RenderLayer layer, int x1, int x2, int y1, int y2, int color); - @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")) - public void skyblocker$renderItemBar(@Arg ItemStack stack, @Arg(ordinal = 0) int x, @Arg(ordinal = 1) int y) { - if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel || stack.isEmpty()) { - return; - } - - NbtCompound tag = stack.getNbt(); - if (tag == null || !tag.contains("ExtraAttributes")) { - return; - } - - NbtCompound extraAttributes = tag.getCompound("ExtraAttributes"); - if (!extraAttributes.contains("drill_fuel") && !extraAttributes.getString("id").equals("PICKONIMBUS")) { - return; - } - matrices.push(); - matrices.translate(0f, 0f, 200f); - RenderSystem.disableDepthTest(); - - float current = 0.0F; - float max = 0.0F; - String clearFormatting = ""; - - for (String line : ItemUtils.getTooltipStrings(stack)) { - clearFormatting = Formatting.strip(line); - if (line.contains("Fuel: ")) { - if (clearFormatting != null) { - String clear = Pattern.compile("[^0-9 /]").matcher(clearFormatting).replaceAll("").trim(); - String[] split = clear.split("/"); - current = Integer.parseInt(split[0]); - max = Integer.parseInt(split[1]) * 1000; - } - break; - } else if (line.contains("uses.")) { - if (clearFormatting != null) { - int startIndex = clearFormatting.lastIndexOf("after") + 6; - int endIndex = clearFormatting.indexOf("uses", startIndex); - if (startIndex >= 0 && endIndex > startIndex) { - String usesString = clearFormatting.substring(startIndex, endIndex).trim(); - current = Integer.parseInt(usesString); - max = 5000; - } - } - break; - } - } - - float hue = Math.max(0.0F, 1.0F - (max - current) / max); - int width = Math.round(current / max * 13.0F); - Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); - this.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 15, y + 15, 0xFF000000); - this.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); - - matrices.pop(); - RenderSystem.enableDepthTest(); - } - @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) private void skyblocker$renderAttributeShardDisplay(@Arg TextRenderer textRenderer, @Arg ItemStack stack, @Arg(ordinal = 0) int x, @Arg(ordinal = 1) int y, @Local(argsOnly = true) LocalRef countOverride) { if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java new file mode 100644 index 00000000..fdede686 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.mixin; + +import org.objectweb.asm.Opcodes; +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 net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +@Mixin(Item.class) +public abstract class ItemMixin { + @WrapOperation( + method = "getItemBarColor", + at = @At(value = "FIELD", target = "Lnet/minecraft/item/Item;maxDamage:I", opcode = Opcodes.GETFIELD) + ) + private int skyblocker$handlePickoDrillBarColor(Item item, Operation original, ItemStack stack) { + return stack.getMaxDamage(); + } + + @WrapOperation( + method = "getItemBarStep", + at = @At(value = "FIELD", target = "Lnet/minecraft/item/Item;maxDamage:I", opcode = Opcodes.GETFIELD) + ) + private int skyblocker$handlePickoDrillBarStep(Item item, Operation original, ItemStack stack) { + return stack.getMaxDamage(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java index 063c048e..b235956a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java @@ -8,6 +8,8 @@ import org.spongepowered.asm.mixin.injection.At; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager; +import me.xmrvizzy.skyblocker.utils.ItemUtils; +import me.xmrvizzy.skyblocker.utils.ItemUtils.Durability; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; @@ -30,4 +32,31 @@ public abstract class ItemStackMixin { return original; } + + @ModifyReturnValue(method = "getDamage", at = @At("RETURN")) + private int skyblocker$handlePickoDrillDamage(int original) { + Durability dur = ItemUtils.getDurability((ItemStack) (Object) this); + if (dur != null) { + return dur.max() - dur.current(); + } + return original; + } + + @ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN")) + private int skyblocker$handlePickoDrillMaxDamage(int original) { + Durability dur = ItemUtils.getDurability((ItemStack) (Object) this); + if (dur != null) { + return dur.max(); + } + return original; + } + + @ModifyReturnValue(method = "isDamageable", at = @At("RETURN")) + private boolean skyblocker$handlePickoDrillDamageable(boolean original) { + Durability dur = ItemUtils.getDurability((ItemStack) (Object) this); + if (dur != null) { + return true; + } + return original; + } } -- cgit From a7c361260a2a104261cf301125b4c81c615334f0 Mon Sep 17 00:00:00 2001 From: alexia Date: Sat, 7 Oct 2023 17:28:14 +0200 Subject: Apply suggestions from code review Co-authored-by: Kevin <92656833+kevinthegreat1@users.noreply.github.com> --- src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java | 6 +++--- src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java index b235956a..280c01ba 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java @@ -34,7 +34,7 @@ public abstract class ItemStackMixin { } @ModifyReturnValue(method = "getDamage", at = @At("RETURN")) - private int skyblocker$handlePickoDrillDamage(int original) { + private int skyblocker$handleDamage(int original) { Durability dur = ItemUtils.getDurability((ItemStack) (Object) this); if (dur != null) { return dur.max() - dur.current(); @@ -43,7 +43,7 @@ public abstract class ItemStackMixin { } @ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN")) - private int skyblocker$handlePickoDrillMaxDamage(int original) { + private int skyblocker$handleMaxDamage(int original) { Durability dur = ItemUtils.getDurability((ItemStack) (Object) this); if (dur != null) { return dur.max(); @@ -52,7 +52,7 @@ public abstract class ItemStackMixin { } @ModifyReturnValue(method = "isDamageable", at = @At("RETURN")) - private boolean skyblocker$handlePickoDrillDamageable(boolean original) { + private boolean skyblocker$handleDamageable(boolean original) { Durability dur = ItemUtils.getDurability((ItemStack) (Object) this); if (dur != null) { return true; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java index 0be4d403..0d227bc3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java @@ -40,7 +40,7 @@ public class ItemUtils { int current = 0; int max = 0; - String clearFormatting = ""; + String clearFormatting; for (String line : ItemUtils.getTooltipStrings(stack)) { clearFormatting = Formatting.strip(line); -- cgit From 6ccb02d50bcded84ab21437895c9344c9ec416cb Mon Sep 17 00:00:00 2001 From: alexia Date: Sun, 8 Oct 2023 16:21:24 +0200 Subject: Merge WrapOperations into one --- src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java index fdede686..99d42640 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemMixin.java @@ -13,18 +13,10 @@ import net.minecraft.item.ItemStack; @Mixin(Item.class) public abstract class ItemMixin { @WrapOperation( - method = "getItemBarColor", + method = {"getItemBarColor", "getItemBarStep"}, at = @At(value = "FIELD", target = "Lnet/minecraft/item/Item;maxDamage:I", opcode = Opcodes.GETFIELD) ) - private int skyblocker$handlePickoDrillBarColor(Item item, Operation original, ItemStack stack) { - return stack.getMaxDamage(); - } - - @WrapOperation( - method = "getItemBarStep", - at = @At(value = "FIELD", target = "Lnet/minecraft/item/Item;maxDamage:I", opcode = Opcodes.GETFIELD) - ) - private int skyblocker$handlePickoDrillBarStep(Item item, Operation original, ItemStack stack) { + private int skyblocker$handlePickoDrillBar(Item item, Operation original, ItemStack stack) { return stack.getMaxDamage(); } } -- cgit