From 031f0cf067c07982b13d97b5421354dfd48bd3bd Mon Sep 17 00:00:00 2001
From: modmuss50 <modmuss50@gmail.com>
Date: Wed, 6 Mar 2024 16:40:52 +0000
Subject: [PATCH] 24w10a

---
 .../test/lookup/compat/WrappedInventory.java  |  2 +-
 .../content/registry/class_9316Mixin.java     |  6 ++--
 ...abric-data-generation-api-v1.accesswidener |  4 +--
 .../datagen/DataGeneratorTestEntrypoint.java  |  4 +--
 .../api/entity/event/v1/FabricElytraItem.java |  2 +-
 .../ClientPlayerInteractionManagerMixin.java  |  4 +--
 .../test/item/gametest/RecipeGameTest.java    |  2 +-
 .../itemgroup/v1/FabricItemGroupEntries.java  |  4 +--
 ...TypeAwareBuyForOneEmeraldFactoryMixin.java |  6 ++--
 .../object/builder/VillagerTypeTest1.java     | 26 ++++++++--------
 .../object/builder/VillagerTypeTest2.java     | 14 ++++-----
 .../transfer/item/InventorySlotWrapper.java   |  2 +-
 .../AbstractFurnaceBlockEntityMixin.java      |  2 +-
 ...=> LockableContainerBlockEntityMixin.java} | 17 ++++++-----
 .../fabric-transfer-api-v1.mixins.json        |  2 +-
 .../gametests/VanillaStorageTests.java        |  4 +++
 gradle.properties                             | 30 +++++++++----------
 17 files changed, 68 insertions(+), 63 deletions(-)
 rename fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/{LootableContainerBlockEntityMixin.java => LockableContainerBlockEntityMixin.java} (74%)

