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.
This commit is contained in:
blablubbabc 2024-10-06 18:32:00 +11:00 committed by md_5
parent 45b66f7e4c
commit 11a5e840ca
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11

View File

@ -3,7 +3,9 @@ package org.bukkit.craftbukkit.inventory;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponentPredicate; import net.minecraft.core.component.DataComponentPredicate;
import net.minecraft.core.component.PatchedDataComponentMap;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.trading.ItemCost; import net.minecraft.world.item.trading.ItemCost;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -116,10 +118,12 @@ public class CraftMerchantRecipe extends MerchantRecipe {
List<ItemStack> ingredients = getIngredients(); List<ItemStack> ingredients = getIngredients();
Preconditions.checkState(!ingredients.isEmpty(), "No offered ingredients"); Preconditions.checkState(!ingredients.isEmpty(), "No offered ingredients");
net.minecraft.world.item.ItemStack baseCostA = CraftItemStack.asNMSCopy(ingredients.get(0)); 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) { if (ingredients.size() > 1) {
net.minecraft.world.item.ItemStack costB = CraftItemStack.asNMSCopy(ingredients.get(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 { } else {
handle.costB = Optional.empty(); handle.costB = Optional.empty();
} }