From deaa740b4451224b08fe3e74cea218824d4aa0e7 Mon Sep 17 00:00:00 2001 From: InspectorBoat Date: Thu, 25 Dec 2025 17:13:34 -0500 Subject: [PATCH 1/4] Update item stack on update, not every tick --- .../mixins/AbstractContainerMenuMixin.java | 2 ++ .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 13 +++---------- .../skyblock/item/ItemStackUpdateDurability.java | 5 +++++ 3 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/ItemStackUpdateDurability.java diff --git a/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java b/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java index e307c8dc7ef..a9dd6970e51 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.mixins; +import de.hysky.skyblocker.skyblock.item.ItemStackUpdateDurability; import de.hysky.skyblocker.skyblock.InventorySearch; import de.hysky.skyblocker.skyblock.ItemPickupWidget; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -17,5 +18,6 @@ private void onSetStackInSlot(int slot, int revision, ItemStack stack, CallbackI InventorySearch.refreshSlot(slot); } ItemPickupWidget.getInstance().onItemPickup(slot, stack); + ((ItemStackUpdateDurability) (Object) stack).skyblocker$getAndCacheDurability(); } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 0295d954efd..814cb31aa8e 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -4,6 +4,7 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.ItemStackUpdateDurability; import de.hysky.skyblocker.injected.SkyblockerStack; import de.hysky.skyblocker.skyblock.item.PetInfo; import de.hysky.skyblocker.skyblock.item.SkyblockItemRarity; @@ -35,7 +36,7 @@ import net.minecraft.world.item.enchantment.ItemEnchantments; @Mixin(ItemStack.class) -public abstract class ItemStackMixin implements DataComponentHolder, SkyblockerStack { +public abstract class ItemStackMixin implements DataComponentHolder, SkyblockerStack, ItemStackUpdateDurability { @Unique private float durabilityBarFill = -1; @@ -88,14 +89,6 @@ public abstract class ItemStackMixin implements DataComponentHolder, SkyblockerS } } - /** - * 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) { - skyblocker$getAndCacheDurability(); - } - @ModifyReturnValue(method = "isBarVisible", at = @At("RETURN")) private boolean modifyItemBarVisible(boolean original) { return original || durabilityBarFill >= 0f; @@ -137,7 +130,7 @@ private void onInit(CallbackInfo ci) { } @Unique - private void skyblocker$getAndCacheDurability() { + public void skyblocker$getAndCacheDurability() { if (!skyblocker$shouldProcess()) { durabilityBarFill = -1; return; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/ItemStackUpdateDurability.java b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemStackUpdateDurability.java new file mode 100644 index 00000000000..5cf9cb0128f --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemStackUpdateDurability.java @@ -0,0 +1,5 @@ +package de.hysky.skyblocker.skyblock.item; + +public interface ItemStackUpdateDurability { + void skyblocker$getAndCacheDurability(); +} From 020bf1216586552227a51ded0b18c6fdb3898479 Mon Sep 17 00:00:00 2001 From: InspectorBoat Date: Thu, 25 Dec 2025 18:45:34 -0500 Subject: [PATCH 2/4] Add missing @Override --- src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 814cb31aa8e..143d494afab 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -130,6 +130,7 @@ private void onInit(CallbackInfo ci) { } @Unique + @Override public void skyblocker$getAndCacheDurability() { if (!skyblocker$shouldProcess()) { durabilityBarFill = -1; From 4ae5085e235fd5a7f6243a89a52ebfa3f6820bbe Mon Sep 17 00:00:00 2001 From: InspectorBoat Date: Thu, 25 Dec 2025 23:26:48 -0500 Subject: [PATCH 3/4] Prevent updating durability on item creation --- .../mixins/AbstractContainerMenuMixin.java | 37 ++++++++++++++++++- .../skyblocker/mixins/ItemStackMixin.java | 5 --- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java b/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java index a9dd6970e51..4b0d26cccdf 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java @@ -3,15 +3,50 @@ import de.hysky.skyblocker.skyblock.item.ItemStackUpdateDurability; import de.hysky.skyblocker.skyblock.InventorySearch; import de.hysky.skyblocker.skyblock.ItemPickupWidget; +import net.minecraft.core.NonNullList; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +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.List; + @Mixin(AbstractContainerMenu.class) -public class AbstractContainerMenuMixin { +public abstract class AbstractContainerMenuMixin { + @Shadow + @Final + public NonNullList slots; + + @Shadow + private ItemStack carried; + + /// When the server creates or updates the entire menu + @Inject(method = "initializeContents", at = @At("TAIL")) + private void skyblocker$initializeContents(int stateId, List list, ItemStack itemStack, CallbackInfo ci) { + for (int j = 0; j < list.size(); j++) { + ((ItemStackUpdateDurability) (Object) this.slots.get(j).getItem()).skyblocker$getAndCacheDurability(); + } + ((ItemStackUpdateDurability) (Object) this.carried).skyblocker$getAndCacheDurability(); + } + + /// When the player clicks + @Inject(method = "doClick", at = @At("TAIL")) + private void skyblocker$doClick(int i, int j, ClickType clickType, Player player, CallbackInfo ci) { + // I'm way too lazy to figure how to only update the slots that were moved, soo... + for (int k = 0; k < this.slots.size(); k++) { + ((ItemStackUpdateDurability) (Object) this.slots.get(k).getItem()).skyblocker$getAndCacheDurability(); + } + ((ItemStackUpdateDurability) (Object) this.carried).skyblocker$getAndCacheDurability(); + } + + /// When the server updates a single item @Inject(method = "setItem", at = @At("HEAD")) private void onSetStackInSlot(int slot, int revision, ItemStack stack, CallbackInfo ci) { if (InventorySearch.isSearching()) { diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 143d494afab..85051393067 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -104,11 +104,6 @@ private int modifyItemBarColor(int original) { return durabilityBarFill >= 0 ? OkLabColor.interpolate(CommonColors.RED, CommonColors.GREEN, durabilityBarFill) : original; } - @Inject(method = "(Lnet/minecraft/world/level/ItemLike;ILnet/minecraft/core/component/PatchedDataComponentMap;)V", at = @At("TAIL")) - private void onInit(CallbackInfo ci) { - skyblocker$getAndCacheDurability(); - } - @Inject(method = "set*", at = @At("TAIL")) private void skyblocker$resetFields(DataComponentType type, @Nullable T value, CallbackInfoReturnable cir) { if (type == DataComponents.CUSTOM_DATA) { From 408e6a5c9b1765c74d9f350c06ef56a95c15dca6 Mon Sep 17 00:00:00 2001 From: InspectorBoat Date: Thu, 25 Dec 2025 23:37:48 -0500 Subject: [PATCH 4/4] Drive-by commit: Fix inventory search not updating correctly when moving items around --- .../hysky/skyblocker/mixins/AbstractContainerMenuMixin.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java b/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java index 4b0d26cccdf..c274e934315 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/AbstractContainerMenuMixin.java @@ -32,6 +32,9 @@ public abstract class AbstractContainerMenuMixin { private void skyblocker$initializeContents(int stateId, List list, ItemStack itemStack, CallbackInfo ci) { for (int j = 0; j < list.size(); j++) { ((ItemStackUpdateDurability) (Object) this.slots.get(j).getItem()).skyblocker$getAndCacheDurability(); + if (InventorySearch.isSearching()) { + InventorySearch.refreshSlot(j); + } } ((ItemStackUpdateDurability) (Object) this.carried).skyblocker$getAndCacheDurability(); } @@ -42,6 +45,9 @@ public abstract class AbstractContainerMenuMixin { // I'm way too lazy to figure how to only update the slots that were moved, soo... for (int k = 0; k < this.slots.size(); k++) { ((ItemStackUpdateDurability) (Object) this.slots.get(k).getItem()).skyblocker$getAndCacheDurability(); + if (InventorySearch.isSearching()) { + InventorySearch.refreshSlot(k); + } } ((ItemStackUpdateDurability) (Object) this.carried).skyblocker$getAndCacheDurability(); }