diff --git a/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/compat/WrappedInventory.java b/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/compat/WrappedInventory.java
index ec6a875fa..1aa103bf3 100644
--- a/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/compat/WrappedInventory.java
+++ b/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/compat/WrappedInventory.java
@@ -60,7 +60,7 @@ final class WrappedInventory implements ItemInsertable, ItemExtractable {
 			if (inv.isValid(i, input)) {
 				ItemStack stack = inv.getStack(i);
 
-				if (stack.isEmpty() || ItemStack.areItemsAndNbtEqual(stack, input)) {
+				if (stack.isEmpty() || ItemStack.areItemsAndComponentsEqual(stack, input)) {
 					int remainingSpace = Math.min(inv.getMaxCountPerStack(), stack.getItem().getMaxCount()) - stack.getCount();
 					int inserted = Math.min(remainingSpace, input.getCount());
 
diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/class_9316Mixin.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/class_9316Mixin.java
index 9c37e66d2..727550dab 100644
--- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/class_9316Mixin.java
+++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/class_9316Mixin.java
@@ -24,14 +24,14 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
 import net.minecraft.block.BlockState;
-import net.minecraft.class_9316;
+import net.minecraft.entity.ai.pathing.PathContext;
 import net.minecraft.entity.ai.pathing.PathNodeType;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.CollisionView;
 
 import net.fabricmc.fabric.api.registry.LandPathNodeTypesRegistry;
 
-@Mixin(class_9316.class)
+@Mixin(PathContext.class)
 public abstract class class_9316Mixin {
 	@Shadow
 	public abstract BlockState method_57623(BlockPos blockPos);
@@ -42,7 +42,7 @@ public abstract class class_9316Mixin {
 	/**
 	 * Overrides the node type for the specified position, if the position is found as neighbor block in a path.
 	 */
-	@Inject(method = "method_57622", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/util/math/BlockPos$Mutable;set(III)Lnet/minecraft/util/math/BlockPos$Mutable;"), cancellable = true)
+	@Inject(method = "getNodeType", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/util/math/BlockPos$Mutable;set(III)Lnet/minecraft/util/math/BlockPos$Mutable;"), cancellable = true)
 	private void method_57622(int x, int y, int z, CallbackInfoReturnable<PathNodeType> cir, @Local BlockPos pos) {
 		final PathNodeType neighborNodeType = LandPathNodeTypesRegistry.getPathNodeType(method_57623(pos), method_57621(), pos, true);
 
diff --git a/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener b/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener
index f1cf8823f..0e1f0a51e 100644
--- a/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener
+++ b/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener
@@ -320,12 +320,12 @@ transitive-extendable	method	net/minecraft/data/MetadataProvider	getName	()Ljava
 transitive-extendable	method	net/minecraft/data/SnbtProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/client/ModelProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/dev/NbtProvider	getName	()Ljava/lang/String;
+transitive-extendable	method	net/minecraft/data/report/BiomeParametersProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/report/BlockListProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/report/CommandSyntaxProvider	getName	()Ljava/lang/String;
-transitive-extendable	method	net/minecraft/data/report/DynamicRegistriesProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/report/ItemListProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/report/RegistryDumpProvider	getName	()Ljava/lang/String;
-transitive-extendable	method	net/minecraft/data/server/BiomeParametersProvider	getName	()Ljava/lang/String;
+transitive-extendable	method	net/minecraft/data/server/DynamicRegistriesProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/server/advancement/AdvancementProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/server/loottable/LootTableProvider	getName	()Ljava/lang/String;
 transitive-extendable	method	net/minecraft/data/server/recipe/RecipeProvider	getName	()Ljava/lang/String;
diff --git a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java
index f5348b1e7..de98f4369 100644
--- a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java
+++ b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java
@@ -164,10 +164,10 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
 		public void generate(RecipeExporter exporter) {
 			offerPlanksRecipe2(exporter, SIMPLE_BLOCK, ItemTags.ACACIA_LOGS, 1);
 
-			ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.LEATHER, 4).input(Items.ITEM_FRAME)
+			ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.DIAMOND_ORE, 4).input(Items.ITEM_FRAME)
 					.criterion("has_frame", conditionsFromItem(Items.ITEM_FRAME))
 					.offerTo(withConditions(exporter, DefaultResourceConditions.itemsRegistered(Blocks.DIAMOND_BLOCK)));
-			ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.LEATHER_BOOTS, 4).input(Items.ITEM_FRAME, 2)
+			ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.EMERALD, 4).input(Items.ITEM_FRAME, 2)
 					.criterion("has_frame", conditionsFromItem(Items.ITEM_FRAME))
 					.offerTo(withConditions(exporter, DefaultResourceConditions.registryContains(BiomeKeys.PLAINS, BiomeKeys.BADLANDS)));
 
diff --git a/fabric-entity-events-v1/src/main/java/net/fabricmc/fabric/api/entity/event/v1/FabricElytraItem.java b/fabric-entity-events-v1/src/main/java/net/fabricmc/fabric/api/entity/event/v1/FabricElytraItem.java
index 472dfa6cc..0d7fee1e6 100644
--- a/fabric-entity-events-v1/src/main/java/net/fabricmc/fabric/api/entity/event/v1/FabricElytraItem.java
+++ b/fabric-entity-events-v1/src/main/java/net/fabricmc/fabric/api/entity/event/v1/FabricElytraItem.java
@@ -52,7 +52,7 @@ public interface FabricElytraItem {
 	 * A helper to perform the default vanilla elytra tick logic: damage the elytra every 20 ticks, and send a game event every 10 ticks.
 	 */
 	default void doVanillaElytraTick(LivingEntity entity, ItemStack chestStack) {
-		int nextRoll = entity.getRoll() + 1;
+		int nextRoll = entity.getFallFlyingTicks() + 1;
 
 		if (!entity.getWorld().isClient && nextRoll % 10 == 0) {
 			if ((nextRoll / 10) % 2 == 0) {
diff --git a/fabric-item-api-v1/src/client/java/net/fabricmc/fabric/mixin/item/client/ClientPlayerInteractionManagerMixin.java b/fabric-item-api-v1/src/client/java/net/fabricmc/fabric/mixin/item/client/ClientPlayerInteractionManagerMixin.java
index 17bb83aa7..1828d56fc 100644
--- a/fabric-item-api-v1/src/client/java/net/fabricmc/fabric/mixin/item/client/ClientPlayerInteractionManagerMixin.java
+++ b/fabric-item-api-v1/src/client/java/net/fabricmc/fabric/mixin/item/client/ClientPlayerInteractionManagerMixin.java
@@ -45,12 +45,12 @@ public class ClientPlayerInteractionManagerMixin {
 	@Redirect(
 			at = @At(
 					value = "INVOKE",
-					target = "Lnet/minecraft/item/ItemStack;areItemsAndNbtEqual(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
+					target = "Lnet/minecraft/item/ItemStack;areItemsAndComponentsEqual(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
 			),
 			method = "isCurrentlyBreaking"
 	)
 	private boolean fabricItemContinueBlockBreakingInject(ItemStack stack, ItemStack otherStack) {
-		boolean stackUnchanged = ItemStack.areItemsAndNbtEqual(stack, this.selectedStack);
+		boolean stackUnchanged = ItemStack.areItemsAndComponentsEqual(stack, this.selectedStack);
 
 		if (!stackUnchanged) {
 			// The stack changed and vanilla is about to cancel block breaking progress. Check if the item wants to continue block breaking instead.
diff --git a/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/RecipeGameTest.java b/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/RecipeGameTest.java
index d6876fdb0..71e1bf21a 100644
--- a/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/RecipeGameTest.java
+++ b/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/RecipeGameTest.java
@@ -127,7 +127,7 @@ public class RecipeGameTest implements FabricGameTest {
 			throw new GameTestException("Size doesnt match. " + extraErrorInfo);
 		}
 
-		if (!ItemStack.areItemsAndNbtEqual(currentStack, expectedStack)) {
+		if (!ItemStack.areItemsAndComponentsEqual(currentStack, expectedStack)) {
 			throw new GameTestException("Stack doesnt match. " + extraErrorInfo);
 		}
 	}
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroupEntries.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroupEntries.java
index b8a1eb40d..88b95473c 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroupEntries.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroupEntries.java
@@ -431,7 +431,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
 		checkStacks(newStacks);
 
 		for (int i = 0; i < addTo.size(); i++) {
-			if (ItemStack.areItemsAndNbtEqual(anchor, addTo.get(i))) {
+			if (ItemStack.areItemsAndComponentsEqual(anchor, addTo.get(i))) {
 				addTo.subList(i, i).addAll(newStacks);
 				return;
 			}
@@ -446,7 +446,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
 
 		// Iterate in reverse to add after the last match
 		for (int i = addTo.size() - 1; i >= 0; i--) {
-			if (ItemStack.areItemsAndNbtEqual(anchor, addTo.get(i))) {
+			if (ItemStack.areItemsAndComponentsEqual(anchor, addTo.get(i))) {
 				addTo.subList(i + 1, i + 1).addAll(newStacks);
 				return;
 			}
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin.java
index cbd812413..41d400788 100644
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin.java
+++ b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin.java
@@ -25,12 +25,12 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.Redirect;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
-import net.minecraft.class_9306;
 import net.minecraft.entity.Entity;
 import net.minecraft.registry.DefaultedRegistry;
 import net.minecraft.util.math.random.Random;
 import net.minecraft.village.TradeOffer;
 import net.minecraft.village.TradeOffers;
+import net.minecraft.village.TradedItem;
 import net.minecraft.village.VillagerType;
 
 @Mixin(TradeOffers.TypeAwareBuyForOneEmeraldFactory.class)
@@ -50,8 +50,8 @@ public abstract class TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin {
 	 * To prevent "item" -> "air" trades, if the result of a type aware trade is air, make sure no offer is created.
 	 */
 	@Inject(method = "create", at = @At(value = "NEW", target = "net/minecraft/village/TradeOffer"), cancellable = true)
-	private void failOnNullItem(Entity entity, Random random, CallbackInfoReturnable<TradeOffer> cir, @Local() class_9306 buyingItem) {
-		if (buyingItem.itemStack().isEmpty()) { // Will return true for an "empty" item stack that had null passed in the ctor
+	private void failOnNullItem(Entity entity, Random random, CallbackInfoReturnable<TradeOffer> cir, @Local() TradedItem tradedItem) {
+		if (tradedItem.itemStack().isEmpty()) { // Will return true for an "empty" item stack that had null passed in the ctor
 			cir.setReturnValue(null); // Return null to prevent creation of empty trades
 		}
 	}
diff --git a/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest1.java b/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest1.java
index f68d853b6..45e2d98c8 100644
--- a/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest1.java
+++ b/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest1.java
@@ -25,7 +25,6 @@ import java.util.Optional;
 
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 
-import net.minecraft.class_9306;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.passive.WanderingTraderEntity;
 import net.minecraft.item.Item;
@@ -37,6 +36,7 @@ import net.minecraft.util.Identifier;
 import net.minecraft.util.math.random.Random;
 import net.minecraft.village.TradeOffer;
 import net.minecraft.village.TradeOffers;
+import net.minecraft.village.TradedItem;
 import net.minecraft.village.VillagerProfession;
 
 import net.fabricmc.api.ModInitializer;
@@ -51,16 +51,16 @@ public class VillagerTypeTest1 implements ModInitializer {
 	public void onInitialize() {
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, (factories, rebalanced) -> {
 			Item scrap = rebalanced ? Items.NETHER_BRICK : Items.NETHERITE_SCRAP;
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLD_INGOT, 3), Optional.of(new class_9306(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLD_INGOT, 3), Optional.of(new TradedItem(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
 		});
 		// Toolsmith is not rebalanced yet
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.TOOLSMITH, 1, (factories, rebalanced) -> {
 			Item scrap = rebalanced ? Items.NETHER_BRICK : Items.NETHERITE_SCRAP;
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLD_INGOT, 3), Optional.of(new class_9306(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLD_INGOT, 3), Optional.of(new TradedItem(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
 		});
 
 		TradeOfferHelper.registerWanderingTraderOffers(1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLD_INGOT, 3), Optional.of(new class_9306(Items.NETHERITE_SCRAP, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.35F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLD_INGOT, 3), Optional.of(new TradedItem(Items.NETHERITE_SCRAP, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.35F)));
 		});
 
 		TradeOfferHelper.registerRebalancedWanderingTraderOffers(builder -> {
@@ -68,28 +68,28 @@ public class VillagerTypeTest1 implements ModInitializer {
 					FOOD_POOL_ID,
 					5,
 					Registries.ITEM.stream().filter(item -> item.getFoodComponent() != null).map(
-							item -> new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHERITE_INGOT), new ItemStack(item), 3, 4, 0.15F))
+							item -> new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHERITE_INGOT), new ItemStack(item), 3, 4, 0.15F))
 					).toList()
 			);
 			builder.addAll(
 					THING_POOL_ID,
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHERITE_INGOT), new ItemStack(Items.MOJANG_BANNER_PATTERN), 1, 4, 0.15F))
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHERITE_INGOT), new ItemStack(Items.MOJANG_BANNER_PATTERN), 1, 4, 0.15F))
 			);
 			builder.addOffersToPool(
 					TradeOfferHelper.WanderingTraderOffersBuilder.BUY_ITEMS_POOL,
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.BLAZE_POWDER, 1), new ItemStack(Items.EMERALD, 4), 3, 4, 0.15F)),
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHER_WART, 5), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F)),
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLDEN_CARROT, 4), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F))
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.BLAZE_POWDER, 1), new ItemStack(Items.EMERALD, 4), 3, 4, 0.15F)),
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHER_WART, 5), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F)),
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLDEN_CARROT, 4), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F))
 			);
 			builder.addOffersToPool(
 					TradeOfferHelper.WanderingTraderOffersBuilder.SELL_SPECIAL_ITEMS_POOL,
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.EMERALD, 6), new ItemStack(Items.BRUSH, 1), 1, 4, 0.15F)),
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 16), new ItemStack(Items.ELYTRA, 1), 1, 4, 0.15F)),
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.EMERALD, 3), new ItemStack(Items.LEAD, 2), 3, 4, 0.15F))
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.EMERALD, 6), new ItemStack(Items.BRUSH, 1), 1, 4, 0.15F)),
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 16), new ItemStack(Items.ELYTRA, 1), 1, 4, 0.15F)),
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.EMERALD, 3), new ItemStack(Items.LEAD, 2), 3, 4, 0.15F))
 			);
 			builder.addOffersToPool(
 					FOOD_POOL_ID,
-					new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHERITE_INGOT), new ItemStack(Items.EGG), 3, 4, 0.15F))
+					new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHERITE_INGOT), new ItemStack(Items.EGG), 3, 4, 0.15F))
 			);
 		});
 
