From eb5257d3a5ca26e9bdc303a22dd2881da62b0165 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Thu, 13 Jul 2023 16:59:49 -0400
Subject: [PATCH] Suppress Item Meta Validation Checks (#9331)

Stops item meta from aggressively throwing exceptions.
---
 ...Suppress-Item-Meta-Validation-Checks.patch | 86 +++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 patches/server/Suppress-Item-Meta-Validation-Checks.patch

diff --git a/patches/server/Suppress-Item-Meta-Validation-Checks.patch b/patches/server/Suppress-Item-Meta-Validation-Checks.patch
new file mode 100644
index 0000000000..945fd5c81f
--- /dev/null
+++ b/patches/server/Suppress-Item-Meta-Validation-Checks.patch
@@ -0,0 +1,86 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
+Date: Mon, 12 Jun 2023 14:42:49 -0400
+Subject: [PATCH] Suppress Item Meta Validation Checks
+
+In some cases ItemMeta could validate tags in an ItemStack. This suppresses those warnings and ignores reading the value.
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmor.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmor.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmor.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmor.java
+@@ -0,0 +0,0 @@ public class CraftMetaArmor extends CraftMetaItem implements ArmorMeta {
+             CompoundTag trimCompound = tag.getCompound(TRIM.NBT);
+ 
+             if (trimCompound.contains(TRIM_MATERIAL.NBT, net.minecraft.nbt.Tag.TAG_STRING) && trimCompound.contains(TRIM_PATTERN.NBT, net.minecraft.nbt.Tag.TAG_STRING)) { // Paper - for now, ignore inline definitions of trim material & pattern
+-                TrimMaterial trimMaterial = Registry.TRIM_MATERIAL.get(NamespacedKey.fromString(trimCompound.getString(TRIM_MATERIAL.NBT)));
+-                TrimPattern trimPattern = Registry.TRIM_PATTERN.get(NamespacedKey.fromString(trimCompound.getString(TRIM_PATTERN.NBT)));
++                // Paper start
++                TrimMaterial trimMaterial = getRegistry(Registry.TRIM_MATERIAL, trimCompound.getString(TRIM_MATERIAL.NBT));
++                TrimPattern trimPattern = getRegistry(Registry.TRIM_PATTERN, trimCompound.getString(TRIM_PATTERN.NBT));
++                // Paper end
+ 
+-                this.trim = new ArmorTrim(trimMaterial, trimPattern);
++                this.trim = trimMaterial == null || trimPattern == null ? null : new ArmorTrim(trimMaterial, trimPattern); // Paper
+             }
+         }
+     }
++    // Paper start
++    public <T extends org.bukkit.Keyed> T getRegistry(Registry<T> registry, String value) {
++        if (value == null || value.isEmpty()) {
++            return null;
++        }
++        NamespacedKey namespacedKey = NamespacedKey.fromString(value);
++        if (namespacedKey == null) {
++            return null;
++        }
++
++        T registryValue = registry.get(namespacedKey);
++        if (registryValue == null) {
++            return null;
++        }
++
++        return registryValue;
++    }
++    // Paper end
+ 
+     CraftMetaArmor(Map<String, Object> map) {
+         super(map);
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+@@ -0,0 +0,0 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+                 continue;
+             }
+ 
+-            Attribute attribute = CraftAttributeMap.fromMinecraft(attributeName);
++            // Paper start
++            Attribute attribute;
++            try {
++                attribute = CraftAttributeMap.fromMinecraft(attributeName);
++            } catch (IllegalArgumentException e) {
++                attribute = null;
++            }
++            // Paper end
+             if (attribute == null) {
+                 continue;
+             }
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
+@@ -0,0 +0,0 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
+     CraftMetaSkull(CompoundTag tag) {
+         super(tag);
+ 
++        try { // Paper - Ignore invalid game profiles
+         if (tag.contains(SKULL_OWNER.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) {
+             this.setProfile(NbtUtils.readGameProfile(tag.getCompound(SKULL_OWNER.NBT)));
+         } else if (tag.contains(SKULL_OWNER.NBT, CraftMagicNumbers.NBT.TAG_STRING) && !tag.getString(SKULL_OWNER.NBT).isEmpty()) {
+             this.setProfile(new GameProfile(null, tag.getString(SKULL_OWNER.NBT)));
+         }
++        } catch (Exception ignored) {} // Paper
+ 
+         if (tag.contains(BLOCK_ENTITY_TAG.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) {
+             CompoundTag nbtTagCompound = tag.getCompound(BLOCK_ENTITY_TAG.NBT).copy();