HEX цвета в TextComponent

BlackBaroness

Модератор
Разработчик
Сообщения
1 835
Решения
81
Веб-сайт
t.me
Сап, использую HEX цвета в обычных сообщениях и всё хорошо. Но те же самые сообщения, но уже в TextComponent (для добавления клик\ховер), отображают некорректные обычные цвета

Сообщение вводит пользователь, поэтому есть метод для формата:

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, так и для градиентов
 
Видел решение HEX цветов с TextComponent тут:
Я обычно просто создаю строку(условно str), работаю с ней(в том числе цвета) и потом использую её в Component.text(str).
Это Adventure библиотека, встроена в Paper по умолчанию.
 
Я обычно просто создаю строку(условно str), работаю с ней(в том числе цвета) и потом использую её в Component.text(str).
Это Adventure библиотека, встроена в Paper по умолчанию.
Если я туда засуну строку, содержащую хексы, она будет нормально отображаться и понимать цвета? Ибо банжа чат апи хочет, чтобы пользовались их билдером, а для конфигов это реально неудобно
 
Назад
Сверху Снизу