Сап, использую HEX цвета в обычных сообщениях и всё хорошо. Но те же самые сообщения, но уже в TextComponent (для добавления клик\ховер), отображают некорректные обычные цвета
Сообщение вводит пользователь, поэтому есть метод для формата:
Как можно "подружить" TextComponent сообщения с новыми цветами? Знаю про ComponentBuilder, но речь о пользовательском сообщении, которое надо парсить
UPD. Парсер взят из Chatty. Он как для просто HEX, так и для градиентов
Сообщение вводит пользователь, поэтому есть метод для формата:
Java:
private static final Pattern HEX_COLORS_PATTERN = Pattern.compile("\\{#([a-fA-F0-9]{6})}");
private static final Pattern HEX_GRADIENT_PATTERN = Pattern.compile("\\{#([a-fA-F0-9]{6})(:#([a-fA-F0-9]{6}))+( )([^{}])*(})");
private static String addHex(String text) {
StringBuffer stringBuffer = new StringBuffer();
Matcher matcher = HEX_GRADIENT_PATTERN.matcher(text);
while (matcher.find()) {
String gradient = matcher.group();
int groups = 0;
for (int i = 1; gradient.charAt(i) == '#'; i += 8) {
groups++;
}
Color[] colors = new Color[groups];
for (int i = 0; i < groups; i++) {
colors[i] = ChatColor.of(gradient.substring((8 * i) + 1, (8 * i) + 8)).getColor();
}
String substring = gradient.substring((groups - 1) * 8 + 9, gradient.length() - 1);
char[] chars = substring.toCharArray();
StringBuilder gradientBuilder = new StringBuilder();
int colorLength = chars.length / (colors.length - 1);
int lastColorLength;
if (colorLength == 0) {
colorLength = 1;
lastColorLength = 1;
colors = Arrays.copyOfRange(colors, 0, chars.length);
} else {
lastColorLength = chars.length % (colorLength * (colors.length - 1)) + colorLength;
}
for (int i = 0; i < (colors.length - 1); i++) {
int currentColorLength = ((i == colors.length - 2) ? lastColorLength : colorLength);
for (int j = 0; j < currentColorLength; j++) {
Color color = calculateGradientColor(j + 1, currentColorLength, colors[i], colors[i + 1]);
ChatColor chatColor = ChatColor.of(color);
gradientBuilder.append(chatColor.toString()).append(chars[colorLength * i + j]);
}
}
matcher.appendReplacement(stringBuffer, gradientBuilder.toString());
}
matcher.appendTail(stringBuffer);
text = stringBuffer.toString();
matcher = HEX_COLORS_PATTERN.matcher(text);
stringBuffer = new StringBuffer();
while (matcher.find()) {
String hexColorString = matcher.group();
matcher.appendReplacement(stringBuffer, ChatColor.of(hexColorString.substring(1, hexColorString.length() - 1)).toString());
}
matcher.appendTail(stringBuffer);
return stringBuffer.toString();
}
private static Color calculateGradientColor(int x, int parts, Color from, Color to) {
double p = (double) (parts - x + 1) / (double) parts;
return new Color(
(int) (from.getRed() * p + to.getRed() * (1 - p)),
(int) (from.getGreen() * p + to.getGreen() * (1 - p)),
(int) (from.getBlue() * p + to.getBlue() * (1 - p))
);
}
Как можно "подружить" TextComponent сообщения с новыми цветами? Знаю про ComponentBuilder, но речь о пользовательском сообщении, которое надо парсить
UPD. Парсер взят из Chatty. Он как для просто HEX, так и для градиентов