1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем QuodLitee, 18 фев 2024.

  1. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    Хочу добавить поддержку hex как в TAB, т.е настройку сообщений в кфг с градиентами как-то так:
    Код:
    text:
    - "<hex1>Текст1</hex2>"
    - "<hex1>Текст2</hex2>"
    как такое можно сделать?
     
  2. _Ruleto4ka_

    _Ruleto4ka_ Активный участник Пользователь

    Баллы:
    76
    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%
     
  3. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    посмотри внимательно в каком разделе задан вопрос
     
  4. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Формат с <тегами> это MiniMessage, он вшит в Paper уже какое-то время. Мб заинтересуешься InkyMessage.
     
  5. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    не очень понял что-то в этой документации, набрасал код, но выдаёт ошибку 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));
     
  6. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Какая версия сервера и ядро?
     
  7. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    Purpur 1.16.5
     
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Тогда не судьба - устаревшая версия. Тогда проще всего будет воспользоваться регуляркой и конвертировать это дело в пригодную для формата 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.
     
  9. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    Код не рабочий, да и в конфиг такой паттерн не засунешь я так понял
     
  10. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    простой текст с ховером и цветным текстом то работает в плагине
     
  11. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Код лишь показывает, как примерно это должно работать. Считай псевдокодом.
    Паттерн в конфиг и не нужно засовывать, считай константой для парсинга формата <#123456>asd</#7890af>.
    MiniMessage доступен лишь с более поздних версий и требует более свежую версию adventure.
     
  12. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    При желании можно зашейдить нужную версию внутрь джарника самостоятельно
     
  13. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Тоже верно, но не предлагаю, потому что шейдить adventure довольно больно на Paper. Это придётся adventure-api, adventure-platform-bukkit, adventure-minimessage с релокацией шейдить, и в итоге нельзя будет нормально взаимодействовать с adventure на самом Paper...
     
  14. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Возможно на 1.16.5 достаточно будет только minimessage. Проблема может возникнуть только с несовместимостью версий, но, по-моему, ничего сильно критичного там нет. В любом случае, можно попробовать. На безрыбье и рак рыба
     

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