diff --git a/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest2.java b/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest2.java
index 37baef189..0d7e5b0b7 100644
--- a/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest2.java
+++ b/fabric-object-builder-api-v1/src/testmod/java/net/fabricmc/fabric/test/object/builder/VillagerTypeTest2.java
@@ -16,10 +16,10 @@
 
 package net.fabricmc.fabric.test.object.builder;
 
-import net.minecraft.class_9306;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.village.TradeOffer;
+import net.minecraft.village.TradedItem;
 import net.minecraft.village.VillagerProfession;
 
 import net.fabricmc.api.ModInitializer;
@@ -32,22 +32,22 @@ public class VillagerTypeTest2 implements ModInitializer {
 	@Override
 	public void onInitialize() {
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.WEAPONSMITH, 1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 5), new ItemStack(Items.NETHERITE_INGOT), 3, 4, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 5), new ItemStack(Items.NETHERITE_INGOT), 3, 4, 0.15F)));
 		});
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 6), new ItemStack(Items.ELYTRA), 3, 4, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 6), new ItemStack(Items.ELYTRA), 3, 4, 0.15F)));
 		});
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 7), new ItemStack(Items.CHAINMAIL_BOOTS), 3, 4, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 7), new ItemStack(Items.CHAINMAIL_BOOTS), 3, 4, 0.15F)));
 		});
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 8), new ItemStack(Items.CHAINMAIL_CHESTPLATE), 3, 4, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 8), new ItemStack(Items.CHAINMAIL_CHESTPLATE), 3, 4, 0.15F)));
 		});
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 9), new ItemStack(Items.CHAINMAIL_HELMET), 3, 4, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 9), new ItemStack(Items.CHAINMAIL_HELMET), 3, 4, 0.15F)));
 		});
 		TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
