13
0
geforkt von Mirrors/Paper

Replace TextWrapper with simple newline splitting. Fixes BUKKIT-1662

TextWrapper used to try to ensure a message would wrap correctly on the
client by counting the width of the characters in pixels and wrapping
before hitting that limit. This was needed because the client would lose
color information when wrapping and could not handle long lines of text.

Now that both of these problems are solved in the client we can replace
TextWrapper with simple code to split the message into multiple packets on
newlines and ensure chat colors carry across to the new packet.

By: Travis Watkins <amaranth@ubuntu.com>
Dieser Commit ist enthalten in:
CraftBukkit/Spigot 2012-05-16 18:09:33 -05:00
Ursprung e6ad96fd25
Commit 66cb03e41a

Datei anzeigen

@ -1,88 +1,25 @@
package org.bukkit.craftbukkit; package org.bukkit.craftbukkit;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
public class TextWrapper { public class TextWrapper {
private static final int[] characterWidths = new int[] { public static List<String> wrapText(final String text) {
1, 9, 9, 8, 8, 8, 8, 7, 9, 8, 9, 9, 8, 9, 9, 9, ArrayList<String> output = new ArrayList<String>();
8, 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 9, 9, 9, String[] lines = text.split("\n");
4, 2, 5, 6, 6, 6, 6, 3, 5, 5, 5, 6, 2, 6, 2, 6, String lastColor = null;
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 6,
7, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 4, 6, 6,
3, 6, 6, 6, 6, 6, 5, 6, 6, 2, 6, 5, 3, 6, 6, 6,
6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, 5, 2, 5, 7, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 3, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6,
6, 3, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 2, 6, 6,
8, 9, 9, 6, 6, 6, 8, 8, 6, 8, 8, 8, 8, 8, 6, 6,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 5, 9, 9,
8, 7, 7, 8, 7, 8, 8, 8, 7, 8, 8, 7, 9, 9, 6, 7,
7, 7, 7, 7, 9, 6, 7, 8, 7, 6, 6, 9, 7, 6, 7, 1
};
private static final char COLOR_CHAR = '\u00A7';
private static final int CHAT_WINDOW_WIDTH = 320;
private static final int CHAT_STRING_LENGTH = 119;
private static final String allowedChars = net.minecraft.server.SharedConstants.allowedCharacters;
public static String[] wrapText(final String text) { for (int i = 0; i < lines.length; i++) {
final StringBuilder out = new StringBuilder(); String line = lines[i];
char colorChar = 'f'; if (lastColor != null) {
int lineWidth = 0; line = lastColor + line;
int lineLength = 0;
// Go over the message char by char.
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
// Get the color
if (ch == COLOR_CHAR && i < text.length() - 1) {
// We might need a linebreak ... so ugly ;(
if (lineLength + 2 > CHAT_STRING_LENGTH) {
out.append('\n');
lineLength = 0;
if (colorChar != 'f' && colorChar != 'F') {
out.append(COLOR_CHAR).append(colorChar);
lineLength += 2;
}
}
colorChar = text.charAt(++i);
out.append(COLOR_CHAR).append(colorChar);
lineLength += 2;
continue;
} }
// Figure out if it's allowed output.add(line);
int index = allowedChars.indexOf(ch); lastColor = ChatColor.getLastColors(line);
if (index == -1) {
// Invalid character .. skip it.
continue;
} else {
// Sadly needed as the allowedChars string misses the first
index += 32;
}
// Find the width
final int width = characterWidths[index];
// See if we need a linebreak
if (lineLength + 1 > CHAT_STRING_LENGTH || lineWidth + width >= CHAT_WINDOW_WIDTH) {
out.append('\n');
lineLength = 0;
// Re-apply the last color if it isn't the default
if (colorChar != 'f' && colorChar != 'F') {
out.append(COLOR_CHAR).append(colorChar);
lineLength += 2;
}
lineWidth = width;
} else {
lineWidth += width;
}
out.append(ch);
lineLength++;
} }
// Return it split return output;
return out.toString().split("\n");
} }
} }