diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java index 867923110..f9c0d9ab8 100644 --- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java @@ -662,14 +662,14 @@ public class HologramTrait extends Trait { NPC npc = registry().createNPCUsingItem(EntityType.ITEM_DISPLAY, "", itemStack); npc.data().setPersistent(NPC.Metadata.NAMEPLATE_VISIBLE, false); if (itemMatcher.group(2) != null) { + String modify = itemMatcher.group(2).substring(1); for (ChatColor color : ChatColor.values()) { - if (itemMatcher.group(2).equalsIgnoreCase(color.name())) { - npc.getOrAddTrait(ScoreboardTrait.class) - .setColor(Util.matchEnum(ChatColor.values(), itemMatcher.group(2))); + if (modify.equalsIgnoreCase(color.name())) { + npc.getOrAddTrait(ScoreboardTrait.class).setColor(color); return npc; } } - Bukkit.getUnsafe().modifyItemStack(itemStack, itemMatcher.group(2)); + Bukkit.getUnsafe().modifyItemStack(itemStack, modify); npc.setItemProvider(() -> itemStack.clone()); } return npc; @@ -707,17 +707,17 @@ public class HologramTrait extends Trait { itemNPC = registry().createNPCUsingItem(Util.getFallbackEntityType("ITEM", "DROPPED_ITEM"), "", itemStack); itemNPC.data().setPersistent(NPC.Metadata.NAMEPLATE_VISIBLE, false); if (itemMatcher.group(2) != null) { + String modify = itemMatcher.group(2).substring(1); ChatColor matched = null; for (ChatColor color : ChatColor.values()) { - if (itemMatcher.group(2).equalsIgnoreCase(color.name())) { - itemNPC.getOrAddTrait(ScoreboardTrait.class) - .setColor(Util.matchEnum(ChatColor.values(), itemMatcher.group(2))); + if (modify.equalsIgnoreCase(color.name())) { + itemNPC.getOrAddTrait(ScoreboardTrait.class).setColor(color); matched = color; break; } } if (matched == null) { - Bukkit.getUnsafe().modifyItemStack(itemStack, itemMatcher.group(2)); + Bukkit.getUnsafe().modifyItemStack(itemStack, modify); itemNPC.setItemProvider(() -> itemStack.clone()); } } @@ -920,7 +920,7 @@ public class HologramTrait extends Trait { } } - private static final Pattern ITEM_MATCHER = Pattern.compile(""); + private static final Pattern ITEM_MATCHER = Pattern.compile(""); private static boolean SUPPORTS_DISPLAY = false; static { try { diff --git a/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java b/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java index 18d9b7620..7458bdba1 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java @@ -2,7 +2,6 @@ package net.citizensnpcs.trait; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; @@ -12,6 +11,7 @@ import java.util.regex.Pattern; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -34,7 +34,6 @@ import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; @@ -76,7 +75,6 @@ import net.citizensnpcs.trait.shop.PermissionAction; import net.citizensnpcs.trait.shop.PermissionAction.PermissionActionGUI; import net.citizensnpcs.trait.shop.StoredShops; import net.citizensnpcs.util.InventoryMultiplexer; -import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; /** @@ -961,7 +959,6 @@ public class ShopTrait extends Trait { this.shop = shop; this.player = player; Map tradesMap = Maps.newHashMap(); - Set clearComponentPredicates = Sets.newHashSet(); Merchant merchant = Bukkit.createMerchant(shop.getTitle()); List recipes = Lists.newArrayList(); for (NPCShopPage page : shop.pages) { @@ -974,11 +971,17 @@ public class ShopTrait extends Trait { if (!(action instanceof ItemAction)) continue; ItemAction ia = (ItemAction) action; - if (!ia.compareSimilarity && ia.items.size() > 0) { - clearComponentPredicates.add(recipes.size()); - } for (ItemStack stack : ia.items) { stack = stack.clone(); + if (!ia.compareSimilarity && ia.metaFilter.size() > 0) { + // Minecraft implements its own trade selection logic on the client + // Clear the custom component part of the itemstack since we will check it later anyway + ItemMeta im = stack.getItemMeta(); + for (NamespacedKey nk : Lists.newArrayList(im.getPersistentDataContainer().getKeys())) { + im.getPersistentDataContainer().remove(nk); + } + stack.setItemMeta(im); + } recipe.addIngredient(stack); if (recipe.getIngredients().size() == 2) break; @@ -991,7 +994,6 @@ public class ShopTrait extends Trait { } } merchant.setRecipes(recipes); - NMS.clearMerchantComponentPredicates(merchant, clearComponentPredicates); trades = tradesMap; view = player.openMerchant(merchant, true); } diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java index 87e630700..50f65813d 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMS.java +++ b/main/src/main/java/net/citizensnpcs/util/NMS.java @@ -9,7 +9,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; @@ -37,7 +36,6 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Merchant; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; @@ -155,10 +153,6 @@ public class NMS { BRIDGE.cancelMoveDestination(entity); } - public static void clearMerchantComponentPredicates(Merchant merchant, Set clearComponentPredicates) { - BRIDGE.clearMerchantComponentPredicates(merchant, clearComponentPredicates); - } - public static Iterable createBundlePacket(List packets) { return BRIDGE.createBundlePacket(packets); } diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java index ba1806d01..3f852d97b 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java +++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java @@ -3,7 +3,6 @@ package net.citizensnpcs.util; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.function.Function; @@ -24,7 +23,6 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Merchant; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; @@ -65,10 +63,6 @@ public interface NMSBridge { public void cancelMoveDestination(Entity entity); - public default void clearMerchantComponentPredicates(Merchant merchant, Set clearComponentPredicates) { - // TODO: implement for <=1.19.4 - } - public default Iterable createBundlePacket(List packets) { return packets; } diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java index 7ef00db08..f70c053ce 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java @@ -9,7 +9,6 @@ import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.TreeMap; @@ -40,7 +39,6 @@ import org.bukkit.craftbukkit.v1_20_R4.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_20_R4.event.CraftPortalEvent; import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftMerchant; import org.bukkit.entity.EntityType; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; @@ -48,7 +46,6 @@ import org.bukkit.entity.Tameable; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; -import org.bukkit.inventory.Merchant; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; @@ -263,7 +260,6 @@ import net.citizensnpcs.util.PlayerAnimation; import net.citizensnpcs.util.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; -import net.minecraft.core.component.DataComponentPredicate; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.CompoundTag; @@ -360,8 +356,6 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.trading.ItemCost; -import net.minecraft.world.item.trading.MerchantOffer; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.dimension.end.EndDragonFight; @@ -502,24 +496,6 @@ public class NMSImpl implements NMSBridge { } } - @Override - public void clearMerchantComponentPredicates(Merchant merchant, Set clearComponentPredicates) { - net.minecraft.world.item.trading.Merchant handle = ((CraftMerchant) merchant).getMerchant(); - Iterator itr = handle.getOffers().iterator(); - for (int i = 0; itr.hasNext(); i++) { - MerchantOffer offer = itr.next(); - if (!clearComponentPredicates.contains(i)) - continue; - offer.baseCostA = new ItemCost(offer.baseCostA.item(), offer.baseCostA.count(), - DataComponentPredicate.EMPTY, offer.baseCostA.itemStack()); - ItemCost costB = offer.getItemCostB().orElseGet(() -> null); - if (costB != null) { - offer.costB = Optional - .of(new ItemCost(costB.item(), costB.count(), DataComponentPredicate.EMPTY, costB.itemStack())); - } - } - } - @Override @SuppressWarnings("rawtypes") public Iterable createBundlePacket(List source) { diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java index 53243bebc..5fcbaff3c 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java @@ -9,7 +9,6 @@ import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.TreeMap; @@ -38,7 +37,6 @@ import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_21_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryAnvil; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftMerchant; import org.bukkit.craftbukkit.v1_21_R1.inventory.view.CraftAnvilView; import org.bukkit.entity.EntityType; import org.bukkit.entity.FishHook; @@ -48,7 +46,6 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.EntityKnockbackEvent.KnockbackCause; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; -import org.bukkit.inventory.Merchant; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; @@ -263,7 +260,6 @@ import net.citizensnpcs.util.PlayerAnimation; import net.citizensnpcs.util.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; -import net.minecraft.core.component.DataComponentPredicate; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.CompoundTag; @@ -360,8 +356,6 @@ import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.trading.ItemCost; -import net.minecraft.world.item.trading.MerchantOffer; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.dimension.end.EndDragonFight; @@ -482,24 +476,6 @@ public class NMSImpl implements NMSBridge { } } - @Override - public void clearMerchantComponentPredicates(Merchant merchant, Set clearComponentPredicates) { - net.minecraft.world.item.trading.Merchant handle = ((CraftMerchant) merchant).getMerchant(); - Iterator itr = handle.getOffers().iterator(); - for (int i = 0; itr.hasNext(); i++) { - MerchantOffer offer = itr.next(); - if (!clearComponentPredicates.contains(i)) - continue; - offer.baseCostA = new ItemCost(offer.baseCostA.item(), offer.baseCostA.count(), - DataComponentPredicate.EMPTY, offer.baseCostA.itemStack()); - ItemCost costB = offer.getItemCostB().orElseGet(() -> null); - if (costB != null) { - offer.costB = Optional - .of(new ItemCost(costB.item(), costB.count(), DataComponentPredicate.EMPTY, costB.itemStack())); - } - } - } - @Override @SuppressWarnings("rawtypes") public Iterable createBundlePacket(List source) {