From 4b39bd549cd60df7ff3af7a69bc71a27ecc5061e Mon Sep 17 00:00:00 2001 From: Zach Brown 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/CommandBlockListenerAbstract.java b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java index 729859d13..2a1dffbf4 100644 --- a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java +++ b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java @@ -57,7 +57,7 @@ public abstract class CommandBlockListenerAbstract implements ICommandListener { this.g = nbttagcompound.getString("Command"); this.d = nbttagcompound.getInt("SuccessCount"); if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.h = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.h = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } if (nbttagcompound.hasKeyOfType("TrackOutput", 1)) { diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 8abd71dfc..13c0c7ee8 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -1734,7 +1734,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.setPosition(this.locX, this.locY, this.locZ); this.setYawPitch(this.yaw, this.pitch); if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.setCustomName(IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName"))); + this.setCustomName(MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound)); // Paper - Catch ParseException } this.setCustomNameVisible(nbttagcompound.getBoolean("CustomNameVisible")); diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java index 0ef5ad116..f70f5899f 100644 --- a/src/main/java/net/minecraft/server/MCUtil.java +++ b/src/main/java/net/minecraft/server/MCUtil.java @@ -339,4 +339,19 @@ public final class MCUtil { return null; } } + + @Nullable + public static IChatBaseComponent getBaseComponentFromNbt(String key, NBTTagCompound compound) { + if (!compound.hasKey(key)) { + return null; + } + String string = compound.getString(key); + try { + return IChatBaseComponent.ChatSerializer.jsonToComponent(string); + } catch (com.google.gson.JsonParseException e) { + org.bukkit.Bukkit.getLogger().warning("Unable to parse " + key + " from " + compound +": " + e.getMessage()); + } + + return null; + } } diff --git a/src/main/java/net/minecraft/server/TileEntityBanner.java b/src/main/java/net/minecraft/server/TileEntityBanner.java index b4fae0d30..364a9fa7a 100644 --- a/src/main/java/net/minecraft/server/TileEntityBanner.java +++ b/src/main/java/net/minecraft/server/TileEntityBanner.java @@ -74,7 +74,7 @@ public class TileEntityBanner extends TileEntity implements INamableTileEntity { public void load(NBTTagCompound nbttagcompound) { super.load(nbttagcompound); if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.a = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.a = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } if (this.hasWorld()) { diff --git a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java index 480faa66e..f3ddb86d0 100644 --- a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java +++ b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java @@ -236,7 +236,7 @@ public class TileEntityBrewingStand extends TileEntityContainer implements IWorl ContainerUtil.b(nbttagcompound, this.items); this.brewTime = nbttagcompound.getShort("BrewTime"); if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.k = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.k = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } this.fuelLevel = nbttagcompound.getByte("Fuel"); diff --git a/src/main/java/net/minecraft/server/TileEntityChest.java b/src/main/java/net/minecraft/server/TileEntityChest.java index 7594c16e9..803793072 100644 --- a/src/main/java/net/minecraft/server/TileEntityChest.java +++ b/src/main/java/net/minecraft/server/TileEntityChest.java @@ -83,7 +83,7 @@ public class TileEntityChest extends TileEntityLootable { // Paper - Remove ITic } if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.i = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.i = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } } diff --git a/src/main/java/net/minecraft/server/TileEntityDispenser.java b/src/main/java/net/minecraft/server/TileEntityDispenser.java index ddd2e0eb0..21bd156e9 100644 --- a/src/main/java/net/minecraft/server/TileEntityDispenser.java +++ b/src/main/java/net/minecraft/server/TileEntityDispenser.java @@ -107,7 +107,7 @@ public class TileEntityDispenser extends TileEntityLootable { } if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.i = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.i = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } } diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java index 0ba13b790..978b9c046 100644 --- a/src/main/java/net/minecraft/server/TileEntityFurnace.java +++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java @@ -218,7 +218,7 @@ public class TileEntityFurnace extends TileEntityContainer implements IWorldInve } if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.l = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.l = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } // Paper start - cook speed API diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java index 10e18bf34..46069bf80 100644 --- a/src/main/java/net/minecraft/server/TileEntityHopper.java +++ b/src/main/java/net/minecraft/server/TileEntityHopper.java @@ -61,7 +61,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi } if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.setCustomName(IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName"))); + this.setCustomName(MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound)); // Paper - Catch ParseException } this.f = nbttagcompound.getInt("TransferCooldown"); diff --git a/src/main/java/net/minecraft/server/TileEntityShulkerBox.java b/src/main/java/net/minecraft/server/TileEntityShulkerBox.java index aa750ab91..36394aa78 100644 --- a/src/main/java/net/minecraft/server/TileEntityShulkerBox.java +++ b/src/main/java/net/minecraft/server/TileEntityShulkerBox.java @@ -254,7 +254,7 @@ public class TileEntityShulkerBox extends TileEntityLootable implements IWorldIn } if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.i = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); + this.i = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException } } -- 2.19.1