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

Помогите Сделать метод для окраски сообщений

Тема в разделе "Разработка плагинов для новичков", создана пользователем reZero, 17 окт 2022.

Статус темы:
Закрыта.
  1. Автор темы
    reZero

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

    Баллы:
    76
    Хочу сделать универсальный метод, который принимает на входе строку из конфига и возвращает на выходе окрашенное сообщение.

    Сложность в том, что такой метод должен поддерживать дефолтные бакитовские цвета, хекс коды и куори мини-месседжи.

    Моя проблема в том, что я не могу обмозговать, каким образом можно строку распарсить таким образом, чтобы затем применить к ней нужные цвета.

    Сама входная строка может не иметь все эти типы сразу, а только один, например, дефолтовый бакитовский.

    Может быть, у кого-то уже есть в своих утилитках такой метод? Поделитесь, плиз
     
  2. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Я бы советовал просто посмотреть в MineDown - и поддержка легаси, и новые штуки.
    Впрочем, сейчас сам планирую написать небольшой "переводчик" легаси в теги minimessage. Успел лишь набросать что-как будет переводиться, может поможет.
    Код:
    &0 <black>
    &1 <dark_blue>
    &2 <dark_green>
    &3 <dark_aqua>
    &4 <dark_red>
    &5 <dark_purple>
    &6 <gold>
    &7 <gray>
    &8 <dark_gray>
    &9 <blue>
    &a <green>
    &b <aqua>
    &c <red>
    &d <light_purple>
    &e <yellow>
    &f <white>
    
    &x&1&2&3&4&5&6 <color:#123456>
    &#123456 <color:#123456>
    
    &@#abcdef-red-a& <gradient:#abcdef:red:green>
    
    &r <reset>
    &l <b>
    &n <u>
    &m <st>
    &o <i>
    &k <obf>
    
    &/X </X> (any tag)
    Если интересует, смогу поделиться в ближайшие пару дней, ибо готово лишь пару строк кода ;D
     
    Последнее редактирование: 17 окт 2022
  3. Автор темы
    reZero

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

    Баллы:
    76
    Посмотрю, спасибо
    Было бы интересно)
     
  4. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    https://gist.github.com/imDaniX/e536c3e1cce7c8c8ed34e63fee1e0689
    Набросал пока так. Выглядит несколько громоздко, но работу выполняет, да производительность не самая плохая. Для референса на коды - табличка из моего прошлого сообщения.
    Код:
    (i<) &@red-yellow-0&&lServer&r admin &9imDaniX &8> &#fff5d9&oHello world!&/# YOLO
    (o>) <gradient:red:yellow:black><b>Server<reset> admin <blue>imDaniX <dark_gray>> <color:#fff5d9><i>Hello world!</color> YOLO
    В идеале добавить возможность экранирования &, но пока лень.
     
  5. Автор темы
    reZero

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

    Баллы:
    76
    Метод работает как надо. Конвертация в kyori теги в цикле 12к раз заняла у меня всего 78 мс, что, я считаю, достойно. Спасибо
     
  6. Автор темы
    reZero

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

    Баллы:
    76
    Только теперь у меня появилась проблема, связанная с тем, что я только начинаю работать с куори апи. При попытке отправить созданный компонент игроку или повесить его в качестве названия айтемстака, сервер выбрасывает исключение
    HTML:
    Caused by: java.lang.NoSuchMethodError: 'void org.*********ventory.meta.ItemMeta.displayName(me.plugin.adventure.text.Component)'
    Куори апи и его состовляющие в джарник зашейдил, по идее, проблем быть не должно.
    HTML:
    public static Component colorizeComponent(String msg) {
            return MiniMessage.miniMessage().deserialize(MiniTranslator.toMini(msg));
        }
    HTML:
    @Arg("test @string")
        public void test(CommandSender sender, String string) {
            Player player = (Player) sender;
            sender.sendMessage(ColorUtil.colorizeComponent(string));
            player.getInventory().addItem(new ItemBuilder("STONE").withName("#B2FF00SOMEITEM").build());
        }
    HTML:
    public ItemBuilder withName(String name) {
            itemMeta.displayName(ColorUtil.colorizeComponent(name));
            return this;
        }

    В чем может быть проблема?
     
  7. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Проблема в том, что в самом Spigot нет методов, связанных с adventure - соответственно, и метода ItemMeta#displayName на нем попросту нет. Скорее всего тут только переводить компонент в строку, и по старинке использовать ItemMeta#setDisplayName. Можно воспользоваться legacy text serializer.
    Для отправки сообщений, в свою очередь, BukkitAudiences.
     
  8. Автор темы
    reZero

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

    Баллы:
    76
    У меня тестовый сервер на пурпуре. Разве там нет поддержки куори?
     
  9. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    А, если Paper и выше, то тебе ничего шейдить в принципе не нужно - укажи adventure в проекте точно также, как paper/purpur-api.
     
  10. Автор темы
    reZero

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

    Баллы:
    76
    Я тоже так думал, но когда я не делаю шейд, натыкаюсь на ошибку отсутствия такого класса...
    HTML:
    Caused by: java.lang.ClassNotFoundException: net.kyori.adventure.platform.bukkit.BukkitAudiences
    Код:
    <!--> KYORI <-->
            <dependency>
                <groupId>net.kyori</groupId>
                <artifactId>adventure-text-minimessage</artifactId>
                <version>4.11.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>net.kyori</groupId>
                <artifactId>adventure-text-serializer-plain</artifactId>
                <version>4.11.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>net.kyori</groupId>
                <artifactId>adventure-platform-bukkit</artifactId>
                <version>4.1.2</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>net.kyori</groupId>
                <artifactId>adventure-api</artifactId>
                <version>4.11.0</version>
                <scope>provided</scope>
            </dependency>
     
  11. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Потому что тебе и всё остальное тоже не нужно. BukkitAudiences и adventure-platform-bukkit в целом тебе нужны только для Spigot и ниже. Вообще, Paper и так поставляет adventure-api - скорее всего ты можешь всю секцию kyori убрать.
     
  12. Автор темы
    reZero

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

    Баллы:
    76
    Снёс полностью секцию куори. Теперь BukkitAudiences для IDE неизвестный класс и его нельзя не откуда импортировать
    HTML:
     <repository>
                <id>papermc-repo</id>
                <url>https://repo.papermc.io/repository/maven-public/</url>
            </repository>
    
    
    <!--> Paper <-->
            <dependency>
                <groupId>com.destroystokyo.paper</groupId>
                <artifactId>paper-api</artifactId>
                <version>1.16.5-R0.1-SNAPSHOT</version>
                <scope>provided</scope>
            </dependency>
     
  13. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Как и говорил, BukkitAudiences тебе в принципе не нужен. Компоненты можно отправлять и так.
     
  14. Автор темы
    reZero

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

    Баллы:
    76
    PlainTextComponentSerializer и MiniMessage так же недоступны. Без последнего построить нужные мне компоненты не выйдет.
     
  15. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Хм, да, PlainTextComponentSerializer придется взять. MiniMessage должен быть доступен, но вероятно, это касается лишь последних версий. Конкретно их тогда и правда придется зашейдить.
     
  16. Автор темы
    reZero

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

    Баллы:
    76
    HTML:
     Caused by: java.lang.NoSuchMethodError: 'net.kyori.adventure.text.minimessage.MiniMessage net.kyori.adventure.text.minimessage.MiniMessage.miniMessage()'
    Класс по этому пути в джарнике присутствует, метод там же
     
  17. Zuif

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

    Баллы:
    76
    для хексов(градиентных и т.д) и ргб я юзал TAB, там у него есть статический класс RgbUtils или как-то так, и у него есть метод для преобразования, там и легаси и паттерны и т.д, но это конечно если TAB есть на сервере(имхо самый лучший плагин для таба)
     
  18. Автор темы
    reZero

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

    Баллы:
    76
    В общем починил. Вместо бумаги задепендил пурпур и минимеседжи появились. Нужно было только немного подправить методы доступа к самому экземпляру, так как он немного отличается от джавадоковского
     
  19. Автор темы
    reZero

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

    Баллы:
    76
    Такое себе решение в моей ситуации. Мне не нужно тянуть подобные плагины.
     
Статус темы:
Закрыта.

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