-			factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 10), new ItemStack(Items.CHAINMAIL_LEGGINGS), 3, 4, 0.15F)));
+			factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 10), new ItemStack(Items.CHAINMAIL_LEGGINGS), 3, 4, 0.15F)));
 		});
 	}
 }
diff --git a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/item/InventorySlotWrapper.java b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/item/InventorySlotWrapper.java
index 2c46b901c..9dddfa9b3 100644
--- a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/item/InventorySlotWrapper.java
+++ b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/item/InventorySlotWrapper.java
@@ -163,7 +163,7 @@ class InventorySlotWrapper extends SingleStackStorage {
 					original.set(type, null);
 				}
 
-				original.copyComponentsFrom(currentStack.getComponents());
+				original.applyComponentsFrom(currentStack.getComponents());
 			}
 
 			// None is empty and the items and components match: just update the amount, and reuse the original stack.
diff --git a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/AbstractFurnaceBlockEntityMixin.java b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/AbstractFurnaceBlockEntityMixin.java
index 0826d53df..51c21050b 100644
--- a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/AbstractFurnaceBlockEntityMixin.java
+++ b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/AbstractFurnaceBlockEntityMixin.java
@@ -73,7 +73,7 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableContainerB
 			ItemStack stack = newStack;
 
 			// Update cook time if needed. Code taken from AbstractFurnaceBlockEntity#setStack.
