From 2cc58e59dc37997cd8b911e0e3467205e0674707 Mon Sep 17 00:00:00 2001 From: MicrocontrollersDev Date: Sat, 26 Jul 2025 10:51:02 -0700 Subject: [PATCH 1/2] fix #467 --- .../basic/mc168573/BlocksAttacksMixin.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java b/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java index 9033b3c4..4a2b5ff8 100644 --- a/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java +++ b/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java @@ -1,22 +1,24 @@ package dev.isxander.debugify.mixins.basic.mc168573; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import dev.isxander.debugify.fixes.BugFix; import dev.isxander.debugify.fixes.FixCategory; -import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.BlocksAttacks; -import net.minecraft.world.level.Level; 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; @BugFix(id = "MC-168573", category = FixCategory.BASIC, env = BugFix.Env.SERVER, description = "After breaking a shield, the player's off-hand can't finish using some items") @Mixin(BlocksAttacks.class) public class BlocksAttacksMixin { - @Inject(method = "hurtBlockingItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/EquipmentSlot;)V")) - private void fixShieldBreakItemUse(Level level, ItemStack itemStack, LivingEntity livingEntity, InteractionHand interactionHand, float f, CallbackInfo ci) { - livingEntity.stopUsingItem(); + @WrapOperation(method = "hurtBlockingItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/EquipmentSlot;)V")) + private void fixShieldBreakItemUse(ItemStack instance, int amount, LivingEntity entity, EquipmentSlot slot, Operation original, @Local(argsOnly = true) ItemStack stack) { + boolean isBroken = stack.nextDamageWillBreak(); + original.call(instance, amount, entity, slot); + if (isBroken) entity.stopUsingItem(); } } From d12b961cfa2250ebe8eb3dc55f40d8b3d9fadb16 Mon Sep 17 00:00:00 2001 From: MicrocontrollersDev Date: Mon, 28 Jul 2025 00:44:51 -0700 Subject: [PATCH 2/2] add explanation --- .../debugify/mixins/basic/mc168573/BlocksAttacksMixin.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java b/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java index 4a2b5ff8..299d2135 100644 --- a/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java +++ b/src/main/java/dev/isxander/debugify/mixins/basic/mc168573/BlocksAttacksMixin.java @@ -15,6 +15,10 @@ @BugFix(id = "MC-168573", category = FixCategory.BASIC, env = BugFix.Env.SERVER, description = "After breaking a shield, the player's off-hand can't finish using some items") @Mixin(BlocksAttacks.class) public class BlocksAttacksMixin { + /** + * We need to check if the shield is going to break and only stop using the item after it is broken. + * We can't use isBroken here, so instead we check if the next damage will break the blockable, then do the damage call after. + */ @WrapOperation(method = "hurtBlockingItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/EquipmentSlot;)V")) private void fixShieldBreakItemUse(ItemStack instance, int amount, LivingEntity entity, EquipmentSlot slot, Operation original, @Local(argsOnly = true) ItemStack stack) { boolean isBroken = stack.nextDamageWillBreak();