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();
+	}
 }