From 7ca21dc536a89078cb266d441cdc10d1df95dd59 Mon Sep 17 00:00:00 2001 From: Nayla Hanegan Date: Mon, 30 Sep 2024 14:07:24 -0400 Subject: [PATCH 1/5] Revert "Dont provide ITEM_HANDLER for Inventory instances (#88)" This fixes $158. This reverts commit b00938ec12cc6caa62752e29748f6ce0163a996f. --- .../api/transfer/v1/item/ItemStorage.java | 13 +---- .../compat/TransferApiForgeCompat.java | 48 +++++++------------ 2 files changed, 17 insertions(+), 44 deletions(-) diff --git a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/api/transfer/v1/item/ItemStorage.java b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/api/transfer/v1/item/ItemStorage.java index dc6c326f3..2f80ef77e 100644 --- a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/api/transfer/v1/item/ItemStorage.java +++ b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/api/transfer/v1/item/ItemStorage.java @@ -96,13 +96,7 @@ private ItemStorage() { static { // Composter support. - ItemStorage.SIDED.registerForBlocks((world, pos, state, blockEntity, direction) -> { - // FFAPI: do not provide composter compat if queried from our capability provider - if (TransferApiForgeCompat.COMPUTING_CAPABILITY_LOCK.get()) { - return null; - } - return ComposterWrapper.get(world, pos, direction); - }, Blocks.COMPOSTER); + ItemStorage.SIDED.registerForBlocks((world, pos, state, blockEntity, direction) -> ComposterWrapper.get(world, pos, direction), Blocks.COMPOSTER); // Support for SidedStorageBlockEntity. ItemStorage.SIDED.registerFallback((world, pos, state, blockEntity, direction) -> { @@ -115,11 +109,6 @@ private ItemStorage() { // Register Inventory fallback. ItemStorage.SIDED.registerFallback((world, pos, state, blockEntity, direction) -> { - // FFAPI: do not provide Inventory instace compat if queried from our capability provider - if (TransferApiForgeCompat.COMPUTING_CAPABILITY_LOCK.get()) { - return null; - } - Inventory inventoryToWrap = null; if (state.getBlock() instanceof InventoryProvider provider) { diff --git a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/compat/TransferApiForgeCompat.java b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/compat/TransferApiForgeCompat.java index f84a5fb16..602ceb542 100644 --- a/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/compat/TransferApiForgeCompat.java +++ b/fabric-transfer-api-v1/src/main/java/net/fabricmc/fabric/impl/transfer/compat/TransferApiForgeCompat.java @@ -16,21 +16,9 @@ package net.fabricmc.fabric.impl.transfer.compat; -import net.fabricmc.fabric.api.lookup.v1.block.BlockApiLookup; -import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; -import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; -import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; -import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; -import net.fabricmc.fabric.api.transfer.v1.storage.SlottedStorage; -import net.fabricmc.fabric.api.transfer.v1.storage.Storage; -import net.fabricmc.fabric.impl.transfer.TransferApiImpl; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import java.util.HashMap; +import java.util.Map; + import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -40,8 +28,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Direction; + +import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext; +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; +import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; +import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.fabricmc.fabric.api.transfer.v1.storage.SlottedStorage; +import net.fabricmc.fabric.api.transfer.v1.storage.Storage; +import net.fabricmc.fabric.impl.transfer.TransferApiImpl; public class TransferApiForgeCompat { public static void init() { @@ -50,21 +49,6 @@ public static void init() { } private static final Map, LazyOptional> CAPS = new HashMap<>(); - - /** - * This lock has two purposes: avoiding recursive calls between {@link ICapabilityProvider#getCapability(Capability) getCapability} - * and {@link BlockApiLookup#find(World, BlockPos, BlockState, BlockEntity, Object) find} as well as influencing the - * behavior of {@code find} if it was called from {@code getCapability}. - *

- * The recursive calls occur because our capabilities providers need to access the block lookup API to check if they - * should provide a capability (for Fabric from Forge compat), but the block lookup API needs to query the - * capabilities (for Forge from Fabric compat). This lock is set immediately before one API calls the other, which - * then disables the call from the other API to the first, breaking the recursion. - *

- * Additionally, this lock is used to conditionally disable some of the block lookup API's fallback providers, if - * they got invoked by a capability provider. This is needed because Fabric has fallback providers for many Vanilla - * things, but Forge already implements their own compat for those. - */ public static final ThreadLocal COMPUTING_CAPABILITY_LOCK = ThreadLocal.withInitial(() -> false); private static void onAttachBlockEntityCapabilities(AttachCapabilitiesEvent event) { From 0dbe82f9ce1781f6f17963da99dce0b88504b15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=86=AC=E7=85=9C?= <10185101162@stu.ecnu.edu.cn> Date: Fri, 18 Apr 2025 23:29:13 +0800 Subject: [PATCH 2/5] Update TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同步 Fabric API 修改 --- ...TypeAwareBuyForOneEmeraldFactoryMixin.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) 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 df6856937..62cffeef4 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 @@ -18,16 +18,13 @@ import java.util.stream.Stream; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Cancellable; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.random.Random; import net.minecraft.registry.DefaultedRegistry; import net.minecraft.village.TradeOffer; import net.minecraft.village.TradeOffers; @@ -47,12 +44,18 @@ private Stream disableVanillaCheck(DefaultedRegistry instan } /** - * To prevent "item" -> "air" trades, if the result of a type aware trade is air, make sure no offer is created. + * https://github.com/FabricMC/fabric/commit/e35120df0e113211c3e6928fa446efe6f387b085#diff-3f36fa41b6959de14a21137b631ecff47f27ed73845fa4c15ce77fac6cdad012R50 + * To prevent crashes due to passing a {@code null} item to a {@link TradeOffer}, return a {@code null} trade offer + * early before {@code null} is passed to the constructor. */ - @Inject(method = "create", at = @At(value = "NEW", target = "net/minecraft/village/TradeOffer"), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true, require = 0) - private void failOnNullItem(Entity entity, Random random, CallbackInfoReturnable cir, ItemStack buyingItem) { - if (buyingItem.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 + @ModifyExpressionValue( + method = "create", + at = @At(value = "INVOKE", target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;") + ) + private Object failOnNullItem(Object item, @Cancellable CallbackInfoReturnable cir) { + if (item == null) { + cir.setReturnValue(null); } + return item; } } From 6b74893c5cb9a84301c58365fb7043ef31cf7db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=86=AC=E7=85=9C?= <10185101162@stu.ecnu.edu.cn> Date: Fri, 18 Apr 2025 23:37:18 +0800 Subject: [PATCH 3/5] Update build.gradle Add mixinextras to compile & runtime --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 5b2cf8021..bdb270fd8 100644 --- a/build.gradle +++ b/build.gradle @@ -249,6 +249,8 @@ allprojects { minecraft "com.mojang:minecraft:$rootProject.minecraft_version" mappings "net.fabricmc:yarn:${rootProject.minecraft_version}${project.yarn_version}:v2" forge "net.minecraftforge:forge:${rootProject.forge_version}" + compileOnly annotationProcessor('io.github.llamalad7:mixinextras-common:0.4.1') + implementation "io.github.llamalad7:mixinextras-forge:0.4.1" testmodImplementation sourceSets.main.output // testmodClientImplementation sourceSets.main.output From f4aaa2b500e0e4ceaaa3c5e8f0e1c096c53fb9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=86=AC=E7=85=9C?= <10185101162@stu.ecnu.edu.cn> Date: Sat, 31 May 2025 10:16:18 +0800 Subject: [PATCH 4/5] JarInJar MixinExtras --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bdb270fd8..a5d819e27 100644 --- a/build.gradle +++ b/build.gradle @@ -250,7 +250,9 @@ allprojects { mappings "net.fabricmc:yarn:${rootProject.minecraft_version}${project.yarn_version}:v2" forge "net.minecraftforge:forge:${rootProject.forge_version}" compileOnly annotationProcessor('io.github.llamalad7:mixinextras-common:0.4.1') - implementation "io.github.llamalad7:mixinextras-forge:0.4.1" + implementation(jarJar("io.github.llamalad7:mixinextras-forge:0.4.1")) { + jarJar.ranged(it, "[0.4.1,)") + } testmodImplementation sourceSets.main.output // testmodClientImplementation sourceSets.main.output From e54e38942144141179712bb3c568770b35439c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=86=AC=E7=85=9C?= <10185101162@stu.ecnu.edu.cn> Date: Sat, 31 May 2025 14:24:47 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.gradle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index a5d819e27..6bd9f6a7f 100644 --- a/build.gradle +++ b/build.gradle @@ -250,9 +250,7 @@ allprojects { mappings "net.fabricmc:yarn:${rootProject.minecraft_version}${project.yarn_version}:v2" forge "net.minecraftforge:forge:${rootProject.forge_version}" compileOnly annotationProcessor('io.github.llamalad7:mixinextras-common:0.4.1') - implementation(jarJar("io.github.llamalad7:mixinextras-forge:0.4.1")) { - jarJar.ranged(it, "[0.4.1,)") - } + implementation(include("io.github.llamalad7:mixinextras-forge:0.4.1")) testmodImplementation sourceSets.main.output // testmodClientImplementation sourceSets.main.output