94 lines
4.1 KiB
Diff
94 lines
4.1 KiB
Diff
From e44f34d3173d7a9e16a6e7a74ef205dd935cfd4e Mon Sep 17 00:00:00 2001
|
|
From: Zach Brown <zach@zachbr.io>
|
|
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 2c6ce5bae..15b3add9e 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntitySign.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntitySign.java
|
|
@@ -14,6 +14,11 @@ public class TileEntitySign extends TileEntity implements ICommandListener { //
|
|
private final String[] k = new String[4];
|
|
private EnumColor color;
|
|
|
|
+ // 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);
|
|
this.color = EnumColor.BLACK;
|
|
@@ -36,6 +41,12 @@ public class TileEntitySign extends TileEntity implements ICommandListener { //
|
|
// CraftBukkit end
|
|
|
|
nbttagcompound.setString("Color", this.color.b());
|
|
+ // Paper start - Only remove private area unicode once // TODO - this doesn't need to run for every sign, check data ver
|
|
+ if (this.privateUnicodeRemoved) {
|
|
+ nbttagcompound.setBoolean("Paper.RemovedPrivateUnicode", true);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
return nbttagcompound;
|
|
}
|
|
|
|
@@ -45,6 +56,11 @@ public class TileEntitySign extends TileEntity implements ICommandListener { //
|
|
super.load(nbttagcompound);
|
|
this.color = EnumColor.a(nbttagcompound.getString("Color"), EnumColor.BLACK);
|
|
|
|
+ // 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
|
|
@@ -57,6 +73,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.isEmpty() ? "\"\"" : s); // Paper - move down - the old format might throw a json error
|
|
|
|
@@ -83,6 +112,7 @@ public class TileEntitySign extends TileEntity implements ICommandListener { //
|
|
this.k[i] = null;
|
|
}
|
|
|
|
+ if (ranUnicodeRemoval) this.privateUnicodeRemoved = true; // Paper - Flag to write NBT
|
|
}
|
|
|
|
public void a(int i, IChatBaseComponent ichatbasecomponent) {
|
|
--
|
|
2.21.0
|
|
|