From 693ffc05813a319ddfb007801801b3d964c20d37 Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Fri, 20 Jan 2023 19:07:18 +0100 Subject: [PATCH] Fix ItemStack.EMPTY.getItem() rarely returning null due to threading (#2826) * Fix ItemStack.EMPTY.getItem() rarely returning null due to threading * Overwrite instead (cherry picked from commit c3530bb1c62a336060b7651629e49277a233982e) --- .../fabric/mixin/item/ItemStackMixin.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/ItemStackMixin.java b/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/ItemStackMixin.java index b2c1658f3..1c3a43932 100644 --- a/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/ItemStackMixin.java +++ b/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/ItemStackMixin.java @@ -20,6 +20,7 @@ import java.util.function.Consumer; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -36,6 +37,7 @@ import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.fabricmc.fabric.api.item.v1.FabricItemStack; import net.fabricmc.fabric.api.item.v1.CustomDamageHandler; @@ -100,4 +102,22 @@ public abstract class ItemStackMixin implements FabricItemStack { public boolean hookIsSuitableFor(Item item, BlockState state) { return item.isSuitableFor((ItemStack) (Object) this, state); } + + @Final + @Shadow + private Item item; + @Shadow + private int count; + @Shadow + private boolean empty; + + /** + * Soft-overwrite updateEmptyState to fix <a href="https://bugs.mojang.com/projects/MC/issues/MC-258939">MC-258939</a>. + * Cannot hard-overwrite because Lithium contains a similar but insufficient inject. + */ + @Inject(method = "updateEmptyState", at = @At("HEAD"), cancellable = true) + private void updateEmptyState(CallbackInfo ci) { + this.empty = this.item == null || this.item == Items.AIR || this.count <= 0; + ci.cancel(); + } }