Войти или зарегистрироваться

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

  • Автор темы Автор темы reZero
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

reZero

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

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

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

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

Может быть, у кого-то уже есть в своих утилитках такой метод? Поделитесь, плиз
 
Я бы советовал просто посмотреть в 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
 
Последнее редактирование:
Я бы советовал просто посмотреть в MineDown - и поддержка легаси, и новые штуки.
Посмотрю, спасибо
Если интересует, смогу поделиться в ближайшие пару дней, ибо готово лишь пару строк кода ;D
Было бы интересно)
 
Если интересует, смогу поделиться в ближайшие пару дней, ибо готово лишь пару строк кода ;D
Было бы интересно)
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

В идеале добавить возможность экранирования &, но пока лень.
 
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

В идеале добавить возможность экранирования &, но пока лень.
Метод работает как надо. Конвертация в kyori теги в цикле 12к раз заняла у меня всего 78 мс, что, я считаю, достойно. Спасибо
 
Только теперь у меня появилась проблема, связанная с тем, что я только начинаю работать с куори апи. При попытке отправить созданный компонент игроку или повесить его в качестве названия айтемстака, сервер выбрасывает исключение
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;
    }

В чем может быть проблема?
 
Только теперь у меня появилась проблема, связанная с тем, что я только начинаю работать с куори апи. При попытке отправить созданный компонент игроку или повесить его в качестве названия айтемстака, сервер выбрасывает исключение
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;
    }

В чем может быть проблема?
Проблема в том, что в самом Spigot нет методов, связанных с adventure - соответственно, и метода ItemMeta#displayName на нем попросту нет. Скорее всего тут только переводить компонент в строку, и по старинке использовать ItemMeta#setDisplayName. Можно воспользоваться legacy text serializer.
Для отправки сообщений, в свою очередь, BukkitAudiences.
 
Проблема в том, что в самом Spigot нет методов, связанных с adventure - соответственно, и метода ItemMeta#displayName на нем попросту нет. Скорее всего тут только переводить компонент в строку, и по старинке использовать ItemMeta#setDisplayName. Можно воспользоваться legacy text serializer.
Для отправки сообщений, в свою очередь, BukkitAudiences.
У меня тестовый сервер на пурпуре. Разве там нет поддержки куори?
 
У меня тестовый сервер на пурпуре. Разве там нет поддержки куори?
А, если Paper и выше, то тебе ничего шейдить в принципе не нужно - укажи adventure в проекте точно также, как paper/purpur-api.
 
А, если Paper и выше, то тебе ничего шейдить в принципе не нужно - укажи adventure в проекте точно также, как paper/purpur-api.
Я тоже так думал, но когда я не делаю шейд, натыкаюсь на ошибку отсутствия такого класса...
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>
 
Я тоже так думал, но когда я не делаю шейд, натыкаюсь на ошибку отсутствия такого класса...
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>
Потому что тебе и всё остальное тоже не нужно. BukkitAudiences и adventure-platform-bukkit в целом тебе нужны только для Spigot и ниже. Вообще, Paper и так поставляет adventure-api - скорее всего ты можешь всю секцию kyori убрать.
 
Потому что тебе и всё остальное тоже не нужно. BukkitAudiences и adventure-platform-bukkit в целом тебе нужны только для Spigot и ниже. Вообще, Paper и так поставляет adventure-api - скорее всего ты можешь всю секцию kyori убрать.
Снёс полностью секцию куори. Теперь 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>
 
Снёс полностью секцию куори. Теперь 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>
Как и говорил, BukkitAudiences тебе в принципе не нужен. Компоненты можно отправлять и так.
 
Как и говорил, BukkitAudiences тебе в принципе не нужен. Компоненты можно отправлять и так.
PlainTextComponentSerializer и MiniMessage так же недоступны. Без последнего построить нужные мне компоненты не выйдет.
 
PlainTextComponentSerializer и MiniMessage так же недоступны. Без последнего построить нужные мне компоненты не выйдет.
Хм, да, PlainTextComponentSerializer придется взять. MiniMessage должен быть доступен, но вероятно, это касается лишь последних версий. Конкретно их тогда и правда придется зашейдить.
 
Хм, да, PlainTextComponentSerializer придется взять. MiniMessage должен быть доступен, но вероятно, это касается лишь последних версий. Конкретно их тогда и правда придется зашейдить.
HTML:
 Caused by: java.lang.NoSuchMethodError: 'net.kyori.adventure.text.minimessage.MiniMessage net.kyori.adventure.text.minimessage.MiniMessage.miniMessage()'
Класс по этому пути в джарнике присутствует, метод там же
 
для хексов(градиентных и т.д) и ргб я юзал TAB, там у него есть статический класс RgbUtils или как-то так, и у него есть метод для преобразования, там и легаси и паттерны и т.д, но это конечно если TAB есть на сервере(имхо самый лучший плагин для таба)
 
HTML:
 Caused by: java.lang.NoSuchMethodError: 'net.kyori.adventure.text.minimessage.MiniMessage net.kyori.adventure.text.minimessage.MiniMessage.miniMessage()'
Класс по этому пути в джарнике присутствует, метод там же
В общем починил. Вместо бумаги задепендил пурпур и минимеседжи появились. Нужно было только немного подправить методы доступа к самому экземпляру, так как он немного отличается от джавадоковского
 
для хексов(градиентных и т.д) и ргб я юзал TAB, там у него есть статический класс RgbUtils или как-то так, и у него есть метод для преобразования, там и легаси и паттерны и т.д, но это конечно если TAB есть на сервере(имхо самый лучший плагин для таба)
Такое себе решение в моей ситуации. Мне не нужно тянуть подобные плагины.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх