From c7aaa15a199d87e23efb96d32eea982896ebcac6 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 11 Jul 2023 17:25:26 -0400 Subject: [PATCH] Remove emptyCacheFlag from item stacks (fixes MC-258939) --- .../item_cache_flag/ItemStackMixin.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/item_cache_flag/ItemStackMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/item_cache_flag/ItemStackMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/item_cache_flag/ItemStackMixin.java new file mode 100644 index 00000000..ebff609f --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/item_cache_flag/ItemStackMixin.java @@ -0,0 +1,40 @@ +package org.embeddedt.modernfix.common.mixin.bugfix.item_cache_flag; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * Remove emptyCacheFlag from ItemStack, as Mojang did in 1.20 due to MC-258939. + */ +@Mixin(ItemStack.class) +public class ItemStackMixin { + @Shadow @Final @Deprecated private Item item; + + /** + * @author embeddedt, Mojang + * @reason avoid getItem() + */ + @Redirect(method = "isEmpty", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;")) + private Item getItemDirect(ItemStack stack) { + return this.item; + } + + @Redirect(method = "*", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraft/world/item/ItemStack;emptyCacheFlag:Z")) + private boolean checkEmptyDirect(ItemStack stack) { + return stack.isEmpty(); + } + + /** + * @author embeddedt, Mojang + * @reason flag is no longer used + */ + @Overwrite + private void updateEmptyCacheFlag() {} +}