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

Стартап InkyMessage | Форматирование текста под adventure

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

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

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Исходный код: https://github.com/GlowingInk/InkyMessage
    Документация: пока что README

    Описание
    Разработка в ранней стадии.

    (Де)сериализатор текста для Adventure, вдохновленный MineDown и MiniMessage. Поддерживает как легаси формат цветов(&a, &1, &n), так и современные функции.
    Меня не устраивали оба решения, из-за чего я и решил взяться за проект. MineDown в принципе неплохой, но стакать опции сообщений - крайне неудобно. MiniMessage требует большое количество писанины для минимальных функций, на что просто становится больно смотреть.

    Производительность итоговой библиотеки не так важна, ведь всё в любом случае измеряется буквально в наносекундах. Но если вам вдруг понадобится отправлять тысячи сообщений в секунду - грубо говоря, на данном этапе примерно в три раза быстрее MineDown, примерно в пять раз быстрее MiniMessage. Может отличаться от ситуации к ситуации; в частности - обработка градиентов пока идет примерно наравне с MiniMessage.

    Формат
    Полностью поддерживается легаси формат цветов. Для более богатого форматирования используйте формат: &[моё сообщение](тег1:подтег)(тег2:подтег значение)(тегN:подтег...)
    Для всех текущих тегов смотрите документацию.

    Green, clickable red, red again.
    Код:
    Inky: &aGreen, &[clickable&c red](click:url https://rubukkit.org/), red again.
    Mini: <green>Green, <click:open_url:'https://rubukkit.org/'><green>clickable<red> red</click><red>, red again.
    Down: &aGreen, [&aclickable&c red](https://rubukkit.org/)&c, red again
    Как можно заметить, в отличии от MiniMessage и MineDown, цвета сохраняют линейность даже после дополнительного форматирования. Единственная неудобность в этом плане: форматирование с тегом color будет требовать поставить &r заранее - цвета накладываются "поверх", и если у текста уже есть какой-то цвет, то по сути тег будет проигнорирован.
    Код:
    Inky: &aЗелёный, &r&[радужный](gradient:spectrum)(click:url https://rubukkit.org/)
    Mini: <green>Зелёный, <click:open_url:'https://rubukkit.org/'><rainbow>радужный</rainbow></click>
    Down: &aЗелёный, [&rainbow&радужный](https://rubukkit.org/)
    Использование
    Основа - класс InkyMessage. Для генерации сообщений воспользуйтесь InkyMessage.inkyMessage() - либо импортируйте статично, либо просто сохраните в переменную. Далее достаточно вызвать deserialize("&aСообщение"). Экранировать текст можно через InkyMessage.escape("&aСообщение") - подобное сообщение при попадании в deserialize будет работать как обычный текст.
    Кастомизация InkyMessageResolver пока в разработке, и я настоятельно не рекомендую её использовать в данный момент - иначе вам ещё раз 10 придется её переписывать, я уверен.

    Для добавления к себе в проект можно воспользоваться Maven.
    Репозиторий
    HTML:
    <repository>
        <id>glowing-ink</id>
        <url>https://repo.glowing.ink/releases</url>
    </repository>
    Зависимость
    HTML:
    <dependency>
        <groupId>ink.glowing</groupId>
        <artifactId>inkymessage</artifactId>
        <version>0.11.0</version> <!-- Сравните с версией на GitHub -->
    </dependency>
    По нужде - зашейдить
    HTML:
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.4.1</version>
                <configuration>
                    <relocations>
                        <relocation>
                            <pattern>ink.glowing.text</pattern>
                            <shadedPattern>ваш.пакет.для.библиотеки</shadedPattern>
                        </relocation>
                    </relocations>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    TODO
    До релиза сделать в планах следующее:
    • Плейсхолдеры для компонентов клавиш и прочего.
    • Дописать документацию, примеры, скриншоты.
    • Закончить первую стадию API.
     
    Последнее редактирование: 24 май 2023
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Не думал кинуть пулл реквест в Adventure с таким сериалайзером?
     
  3. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Та не. Насколько я помню, они в принципе были очень против старого формата, мол, все эти &3 - магические значения, не имеющие за собой ничего. Разве что на замену LegacyComponentSerializer предлагать, но такое изменение станется серьезной сменой ожидаемого поведения.
     
  4. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Релиз 0.7.0
    • Под капотом было переделано много чего для чуть более солидного API. Но всё ещё не рекомендую использовать что-либо, кроме InkyMessage.inkyMessage() - слишком сыро. Впрочем, фиксация релизов для того и нужна, чтобы была возможность стоять на одном API - просто предупреждаю, что оно точно изменится.
    • Подготовка к сериализации (компоненты -> строка).
    • "Зарубежная" радуга изменена на "русскую" (roygbiv -> кожзгсф), просто потому что мне слишком странно видеть два фиолетовых цвета...
    • В стандартный резольвер добавлена обработка ссылок http(s).
    В README.md добавил репозиторий снапшотов - туда автоматически подтягиваются последние изменения в проекте. Версию снапшота можно подсмотреть в pom'нике проекта.

    upd: Итоговый радужный градиент вышел не очень, поэтому откатится в ближайшем релизе.
     
    Последнее редактирование: 26 апр 2023
  5. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Релиз 0.7.1/0.7.2
    • Градиенты отделены в отдельный тег gradient. Использование через тег color всё ещё возможно.
    • Градиент rainbow теперь называется spectrum (старое название доступно) и использует другой алгоритм формирования, а-ля MiniMessage.
     
  6. SlenderMix

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

    Баллы:
    76
    Имя в Minecraft:
    HIDDEN
    А вопросик, такой а где два фиолетовых?
     
  7. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Меня эти два конфузят больно.
    Да и яндекс подсказывает, что это около-фиолетовые.
    upload_2023-4-26_15-27-13.png
    upload_2023-4-26_15-27-30.png
    На английском они indigo и violet, но больно они "фиолетовые" для меня.
     
  8. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Релиз 0.8.0
    • Реализован базовый сериалайзер (компонент -> строка).
    Пока что есть огрехи в виде отсутствия "оптимизации" легаси кодов между компонентами.
    Вот выдержка из текущих тестов (сначала компоненты, потом результат):
    Код:
    text()
            .append(text("First green").color(GREEN).decorate(BOLD))
            .append(text(" then second green").color(GREEN).decorate(BOLD)).build()
    "&a&lFirst green&a&l then second green"
    
    text("First green").append(text(" then second green")).color(GREEN).decorate(BOLD)
    "&a&lFirst green&a&l then second green"
    
    Сериализация меня интересует несколько меньше, чем десериализация, но постараюсь исправить этот момент в скором будущем.
     
  9. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Релиз 0.9.2
    • Переписана десериализация - теперь будет проще добавлять некоторые обещанные фичи.
    • Как обычно, большие изменения API. Всё ещё не рекомендую трогать. InkyMessage.inkyMessage() как всегда доступен.
     
  10. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Релиз 0.10.0
    • Добавлена первоначальная реализация плейсхолдеров-компонентов. Формат &{ключ:значение}(спецтег:подтег значение)(спецтег...). Пока что лишь для переводов - &{lang:chat.type.advancement.task}(lang:arg &aНеизвестный игрок)(lang:arg &b[Нюх-нюх])(lang:fallback Сообщение, если у клиента не будет нужного языка). Реализация не очень нравится - как всегда предупреждаю, что будет переделываться.
    • Тег gradient был перенесён в color - теперь они имеют единый синтаксис. &[Чёрный](color:black), &[Чёрно-белый](color:white-black), &[Радужный](color:spectrum)
    • Градиенты несколько оптимизированы. В небольших тестах производительность примерно равна MiniMessage.
     
  11. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Релиз 0.11.0
    • Улучшена реализация плейсхолдеров.
    • Исправлен парсинг форматирования при использовании того впритык &[друг](...)&[ за другом](...)
    Также поставил доступ к репо через Cloudflare, так что теперь можно подключаться по https, чтобы последние версии Maven'а не ругались.
     
  12. 0xLairon1

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

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    Чет не могу понять, а какая минимальная версия ядра? Допустим MiniMessage работает только от paper 1 18 насколько я знаю.
    Ищу себе какое-то подобное решение которое будет работать на 1 17 1 paper)
     
  13. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Я не тестировал версии ниже 1.19.3. Но судя по версии adventure на разных версиях, боюсь, тоже с 1.18, и то, font не будет работать на нем.

    Могу лишь посоветовать попробовать использовать платформу Bukkit, сам adventure последней версии, и зашейдить полностью пакет net.kyori.adventure - чтобы и adventure внутри InkyMessage, и платформа, и твой adventure были под одним пакетом. Тогда не будет таких проблем с устаревшей версией adventure на старых версиях. Но получившийся джарник конечно будет довольно большим...
     
  14. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ну, собственно, и по теме как раз ;D Упоминал MineDown на сервере Adventure - касательно легаси они довольно солёные.
    upload_2023-5-24_8-5-12.png
     
  15. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Как начет использования [] внутри &[]()? В MineDown это реализовано с помощью \\[\\]
     
  16. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Символы &]()}\ точно также экранируются слэшем. [ и { не требуют экранирования - они работают только после &.
    "&[[Текст\]](decor:bold)" выведет "[Текст]".
     
  17. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Замечательно, имело место быть упомянутым где-то.
    Еще хотелось бы пример работы с placeholder'ами увидеть.

    Все же, результат для:
    "&7&[/command asd [dsa\\]](click:suggest /command asd)(hover:text &7%display%)"
    Где %display% это "asdasdasd \\(asdasdasd\\)"
    Это /command asd [dsa]) < ???
     
    Последнее редактирование: 4 июл 2023
  18. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Проверил это:
    Код:
    inkyMessage().deserialize("&7&[/command asd [dsa\\]](click:suggest /command asd)(hover:text &7%display%)".replace("%display%", "asdasdasd \\(asdasdasd\\)"));
    Результат:
    upload_2023-7-4_2-37-56.png

    Возможно, дело в 0.11.0 - попробуй снапшот 0.12.0-SNAPSHOT (нужно подменить репо на снапшотный)
     
  19. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Поставил снапшот, проблема осталась.
     
  20. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ранее я немного схитрил - это сериализованный компонент MiniMessage, чтоб отрендерить на https://webui.advntr.dev/
    Но проверил на сервере все же - тоже самое, проходит нормально. Причем, 0.11.0.
    upload_2023-7-4_2-53-4.png
    Может значение в %display% дважды экранируешь? В таком случае как раз остаётся ), и значение при наведении отличается.
    upload_2023-7-4_2-56-48.png
     

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