From 11a5e840ca869d125501356025cc849e510c1958 Mon Sep 17 00:00:00 2001 From: blablubbabc Date: Sun, 6 Oct 2024 18:32:00 +1100 Subject: [PATCH] SPIGOT-7907, #1484: Improve merchant recipe item matching behavior to more closely align with older versions Before the update for MC 1.20.5 (item components), merchant recipes would accept items with additional NBT tags. Since 1.20.5, merchant recipes created via the Bukkit API no longer accept additional components. This changes which component types we pick for merchant recipes created via the API to more closely match the behavior from before the MC 1.20.5 update, i.e. ignore any empty / default components again. --- .../bukkit/craftbukkit/inventory/CraftMerchantRecipe.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantRecipe.java index f7b28b2f2..6030c5625 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantRecipe.java @@ -3,7 +3,9 @@ package org.bukkit.craftbukkit.inventory; import com.google.common.base.Preconditions; import java.util.List; import java.util.Optional; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentPredicate; +import net.minecraft.core.component.PatchedDataComponentMap; import net.minecraft.world.item.Items; import net.minecraft.world.item.trading.ItemCost; import org.bukkit.inventory.ItemStack; @@ -116,10 +118,12 @@ public class CraftMerchantRecipe extends MerchantRecipe { List ingredients = getIngredients(); Preconditions.checkState(!ingredients.isEmpty(), "No offered ingredients"); net.minecraft.world.item.ItemStack baseCostA = CraftItemStack.asNMSCopy(ingredients.get(0)); - handle.baseCostA = new ItemCost(baseCostA.getItemHolder(), baseCostA.getCount(), DataComponentPredicate.allOf(baseCostA.getComponents()), baseCostA); + DataComponentPredicate baseCostAPredicate = DataComponentPredicate.allOf(PatchedDataComponentMap.fromPatch(DataComponentMap.EMPTY, baseCostA.getComponentsPatch())); + handle.baseCostA = new ItemCost(baseCostA.getItemHolder(), baseCostA.getCount(), baseCostAPredicate, baseCostA); if (ingredients.size() > 1) { net.minecraft.world.item.ItemStack costB = CraftItemStack.asNMSCopy(ingredients.get(1)); - handle.costB = Optional.of(new ItemCost(costB.getItemHolder(), costB.getCount(), DataComponentPredicate.allOf(costB.getComponents()), costB)); + DataComponentPredicate costBPredicate = DataComponentPredicate.allOf(PatchedDataComponentMap.fromPatch(DataComponentMap.EMPTY, costB.getComponentsPatch())); + handle.costB = Optional.of(new ItemCost(costB.getItemHolder(), costB.getCount(), costBPredicate, costB)); } else { handle.costB = Optional.empty(); }