aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0264-Catch-JsonParseException-in-Entity-and-TE-names.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0264-Catch-JsonParseException-in-Entity-and-TE-names.patch')
-rw-r--r--patches/server/0264-Catch-JsonParseException-in-Entity-and-TE-names.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/patches/server/0264-Catch-JsonParseException-in-Entity-and-TE-names.patch b/patches/server/0264-Catch-JsonParseException-in-Entity-and-TE-names.patch
new file mode 100644
index 0000000000..d823af9154
--- /dev/null
+++ b/patches/server/0264-Catch-JsonParseException-in-Entity-and-TE-names.patch
@@ -0,0 +1,114 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown <[email protected]>
+Date: Sat, 22 Sep 2018 15:56:59 -0400
+Subject: [PATCH] Catch JsonParseException in Entity and TE names
+
+As a result, data that no longer parses correctly will not crash the server
+instead just logging the exception and continuing (and in most cases should
+fix the data)
+
+Player data is fixed pretty much immediately but some block data (like
+Shulkers) may need to be changed in order for it to re-save properly
+
+No more crashing though.
+
+diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
+index c9b43d077727c22a9eca738e9a75e7f1a6a5a9ee..99f56658c70f99592fb40c9df0ce3e47053d1bd5 100644
+--- a/src/main/java/net/minecraft/server/MCUtil.java
++++ b/src/main/java/net/minecraft/server/MCUtil.java
+@@ -13,6 +13,8 @@ import java.lang.ref.Cleaner;
+ import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
+ import net.minecraft.core.BlockPos;
+ import net.minecraft.core.Direction;
++import net.minecraft.nbt.CompoundTag;
++import net.minecraft.network.chat.Component;
+ import net.minecraft.server.level.ChunkHolder;
+ import net.minecraft.server.level.ChunkMap;
+ import net.minecraft.server.level.DistanceManager;
+@@ -540,6 +542,21 @@ public final class MCUtil {
+ }
+ }
+
++ @Nullable
++ public static Component getBaseComponentFromNbt(String key, CompoundTag compound) {
++ if (!compound.contains(key)) {
++ return null;
++ }
++ String string = compound.getString(key);
++ try {
++ return Component.Serializer.fromJson(string);
++ } catch (com.google.gson.JsonParseException e) {
++ org.bukkit.Bukkit.getLogger().warning("Unable to parse " + key + " from " + compound +": " + e.getMessage());
++ }
++
++ return null;
++ }
++
+ public static ChunkStatus getChunkStatus(ChunkHolder chunk) {
+ return chunk.getChunkHolderStatus();
+ }
+diff --git a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
+index a0728e95251e8110bcecd00512c7a266fe120794..da504702bc9423774b35dff792d2dbe7fc270fe3 100644
+--- a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
++++ b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
+@@ -72,7 +72,7 @@ public abstract class BaseCommandBlock implements CommandSource {
+ this.command = nbt.getString("Command");
+ this.successCount = nbt.getInt("SuccessCount");
+ if (nbt.contains("CustomName", 8)) {
+- this.setName(Component.Serializer.fromJson(nbt.getString("CustomName")));
++ this.setName(net.minecraft.server.MCUtil.getBaseComponentFromNbt("CustomName", nbt)); // Paper - Catch ParseException
+ }
+
+ if (nbt.contains("TrackOutput", 1)) {
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java
+index 601cf7b9aa4b3483a2134a2db0d617ed8938ea48..c6ce5dc5dafc15f1f12b0ea4c9d55325f6a76529 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java
+@@ -98,7 +98,7 @@ public class BannerBlockEntity extends BlockEntity implements Nameable {
+ public void load(CompoundTag nbt) {
+ super.load(nbt);
+ if (nbt.contains("CustomName", 8)) {
+- this.name = Component.Serializer.fromJson(nbt.getString("CustomName"));
++ this.name = net.minecraft.server.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException
+ }
+
+ this.itemPatterns = nbt.getList("Patterns", 10);
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
+index a34ae15cd4048bda965fd1449c75f3bd8f0e530b..adf67868eef7d578b7858a5afd54e37ea0d5102f 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
+@@ -30,7 +30,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co
+ super.load(nbt);
+ this.lockKey = LockCode.fromTag(nbt);
+ if (nbt.contains("CustomName", 8)) {
+- this.name = Component.Serializer.fromJson(nbt.getString("CustomName"));
++ this.name = net.minecraft.server.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException
+ }
+
+ }
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
+index 0c699c08ef85ca3339ada5c869b571581092a11d..349b89dd4d34b92d1077ddadb30c36642fd85622 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
+@@ -365,7 +365,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider {
+ this.levels = nbt.getInt("Levels"); // SPIGOT-5053, use where available
+ // CraftBukkit end
+ if (nbt.contains("CustomName", 8)) {
+- this.name = Component.Serializer.fromJson(nbt.getString("CustomName"));
++ this.name = net.minecraft.server.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException
+ }
+
+ this.lockKey = LockCode.fromTag(nbt);
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java
+index 3a8bdb788b07b0a8cda3d4b872ede52ca9a005c4..2341a5a249d455628165fc6ba508fc6d70c3dbfb 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java
+@@ -42,7 +42,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable
+ public void load(CompoundTag nbt) {
+ super.load(nbt);
+ if (nbt.contains("CustomName", 8)) {
+- this.name = Component.Serializer.fromJson(nbt.getString("CustomName"));
++ this.name = net.minecraft.server.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException
+ }
+
+ }