aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0958-Suppress-Item-Meta-Validation-Checks.patch
blob: ee326bb6ed7b81145f92b67af400ddbd2a1724d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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 f393e0844889c967d9e83d9a1e73c134fcb6e33b..f8996ee643a46db301577f6c523f24e973e8f309 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmor.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmor.java
@@ -68,13 +68,33 @@ public class CraftMetaArmor extends CraftMetaItem implements ArmorMeta {
             CompoundTag trimCompound = tag.getCompound(CraftMetaArmor.TRIM.NBT);
 
             if (trimCompound.contains(CraftMetaArmor.TRIM_MATERIAL.NBT, net.minecraft.nbt.Tag.TAG_STRING) && trimCompound.contains(CraftMetaArmor.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(CraftMetaArmor.TRIM_MATERIAL.NBT)));
-                TrimPattern trimPattern = Registry.TRIM_PATTERN.get(NamespacedKey.fromString(trimCompound.getString(CraftMetaArmor.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 cbf1a518406bf478811c737e6dabf0a8c451d16c..039197efb05432b8139fbabe92338572c1bf078e 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -490,7 +490,14 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
                 continue;
             }
 
-            Attribute attribute = CraftAttribute.stringToBukkit(attributeName);
+            // Paper start
+            Attribute attribute;
+            try {
+                attribute = CraftAttribute.stringToBukkit(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 b2bab2d79c969bc81b160312a996fb9cd87d0f95..173d2ae0b4fd6677250ded24576c5420a93e73bf 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
@@ -71,11 +71,13 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
     CraftMetaSkull(CompoundTag tag) {
         super(tag);
 
+        try { // Paper - Ignore invalid game profiles
         if (tag.contains(CraftMetaSkull.SKULL_OWNER.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) {
             this.setProfile(NbtUtils.readGameProfile(tag.getCompound(CraftMetaSkull.SKULL_OWNER.NBT)));
         } else if (tag.contains(CraftMetaSkull.SKULL_OWNER.NBT, CraftMagicNumbers.NBT.TAG_STRING) && !tag.getString(CraftMetaSkull.SKULL_OWNER.NBT).isEmpty()) {
             this.setProfile(new GameProfile(Util.NIL_UUID, tag.getString(CraftMetaSkull.SKULL_OWNER.NBT)));
         }
+        } catch (Exception ignored) {} // Paper
 
         if (tag.contains(CraftMetaSkull.BLOCK_ENTITY_TAG.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) {
             CompoundTag nbtTagCompound = tag.getCompound(CraftMetaSkull.BLOCK_ENTITY_TAG.NBT).copy();