From 54b4400cee545de0c099a5783e1638666f4ac406 Mon Sep 17 00:00:00 2001
From: modmuss50 <modmuss50@gmail.com>
Date: Wed, 7 Feb 2024 19:01:58 +0000
Subject: [PATCH] 24w06a

---
 .../test/lookup/compat/WrappedInventory.java  |  2 +-
 .../v1/provider/FabricRecipeProvider.java     |  2 +-
 ...abric-data-generation-api-v1.accesswidener |  2 +-
 .../DimensionOptionsRegistryHolderMixin.java  | 47 ++++++++++++++
 .../mixin/dimension/RegistryCodecsMixin.java  | 62 -------------------
 .../fabric-dimensions-v1.mixins.json          |  2 +-
 .../ClientPlayerInteractionManagerMixin.java  |  4 +-
 .../item/ArmorKnockbackResistanceTest.java    |  4 +-
 .../test/item/gametest/FoodGameTest.java      |  8 +--
 .../itemgroup/v1/FabricItemGroupEntries.java  |  8 +--
 .../client/ClientPlayNetworkHandlerMixin.java |  2 +-
 .../builder/PersistentStateManagerMixin.java  | 18 +++---
 .../event/registry/FabricRegistryBuilder.java |  3 +-
 .../sync/SerializableRegistriesMixin.java     |  3 +-
 .../registry/sync/SimpleRegistryMixin.java    |  3 +-
 .../rendering/TooltipComponentTestInit.java   |  4 +-
 .../resource/loader/ModNioResourcePack.java   | 30 ++++++---
 .../loader/ModResourcePackCreator.java        | 29 +++++----
 .../loader/ModResourcePackFactory.java        |  5 +-
 .../loader/PlaceholderResourcePack.java       | 18 ++++--
 .../loader/ResourceManagerHelperImpl.java     | 23 +++++--
 .../loader/ResourcePackProfileMixin.java      | 10 +--
 .../loader/unit/ModResourcePackUtilTests.java | 21 ++++---
 .../AbstractFurnaceBlockEntityMixin.java      |  2 +-
 ...ransitive-access-wideners-v1.accesswidener |  2 +-
 gradle.properties                             | 48 +++++++-------
 26 files changed, 197 insertions(+), 165 deletions(-)
 create mode 100644 fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/DimensionOptionsRegistryHolderMixin.java
 delete mode 100644 fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/RegistryCodecsMixin.java

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 cca461275..ec6a875fa 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.canCombine(stack, input)) {
+				if (stack.isEmpty() || ItemStack.areItemsAndNbtEqual(stack, input)) {
 					int remainingSpace = Math.min(inv.getMaxCountPerStack(), stack.getItem().getMaxCount()) - stack.getCount();
 					int inserted = Math.min(remainingSpace, input.getCount());
 
diff --git a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricRecipeProvider.java b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricRecipeProvider.java
index 66fbd6908..57881e430 100644
--- a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricRecipeProvider.java
+++ b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricRecipeProvider.java
@@ -87,7 +87,7 @@ public abstract class FabricRecipeProvider extends RecipeProvider {
 	}
 
 	@Override
-	public CompletableFuture<?> method_56888(DataWriter writer, RegistryWrapper.WrapperLookup wrapperLookup) {
+	public CompletableFuture<?> run(DataWriter writer, RegistryWrapper.WrapperLookup wrapperLookup) {
 		Set<Identifier> generatedRecipes = Sets.newHashSet();
 		List<CompletableFuture<?>> list = new ArrayList<>();
 		generate(new RecipeExporter() {
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 bd95c495a..2a0dc51b5 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
@@ -64,7 +64,7 @@ transitive-accessible field net/minecraft/data/server/loottable/BlockLootTableGe
 
 ### Generated access wideners below
 
-transitive-accessible	method	net/minecraft/data/server/recipe/RecipeProvider	method_56888	(Lnet/minecraft/data/DataWriter;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Ljava/util/concurrent/CompletableFuture;
+transitive-accessible	method	net/minecraft/data/server/recipe/RecipeProvider	run	(Lnet/minecraft/data/DataWriter;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Ljava/util/concurrent/CompletableFuture;
 transitive-accessible	method	net/minecraft/data/server/recipe/RecipeProvider	saveRecipeAdvancement	(Lnet/minecraft/data/DataWriter;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;Lnet/minecraft/advancement/AdvancementEntry;)Ljava/util/concurrent/CompletableFuture;
 transitive-accessible	method	net/minecraft/data/server/recipe/RecipeProvider	generate	(Lnet/minecraft/data/server/recipe/RecipeExporter;)V
 transitive-accessible	method	net/minecraft/data/server/recipe/RecipeProvider	generateFamilies	(Lnet/minecraft/data/server/recipe/RecipeExporter;Lnet/minecraft/resource/featuretoggle/FeatureSet;)V
diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/DimensionOptionsRegistryHolderMixin.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/DimensionOptionsRegistryHolderMixin.java
new file mode 100644
index 000000000..7b156f2c0
--- /dev/null
+++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/DimensionOptionsRegistryHolderMixin.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016, 2017, 2018, 2019 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.fabric.mixin.dimension;
+
+import com.mojang.datafixers.Products;
+import com.mojang.datafixers.kinds.App;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+import net.minecraft.registry.RegistryKey;
+import net.minecraft.registry.RegistryKeys;
+import net.minecraft.world.dimension.DimensionOptions;
+import net.minecraft.world.dimension.DimensionOptionsRegistryHolder;
+
+import net.fabricmc.fabric.impl.dimension.FailSoftMapCodec;
+
+@Mixin(DimensionOptionsRegistryHolder.class)
+public class DimensionOptionsRegistryHolderMixin {
+	/**
+	 * Fix the issue that cannot load world after uninstalling a dimension mod/datapack.
+	 * After uninstalling a dimension mod/datapack, the dimension config in `level.dat` file cannot be deserialized.
+	 * The solution is to make it fail-soft.
+	 */
+	@Redirect(method = "method_45516", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/codecs/RecordCodecBuilder$Instance;group(Lcom/mojang/datafixers/kinds/App;)Lcom/mojang/datafixers/Products$P1;"))
+	private static Products.P1 useFailSoftMap(RecordCodecBuilder.Instance instance, App app) {
+		return instance.group(
+				new FailSoftMapCodec<>(RegistryKey.createCodec(RegistryKeys.DIMENSION), DimensionOptions.CODEC)
+						.fieldOf("dimensions").forGetter(DimensionOptionsRegistryHolder::dimensions)
+		);
+	}
+}
diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/RegistryCodecsMixin.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/RegistryCodecsMixin.java
deleted file mode 100644
index cb395ae05..000000000
--- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/dimension/RegistryCodecsMixin.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2016, 2017, 2018, 2019 FabricMC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.fabricmc.fabric.mixin.dimension;
-
-import java.util.Map;
-
-import com.mojang.serialization.Codec;
-import com.mojang.serialization.Lifecycle;
-import com.mojang.serialization.codecs.UnboundedMapCodec;
-import org.apache.commons.lang3.Validate;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-
-import net.minecraft.registry.Registry;
-import net.minecraft.registry.RegistryCodecs;
-import net.minecraft.registry.RegistryKey;
-
-import net.fabricmc.fabric.impl.dimension.FailSoftMapCodec;
-
-@Mixin(RegistryCodecs.class)
-public class RegistryCodecsMixin {
-	/**
-	 * Fix the issue that cannot load world after uninstalling a dimension mod/datapack.
-	 * After uninstalling a dimension mod/datapack, the dimension config in `level.dat` file cannot be deserialized.
-	 * The solution is to make it fail-soft.
-	 * Currently (1.19.3), `createKeyedRegistryCodec` is only used in dimension codec.
-	 */
-	@ModifyVariable(
-			method = "createKeyedRegistryCodec",
-			at = @At(
-					value = "INVOKE_ASSIGN",
-					target = "Lcom/mojang/serialization/Codec;unboundedMap(Lcom/mojang/serialization/Codec;Lcom/mojang/serialization/Codec;)Lcom/mojang/serialization/codecs/UnboundedMapCodec;",
-					remap = false
-			),
-			ordinal = 1 // there are two local variables of `Codec` type. Modify the second.
-	)
-	private static <E> Codec<Map<RegistryKey<E>, E>> modifyCodecLocalVariable(
-			Codec<Map<RegistryKey<E>, E>> originalVariable,
-			RegistryKey<? extends Registry<E>> registryRef,
-			Lifecycle lifecycle, Codec<E> elementCodec
-	) {
-		// make sure that it's not modifying the wrong variable
-		Validate.isTrue(originalVariable instanceof UnboundedMapCodec<?, ?>);
-
-		return new FailSoftMapCodec<>(RegistryKey.createCodec(registryRef), elementCodec);
-	}
-}
diff --git a/fabric-dimensions-v1/src/main/resources/fabric-dimensions-v1.mixins.json b/fabric-dimensions-v1/src/main/resources/fabric-dimensions-v1.mixins.json
index d8d121008..7b1e09ec5 100644
--- a/fabric-dimensions-v1/src/main/resources/fabric-dimensions-v1.mixins.json
+++ b/fabric-dimensions-v1/src/main/resources/fabric-dimensions-v1.mixins.json
@@ -4,7 +4,7 @@
   "compatibilityLevel": "JAVA_17",
   "mixins": [
     "EntityMixin",
-    "RegistryCodecsMixin",
+    "DimensionOptionsRegistryHolderMixin",
     "Schema2832Mixin",
     "TaggedChoiceMixin",
     "TaggedChoiceTypeMixin"
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 e1bb1060c..17bb83aa7 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;canCombine(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
+					target = "Lnet/minecraft/item/ItemStack;areItemsAndNbtEqual(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
 			),
 			method = "isCurrentlyBreaking"
 	)
 	private boolean fabricItemContinueBlockBreakingInject(ItemStack stack, ItemStack otherStack) {
-		boolean stackUnchanged = ItemStack.canCombine(stack, this.selectedStack);
+		boolean stackUnchanged = ItemStack.areItemsAndNbtEqual(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/ArmorKnockbackResistanceTest.java b/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/ArmorKnockbackResistanceTest.java
index 346ca08dc..11dbcbdc6 100644
--- a/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/ArmorKnockbackResistanceTest.java
+++ b/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/ArmorKnockbackResistanceTest.java
@@ -34,7 +34,7 @@ import net.minecraft.util.Util;
 import net.fabricmc.api.ModInitializer;
 
 public class ArmorKnockbackResistanceTest implements ModInitializer {
-	private static final RegistryEntry<ArmorMaterial> WOOD_ARMOR = Registry.registerReference(Registries.field_48976, new Identifier("fabric-item-api-v1-testmod", "wood"), createTestArmorMaterial());
+	private static final RegistryEntry<ArmorMaterial> WOOD_ARMOR = Registry.registerReference(Registries.ARMOR_MATERIAL, new Identifier("fabric-item-api-v1-testmod", "wood"), createTestArmorMaterial());
 
 	@Override
 	public void onInitialize() {
@@ -53,7 +53,7 @@ public class ArmorKnockbackResistanceTest implements ModInitializer {
 			0,
 			SoundEvents.ITEM_ARMOR_EQUIP_LEATHER,
 				() -> Ingredient.ofItems(Items.LEATHER),
-			List.of(new ArmorMaterial.class_9196(new Identifier("fabric-item-api-v1-testmod", "wood"))),
+			List.of(new ArmorMaterial.Layer(new Identifier("fabric-item-api-v1-testmod", "wood"))),
 			0,
 			0.5F
 		);
diff --git a/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/FoodGameTest.java b/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/FoodGameTest.java
index afb3948f6..8f8652401 100644
--- a/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/FoodGameTest.java
+++ b/fabric-item-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/gametest/FoodGameTest.java
@@ -38,7 +38,7 @@ import net.fabricmc.fabric.test.item.FoodGameInitializer;
 public final class FoodGameTest implements FabricGameTest {
 	@GameTest(templateName = EMPTY_STRUCTURE)
 	public void damageFoodTest(TestContext context) {
-		PlayerEntity player = context.createMockCreativePlayer(GameMode.SURVIVAL);
+		PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL);
 		HungerManager hungerManager = player.getHungerManager();
 
 		for (int damage : new int[]{0, 1, 10, 19}) {
@@ -61,7 +61,7 @@ public final class FoodGameTest implements FabricGameTest {
 
 	@GameTest(templateName = EMPTY_STRUCTURE)
 	public void nameFoodTest(TestContext context) {
-		PlayerEntity player = context.createMockCreativePlayer(GameMode.SURVIVAL);
+		PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL);
 		HungerManager hungerManager = player.getHungerManager();
 		hungerManager.setFoodLevel(0);
 		hungerManager.setSaturationLevel(0);
@@ -80,9 +80,9 @@ public final class FoodGameTest implements FabricGameTest {
 
 	@GameTest(templateName = EMPTY_STRUCTURE)
 	public void nameMeatTest(TestContext context) {
-		PlayerEntity player = context.createMockCreativePlayer(GameMode.SURVIVAL);
+		PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL);
 		WolfEntity wolf = context.spawnEntity(EntityType.WOLF, context.getRelative(Vec3d.ZERO));
-		wolf.setTamed(true);
+		wolf.setTamed(true, true);
 		wolf.setOwner(player);
 		wolf.setHealth(1f);
 		ItemStack meat = FoodGameInitializer.NAME.getDefaultStack();
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 f43082aee..b8a1eb40d 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
@@ -214,7 +214,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
 	/**
 	 * Adds stacks after an existing stack in the group, or at the end, if the stack isn't in the group.
 	 *
-	 * @param afterLast  Add {@code newStacks} after the last group entry matching this stack (compared using {@link ItemStack#canCombine}).
+	 * @param afterLast  Add {@code newStacks} after the last group entry matching this stack (compared using {@link ItemStack#areItemsAndNbtEqual}).
 	 * @param newStacks  The stacks to add. Only {@linkplain #isEnabled(ItemStack) enabled} stacks will be added.
 	 * @param visibility Determines whether the stack will be shown in the tab itself, returned
 	 *                   for searches, or both.
@@ -331,7 +331,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
 	/**
 	 * Adds stacks before an existing stack to the group, or at the end, if the stack isn't in the group.
 	 *
-	 * @param beforeFirst Add {@code newStacks} before the first group entry matching this stack (compared using {@link ItemStack#canCombine}).
+	 * @param beforeFirst Add {@code newStacks} before the first group entry matching this stack (compared using {@link ItemStack#areItemsAndNbtEqual}).
 	 * @param newStacks   The stacks to add. Only {@linkplain #isEnabled(ItemStack) enabled} stacks will be added.
 	 * @param visibility  Determines whether the stack will be shown in the tab itself, returned
 	 *                    for searches, or both.
@@ -431,7 +431,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
 		checkStacks(newStacks);
 
 		for (int i = 0; i < addTo.size(); i++) {
-			if (ItemStack.canCombine(anchor, addTo.get(i))) {
+			if (ItemStack.areItemsAndNbtEqual(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.canCombine(anchor, addTo.get(i))) {
+			if (ItemStack.areItemsAndNbtEqual(anchor, addTo.get(i))) {
 				addTo.subList(i + 1, i + 1).addAll(newStacks);
 				return;
 			}
diff --git a/fabric-lifecycle-events-v1/src/client/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientPlayNetworkHandlerMixin.java b/fabric-lifecycle-events-v1/src/client/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientPlayNetworkHandlerMixin.java
index a88d419c2..eb57b48ec 100644
--- a/fabric-lifecycle-events-v1/src/client/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientPlayNetworkHandlerMixin.java
+++ b/fabric-lifecycle-events-v1/src/client/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientPlayNetworkHandlerMixin.java
@@ -99,7 +99,7 @@ abstract class ClientPlayNetworkHandlerMixin {
 	 * Also invoked during GameJoin, but before Networking API fires the Ready event.
 	 */
 	@SuppressWarnings("ConstantConditions")
-	@Inject(method = "refreshTagBasedData", at = @At("RETURN"))
+	@Inject(method = "onSynchronizeTags", at = @At("RETURN"))
 	private void hookOnSynchronizeTags(CallbackInfo ci) {
 		ClientPlayNetworkHandler self = (ClientPlayNetworkHandler) (Object) this;
 		CommonLifecycleEvents.TAGS_LOADED.invoker().onTagsLoaded(self.getRegistryManager(), true);
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/PersistentStateManagerMixin.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/PersistentStateManagerMixin.java
index e264ec35e..6765ae701 100644
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/PersistentStateManagerMixin.java
+++ b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/PersistentStateManagerMixin.java
@@ -16,15 +16,11 @@
 
 package net.fabricmc.fabric.mixin.object.builder;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.PushbackInputStream;
-
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
+import com.mojang.datafixers.DataFixer;
 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.CallbackInfoReturnable;
-import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
 
 import net.minecraft.datafixer.DataFixTypes;
 import net.minecraft.nbt.NbtCompound;
@@ -35,10 +31,12 @@ class PersistentStateManagerMixin {
 	/**
 	 * Handle mods passing a null DataFixTypes to a PersistentState.Type.
 	 */
-	@Inject(method = "readNbt", at = @At(value = "INVOKE", target = "Lnet/minecraft/nbt/NbtHelper;getDataVersion(Lnet/minecraft/nbt/NbtCompound;I)I"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD)
-	private void handleNullDataFixType(String id, DataFixTypes dataFixTypes, int currentSaveVersion, CallbackInfoReturnable<NbtCompound> cir, File file, FileInputStream fileInputStream, PushbackInputStream pushbackInputStream, NbtCompound nbtCompound) {
+	@WrapOperation(method = "readNbt", at = @At(value = "INVOKE", target = "Lnet/minecraft/datafixer/DataFixTypes;update(Lcom/mojang/datafixers/DataFixer;Lnet/minecraft/nbt/NbtCompound;II)Lnet/minecraft/nbt/NbtCompound;"))
+	private NbtCompound handleNullDataFixType(DataFixTypes dataFixTypes, DataFixer dataFixer, NbtCompound nbt, int oldVersion, int newVersion, Operation<NbtCompound> original) {
 		if (dataFixTypes == null) {
-			cir.setReturnValue(nbtCompound);
+			return nbt;
 		}
+
+		return original.call(dataFixTypes, dataFixer, nbt, oldVersion, newVersion);
 	}
 }
diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java
index 0a35a321a..820c4ecc0 100644
--- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java
+++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java
@@ -20,6 +20,7 @@ import java.util.EnumSet;
 
 import com.mojang.serialization.Lifecycle;
 
+import net.minecraft.class_9248;
 import net.minecraft.registry.DefaultedRegistry;
 import net.minecraft.registry.MutableRegistry;
 import net.minecraft.registry.Registry;
@@ -145,7 +146,7 @@ public final class FabricRegistryBuilder<T, R extends MutableRegistry<T>> {
 		}
 
 		//noinspection unchecked
-		RegistriesAccessor.getROOT().add((RegistryKey<MutableRegistry<?>>) key, registry, Lifecycle.stable());
+		RegistriesAccessor.getROOT().add((RegistryKey<MutableRegistry<?>>) key, registry, class_9248.field_49136);
 
 		return registry;
 	}
diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SerializableRegistriesMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SerializableRegistriesMixin.java
index 29c55535c..8a130a2d2 100644
--- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SerializableRegistriesMixin.java
+++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SerializableRegistriesMixin.java
@@ -16,6 +16,7 @@
 
 package net.fabricmc.fabric.mixin.registry.sync;
 
+import java.util.Set;
 import java.util.function.BiConsumer;
 
 import com.mojang.serialization.DynamicOps;
@@ -54,7 +55,7 @@ abstract class SerializableRegistriesMixin {
 	 */
 	@Dynamic("method_56597: Optional.ifPresent in serialize")
 	@Inject(method = "method_56596", at = @At("HEAD"), cancellable = true)
-	private static void filterNonSyncedEntriesAgain(RegistryLoader.Entry entry, DynamicOps dynamicOps, BiConsumer biConsumer, Registry registry, CallbackInfo ci) {
+	private static void filterNonSyncedEntriesAgain(Set set, RegistryLoader.Entry entry, DynamicOps dynamicOps, BiConsumer biConsumer, Registry registry, CallbackInfo ci) {
 		boolean canSkip = DynamicRegistriesImpl.SKIP_EMPTY_SYNC_REGISTRIES.contains(registry.getKey());
 
 		if (canSkip && registry.size() == 0) {
diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java
index 5c45e5ff8..a2f9b9222 100644
--- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java
+++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java
@@ -46,6 +46,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
+import net.minecraft.class_9248;
 import net.minecraft.registry.MutableRegistry;
 import net.minecraft.registry.Registry;
 import net.minecraft.registry.RegistryKey;
@@ -150,7 +151,7 @@ public abstract class SimpleRegistryMixin<T> implements MutableRegistry<T>, Rema
 	}
 
 	@Inject(method = "add", at = @At("RETURN"))
-	private void set(RegistryKey<T> key, T entry, Lifecycle lifecycle, CallbackInfoReturnable<RegistryEntry.Reference<T>> info) {
+	private void set(RegistryKey<T> key, T entry, class_9248 arg, CallbackInfoReturnable<RegistryEntry.Reference<T>> info) {
 		// We need to restore the 1.19 behavior of binding the value to references immediately.
 		// Unfrozen registries cannot be interacted with otherwise, because the references would throw when
 		// trying to access their values.
diff --git a/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/TooltipComponentTestInit.java b/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/TooltipComponentTestInit.java
index 55401ffaa..97fd6b910 100644
--- a/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/TooltipComponentTestInit.java
+++ b/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/TooltipComponentTestInit.java
@@ -38,7 +38,7 @@ import net.fabricmc.api.ModInitializer;
 
 public class TooltipComponentTestInit implements ModInitializer {
 	public static Item CUSTOM_TOOLTIP_ITEM = new CustomTooltipItem();
-	public static RegistryEntry<ArmorMaterial> TEST_ARMOR_MATERIAL = Registry.registerReference(Registries.field_48976, new Identifier("fabric-rendering-v1-testmod", "test_material"), createTestArmorMaterial());
+	public static RegistryEntry<ArmorMaterial> TEST_ARMOR_MATERIAL = Registry.registerReference(Registries.ARMOR_MATERIAL, new Identifier("fabric-rendering-v1-testmod", "test_material"), createTestArmorMaterial());
 	public static Item CUSTOM_ARMOR_ITEM = new ArmorItem(TEST_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Settings());
 
 	@Override
@@ -72,7 +72,7 @@ public class TooltipComponentTestInit implements ModInitializer {
 			0,
 			SoundEvents.ITEM_ARMOR_EQUIP_LEATHER,
 				() -> Ingredient.ofItems(Items.LEATHER),
-			List.of(new ArmorMaterial.class_9196(new Identifier("fabric-rendering-v1-testmod", "test_material"))),
+			List.of(new ArmorMaterial.Layer(new Identifier("fabric-rendering-v1-testmod", "test_material"))),
 			0,
 			0
 		);
diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModNioResourcePack.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModNioResourcePack.java
index db8e0d7cb..dcc455174 100644
--- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModNioResourcePack.java
+++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModNioResourcePack.java
@@ -34,6 +34,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -41,11 +42,13 @@ import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import net.minecraft.class_9224;
 import net.minecraft.resource.AbstractFileResourcePack;
 import net.minecraft.resource.InputSupplier;
 import net.minecraft.resource.ResourcePack;
 import net.minecraft.resource.ResourceType;
 import net.minecraft.resource.metadata.ResourceMetadataReader;
+import net.minecraft.text.Text;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.PathUtil;
 
@@ -65,6 +68,7 @@ public class ModNioResourcePack implements ResourcePack, ModResourcePack {
 	private final ResourceType type;
 	private final ResourcePackActivationType activationType;
 	private final Map<ResourceType, Set<String>> namespaces;
+	private final class_9224 metadata;
 	/**
 	 * Whether the pack is bundled and loaded by default, as opposed to registered built-in packs.
 	 * @see ModResourcePackUtil#appendModResourcePacks(List, ResourceType, String)
@@ -95,12 +99,21 @@ public class ModNioResourcePack implements ResourcePack, ModResourcePack {
 		if (paths.isEmpty()) return null;
 
 		String packId = subPath == null ? id : id + "_" + subPath;
-		ModNioResourcePack ret = new ModNioResourcePack(packId, mod, paths, type, activationType, modBundled);
+		Text displayName = subPath == null
+				? Text.translatable("pack.name.fabricMod", mod.getMetadata().getName())
+				: Text.translatable("pack.name.fabricMod.subPack", mod.getMetadata().getName(), Text.translatable("resourcePack." + subPath + ".name"));
+		class_9224 metadata = new class_9224(
+				packId,
+				displayName,
+				ModResourcePackCreator.RESOURCE_PACK_SOURCE,
+				Optional.empty()
+		);
+		ModNioResourcePack ret = new ModNioResourcePack(packId, mod, paths, type, activationType, modBundled, metadata);
 
 		return ret.getNamespaces(type).isEmpty() ? null : ret;
 	}
 
-	private ModNioResourcePack(String id, ModContainer mod, List<Path> paths, ResourceType type, ResourcePackActivationType activationType, boolean modBundled) {
+	private ModNioResourcePack(String id, ModContainer mod, List<Path> paths, ResourceType type, ResourcePackActivationType activationType, boolean modBundled, class_9224 metadata) {
 		this.id = id;
 		this.mod = mod;
 		this.basePaths = paths;
@@ -108,6 +121,7 @@ public class ModNioResourcePack implements ResourcePack, ModResourcePack {
 		this.activationType = activationType;
 		this.modBundled = modBundled;
 		this.namespaces = readNamespaces(paths, mod.getMetadata().getId());
+		this.metadata = metadata;
 	}
 
 	@Override
@@ -115,7 +129,7 @@ public class ModNioResourcePack implements ResourcePack, ModResourcePack {
 		// See DirectoryResourcePack.
 		return new ModNioResourcePack(id, mod, basePaths.stream().map(
 				path -> path.resolve(overlay)
-		).toList(), type, activationType, modBundled);
+		).toList(), type, activationType, modBundled, metadata);
 	}
 
 	static Map<ResourceType, Set<String>> readNamespaces(List<Path> paths, String modId) {
@@ -270,6 +284,11 @@ public class ModNioResourcePack implements ResourcePack, ModResourcePack {
 		}
 	}
 
+	@Override
+	public class_9224 method_56926() {
+		return metadata;
+	}
+
 	@Override
 	public void close() {
 	}
@@ -288,11 +307,6 @@ public class ModNioResourcePack implements ResourcePack, ModResourcePack {
 		return id;
 	}
 
-	@Override
-	public boolean isAlwaysStable() {
-		return this.modBundled;
-	}
-
 	private static boolean exists(Path path) {
 		// NIO Files.exists is notoriously slow when checking the file system
 		return path.getFileSystem() == DEFAULT_FS ? path.toFile().exists() : Files.exists(path);
diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackCreator.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackCreator.java
index b56ab9449..e5e1c2551 100644
--- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackCreator.java
+++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackCreator.java
@@ -18,6 +18,7 @@ package net.fabricmc.fabric.impl.resource.loader;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
@@ -25,6 +26,8 @@ import java.util.function.Predicate;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.VisibleForTesting;
 
+import net.minecraft.class_9224;
+import net.minecraft.class_9225;
 import net.minecraft.resource.ResourcePackProfile;
 import net.minecraft.resource.ResourcePackProvider;
 import net.minecraft.resource.ResourcePackSource;
@@ -65,6 +68,8 @@ public class ModResourcePackCreator implements ResourcePackProvider {
 		}
 	};
 	public static final ModResourcePackCreator CLIENT_RESOURCE_PACK_PROVIDER = new ModResourcePackCreator(ResourceType.CLIENT_RESOURCES);
+	private static final class_9225 ACTIVATION_INFO = new class_9225(true, ResourcePackProfile.InsertionPosition.TOP, false);
+
 	private final ResourceType type;
 
 	public ModResourcePackCreator(ResourceType type) {
@@ -90,14 +95,18 @@ public class ModResourcePackCreator implements ResourcePackProvider {
 			4. User resource packs
 		 */
 
-		consumer.accept(ResourcePackProfile.create(
+		class_9224 metadata = new class_9224(
 				FABRIC,
 				Text.translatable("pack.name.fabricMods"),
-				true,
-				new PlaceholderResourcePack.Factory(this.type),
+				RESOURCE_PACK_SOURCE,
+				Optional.empty()
+		);
+
+		consumer.accept(ResourcePackProfile.create(
+				metadata,
+				new PlaceholderResourcePack.Factory(this.type, metadata),
 				this.type,
-				ResourcePackProfile.InsertionPosition.TOP,
-				RESOURCE_PACK_SOURCE
+				ACTIVATION_INFO
 		));
 
 		// Build a list of mod resource packs.
@@ -118,17 +127,11 @@ public class ModResourcePackCreator implements ResourcePackProvider {
 		ModResourcePackUtil.appendModResourcePacks(packs, this.type, subPath);
 
 		for (ModResourcePack pack : packs) {
-			Text displayName = subPath == null
-					? Text.translatable("pack.name.fabricMod", pack.getFabricModMetadata().getName())
-					: Text.translatable("pack.name.fabricMod.subPack", pack.getFabricModMetadata().getName(), Text.translatable("resourcePack." + subPath + ".name"));
 			ResourcePackProfile profile = ResourcePackProfile.create(
-					pack.getName(),
-					displayName,
-					subPath == null,
+					pack.method_56926(),
 					new ModResourcePackFactory(pack),
 					this.type,
-					ResourcePackProfile.InsertionPosition.TOP,
-					RESOURCE_PACK_SOURCE
+					ACTIVATION_INFO
 			);
 
 			if (profile != null) {
diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackFactory.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackFactory.java
index 8282470ce..ac855d127 100644
--- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackFactory.java
+++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ModResourcePackFactory.java
@@ -19,6 +19,7 @@ package net.fabricmc.fabric.impl.resource.loader;
 import java.util.ArrayList;
 import java.util.List;
 
+import net.minecraft.class_9224;
 import net.minecraft.resource.OverlayResourcePack;
 import net.minecraft.resource.ResourcePack;
 import net.minecraft.resource.ResourcePackProfile;
@@ -27,12 +28,12 @@ import net.fabricmc.fabric.api.resource.ModResourcePack;
 
 public record ModResourcePackFactory(ModResourcePack pack) implements ResourcePackProfile.PackFactory {
 	@Override
-	public ResourcePack open(String name) {
+	public ResourcePack open(class_9224 var1) {
 		return pack;
 	}
 
 	@Override
-	public ResourcePack openWithOverlays(String name, ResourcePackProfile.Metadata metadata) {
+	public ResourcePack openWithOverlays(class_9224 var1, ResourcePackProfile.Metadata metadata) {
 		if (metadata.overlays().isEmpty()) {
 			return pack;
 		} else {
diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/PlaceholderResourcePack.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/PlaceholderResourcePack.java
index 18b578cd3..e6b8e60ad 100644
--- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/PlaceholderResourcePack.java
+++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/PlaceholderResourcePack.java
@@ -25,6 +25,7 @@ import org.apache.commons.io.IOUtils;
 import org.jetbrains.annotations.Nullable;
 
 import net.minecraft.SharedConstants;
+import net.minecraft.class_9224;
 import net.minecraft.resource.InputSupplier;
 import net.minecraft.resource.ResourcePack;
 import net.minecraft.resource.ResourcePackProfile;
@@ -35,7 +36,7 @@ import net.minecraft.resource.metadata.ResourceMetadataReader;
 import net.minecraft.text.Text;
 import net.minecraft.util.Identifier;
 
-public record PlaceholderResourcePack(ResourceType type) implements ResourcePack {
+public record PlaceholderResourcePack(ResourceType type, class_9224 metadata) implements ResourcePack {
 	private static final Text DESCRIPTION_TEXT = Text.translatable("pack.description.modResources");
 
 	public PackResourceMetadata getMetadata() {
@@ -87,6 +88,11 @@ public record PlaceholderResourcePack(ResourceType type) implements ResourcePack
 		return ResourceMetadataMap.of(PackResourceMetadata.SERIALIZER, getMetadata()).get(metaReader);
 	}
 
+	@Override
+	public class_9224 method_56926() {
+		return metadata;
+	}
+
 	@Override
 	public String getName() {
 		return ModResourcePackCreator.FABRIC;
@@ -96,15 +102,15 @@ public record PlaceholderResourcePack(ResourceType type) implements ResourcePack
 	public void close() {
 	}
 
-	public record Factory(ResourceType type) implements ResourcePackProfile.PackFactory {
+	public record Factory(ResourceType type, class_9224 metadata) implements ResourcePackProfile.PackFactory {
 		@Override
-		public ResourcePack open(String name) {
-			return new PlaceholderResourcePack(this.type);
+		public ResourcePack open(class_9224 var1) {
+			return new PlaceholderResourcePack(this.type, metadata);
 		}
 
 		@Override
-		public ResourcePack openWithOverlays(String name, ResourcePackProfile.Metadata metadata) {
-			return open(name);
+		public ResourcePack openWithOverlays(class_9224 var1, ResourcePackProfile.Metadata metadata) {
+			return open(var1);
 		}
 	}
 }
diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ResourceManagerHelperImpl.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ResourceManagerHelperImpl.java
index d45c6d8ce..808b97c25 100644
--- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ResourceManagerHelperImpl.java
+++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/ResourceManagerHelperImpl.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.function.Consumer;
 
@@ -32,6 +33,8 @@ import com.google.common.collect.Lists;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import net.minecraft.class_9224;
+import net.minecraft.class_9225;
 import net.minecraft.resource.ResourcePack;
 import net.minecraft.resource.ResourcePackProfile;
 import net.minecraft.resource.ResourceReloader;
@@ -112,18 +115,30 @@ public class ResourceManagerHelperImpl implements ResourceManagerHelper {
 			// Add the built-in pack only if namespaces for the specified resource type are present.
 			if (!pack.getNamespaces(resourceType).isEmpty()) {
 				// Make the resource pack profile for built-in pack, should never be always enabled.
-				ResourcePackProfile profile = ResourcePackProfile.create(entry.getRight().getName(), entry.getLeft(), pack.getActivationType() == ResourcePackActivationType.ALWAYS_ENABLED, new ResourcePackProfile.PackFactory() {
+				class_9224 info = new class_9224(
+						entry.getRight().getName(),
+						entry.getLeft(),
+						new BuiltinModResourcePackSource(pack.getFabricModMetadata().getName()),
+						Optional.empty()
+				);
+				class_9225 info2 = new class_9225(
+						pack.getActivationType() == ResourcePackActivationType.ALWAYS_ENABLED,
+						ResourcePackProfile.InsertionPosition.TOP,
+						false // TODO check me
+				);
+
+				ResourcePackProfile profile = ResourcePackProfile.create(info, new ResourcePackProfile.PackFactory() {
 					@Override
-					public ResourcePack open(String name) {
+					public ResourcePack open(class_9224 var1) {
 						return entry.getRight();
 					}
 
 					@Override
-					public ResourcePack openWithOverlays(String string, ResourcePackProfile.Metadata metadata) {
+					public ResourcePack openWithOverlays(class_9224 var1, ResourcePackProfile.Metadata metadata) {
 						// Don't support overlays in builtin res packs.
 						return entry.getRight();
 					}
-				}, resourceType, ResourcePackProfile.InsertionPosition.TOP, new BuiltinModResourcePackSource(pack.getFabricModMetadata().getName()));
+				}, resourceType, info2);
 				consumer.accept(profile);
 			}
 		}
diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/ResourcePackProfileMixin.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/ResourcePackProfileMixin.java
index a9c2ffec7..ee1ad19ec 100644
--- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/ResourcePackProfileMixin.java
+++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/ResourcePackProfileMixin.java
@@ -19,7 +19,6 @@ package net.fabricmc.fabric.mixin.resource.loader;
 import java.util.Set;
 import java.util.function.Predicate;
 
-import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.Unique;
@@ -27,6 +26,7 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
+import net.minecraft.class_9224;
 import net.minecraft.resource.ResourcePack;
 import net.minecraft.resource.ResourcePackProfile;
 import net.minecraft.resource.ResourcePackSource;
@@ -45,15 +45,15 @@ import net.fabricmc.fabric.impl.resource.loader.ResourcePackSourceTracker;
 abstract class ResourcePackProfileMixin implements FabricResourcePackProfile {
 	@Unique
 	private static final Predicate<Set<String>> DEFAULT_PARENT_PREDICATE = parents -> true;
-	@Shadow
-	@Final
-	private ResourcePackSource source;
 	@Unique
 	private Predicate<Set<String>> parentsPredicate = DEFAULT_PARENT_PREDICATE;
 
+	@Shadow
+	public abstract class_9224 method_56933();
+
 	@Inject(method = "createResourcePack", at = @At("RETURN"))
 	private void onCreateResourcePack(CallbackInfoReturnable<ResourcePack> info) {
-		ResourcePackSourceTracker.setSource(info.getReturnValue(), source);
+		ResourcePackSourceTracker.setSource(info.getReturnValue(), method_56933().source());
 	}
 
 	@Override
diff --git a/fabric-resource-loader-v0/src/test/java/net/fabricmc/fabric/test/resource/loader/unit/ModResourcePackUtilTests.java b/fabric-resource-loader-v0/src/test/java/net/fabricmc/fabric/test/resource/loader/unit/ModResourcePackUtilTests.java
index 8921f275c..8c3c89d62 100644
--- a/fabric-resource-loader-v0/src/test/java/net/fabricmc/fabric/test/resource/loader/unit/ModResourcePackUtilTests.java
+++ b/fabric-resource-loader-v0/src/test/java/net/fabricmc/fabric/test/resource/loader/unit/ModResourcePackUtilTests.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.function.Predicate;
@@ -35,6 +36,8 @@ import org.junit.jupiter.api.Test;
 
 import net.minecraft.Bootstrap;
 import net.minecraft.SharedConstants;
+import net.minecraft.class_9224;
+import net.minecraft.class_9225;
 import net.minecraft.resource.ResourcePackProfile;
 
 import net.fabricmc.fabric.impl.resource.loader.FabricResourcePackProfile;
@@ -203,15 +206,19 @@ public class ModResourcePackUtilTests {
 	}
 
 	private ResourcePackProfile mockProfile(Map<String, ResourcePackProfile> profiles, String id, @Nullable Predicate<Set<String>> parents) {
-		ResourcePackProfile profile = ResourcePackProfile.of(
-				id,
-				null,
-				false,
+		ResourcePackProfile profile = new ResourcePackProfile(
+				new class_9224(
+						id,
+						null,
+						null,
+						Optional.empty()
+				),
 				null,
 				null,
-				null,
-				false,
-				ModResourcePackCreator.RESOURCE_PACK_SOURCE
+				new class_9225(
+						false,
+						null,
+						false)
 		);
 
 		if (parents != null) ((FabricResourcePackProfile) profile).fabric_setParentsPredicate(parents);
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 3dadba53a..0826d53df 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.canCombine(stack, itemStack);
+			boolean bl = !stack.isEmpty() && ItemStack.areItemsAndNbtEqual(stack, itemStack);
 
 			if (!bl) {
 				this.cookTimeTotal = getCookTime(this.world, (AbstractFurnaceBlockEntity) (Object) this);
diff --git a/fabric-transitive-access-wideners-v1/src/main/resources/fabric-transitive-access-wideners-v1.accesswidener b/fabric-transitive-access-wideners-v1/src/main/resources/fabric-transitive-access-wideners-v1.accesswidener
index dcbcd06df..a083147f2 100644
--- a/fabric-transitive-access-wideners-v1/src/main/resources/fabric-transitive-access-wideners-v1.accesswidener
+++ b/fabric-transitive-access-wideners-v1/src/main/resources/fabric-transitive-access-wideners-v1.accesswidener
@@ -306,7 +306,7 @@ transitive-accessible field net/minecraft/client/render/RenderPhase LIGHTNING_PR
 transitive-accessible field net/minecraft/client/render/RenderPhase TRIPWIRE_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
 transitive-accessible field net/minecraft/client/render/RenderPhase END_PORTAL_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
 transitive-accessible field net/minecraft/client/render/RenderPhase END_GATEWAY_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
-transitive-accessible field net/minecraft/client/render/RenderPhase field_48949 Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
+transitive-accessible field net/minecraft/client/render/RenderPhase CLOUDS_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
 transitive-accessible field net/minecraft/client/render/RenderPhase LINES_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
 transitive-accessible field net/minecraft/client/render/RenderPhase GUI_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
 transitive-accessible field net/minecraft/client/render/RenderPhase GUI_OVERLAY_PROGRAM Lnet/minecraft/client/render/RenderPhase$ShaderProgram;
diff --git a/gradle.properties b/gradle.properties
index 57a277f0d..d0c49198b 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.95.5
-minecraft_version=24w05a
-yarn_version=+build.2
+version=0.95.6
+minecraft_version=24w06a
+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.51
+fabric-api-lookup-api-v1-version=1.6.52
 fabric-biome-api-v1-version=13.0.19
 fabric-block-api-v1-version=1.0.18
 fabric-block-view-api-v2-version=1.0.6
@@ -21,44 +21,44 @@ 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.5
+fabric-content-registries-v0-version=6.0.6
 fabric-crash-report-info-v1-version=0.2.25
-fabric-data-attachment-api-v1-version=1.0.5
-fabric-data-generation-api-v1-version=16.0.0
-fabric-dimensions-v1-version=2.1.63
+fabric-data-attachment-api-v1-version=1.0.6
+fabric-data-generation-api-v1-version=16.0.1
+fabric-dimensions-v1-version=2.1.64
 fabric-entity-events-v1-version=1.6.1
 fabric-events-interaction-v0-version=0.7.3
-fabric-events-lifecycle-v0-version=0.2.77
+fabric-events-lifecycle-v0-version=0.2.78
 fabric-game-rule-api-v1-version=1.0.48
-fabric-gametest-api-v1-version=1.3.4
-fabric-item-api-v1-version=4.0.1
-fabric-item-group-api-v1-version=4.0.25
+fabric-gametest-api-v1-version=1.3.5
+fabric-item-api-v1-version=4.0.2
+fabric-item-group-api-v1-version=4.0.26
 fabric-key-binding-api-v1-version=1.0.43
 fabric-keybindings-v0-version=0.2.41
-fabric-lifecycle-events-v1-version=2.2.34
-fabric-loot-api-v2-version=2.1.9
+fabric-lifecycle-events-v1-version=2.2.35
+fabric-loot-api-v2-version=2.1.10
 fabric-message-api-v1-version=6.0.7
-fabric-mining-level-api-v1-version=2.1.65
+fabric-mining-level-api-v1-version=2.1.66
 fabric-model-loading-api-v1-version=1.0.10
 fabric-models-v0-version=0.4.9
 fabric-networking-api-v1-version=4.0.1
-fabric-object-builder-api-v1-version=14.0.2
+fabric-object-builder-api-v1-version=14.0.3
 fabric-particles-v1-version=2.0.0
 fabric-recipe-api-v1-version=3.0.1
-fabric-registry-sync-v0-version=5.0.2
+fabric-registry-sync-v0-version=5.0.3
 fabric-renderer-api-v1-version=3.2.7
 fabric-renderer-indigo-version=1.5.7
-fabric-renderer-registries-v1-version=3.2.55
+fabric-renderer-registries-v1-version=3.2.56
 fabric-rendering-data-attachment-v1-version=0.3.44
 fabric-rendering-fluids-v1-version=3.0.35
-fabric-rendering-v0-version=1.1.58
-fabric-rendering-v1-version=4.1.0
+fabric-rendering-v0-version=1.1.59
+fabric-rendering-v1-version=4.1.1
 fabric-resource-conditions-api-v1-version=2.3.17
-fabric-resource-loader-v0-version=0.11.20
+fabric-resource-loader-v0-version=0.11.21
 fabric-screen-api-v1-version=2.0.19
-fabric-screen-handler-api-v1-version=1.3.58
+fabric-screen-handler-api-v1-version=1.3.59
 fabric-sound-api-v1-version=1.0.19
-fabric-transfer-api-v1-version=4.0.13
-fabric-transitive-access-wideners-v1-version=6.0.4
+fabric-transfer-api-v1-version=4.0.14
+fabric-transitive-access-wideners-v1-version=6.0.5
 fabric-convention-tags-v1-version=1.5.13
 fabric-client-tags-api-v1-version=1.1.9