-			boolean bl = !stack.isEmpty() && ItemStack.areItemsAndNbtEqual(stack, itemStack);
+			boolean bl = !stack.isEmpty() && ItemStack.areItemsAndComponentsEqual(stack, itemStack);
 
 			if (!bl) {
 				this.cookTimeTotal = getCookTime(this.world, (AbstractFurnaceBlockEntity) (Object) this);
diff --git a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/LootableContainerBlockEntityMixin.java b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/LockableContainerBlockEntityMixin.java
similarity index 74%
rename from fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/LootableContainerBlockEntityMixin.java
rename to fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/LockableContainerBlockEntityMixin.java
index 0e5e2cb1f..d0732f9b2 100644
--- a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/LootableContainerBlockEntityMixin.java
+++ b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/mixin/transfer/LockableContainerBlockEntityMixin.java
@@ -16,12 +16,13 @@
 
 package net.fabricmc.fabric.mixin.transfer;
 
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Unique;
 import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Redirect;
 
-import net.minecraft.block.entity.LootableContainerBlockEntity;
+import net.minecraft.block.entity.LockableContainerBlockEntity;
 import net.minecraft.item.ItemStack;
 
 import net.fabricmc.fabric.impl.transfer.item.SpecialLogicInventory;
@@ -29,18 +30,18 @@ import net.fabricmc.fabric.impl.transfer.item.SpecialLogicInventory;
 /**
  * Defer markDirty until the outer transaction close callback when setStack is called from an inventory wrapper.
  */
-@Mixin(LootableContainerBlockEntity.class)
-public class LootableContainerBlockEntityMixin implements SpecialLogicInventory {
+@Mixin(LockableContainerBlockEntity.class)
+public class LockableContainerBlockEntityMixin implements SpecialLogicInventory {
 	@Unique
 	private boolean fabric_suppressSpecialLogic = false;
 
-	@Redirect(
-			at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/LootableContainerBlockEntity;markDirty()V"),
+	@WrapOperation(
+			at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/LockableContainerBlockEntity;markDirty()V"),
 			method = "setStack(ILnet/minecraft/item/ItemStack;)V"
 	)
-	public void fabric_redirectMarkDirty(LootableContainerBlockEntity self) {
+	public void fabric_redirectMarkDirty(LockableContainerBlockEntity instance, Operation<Void> original) {
 		if (!fabric_suppressSpecialLogic) {
-			self.markDirty();
+			original.call(instance);
 		}
 	}
 
diff --git a/fabric-transfer-api-v1/src/main/resources/fabric-transfer-api-v1.mixins.json b/fabric-transfer-api-v1/src/main/resources/fabric-transfer-api-v1.mixins.json
index f74b8199b..363fb29ef 100644
--- a/fabric-transfer-api-v1/src/main/resources/fabric-transfer-api-v1.mixins.json
+++ b/fabric-transfer-api-v1/src/main/resources/fabric-transfer-api-v1.mixins.json
@@ -13,7 +13,7 @@
     "HopperBlockEntityMixin",
     "ItemMixin",
     "JukeboxBlockEntityMixin",
-    "LootableContainerBlockEntityMixin",
+    "LockableContainerBlockEntityMixin",
     "SimpleInventoryMixin"
   ]
 }
diff --git a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/gametests/VanillaStorageTests.java b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/gametests/VanillaStorageTests.java
index 6ceecae5f..5bbda91b8 100644
--- a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/gametests/VanillaStorageTests.java
+++ b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/gametests/VanillaStorageTests.java
@@ -119,6 +119,10 @@ public class VanillaStorageTests {
 		context.setBlockState(comparatorPos, Blocks.COMPARATOR.getDefaultState().with(ComparatorBlock.FACING, Direction.WEST));
 
 		try (Transaction transaction = Transaction.openOuter()) {
+			if (world.getBlockTickScheduler().isQueued(context.getAbsolutePos(comparatorPos), Blocks.COMPARATOR)) {
+				throw new GameTestException("Comparator should not have a tick scheduled.");
+			}
+
 			storage.insert(variant, 1000000, transaction);
 
 			// uncommitted insert should not schedule an update
diff --git a/gradle.properties b/gradle.properties
index 1c4218ef5..47d20b71f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx2560M
 org.gradle.parallel=true
 fabric.loom.multiProjectOptimisation=true
 
-version=0.96.7
-minecraft_version=24w09a
-yarn_version=+build.5
+version=0.96.8
+minecraft_version=24w10a
+yarn_version=+build.1
 loader_version=0.15.6
 installer_version=0.11.1
 
@@ -13,7 +13,7 @@ curseforge_minecraft_version=1.20.5-Snapshot
 
 # Do not manually update, use the bumpversions task:
 fabric-api-base-version=0.4.38
-fabric-api-lookup-api-v1-version=1.6.54
+fabric-api-lookup-api-v1-version=1.6.55
 fabric-biome-api-v1-version=13.0.20
 fabric-block-api-v1-version=1.0.18
 fabric-block-view-api-v2-version=1.0.6
@@ -21,18 +21,18 @@ fabric-blockrenderlayer-v1-version=1.1.48
 fabric-command-api-v1-version=1.2.43
 fabric-command-api-v2-version=2.2.22
 fabric-commands-v0-version=0.2.60
-fabric-content-registries-v0-version=6.0.10
+fabric-content-registries-v0-version=6.0.11
 fabric-crash-report-info-v1-version=0.2.25
-fabric-data-attachment-api-v1-version=1.1.5
-fabric-data-generation-api-v1-version=17.0.1
+fabric-data-attachment-api-v1-version=1.1.6
+fabric-data-generation-api-v1-version=17.0.2
 fabric-dimensions-v1-version=2.1.64
-fabric-entity-events-v1-version=1.6.4
+fabric-entity-events-v1-version=1.6.5
 fabric-events-interaction-v0-version=0.7.4
-fabric-events-lifecycle-v0-version=0.2.80
+fabric-events-lifecycle-v0-version=0.2.81
 fabric-game-rule-api-v1-version=1.0.48
 fabric-gametest-api-v1-version=1.3.9
-fabric-item-api-v1-version=5.0.0
-fabric-item-group-api-v1-version=4.0.29
+fabric-item-api-v1-version=5.0.1
+fabric-item-group-api-v1-version=4.0.30
 fabric-key-binding-api-v1-version=1.0.43
 fabric-keybindings-v0-version=0.2.41
 fabric-lifecycle-events-v1-version=2.3.0
@@ -42,10 +42,10 @@ fabric-mining-level-api-v1-version=2.1.68
 fabric-model-loading-api-v1-version=1.0.10
 fabric-models-v0-version=0.4.9
 fabric-networking-api-v1-version=4.0.3
-fabric-object-builder-api-v1-version=14.0.7
+fabric-object-builder-api-v1-version=14.0.8
 fabric-particles-v1-version=2.0.0
 fabric-recipe-api-v1-version=4.0.0
-fabric-registry-sync-v0-version=5.0.7
+fabric-registry-sync-v0-version=5.0.8
 fabric-renderer-api-v1-version=3.2.9
 fabric-renderer-indigo-version=1.5.9
 fabric-renderer-registries-v1-version=3.2.57
@@ -56,9 +56,9 @@ fabric-rendering-v1-version=4.2.0
 fabric-resource-conditions-api-v1-version=2.3.18
 fabric-resource-loader-v0-version=0.11.23
 fabric-screen-api-v1-version=2.0.19
-fabric-screen-handler-api-v1-version=1.3.64
+fabric-screen-handler-api-v1-version=1.3.65
 fabric-sound-api-v1-version=1.0.19
-fabric-transfer-api-v1-version=5.0.1
+fabric-transfer-api-v1-version=5.0.2
 fabric-transitive-access-wideners-v1-version=6.0.6
 fabric-convention-tags-v1-version=1.5.13
 fabric-client-tags-api-v1-version=1.1.9