diff --git a/Spigot-Server-Patches/0399-Strip-private-area-unicode-characters-from-signs.patch b/Spigot-Server-Patches/0399-Strip-private-area-unicode-characters-from-signs.patch new file mode 100644 index 000000000..adb6be226 --- /dev/null +++ b/Spigot-Server-Patches/0399-Strip-private-area-unicode-characters-from-signs.patch @@ -0,0 +1,93 @@ +From 74d15ab6f2245fde253e1718bc7269170716f2b7 Mon Sep 17 00:00:00 2001 +From: Zach Brown +Date: Tue, 23 Oct 2018 20:53:43 -0400 +Subject: [PATCH] Strip private area unicode characters from signs + +It is not immediately clear how these characters ended up on signs in +previous versions. It is clear, however, that they now render as empty +unicode boxes in 1.13, whereas previously they rendered as invisible +characters. + +When these signs are loaded in versions after this commit, these +characters from the private use area of the Unicode block will be +stripped. The sign will then be marked to ensure this conversion only +runs once. + +There is a flag -DPaper.keepInvalidUnicode=true that can be used if you +do not want us to strip these characters from your signs, though I can +think of no reason to use it. + +Fixes GH-1571 + +diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java +index 20dc3f272..3c712fc93 100644 +--- a/src/main/java/net/minecraft/server/TileEntitySign.java ++++ b/src/main/java/net/minecraft/server/TileEntitySign.java +@@ -11,6 +11,11 @@ public class TileEntitySign extends TileEntity implements ICommandListener { + private EntityHuman g; + private final String[] h = new String[4]; + ++ // Paper start - Strip invalid unicode from signs on load ++ private static final boolean keepInvalidUnicode = Boolean.getBoolean("Paper.keepInvalidUnicode"); // Allow people to keep their bad unicode if they really want it ++ private boolean privateUnicodeRemoved = false; ++ // Paper end ++ + public TileEntitySign() { + super(TileEntityTypes.SIGN); + } +@@ -30,6 +35,12 @@ public class TileEntitySign extends TileEntity implements ICommandListener { + } + // CraftBukkit end + ++ // Paper start - Only remove private area unicode once ++ if (this.privateUnicodeRemoved) { ++ nbttagcompound.setBoolean("Paper.RemovedPrivateUnicode", true); ++ } ++ // Paper end ++ + return nbttagcompound; + } + +@@ -37,6 +48,11 @@ public class TileEntitySign extends TileEntity implements ICommandListener { + this.isEditable = false; + super.load(nbttagcompound); + ++ // Paper start - Keep track, only do it once per sign ++ this.privateUnicodeRemoved = nbttagcompound.getBoolean("Paper.RemovedPrivateUnicode"); ++ boolean ranUnicodeRemoval = false; ++ // Paper end ++ + // CraftBukkit start - Add an option to convert signs correctly + // This is done with a flag instead of all the time because + // we have no way to tell whether a sign is from 1.7.10 or 1.8 +@@ -49,6 +65,19 @@ public class TileEntitySign extends TileEntity implements ICommandListener { + s = "\"\""; + } + ++ // Paper start - Strip private use area unicode from signs ++ if (s != null && !keepInvalidUnicode && !this.privateUnicodeRemoved) { ++ StringBuilder builder = new StringBuilder(); ++ for (char character : s.toCharArray()) { ++ if (Character.UnicodeBlock.of(character) != Character.UnicodeBlock.PRIVATE_USE_AREA) { ++ builder.append(character); ++ } ++ } ++ s = builder.toString(); ++ ranUnicodeRemoval = true; ++ } ++ // Paper end ++ + try { + //IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); // Paper - move down - the old format might throw a json error + +@@ -75,6 +104,7 @@ public class TileEntitySign extends TileEntity implements ICommandListener { + this.h[i] = null; + } + ++ if (ranUnicodeRemoval) this.privateUnicodeRemoved = true; // Paper - Flag to write NBT + } + + public void a(int i, IChatBaseComponent ichatbasecomponent) { +-- +2.19.1 +