13
0
geforkt von Mirrors/Paper

improve checking handled tags in itemmeta

Dieser Commit ist enthalten in:
Jake Potrebic 2023-07-10 16:10:15 -07:00
Ursprung 50b91c7359
Commit ae4acc6aeb
33 geänderte Dateien mit 225 neuen und 158 gelöschten Zeilen

Datei anzeigen

@ -40,120 +40,120 @@ import org.bukkit.inventory.meta.TropicalFishBucketMeta;
public final class CraftItemMetas { public final class CraftItemMetas {
public record ItemMetaData<I extends ItemMeta>(Class<I> metaClass, Function<ItemStack, I> fromItemStack, public record ItemMetaData<I extends ItemMeta>(Class<I> metaClass, BiFunction<ItemStack, java.util.Set<net.minecraft.core.component.DataComponentType<?>>, I> fromItemStack,
BiFunction<ItemType.Typed<I>, CraftMetaItem, I> fromItemMeta) { BiFunction<ItemType.Typed<I>, CraftMetaItem, I> fromItemMeta) {
} }
private static final ItemMetaData<ItemMeta> EMPTY_META_DATA = new ItemMetaData<>(ItemMeta.class, private static final ItemMetaData<ItemMeta> EMPTY_META_DATA = new ItemMetaData<>(ItemMeta.class,
item -> null, (item, extras) -> null,
(type, meta) -> null); (type, meta) -> null);
private static final ItemMetaData<ItemMeta> ITEM_META_DATA = new ItemMetaData<>(ItemMeta.class, private static final ItemMetaData<ItemMeta> ITEM_META_DATA = new ItemMetaData<>(ItemMeta.class,
item -> new CraftMetaItem(item.getComponentsPatch()), (item, extras) -> new CraftMetaItem(item.getComponentsPatch(), extras),
(type, meta) -> new CraftMetaItem(meta)); (type, meta) -> new CraftMetaItem(meta));
private static final ItemMetaData<BookMeta> SIGNED_BOOK_META_DATA = new ItemMetaData<>(BookMeta.class, private static final ItemMetaData<BookMeta> SIGNED_BOOK_META_DATA = new ItemMetaData<>(BookMeta.class,
item -> new CraftMetaBookSigned(item.getComponentsPatch()), (item, extras) -> new CraftMetaBookSigned(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaBookSigned signed ? signed : new CraftMetaBookSigned(meta)); (type, meta) -> meta instanceof CraftMetaBookSigned signed ? signed : new CraftMetaBookSigned(meta));
private static final ItemMetaData<BookMeta> WRITABLE_BOOK_META_DATA = new ItemMetaData<>(BookMeta.class, private static final ItemMetaData<BookMeta> WRITABLE_BOOK_META_DATA = new ItemMetaData<>(BookMeta.class,
item -> new CraftMetaBook(item.getComponentsPatch()), (item, extras) -> new CraftMetaBook(item.getComponentsPatch(), extras),
(type, meta) -> meta != null && meta.getClass().equals(CraftMetaBook.class) ? (BookMeta) meta : new CraftMetaBook(meta)); (type, meta) -> meta != null && meta.getClass().equals(CraftMetaBook.class) ? (BookMeta) meta : new CraftMetaBook(meta));
private static final ItemMetaData<SkullMeta> SKULL_META_DATA = new ItemMetaData<>(SkullMeta.class, private static final ItemMetaData<SkullMeta> SKULL_META_DATA = new ItemMetaData<>(SkullMeta.class,
item -> new CraftMetaSkull(item.getComponentsPatch()), (item, extras) -> new CraftMetaSkull(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaSkull skull ? skull : new CraftMetaSkull(meta)); (type, meta) -> meta instanceof CraftMetaSkull skull ? skull : new CraftMetaSkull(meta));
private static final ItemMetaData<ArmorMeta> ARMOR_META_DATA = new ItemMetaData<>(ArmorMeta.class, private static final ItemMetaData<ArmorMeta> ARMOR_META_DATA = new ItemMetaData<>(ArmorMeta.class,
item -> new CraftMetaArmor(item.getComponentsPatch()), (item, extras) -> new CraftMetaArmor(item.getComponentsPatch(), extras),
(type, meta) -> meta != null && meta.getClass().equals(CraftMetaArmor.class) ? (ArmorMeta) meta : new CraftMetaArmor(meta)); (type, meta) -> meta != null && meta.getClass().equals(CraftMetaArmor.class) ? (ArmorMeta) meta : new CraftMetaArmor(meta));
private static final ItemMetaData<ColorableArmorMeta> COLORABLE_ARMOR_META_DATA = new ItemMetaData<>(ColorableArmorMeta.class, private static final ItemMetaData<ColorableArmorMeta> COLORABLE_ARMOR_META_DATA = new ItemMetaData<>(ColorableArmorMeta.class,
item -> new CraftMetaColorableArmor(item.getComponentsPatch()), (item, extras) -> new CraftMetaColorableArmor(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof ColorableArmorMeta colorable ? colorable : new CraftMetaColorableArmor(meta)); (type, meta) -> meta instanceof ColorableArmorMeta colorable ? colorable : new CraftMetaColorableArmor(meta));
private static final ItemMetaData<LeatherArmorMeta> LEATHER_ARMOR_META_DATA = new ItemMetaData<>(LeatherArmorMeta.class, private static final ItemMetaData<LeatherArmorMeta> LEATHER_ARMOR_META_DATA = new ItemMetaData<>(LeatherArmorMeta.class,
item -> new CraftMetaLeatherArmor(item.getComponentsPatch()), (item, extras) -> new CraftMetaLeatherArmor(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaLeatherArmor leather ? leather : new CraftMetaLeatherArmor(meta)); (type, meta) -> meta instanceof CraftMetaLeatherArmor leather ? leather : new CraftMetaLeatherArmor(meta));
private static final ItemMetaData<PotionMeta> POTION_META_DATA = new ItemMetaData<>(PotionMeta.class, private static final ItemMetaData<PotionMeta> POTION_META_DATA = new ItemMetaData<>(PotionMeta.class,
item -> new CraftMetaPotion(item.getComponentsPatch()), (item, extras) -> new CraftMetaPotion(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaPotion potion ? potion : new CraftMetaPotion(meta)); (type, meta) -> meta instanceof CraftMetaPotion potion ? potion : new CraftMetaPotion(meta));
private static final ItemMetaData<MapMeta> MAP_META_DATA = new ItemMetaData<>(MapMeta.class, private static final ItemMetaData<MapMeta> MAP_META_DATA = new ItemMetaData<>(MapMeta.class,
item -> new CraftMetaMap(item.getComponentsPatch()), (item, extras) -> new CraftMetaMap(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaMap map ? map : new CraftMetaMap(meta)); (type, meta) -> meta instanceof CraftMetaMap map ? map : new CraftMetaMap(meta));
private static final ItemMetaData<FireworkMeta> FIREWORK_META_DATA = new ItemMetaData<>(FireworkMeta.class, private static final ItemMetaData<FireworkMeta> FIREWORK_META_DATA = new ItemMetaData<>(FireworkMeta.class,
item -> new CraftMetaFirework(item.getComponentsPatch()), (item, extras) -> new CraftMetaFirework(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaFirework firework ? firework : new CraftMetaFirework(meta)); (type, meta) -> meta instanceof CraftMetaFirework firework ? firework : new CraftMetaFirework(meta));
private static final ItemMetaData<FireworkEffectMeta> CHARGE_META_DATA = new ItemMetaData<>(FireworkEffectMeta.class, private static final ItemMetaData<FireworkEffectMeta> CHARGE_META_DATA = new ItemMetaData<>(FireworkEffectMeta.class,
item -> new CraftMetaCharge(item.getComponentsPatch()), (item, extras) -> new CraftMetaCharge(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaCharge charge ? charge : new CraftMetaCharge(meta)); (type, meta) -> meta instanceof CraftMetaCharge charge ? charge : new CraftMetaCharge(meta));
private static final ItemMetaData<EnchantmentStorageMeta> ENCHANTED_BOOK_META_DATA = new ItemMetaData<>(EnchantmentStorageMeta.class, private static final ItemMetaData<EnchantmentStorageMeta> ENCHANTED_BOOK_META_DATA = new ItemMetaData<>(EnchantmentStorageMeta.class,
item -> new CraftMetaEnchantedBook(item.getComponentsPatch()), (item, extras) -> new CraftMetaEnchantedBook(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaEnchantedBook enchantedBook ? enchantedBook : new CraftMetaEnchantedBook(meta)); (type, meta) -> meta instanceof CraftMetaEnchantedBook enchantedBook ? enchantedBook : new CraftMetaEnchantedBook(meta));
private static final ItemMetaData<BannerMeta> BANNER_META_DATA = new ItemMetaData<>(BannerMeta.class, private static final ItemMetaData<BannerMeta> BANNER_META_DATA = new ItemMetaData<>(BannerMeta.class,
item -> new CraftMetaBanner(item.getComponentsPatch()), (item, extras) -> new CraftMetaBanner(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaBanner banner ? banner : new CraftMetaBanner(meta)); (type, meta) -> meta instanceof CraftMetaBanner banner ? banner : new CraftMetaBanner(meta));
private static final ItemMetaData<SpawnEggMeta> SPAWN_EGG_META_DATA = new ItemMetaData<>(SpawnEggMeta.class, private static final ItemMetaData<SpawnEggMeta> SPAWN_EGG_META_DATA = new ItemMetaData<>(SpawnEggMeta.class,
item -> new CraftMetaSpawnEgg(item.getComponentsPatch()), (item, extras) -> new CraftMetaSpawnEgg(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaSpawnEgg spawnEgg ? spawnEgg : new CraftMetaSpawnEgg(meta)); (type, meta) -> meta instanceof CraftMetaSpawnEgg spawnEgg ? spawnEgg : new CraftMetaSpawnEgg(meta));
private static final ItemMetaData<ArmorStandMeta> ARMOR_STAND_META_DATA = new ItemMetaData<>(ArmorStandMeta.class, // paper private static final ItemMetaData<ArmorStandMeta> ARMOR_STAND_META_DATA = new ItemMetaData<>(ArmorStandMeta.class, // paper
item -> new CraftMetaArmorStand(item.getComponentsPatch()), (item, extras) -> new CraftMetaArmorStand(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaArmorStand armorStand ? armorStand : new CraftMetaArmorStand(meta)); (type, meta) -> meta instanceof CraftMetaArmorStand armorStand ? armorStand : new CraftMetaArmorStand(meta));
private static final ItemMetaData<KnowledgeBookMeta> KNOWLEDGE_BOOK_META_DATA = new ItemMetaData<>(KnowledgeBookMeta.class, private static final ItemMetaData<KnowledgeBookMeta> KNOWLEDGE_BOOK_META_DATA = new ItemMetaData<>(KnowledgeBookMeta.class,
item -> new CraftMetaKnowledgeBook(item.getComponentsPatch()), (item, extras) -> new CraftMetaKnowledgeBook(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaKnowledgeBook knowledgeBook ? knowledgeBook : new CraftMetaKnowledgeBook(meta)); (type, meta) -> meta instanceof CraftMetaKnowledgeBook knowledgeBook ? knowledgeBook : new CraftMetaKnowledgeBook(meta));
private static final ItemMetaData<BlockStateMeta> BLOCK_STATE_META_DATA = new ItemMetaData<>(BlockStateMeta.class, private static final ItemMetaData<BlockStateMeta> BLOCK_STATE_META_DATA = new ItemMetaData<>(BlockStateMeta.class,
item -> new CraftMetaBlockState(item.getComponentsPatch(), CraftItemType.minecraftToBukkit(item.getItem())), (item, extras) -> new CraftMetaBlockState(item.getComponentsPatch(), CraftItemType.minecraftToBukkit(item.getItem()), extras),
(type, meta) -> new CraftMetaBlockState(meta, type.asMaterial())); (type, meta) -> new CraftMetaBlockState(meta, type.asMaterial()));
private static final ItemMetaData<ShieldMeta> SHIELD_META_DATA = new ItemMetaData<>(ShieldMeta.class, private static final ItemMetaData<ShieldMeta> SHIELD_META_DATA = new ItemMetaData<>(ShieldMeta.class,
item -> new CraftMetaShield(item.getComponentsPatch()), (item, extras) -> new CraftMetaShield(item.getComponentsPatch(), extras),
(type, meta) -> new CraftMetaShield(meta)); (type, meta) -> new CraftMetaShield(meta));
private static final ItemMetaData<TropicalFishBucketMeta> TROPICAL_FISH_BUCKET_META_DATA = new ItemMetaData<>(TropicalFishBucketMeta.class, private static final ItemMetaData<TropicalFishBucketMeta> TROPICAL_FISH_BUCKET_META_DATA = new ItemMetaData<>(TropicalFishBucketMeta.class,
item -> new CraftMetaTropicalFishBucket(item.getComponentsPatch()), (item, extras) -> new CraftMetaTropicalFishBucket(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaTropicalFishBucket tropicalFishBucket ? tropicalFishBucket : new CraftMetaTropicalFishBucket(meta)); (type, meta) -> meta instanceof CraftMetaTropicalFishBucket tropicalFishBucket ? tropicalFishBucket : new CraftMetaTropicalFishBucket(meta));
private static final ItemMetaData<AxolotlBucketMeta> AXOLOTL_BUCKET_META_DATA = new ItemMetaData<>(AxolotlBucketMeta.class, private static final ItemMetaData<AxolotlBucketMeta> AXOLOTL_BUCKET_META_DATA = new ItemMetaData<>(AxolotlBucketMeta.class,
item -> new CraftMetaAxolotlBucket(item.getComponentsPatch()), (item, extras) -> new CraftMetaAxolotlBucket(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaAxolotlBucket axolotlBucket ? axolotlBucket : new CraftMetaAxolotlBucket(meta)); (type, meta) -> meta instanceof CraftMetaAxolotlBucket axolotlBucket ? axolotlBucket : new CraftMetaAxolotlBucket(meta));
private static final ItemMetaData<CrossbowMeta> CROSSBOW_META_DATA = new ItemMetaData<>(CrossbowMeta.class, private static final ItemMetaData<CrossbowMeta> CROSSBOW_META_DATA = new ItemMetaData<>(CrossbowMeta.class,
item -> new CraftMetaCrossbow(item.getComponentsPatch()), (item, extras) -> new CraftMetaCrossbow(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaCrossbow crossbow ? crossbow : new CraftMetaCrossbow(meta)); (type, meta) -> meta instanceof CraftMetaCrossbow crossbow ? crossbow : new CraftMetaCrossbow(meta));
private static final ItemMetaData<SuspiciousStewMeta> SUSPICIOUS_STEW_META_DATA = new ItemMetaData<>(SuspiciousStewMeta.class, private static final ItemMetaData<SuspiciousStewMeta> SUSPICIOUS_STEW_META_DATA = new ItemMetaData<>(SuspiciousStewMeta.class,
item -> new CraftMetaSuspiciousStew(item.getComponentsPatch()), (item, extras) -> new CraftMetaSuspiciousStew(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaSuspiciousStew suspiciousStew ? suspiciousStew : new CraftMetaSuspiciousStew(meta)); (type, meta) -> meta instanceof CraftMetaSuspiciousStew suspiciousStew ? suspiciousStew : new CraftMetaSuspiciousStew(meta));
private static final ItemMetaData<ItemMeta> ENTITY_TAG_META_DATA = new ItemMetaData<>(ItemMeta.class, private static final ItemMetaData<ItemMeta> ENTITY_TAG_META_DATA = new ItemMetaData<>(ItemMeta.class,
item -> new CraftMetaEntityTag(item.getComponentsPatch()), (item, extras) -> new CraftMetaEntityTag(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaEntityTag entityTag ? entityTag : new CraftMetaEntityTag(meta)); (type, meta) -> meta instanceof CraftMetaEntityTag entityTag ? entityTag : new CraftMetaEntityTag(meta));
private static final ItemMetaData<CompassMeta> COMPASS_META_DATA = new ItemMetaData<>(CompassMeta.class, private static final ItemMetaData<CompassMeta> COMPASS_META_DATA = new ItemMetaData<>(CompassMeta.class,
item -> new CraftMetaCompass(item.getComponentsPatch()), (item, extras) -> new CraftMetaCompass(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaCompass compass ? compass : new CraftMetaCompass(meta)); (type, meta) -> meta instanceof CraftMetaCompass compass ? compass : new CraftMetaCompass(meta));
private static final ItemMetaData<BundleMeta> BUNDLE_META_DATA = new ItemMetaData<>(BundleMeta.class, private static final ItemMetaData<BundleMeta> BUNDLE_META_DATA = new ItemMetaData<>(BundleMeta.class,
item -> new CraftMetaBundle(item.getComponentsPatch()), (item, extras) -> new CraftMetaBundle(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaBundle bundle ? bundle : new CraftMetaBundle(meta)); (type, meta) -> meta instanceof CraftMetaBundle bundle ? bundle : new CraftMetaBundle(meta));
private static final ItemMetaData<MusicInstrumentMeta> MUSIC_INSTRUMENT_META_DATA = new ItemMetaData<>(MusicInstrumentMeta.class, private static final ItemMetaData<MusicInstrumentMeta> MUSIC_INSTRUMENT_META_DATA = new ItemMetaData<>(MusicInstrumentMeta.class,
item -> new CraftMetaMusicInstrument(item.getComponentsPatch()), (item, extras) -> new CraftMetaMusicInstrument(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaMusicInstrument musicInstrument ? musicInstrument : new CraftMetaMusicInstrument(meta)); (type, meta) -> meta instanceof CraftMetaMusicInstrument musicInstrument ? musicInstrument : new CraftMetaMusicInstrument(meta));
private static final ItemMetaData<OminousBottleMeta> OMINOUS_BOTTLE_META_DATA = new ItemMetaData<>(OminousBottleMeta.class, private static final ItemMetaData<OminousBottleMeta> OMINOUS_BOTTLE_META_DATA = new ItemMetaData<>(OminousBottleMeta.class,
item -> new CraftMetaOminousBottle(item.getComponentsPatch()), (item, extras) -> new CraftMetaOminousBottle(item.getComponentsPatch(), extras),
(type, meta) -> meta instanceof CraftMetaOminousBottle musicInstrument ? musicInstrument : new CraftMetaOminousBottle(meta)); (type, meta) -> meta instanceof CraftMetaOminousBottle musicInstrument ? musicInstrument : new CraftMetaOminousBottle(meta));
// We use if instead of a set, since the result gets cached in CraftItemType, // We use if instead of a set, since the result gets cached in CraftItemType,

Datei anzeigen

@ -173,10 +173,11 @@ public final class CraftItemStack extends ItemStack {
} else if (this.handle == null) { } else if (this.handle == null) {
this.handle = new net.minecraft.world.item.ItemStack(CraftItemType.bukkitToMinecraft(type), 1); this.handle = new net.minecraft.world.item.ItemStack(CraftItemType.bukkitToMinecraft(type), 1);
} else { } else {
final Material oldType = CraftMagicNumbers.getMaterial(this.handle.getItem()); // Paper
this.handle.setItem(CraftItemType.bukkitToMinecraft(type)); this.handle.setItem(CraftItemType.bukkitToMinecraft(type));
if (this.hasItemMeta()) { if (this.hasItemMeta()) {
// This will create the appropriate item meta, which will contain all the data we intend to keep // This will create the appropriate item meta, which will contain all the data we intend to keep
CraftItemStack.setItemMeta(this.handle, CraftItemStack.getItemMeta(this.handle)); this.adjustTagForItemMeta(oldType); // Paper
} }
} }
this.setData(null); this.setData(null);
@ -337,6 +338,19 @@ public final class CraftItemStack extends ItemStack {
public ItemMeta getItemMeta() { public ItemMeta getItemMeta() {
return CraftItemStack.getItemMeta(this.handle); return CraftItemStack.getItemMeta(this.handle);
} }
// Paper start - improve handled tags on type change
public void adjustTagForItemMeta(final Material oldType) {
final CraftMetaItem oldMeta = (CraftMetaItem) CraftItemFactory.instance().getItemMeta(oldType);
final ItemMeta newMeta;
if (oldMeta == null) {
newMeta = getItemMeta(this.handle);
} else {
final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts = new java.util.HashSet<>(CraftMetaItem.getTopLevelHandledDcts(oldMeta.getClass()));
newMeta = getItemMeta(this.handle, CraftItemType.minecraftToBukkitNew(this.handle.getItem()), extraHandledDcts);
}
this.setItemMeta(newMeta);
}
// Paper end - improve handled tags on type change
// Paper start // Paper start
public static void applyMetaToItem(net.minecraft.world.item.ItemStack itemStack, ItemMeta itemMeta) { public static void applyMetaToItem(net.minecraft.world.item.ItemStack itemStack, ItemMeta itemMeta) {
final CraftMetaItem.Applicator tag = new CraftMetaItem.Applicator(); final CraftMetaItem.Applicator tag = new CraftMetaItem.Applicator();
@ -349,12 +363,17 @@ public final class CraftItemStack extends ItemStack {
} }
public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item, org.bukkit.inventory.ItemType metaForType) { public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item, org.bukkit.inventory.ItemType metaForType) {
// Paper end // Paper end
// Paper start - handled tags on type change
return getItemMeta(item, metaForType, null);
}
public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item, org.bukkit.inventory.ItemType metaForType, final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) {
// Paper end - handled tags on type change
if (!CraftItemStack.hasItemMeta(item)) { if (!CraftItemStack.hasItemMeta(item)) {
return CraftItemFactory.instance().getItemMeta(CraftItemStack.getType(item)); return CraftItemFactory.instance().getItemMeta(CraftItemStack.getType(item));
} }
if (metaForType != null) { return ((CraftItemType<?>) metaForType).getItemMeta(item); } // Paper if (metaForType != null) { return ((CraftItemType<?>) metaForType).getItemMeta(item, extraHandledDcts); } // Paper
return ((CraftItemType<?>) CraftItemType.minecraftToBukkitNew(item.getItem())).getItemMeta(item); return ((CraftItemType<?>) CraftItemType.minecraftToBukkitNew(item.getItem())).getItemMeta(item, extraHandledDcts); // Paper
} }
static Material getType(net.minecraft.world.item.ItemStack item) { static Material getType(net.minecraft.world.item.ItemStack item) {

Datei anzeigen

@ -114,8 +114,8 @@ public class CraftItemType<M extends ItemMeta> implements ItemType.Typed<M>, Han
return this.item; return this.item;
} }
public M getItemMeta(net.minecraft.world.item.ItemStack itemStack) { public M getItemMeta(net.minecraft.world.item.ItemStack itemStack, final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) {
return this.itemMetaData.get().fromItemStack().apply(itemStack); return this.itemMetaData.get().fromItemStack().apply(itemStack, extraHandledDcts);
} }
public M getItemMeta(ItemMeta itemMeta) { public M getItemMeta(ItemMeta itemMeta) {

Datei anzeigen

@ -34,8 +34,8 @@ public class CraftMetaArmor extends CraftMetaItem implements ArmorMeta {
} }
} }
CraftMetaArmor(DataComponentPatch tag) { CraftMetaArmor(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaArmor.TRIM).ifPresent((trimCompound) -> { getOrEmpty(tag, CraftMetaArmor.TRIM).ifPresent((trimCompound) -> {
TrimMaterial trimMaterial = CraftTrimMaterial.minecraftHolderToBukkit(trimCompound.material()); TrimMaterial trimMaterial = CraftTrimMaterial.minecraftHolderToBukkit(trimCompound.material());

Datei anzeigen

@ -35,8 +35,8 @@ public class CraftMetaArmorStand extends CraftMetaItem implements com.destroysto
this.entityTag = armorStand.entityTag; this.entityTag = armorStand.entityTag;
} }
CraftMetaArmorStand(DataComponentPatch tag) { CraftMetaArmorStand(DataComponentPatch tag, final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaArmorStand.ENTITY_TAG).ifPresent((nbt) -> { getOrEmpty(tag, CraftMetaArmorStand.ENTITY_TAG).ifPresent((nbt) -> {
this.entityTag = nbt.copyTag(); this.entityTag = nbt.copyTag();

Datei anzeigen

@ -36,8 +36,8 @@ public class CraftMetaAxolotlBucket extends CraftMetaItem implements AxolotlBuck
this.bucketEntityTag = bucket.bucketEntityTag; this.bucketEntityTag = bucket.bucketEntityTag;
} }
CraftMetaAxolotlBucket(DataComponentPatch tag) { CraftMetaAxolotlBucket(DataComponentPatch tag, final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaAxolotlBucket.ENTITY_TAG).ifPresent((nbt) -> { getOrEmpty(tag, CraftMetaAxolotlBucket.ENTITY_TAG).ifPresent((nbt) -> {
this.entityTag = nbt.copyTag(); this.entityTag = nbt.copyTag();

Datei anzeigen

@ -34,8 +34,8 @@ public class CraftMetaBanner extends CraftMetaItem implements BannerMeta {
this.patterns = new ArrayList<Pattern>(banner.patterns); this.patterns = new ArrayList<Pattern>(banner.patterns);
} }
CraftMetaBanner(DataComponentPatch tag) { CraftMetaBanner(DataComponentPatch tag, final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaBanner.PATTERNS).ifPresent((entityTag) -> { getOrEmpty(tag, CraftMetaBanner.PATTERNS).ifPresent((entityTag) -> {
List<BannerPatternLayers.Layer> patterns = entityTag.layers(); List<BannerPatternLayers.Layer> patterns = entityTag.layers();

Datei anzeigen

@ -73,8 +73,8 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
this.position = te.position; this.position = te.position;
} }
CraftMetaBlockState(DataComponentPatch tag, Material material) { CraftMetaBlockState(DataComponentPatch tag, Material material, final Set<DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
this.material = material; this.material = material;
getOrEmpty(tag, CraftMetaBlockState.BLOCK_ENTITY_TAG).ifPresent((blockTag) -> { getOrEmpty(tag, CraftMetaBlockState.BLOCK_ENTITY_TAG).ifPresent((blockTag) -> {

Datei anzeigen

@ -64,8 +64,8 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta, WritableBo
} }
} }
CraftMetaBook(DataComponentPatch tag) { CraftMetaBook(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaBook.BOOK_CONTENT).ifPresent((writable) -> { getOrEmpty(tag, CraftMetaBook.BOOK_CONTENT).ifPresent((writable) -> {
List<Filterable<String>> pages = writable.pages(); List<Filterable<String>> pages = writable.pages();

Datei anzeigen

@ -78,8 +78,8 @@ public class CraftMetaBookSigned extends CraftMetaItem implements BookMeta {
} }
} }
CraftMetaBookSigned(DataComponentPatch tag) { CraftMetaBookSigned(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaBookSigned.BOOK_CONTENT).ifPresent((written) -> { getOrEmpty(tag, CraftMetaBookSigned.BOOK_CONTENT).ifPresent((written) -> {
this.title = written.title().raw(); this.title = written.title().raw();

Datei anzeigen

@ -34,8 +34,8 @@ public class CraftMetaBundle extends CraftMetaItem implements BundleMeta {
} }
} }
CraftMetaBundle(DataComponentPatch tag) { CraftMetaBundle(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaBundle.ITEMS).ifPresent((bundle) -> { getOrEmpty(tag, CraftMetaBundle.ITEMS).ifPresent((bundle) -> {
bundle.items().forEach((item) -> { bundle.items().forEach((item) -> {

Datei anzeigen

@ -29,8 +29,8 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta {
this.setEffect(SerializableMeta.getObject(FireworkEffect.class, map, CraftMetaCharge.EXPLOSION.BUKKIT, true)); this.setEffect(SerializableMeta.getObject(FireworkEffect.class, map, CraftMetaCharge.EXPLOSION.BUKKIT, true));
} }
CraftMetaCharge(DataComponentPatch tag) { CraftMetaCharge(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaCharge.EXPLOSION).ifPresent((f) -> { getOrEmpty(tag, CraftMetaCharge.EXPLOSION).ifPresent((f) -> {
try { try {

Datei anzeigen

@ -18,8 +18,8 @@ public class CraftMetaColorableArmor extends CraftMetaArmor implements Colorable
CraftMetaLeatherArmor.readColor(this, meta); CraftMetaLeatherArmor.readColor(this, meta);
} }
CraftMetaColorableArmor(DataComponentPatch tag) { CraftMetaColorableArmor(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
CraftMetaLeatherArmor.readColor(this, tag); CraftMetaLeatherArmor.readColor(this, tag);
} }

Datei anzeigen

@ -50,8 +50,8 @@ public class CraftMetaCompass extends CraftMetaItem implements CompassMeta {
this.tracked = compassMeta.tracked; this.tracked = compassMeta.tracked;
} }
CraftMetaCompass(DataComponentPatch tag) { CraftMetaCompass(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaCompass.LODESTONE_TARGET).ifPresent((lodestoneTarget) -> { getOrEmpty(tag, CraftMetaCompass.LODESTONE_TARGET).ifPresent((lodestoneTarget) -> {
lodestoneTarget.target().ifPresent((target) -> { lodestoneTarget.target().ifPresent((target) -> {
this.lodestoneWorld = target.dimension(); this.lodestoneWorld = target.dimension();

Datei anzeigen

@ -36,8 +36,8 @@ public class CraftMetaCrossbow extends CraftMetaItem implements CrossbowMeta {
} }
} }
CraftMetaCrossbow(DataComponentPatch tag) { CraftMetaCrossbow(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaCrossbow.CHARGED_PROJECTILES).ifPresent((p) -> { getOrEmpty(tag, CraftMetaCrossbow.CHARGED_PROJECTILES).ifPresent((p) -> {
List<net.minecraft.world.item.ItemStack> list = p.getItems(); List<net.minecraft.world.item.ItemStack> list = p.getItems();

Datei anzeigen

@ -32,8 +32,8 @@ class CraftMetaEnchantedBook extends CraftMetaItem implements EnchantmentStorage
} }
} }
CraftMetaEnchantedBook(DataComponentPatch tag) { CraftMetaEnchantedBook(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaEnchantedBook.STORED_ENCHANTMENTS).ifPresent((itemEnchantments) -> { getOrEmpty(tag, CraftMetaEnchantedBook.STORED_ENCHANTMENTS).ifPresent((itemEnchantments) -> {
this.enchantments = buildEnchantments(itemEnchantments); this.enchantments = buildEnchantments(itemEnchantments);

Datei anzeigen

@ -39,8 +39,8 @@ public class CraftMetaEntityTag extends CraftMetaItem {
this.entityTag = entity.entityTag; this.entityTag = entity.entityTag;
} }
CraftMetaEntityTag(DataComponentPatch tag) { CraftMetaEntityTag(DataComponentPatch tag, final java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaEntityTag.ENTITY_TAG).ifPresent((nbt) -> { getOrEmpty(tag, CraftMetaEntityTag.ENTITY_TAG).ifPresent((nbt) -> {
this.entityTag = nbt.copyTag(); this.entityTag = nbt.copyTag();

Datei anzeigen

@ -60,8 +60,8 @@ class CraftMetaFirework extends CraftMetaItem implements FireworkMeta {
} }
} }
CraftMetaFirework(DataComponentPatch tag) { CraftMetaFirework(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaFirework.FIREWORKS).ifPresent((fireworks) -> { getOrEmpty(tag, CraftMetaFirework.FIREWORKS).ifPresent((fireworks) -> {
this.power = fireworks.flightDuration(); this.power = fireworks.flightDuration();

Datei anzeigen

@ -393,7 +393,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
// Paper end // Paper end
} }
CraftMetaItem(DataComponentPatch tag) { CraftMetaItem(DataComponentPatch tag, Set<DataComponentType<?>> extraHandledTags) { // Paper - improve handled tags on type changes
CraftMetaItem.getOrEmpty(tag, CraftMetaItem.NAME).ifPresent((component) -> { CraftMetaItem.getOrEmpty(tag, CraftMetaItem.NAME).ifPresent((component) -> {
this.displayName = component; this.displayName = component;
}); });
@ -525,9 +525,16 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
}); });
// Paper end - fix ItemFlags // Paper end - fix ItemFlags
// Paper start - improve checking handled data component types
Set<DataComponentType<?>> handledTags = getTopLevelHandledDcts(this.getClass());
if (extraHandledTags != null) {
extraHandledTags.addAll(handledTags);
handledTags = extraHandledTags;
}
// Paper end - improve checking handled data component types
Set<Map.Entry<DataComponentType<?>, Optional<?>>> keys = tag.entrySet(); Set<Map.Entry<DataComponentType<?>, Optional<?>>> keys = tag.entrySet();
for (Map.Entry<DataComponentType<?>, Optional<?>> key : keys) { for (Map.Entry<DataComponentType<?>, Optional<?>> key : keys) {
if (!CraftMetaItem.getHandledTags().contains(key.getKey())) { if (!handledTags.contains(key.getKey())) { // Paper - improve checking handled data component types
key.getValue().ifPresent((value) -> { key.getValue().ifPresent((value) -> {
this.unhandledTags.set((DataComponentType) key.getKey(), value); this.unhandledTags.set((DataComponentType) key.getKey(), value);
}); });
@ -2372,75 +2379,83 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
this.version = version; this.version = version;
} }
public static Set<DataComponentType> getHandledTags() { // Paper start - improve checking handled tags
synchronized (CraftMetaItem.HANDLED_TAGS) { @org.jetbrains.annotations.VisibleForTesting
if (CraftMetaItem.HANDLED_TAGS.isEmpty()) { public static final Map<Class<? extends CraftMetaItem>, Set<DataComponentType<?>>> HANDLED_DCTS_PER_TYPE = new HashMap<>();
CraftMetaItem.HANDLED_TAGS.addAll(Arrays.asList( private static final Set<DataComponentType<?>> DEFAULT_HANDLED_DCTS = Set.of(
CraftMetaItem.NAME.TYPE, CraftMetaItem.NAME.TYPE,
CraftMetaItem.ITEM_NAME.TYPE, CraftMetaItem.ITEM_NAME.TYPE,
CraftMetaItem.LORE.TYPE, CraftMetaItem.LORE.TYPE,
CraftMetaItem.CUSTOM_MODEL_DATA.TYPE, CraftMetaItem.CUSTOM_MODEL_DATA.TYPE,
CraftMetaItem.ENCHANTABLE.TYPE, CraftMetaItem.ENCHANTABLE.TYPE,
CraftMetaItem.BLOCK_DATA.TYPE, CraftMetaItem.BLOCK_DATA.TYPE,
CraftMetaItem.REPAIR.TYPE, CraftMetaItem.REPAIR.TYPE,
CraftMetaItem.ENCHANTMENTS.TYPE, CraftMetaItem.ENCHANTMENTS.TYPE,
CraftMetaItem.HIDE_ADDITIONAL_TOOLTIP.TYPE, CraftMetaItem.HIDE_ADDITIONAL_TOOLTIP.TYPE,
CraftMetaItem.HIDE_TOOLTIP.TYPE, CraftMetaItem.HIDE_TOOLTIP.TYPE,
CraftMetaItem.TOOLTIP_STYLE.TYPE, CraftMetaItem.TOOLTIP_STYLE.TYPE,
CraftMetaItem.ITEM_MODEL.TYPE, CraftMetaItem.ITEM_MODEL.TYPE,
CraftMetaItem.UNBREAKABLE.TYPE, CraftMetaItem.UNBREAKABLE.TYPE,
CraftMetaItem.ENCHANTMENT_GLINT_OVERRIDE.TYPE, CraftMetaItem.ENCHANTMENT_GLINT_OVERRIDE.TYPE,
CraftMetaItem.GLIDER.TYPE, CraftMetaItem.GLIDER.TYPE,
CraftMetaItem.DAMAGE_RESISTANT.TYPE, CraftMetaItem.DAMAGE_RESISTANT.TYPE,
CraftMetaItem.MAX_STACK_SIZE.TYPE, CraftMetaItem.MAX_STACK_SIZE.TYPE,
CraftMetaItem.RARITY.TYPE, CraftMetaItem.RARITY.TYPE,
CraftMetaItem.USE_REMAINDER.TYPE, CraftMetaItem.USE_REMAINDER.TYPE,
CraftMetaItem.USE_COOLDOWN.TYPE, CraftMetaItem.USE_COOLDOWN.TYPE,
CraftMetaItem.FOOD.TYPE, CraftMetaItem.FOOD.TYPE,
CraftMetaItem.TOOL.TYPE, CraftMetaItem.TOOL.TYPE,
CraftMetaItem.EQUIPPABLE.TYPE, CraftMetaItem.EQUIPPABLE.TYPE,
CraftMetaItem.JUKEBOX_PLAYABLE.TYPE, CraftMetaItem.JUKEBOX_PLAYABLE.TYPE,
CraftMetaItem.DAMAGE.TYPE, CraftMetaItem.DAMAGE.TYPE,
CraftMetaItem.MAX_DAMAGE.TYPE, CraftMetaItem.MAX_DAMAGE.TYPE,
CraftMetaItem.CUSTOM_DATA.TYPE, CraftMetaItem.CUSTOM_DATA.TYPE,
CraftMetaItem.ATTRIBUTES.TYPE, CraftMetaItem.ATTRIBUTES.TYPE,
CraftMetaItem.CAN_PLACE_ON.TYPE, // Paper CraftMetaItem.CAN_PLACE_ON.TYPE, // Paper
CraftMetaItem.CAN_BREAK.TYPE, // Paper CraftMetaItem.CAN_BREAK.TYPE // Paper
CraftMetaArmor.TRIM.TYPE, );
CraftMetaArmorStand.ENTITY_TAG.TYPE, public static Set<DataComponentType<?>> getTopLevelHandledDcts(final Class<? extends CraftMetaItem> clazz) {
CraftMetaBanner.PATTERNS.TYPE, synchronized (HANDLED_DCTS_PER_TYPE) {
CraftMetaEntityTag.ENTITY_TAG.TYPE, if (HANDLED_DCTS_PER_TYPE.isEmpty()) {
CraftMetaLeatherArmor.COLOR.TYPE, final Map<Class<? extends CraftMetaItem>, Set<DataComponentType<?>>> map = new HashMap<>();
CraftMetaMap.MAP_POST_PROCESSING.TYPE, map.put(CraftMetaArmor.class, Set.of(CraftMetaArmor.TRIM.TYPE));
CraftMetaMap.MAP_COLOR.TYPE, map.put(CraftMetaArmorStand.class, Set.of(CraftMetaArmorStand.ENTITY_TAG.TYPE));
CraftMetaMap.MAP_ID.TYPE, map.put(CraftMetaAxolotlBucket.class, Set.of(CraftMetaAxolotlBucket.ENTITY_TAG.TYPE, CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG.TYPE));
CraftMetaPotion.POTION_CONTENTS.TYPE, map.put(CraftMetaBanner.class, Set.of(CraftMetaBanner.PATTERNS.TYPE)); // banner uses same tag as block state
CraftMetaShield.BASE_COLOR.TYPE, map.put(CraftMetaShield.class, Set.of(CraftMetaShield.BASE_COLOR.TYPE, CraftMetaBanner.PATTERNS.TYPE));
CraftMetaSkull.SKULL_PROFILE.TYPE, map.put(CraftMetaBlockState.class, Set.of(CraftMetaBlockState.BLOCK_ENTITY_TAG.TYPE));
CraftMetaSkull.NOTE_BLOCK_SOUND.TYPE, map.put(CraftMetaBook.class, Set.of(CraftMetaBook.BOOK_CONTENT.TYPE));
CraftMetaSpawnEgg.ENTITY_TAG.TYPE, map.put(CraftMetaBookSigned.class, Set.of(CraftMetaBookSigned.BOOK_CONTENT.TYPE));
CraftMetaBlockState.BLOCK_ENTITY_TAG.TYPE, map.put(CraftMetaBundle.class, Set.of(CraftMetaBundle.ITEMS.TYPE));
CraftMetaBook.BOOK_CONTENT.TYPE, map.put(CraftMetaCharge.class, Set.of(CraftMetaCharge.EXPLOSION.TYPE));
CraftMetaBookSigned.BOOK_CONTENT.TYPE, map.put(CraftMetaColorableArmor.class, Set.of(CraftMetaArmor.TRIM.TYPE, CraftMetaLeatherArmor.COLOR.TYPE));
CraftMetaFirework.FIREWORKS.TYPE, map.put(CraftMetaCompass.class, Set.of(CraftMetaCompass.LODESTONE_TARGET.TYPE));
CraftMetaEnchantedBook.STORED_ENCHANTMENTS.TYPE, map.put(CraftMetaCrossbow.class, Set.of(CraftMetaCrossbow.CHARGED_PROJECTILES.TYPE));
CraftMetaCharge.EXPLOSION.TYPE, map.put(CraftMetaEnchantedBook.class, Set.of(CraftMetaEnchantedBook.STORED_ENCHANTMENTS.TYPE));
CraftMetaKnowledgeBook.BOOK_RECIPES.TYPE, map.put(CraftMetaEntityTag.class, Set.of(CraftMetaEntityTag.ENTITY_TAG.TYPE));
CraftMetaTropicalFishBucket.ENTITY_TAG.TYPE, map.put(CraftMetaFirework.class, Set.of(CraftMetaFirework.FIREWORKS.TYPE));
CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG.TYPE, map.put(CraftMetaKnowledgeBook.class, Set.of(CraftMetaKnowledgeBook.BOOK_RECIPES.TYPE));
CraftMetaAxolotlBucket.ENTITY_TAG.TYPE, map.put(CraftMetaLeatherArmor.class, Set.of(CraftMetaLeatherArmor.COLOR.TYPE));
CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG.TYPE, map.put(CraftMetaMap.class, Set.of(CraftMetaMap.MAP_COLOR.TYPE, CraftMetaMap.MAP_POST_PROCESSING.TYPE, CraftMetaMap.MAP_ID.TYPE));
CraftMetaCrossbow.CHARGED_PROJECTILES.TYPE, map.put(CraftMetaMusicInstrument.class, Set.of(CraftMetaMusicInstrument.GOAT_HORN_INSTRUMENT.TYPE));
CraftMetaSuspiciousStew.EFFECTS.TYPE, map.put(CraftMetaOminousBottle.class, Set.of(CraftMetaOminousBottle.OMINOUS_BOTTLE_AMPLIFIER.TYPE));
CraftMetaCompass.LODESTONE_TARGET.TYPE, map.put(CraftMetaPotion.class, Set.of(CraftMetaPotion.POTION_CONTENTS.TYPE));
CraftMetaBundle.ITEMS.TYPE, map.put(CraftMetaSkull.class, Set.of(CraftMetaSkull.SKULL_PROFILE.TYPE, CraftMetaSkull.NOTE_BLOCK_SOUND.TYPE));
CraftMetaMusicInstrument.GOAT_HORN_INSTRUMENT.TYPE, map.put(CraftMetaSpawnEgg.class, Set.of(CraftMetaSpawnEgg.ENTITY_TAG.TYPE));
CraftMetaOminousBottle.OMINOUS_BOTTLE_AMPLIFIER.TYPE map.put(CraftMetaSuspiciousStew.class, Set.of(CraftMetaSuspiciousStew.EFFECTS.TYPE));
)); map.put(CraftMetaTropicalFishBucket.class, Set.of(CraftMetaTropicalFishBucket.ENTITY_TAG.TYPE, CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG.TYPE));
for (final Map.Entry<Class<? extends CraftMetaItem>, Set<DataComponentType<?>>> entry : map.entrySet()) {
final ArrayList<DataComponentType<?>> topLevelTags = new ArrayList<>(entry.getValue());
// add tags common to CraftMetaItem to all
topLevelTags.addAll(DEFAULT_HANDLED_DCTS);
HANDLED_DCTS_PER_TYPE.put(entry.getKey(), Set.copyOf(topLevelTags));
}
} }
return CraftMetaItem.HANDLED_TAGS; return HANDLED_DCTS_PER_TYPE.getOrDefault(clazz, DEFAULT_HANDLED_DCTS);
} }
} }
// Paper end - improve checking handled data component types
protected static <T> Optional<? extends T> getOrEmpty(DataComponentPatch tag, ItemMetaKeyType<T> type) { protected static <T> Optional<? extends T> getOrEmpty(DataComponentPatch tag, ItemMetaKeyType<T> type) {
Optional<? extends T> result = tag.get(type.TYPE); Optional<? extends T> result = tag.get(type.TYPE);

Datei anzeigen

@ -32,8 +32,8 @@ public class CraftMetaKnowledgeBook extends CraftMetaItem implements KnowledgeBo
} }
} }
CraftMetaKnowledgeBook(DataComponentPatch tag) { CraftMetaKnowledgeBook(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaKnowledgeBook.BOOK_RECIPES).ifPresent((pages) -> { getOrEmpty(tag, CraftMetaKnowledgeBook.BOOK_RECIPES).ifPresent((pages) -> {
for (int i = 0; i < pages.size(); i++) { for (int i = 0; i < pages.size(); i++) {

Datei anzeigen

@ -25,8 +25,8 @@ class CraftMetaLeatherArmor extends CraftMetaItem implements LeatherArmorMeta {
CraftMetaLeatherArmor.readColor(this, meta); CraftMetaLeatherArmor.readColor(this, meta);
} }
CraftMetaLeatherArmor(DataComponentPatch tag) { CraftMetaLeatherArmor(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
CraftMetaLeatherArmor.readColor(this, tag); CraftMetaLeatherArmor.readColor(this, tag);
} }

Datei anzeigen

@ -44,8 +44,8 @@ class CraftMetaMap extends CraftMetaItem implements MapMeta {
this.color = map.color; this.color = map.color;
} }
CraftMetaMap(DataComponentPatch tag) { CraftMetaMap(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaMap.MAP_ID).ifPresent((mapId) -> { getOrEmpty(tag, CraftMetaMap.MAP_ID).ifPresent((mapId) -> {
this.mapId = mapId.id(); this.mapId = mapId.id();

Datei anzeigen

@ -26,8 +26,8 @@ public class CraftMetaMusicInstrument extends CraftMetaItem implements MusicInst
} }
} }
CraftMetaMusicInstrument(DataComponentPatch tag) { CraftMetaMusicInstrument(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaMusicInstrument.GOAT_HORN_INSTRUMENT).ifPresent((instrument) -> { getOrEmpty(tag, CraftMetaMusicInstrument.GOAT_HORN_INSTRUMENT).ifPresent((instrument) -> {
this.instrument = CraftMusicInstrument.minecraftHolderToBukkit(instrument); this.instrument = CraftMusicInstrument.minecraftHolderToBukkit(instrument);

Datei anzeigen

@ -24,8 +24,8 @@ public class CraftMetaOminousBottle extends CraftMetaItem implements OminousBott
this.ominousBottleAmplifier = bottleMeta.ominousBottleAmplifier; this.ominousBottleAmplifier = bottleMeta.ominousBottleAmplifier;
} }
CraftMetaOminousBottle(DataComponentPatch tag) { CraftMetaOminousBottle(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaOminousBottle.OMINOUS_BOTTLE_AMPLIFIER).ifPresent((amplifier) -> { getOrEmpty(tag, CraftMetaOminousBottle.OMINOUS_BOTTLE_AMPLIFIER).ifPresent((amplifier) -> {
this.ominousBottleAmplifier = amplifier.value(); this.ominousBottleAmplifier = amplifier.value();
}); });

Datei anzeigen

@ -54,8 +54,8 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta {
} }
} }
CraftMetaPotion(DataComponentPatch tag) { CraftMetaPotion(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaPotion.POTION_CONTENTS).ifPresent((potionContents) -> { getOrEmpty(tag, CraftMetaPotion.POTION_CONTENTS).ifPresent((potionContents) -> {
potionContents.potion().ifPresent((potion) -> { potionContents.potion().ifPresent((potion) -> {
this.type = CraftPotionType.minecraftHolderToBukkit(potion); this.type = CraftPotionType.minecraftHolderToBukkit(potion);

Datei anzeigen

@ -42,8 +42,8 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
} }
} }
CraftMetaShield(DataComponentPatch tag) { CraftMetaShield(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper - improve checking handled tags in item meta
super(tag); super(tag, extraHandledDcts); // Paper - improve checking handled tags in item meta
getOrEmpty(tag, CraftMetaShield.BASE_COLOR).ifPresent((color) -> { getOrEmpty(tag, CraftMetaShield.BASE_COLOR).ifPresent((color) -> {
this.banner = CraftMetaShield.getBlockState(DyeColor.getByWoolData((byte) color.getId())); this.banner = CraftMetaShield.getBlockState(DyeColor.getByWoolData((byte) color.getId()));

Datei anzeigen

@ -48,8 +48,8 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
this.noteBlockSound = skullMeta.noteBlockSound; this.noteBlockSound = skullMeta.noteBlockSound;
} }
CraftMetaSkull(DataComponentPatch tag) { CraftMetaSkull(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaSkull.SKULL_PROFILE).ifPresent(this::setProfile); getOrEmpty(tag, CraftMetaSkull.SKULL_PROFILE).ifPresent(this::setProfile);

Datei anzeigen

@ -33,8 +33,8 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
this.entityTag = egg.entityTag; this.entityTag = egg.entityTag;
} }
CraftMetaSpawnEgg(DataComponentPatch tag) { CraftMetaSpawnEgg(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaSpawnEgg.ENTITY_TAG).ifPresent((nbt) -> { getOrEmpty(tag, CraftMetaSpawnEgg.ENTITY_TAG).ifPresent((nbt) -> {
this.entityTag = nbt.copyTag(); this.entityTag = nbt.copyTag();

Datei anzeigen

@ -33,8 +33,8 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
} }
} }
CraftMetaSuspiciousStew(DataComponentPatch tag) { CraftMetaSuspiciousStew(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaSuspiciousStew.EFFECTS).ifPresent((suspiciousStewEffects) -> { getOrEmpty(tag, CraftMetaSuspiciousStew.EFFECTS).ifPresent((suspiciousStewEffects) -> {
List<SuspiciousStewEffects.Entry> list = suspiciousStewEffects.effects(); List<SuspiciousStewEffects.Entry> list = suspiciousStewEffects.effects();
int length = list.size(); int length = list.size();

Datei anzeigen

@ -38,8 +38,8 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB
this.bucketEntityTag = bucket.bucketEntityTag; this.bucketEntityTag = bucket.bucketEntityTag;
} }
CraftMetaTropicalFishBucket(DataComponentPatch tag) { CraftMetaTropicalFishBucket(DataComponentPatch tag, java.util.Set<net.minecraft.core.component.DataComponentType<?>> extraHandledDcts) { // Paper
super(tag); super(tag, extraHandledDcts); // Paper
getOrEmpty(tag, CraftMetaTropicalFishBucket.ENTITY_TAG).ifPresent((nbt) -> { getOrEmpty(tag, CraftMetaTropicalFishBucket.ENTITY_TAG).ifPresent((nbt) -> {
this.entityTag = nbt.copyTag(); this.entityTag = nbt.copyTag();

Datei anzeigen

@ -97,7 +97,7 @@ public class DeprecatedItemMetaCustomValueTest {
CraftMetaItem.Applicator compound = new CraftMetaItem.Applicator(); CraftMetaItem.Applicator compound = new CraftMetaItem.Applicator();
itemMeta.applyToItem(compound); itemMeta.applyToItem(compound);
assertEquals(itemMeta, new CraftMetaItem(compound.build())); assertEquals(itemMeta, new CraftMetaItem(compound.build(), null)); // Paper
} }
@Test @Test

Datei anzeigen

@ -0,0 +1,33 @@
package org.bukkit.craftbukkit.inventory;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
import org.bukkit.support.environment.AllFeatures;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
// in cb package because of package-private stuff
@AllFeatures
class MetaHandledTagsTest {
@Test
public void checkAllMetasHaveHandledTags() {
try (final ScanResult result = new ClassGraph()
.whitelistPackages("org.bukkit.craftbukkit.inventory")
.enableClassInfo().scan()) {
final ClassInfoList subclasses = result.getSubclasses(CraftMetaItem.class.getName());
assertFalse(subclasses.isEmpty(), "found 0 sub types");
for (final ClassInfo subclass : subclasses) {
final Class<CraftMetaItem> clazz = subclass.loadClass(CraftMetaItem.class);
CraftMetaItem.getTopLevelHandledDcts(clazz); // load into map
assertTrue(CraftMetaItem.HANDLED_DCTS_PER_TYPE.containsKey(clazz), subclass.getName() + " not found in handled tags map");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

Datei anzeigen

@ -131,7 +131,7 @@ public class PersistentDataContainerTest {
CraftMetaItem.Applicator compound = new CraftMetaItem.Applicator(); CraftMetaItem.Applicator compound = new CraftMetaItem.Applicator();
itemMeta.applyToItem(compound); itemMeta.applyToItem(compound);
assertEquals(itemMeta, new CraftMetaItem(compound.build())); assertEquals(itemMeta, new CraftMetaItem(compound.build(), null)); // Paper
} }
@Test @Test
@ -464,7 +464,7 @@ public class PersistentDataContainerTest {
@Test @Test
public void testEmptyListApplicationToAnyType() throws IOException { public void testEmptyListApplicationToAnyType() throws IOException {
final CraftMetaItem craftItem = new CraftMetaItem(DataComponentPatch.EMPTY); final CraftMetaItem craftItem = new CraftMetaItem(DataComponentPatch.EMPTY, null); // Paper
final PersistentDataContainer container = craftItem.getPersistentDataContainer(); final PersistentDataContainer container = craftItem.getPersistentDataContainer();
container.set(PersistentDataContainerTest.requestKey("list"), PersistentDataType.LIST.strings(), List.of()); container.set(PersistentDataContainerTest.requestKey("list"), PersistentDataType.LIST.strings(), List.of());
@ -477,7 +477,7 @@ public class PersistentDataContainerTest {
final CraftMetaItem.Applicator storage = new CraftMetaItem.Applicator(); final CraftMetaItem.Applicator storage = new CraftMetaItem.Applicator();
craftItem.applyToItem(storage); craftItem.applyToItem(storage);
final CraftMetaItem readItem = new CraftMetaItem(storage.build()); final CraftMetaItem readItem = new CraftMetaItem(storage.build(), null); // Paper
final PersistentDataContainer readContainer = readItem.getPersistentDataContainer(); final PersistentDataContainer readContainer = readItem.getPersistentDataContainer();
assertTrue(readContainer.has(PersistentDataContainerTest.requestKey("list"), PersistentDataType.LIST.strings())); assertTrue(readContainer.has(PersistentDataContainerTest.requestKey("list"), PersistentDataType.LIST.strings()));