Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как написать градиенты как в tab

QuodLitee

Активный участник
Пользователь
Баллы
66
Хочу добавить поддержку hex как в TAB, т.е настройку сообщений в кфг с градиентами как-то так:
Код:
text:
- "<hex1>Текст1</hex2>"
- "<hex1>Текст2</hex2>"
как такое можно сделать?
 
TAB -> animations.yml
Код:
example:
  change-interval: 3000 # 1000 - 1 сек.
  texts:
   - "&#00FFE0T&#3BBFE8e&#7680F0x&#B040F7t&#EB00FF1"
   - "&#FFFFFFT&#DCDDDEe&#B9BBBEx&#96999Dt&#73777C2"

TAB - config.yml
%animation:example%
 
TAB -> animations.yml
Код:
example:
  change-interval: 3000 # 1000 - 1 сек.
  texts:
   - "&#00FFE0T&#3BBFE8e&#7680F0x&#B040F7t&#EB00FF1"
   - "&#FFFFFFT&#DCDDDEe&#B9BBBEx&#96999Dt&#73777C2"

TAB - config.yml
%animation:example%
посмотри внимательно в каком разделе задан вопрос
 
Хочу добавить поддержку hex как в TAB, т.е настройку сообщений в кфг с градиентами как-то так:
Код:
text:
- "<hex1>Текст1</hex2>"
- "<hex1>Текст2</hex2>"
как такое можно сделать?
Формат с <тегами> это MiniMessage, он вшит в Paper уже какое-то время. Мб заинтересуешься InkyMessage.
 
Формат с <тегами> это MiniMessage, он вшит в Paper уже какое-то время. Мб заинтересуешься InkyMessage.
не очень понял что-то в этой документации, набрасал код, но выдаёт ошибку Caused by: java.lang.NoSuchMethodError: 'net.kyori.adventure.text.minimessage.MiniMessage net.kyori.adventure.text.minimessage.MiniMessage.miniMessage()'
Код:
MiniMessage miniMessage = MiniMessage.miniMessage();
        for (String m : Main.cfg.getStringList("text"))
            p.sendMessage(miniMessage.deserialize(m));
 
не очень понял что-то в этой документации, набрасал код, но выдаёт ошибку Caused by: java.lang.NoSuchMethodError: 'net.kyori.adventure.text.minimessage.MiniMessage net.kyori.adventure.text.minimessage.MiniMessage.miniMessage()'
Код:
MiniMessage miniMessage = MiniMessage.miniMessage();
        for (String m : Main.cfg.getStringList("text"))
            p.sendMessage(miniMessage.deserialize(m));
Какая версия сервера и ядро?
 
Тогда не судьба - устаревшая версия. Тогда проще всего будет воспользоваться регуляркой и конвертировать это дело в пригодную для формата Spigot'а строку.
Что-нибудь типа
Код:
Pattern GRADIENT_PATTERN = Pattern.compile("<#([0-9a-f]{6})>(.+?)</#([0-9a-f]{6})>");
Получаем начальный и конечный цвета и сам текст.
Код:
Matcher matcher = GRADIENT_PATTERN.matcher(str);
Color startColor = new Color(Integer.parseInt(matcher.group(1), 16), false);
String text = matcher.group(2);
Color endColor = new Color(Integer.parseInt(matcher.group(3), 16), false);
И собираем это в формат Spigot'а.
Код:
StringBuilder builder = new StringBuilder(text.length()*15);
for (int i = 0; i < text.length(); i++) {
    Color blend = blend(startColor, endColor, i / text.length());
    builder.append(ChatColor.COLOR_CHAR).append('x');
    for (char ch : Integer.toHexString(blend.getRGB()).toCharArray()) {
        builer.append(ChatColor.COLOR_CHAR).append(ch);
    }
    builder.append(text.charAt(i));
}
return builder.toString();
Это всё писалось на коленке, так что советую проверить самостоятельно всё.

Останется по сути только метод blend(Color, Color, double) сделать, который будет смешивать два цвета. Это сделать несложно, наверняка загуглится по запросу что-то вроде java color gradient.
 
Тогда не судьба - устаревшая версия. Тогда проще всего будет воспользоваться регуляркой и конвертировать это дело в пригодную для формата Spigot'а строку.
Что-нибудь типа
Код:
Pattern GRADIENT_PATTERN = Pattern.compile("<#([0-9a-f]{6})>(.+?)</#([0-9a-f]{6})>");
Получаем начальный и конечный цвета и сам текст.
Код:
Matcher matcher = GRADIENT_PATTERN.matcher(str);
Color startColor = new Color(Integer.parseInt(matcher.group(1), 16), false);
String text = matcher.group(2);
Color endColor = new Color(Integer.parseInt(matcher.group(3), 16), false);
И собираем это в формат Spigot'а.
Код:
StringBuilder builder = new StringBuilder(text.length()*15);
for (int i = 0; i < text.length(); i++) {
    Color blend = blend(startColor, endColor, i / text.length());
    builder.append(ChatColor.COLOR_CHAR).append('x');
    for (char ch : Integer.toHexString(blend.getRGB()).toCharArray()) {
        builer.append(ChatColor.COLOR_CHAR).append(ch);
    }
    builder.append(text.charAt(i));
}
return builder.toString();
Это всё писалось на коленке, так что советую проверить самостоятельно всё.

Останется по сути только метод blend(Color, Color, double) сделать, который будет смешивать два цвета. Это сделать несложно, наверняка загуглится по запросу что-то вроде java color gradient.
Код не рабочий, да и в конфиг такой паттерн не засунешь я так понял
 
Код не рабочий, да и в конфиг такой паттерн не засунешь я так понял
Код лишь показывает, как примерно это должно работать. Считай псевдокодом.
Паттерн в конфиг и не нужно засовывать, считай константой для парсинга формата <#123456>asd</#7890af>.
простой текст с ховером и цветным текстом то работает в плагине
MiniMessage доступен лишь с более поздних версий и требует более свежую версию adventure.
 
Код лишь показывает, как примерно это должно работать. Считай псевдокодом.
Паттерн в конфиг и не нужно засовывать, считай константой для парсинга формата <#123456>asd</#7890af>.

MiniMessage доступен лишь с более поздних версий и требует более свежую версию adventure.
При желании можно зашейдить нужную версию внутрь джарника самостоятельно
 
При желании можно зашейдить нужную версию внутрь джарника самостоятельно
Тоже верно, но не предлагаю, потому что шейдить adventure довольно больно на Paper. Это придётся adventure-api, adventure-platform-bukkit, adventure-minimessage с релокацией шейдить, и в итоге нельзя будет нормально взаимодействовать с adventure на самом Paper...
 
Тоже верно, но не предлагаю, потому что шейдить adventure довольно больно на Paper. Это придётся adventure-api, adventure-platform-bukkit, adventure-minimessage с релокацией шейдить, и в итоге нельзя будет нормально взаимодействовать с adventure на самом Paper...
Возможно на 1.16.5 достаточно будет только minimessage. Проблема может возникнуть только с несовместимостью версий, но, по-моему, ничего сильно критичного там нет. В любом случае, можно попробовать. На безрыбье и рак рыба
 

Поделиться этой страницей

Назад
Верх