aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOwen <[email protected]>2023-07-13 16:59:49 -0400
committerGitHub <[email protected]>2023-07-13 16:59:49 -0400
commitece4fd3597c08ee0f1818b71fdbb2cab6279000e (patch)
tree09ac412f7d6a6db8676310cae9aa6a23b28d233a
parent836586d59b9a116f25059939050c11cb06e37dd2 (diff)
downloadPaper-ece4fd3597c08ee0f1818b71fdbb2cab6279000e.tar.gz
Paper-ece4fd3597c08ee0f1818b71fdbb2cab6279000e.zip
Suppress Item Meta Validation Checks (#9331)
Stops item meta from aggressively throwing exceptions.
-rw-r--r--patches/server/0985-Suppress-Item-Meta-Validation-Checks.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/patches/server/0985-Suppress-Item-Meta-Validation-Checks.patch b/patches/server/0985-Suppress-Item-Meta-Validation-Checks.patch
new file mode 100644
index 0000000000..c48f4455c9
--- /dev/null
+++ b/patches/server/0985-Suppress-Item-Meta-Validation-Checks.patch
@@ -0,0 +1,86 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Owen1212055 <[email protected]>
+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 c92981aedebe934cefa1c96a0328fb91fe17acbc..80138632e5216c71fe7060a59dbb2915e740a3c8 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(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 1481c8ca684eddca3eb5db3aceac4877043b9fcd..076e06908a0cf97f86a64a15ca0231c5b0f06fec 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+@@ -488,7 +488,14 @@ 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 deed77a3d44bc55681483d7f47f148b5220135f2..47c8148e6413c51ffdd30082bfb37a7fb8a73a71 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(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();