3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-20 05:20:07 +01:00

#711: Add Full RGB support to the console

This is a fairly hacky way to do this - primarily because the Ansi library doesnt support RGB - however the VT100 codes here are the standard for RGB terminals.
Dieser Commit ist enthalten in:
Narimm 2020-08-27 11:11:40 +10:00 committet von md_5
Ursprung 049120068d
Commit 74b6982b03
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: E8E901AC7C617C11

Datei anzeigen

@ -1,7 +1,10 @@
package org.bukkit.craftbukkit.command; package org.bukkit.craftbukkit.command;
import java.awt.Color;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jline.Terminal; import jline.Terminal;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -15,6 +18,9 @@ public class ColouredConsoleSender extends CraftConsoleCommandSender {
private final Map<ChatColor, String> replacements = new EnumMap<ChatColor, String>(ChatColor.class); private final Map<ChatColor, String> replacements = new EnumMap<ChatColor, String>(ChatColor.class);
private final ChatColor[] colors = ChatColor.values(); private final ChatColor[] colors = ChatColor.values();
private final boolean jansiPassthrough; private final boolean jansiPassthrough;
private static final char ANSI_ESC_CHAR = '\u001B';
private static final String RGB_STRING = String.valueOf(ANSI_ESC_CHAR) + "[38;2;%d;%d;%dm";
private static final Pattern RBG_TRANSLATE = Pattern.compile(String.valueOf(ChatColor.COLOR_CHAR) + "x(" + String.valueOf(ChatColor.COLOR_CHAR) + "[A-F0-9]){6}", Pattern.CASE_INSENSITIVE);
protected ColouredConsoleSender() { protected ColouredConsoleSender() {
super(); super();
@ -50,7 +56,7 @@ public class ColouredConsoleSender extends CraftConsoleCommandSender {
// support jansi passthrough VM option when jansi doesn't detect an ANSI supported terminal // support jansi passthrough VM option when jansi doesn't detect an ANSI supported terminal
if (jansiPassthrough || terminal.isAnsiSupported()) { if (jansiPassthrough || terminal.isAnsiSupported()) {
if (!conversationTracker.isConversingModaly()) { if (!conversationTracker.isConversingModaly()) {
String result = message.replaceAll("(?i)" + ChatColor.COLOR_CHAR + "x(" + ChatColor.COLOR_CHAR + "[0-9a-f]){6}", ""); // Hex is not supported by ANSI console String result = convertRGBColors(message);
for (ChatColor color : colors) { for (ChatColor color : colors) {
if (replacements.containsKey(color)) { if (replacements.containsKey(color)) {
result = result.replaceAll("(?i)" + color.toString(), replacements.get(color)); result = result.replaceAll("(?i)" + color.toString(), replacements.get(color));
@ -65,6 +71,22 @@ public class ColouredConsoleSender extends CraftConsoleCommandSender {
} }
} }
private static String convertRGBColors(String input) {
Matcher matcher = RBG_TRANSLATE.matcher(input);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
String s = matcher.group().replace("§", "").replace('x', '#');
Color color = Color.decode(s);
int red = color.getRed();
int blue = color.getBlue();
int green = color.getGreen();
String replacement = String.format(RGB_STRING, red, green, blue);
matcher.appendReplacement(buffer, replacement);
}
matcher.appendTail(buffer);
return buffer.toString();
}
public static ConsoleCommandSender getInstance() { public static ConsoleCommandSender getInstance() {
if (Bukkit.getConsoleSender() != null) { if (Bukkit.getConsoleSender() != null) {
return Bukkit.getConsoleSender(); return Bukkit.getConsoleSender();