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

Помогите Изменение компонента чата из пакета ProtocolLib

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

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

    normalped Участник Пользователь

    Баллы:
    36
    Приветствую! Я слежу за каждым сообщением которое получает игрок через пакет
    PacketType.Play.Server.CHAT. Мне надо заменить в нем определенные слова на другие и так же проверить текст на наличие моего форматирование для применения hex цветов и hex градиентов. Все уже есть, проблема в том, что когда я изменяю именно тексты в компоненте чата, эти hex цвета и градиенты применяются не правильно (по итогу цвет другой). Hex цвета добавляю к строке через
    net.md_5.bungee.api.ChatColor.of().

    Я получаю WrappedChatComponent и его json из пакета, делаю массив из BaseComponent из этого json чтобы потом пройтись по нему через цикл, если BaseComponent является образцом TextComponent - изменить ему extra. Что я только не пробовал, заменял и extra, и сам текст через setText, ничего нормально не работает.

    Можно конечно отредактировать строку и сделать из неё json чтобы потом изменить WrappedChatComponent из этого json. Всё будет супер, hex цвета, градиенты применятся отлично, но все ховер и клик ивенты которые уже были на сообщении будут потеряны.
    ComponentSerializer.toString(TextComponent.fromLegacyText("string"))

    Большое спасибо за ответ.
     
    Последнее редактирование: 22 апр 2024
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Выведи в JSON-формате строку в консоль с заменой § на &, используй оба подхода - корректный и нет. И нам покажи. Так сказу станет понятно, в чём проблема, и в каком направлении копать
     
  3. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Json текста в котором ивенты сообщения не сохраняются, но цвета применяются хорошо:
    {"extra":[{"color":"#80f073","text":"У"},{"color":"#69f05a","text":"с"},{"color":"#53f141","text":"п"},{"color":"#3cf128","text":"е"},{"color":"#26f20f","text":"х "},{"color":"#636363","text":"| "},{"color":"white","text":"samson"},{"color":"gray","text":": "},{"color":"white","text":"aaaaa"}],"text":""}

    Json текста где ивенты сохраняются но цвета не применяются корректно:
    {"extra":[{"clickEvent":{"action":"suggest_command","value":"/msg samson "},"hoverEvent":{"action":"show_text","value":[{"extra":[{"color":"yellow","text":"Отправленное время: "},{"color":"gold","text":"12:04:58"}],"text":""}]},"extra":[{"text":"Успех | "},{"color":"white","text":"samson"},{"color":"gray","text":": "}],"text":""},{"extra":[{"text":"aaaaa"}],"text":""}],"text":""}

    Я не понял где именно заменять символы с "§" на "&", попробовал сделать это в первом подходе, вот результат:
    {"text":"\u0026f\u0026f\u0026f\u0026x\u00268\u00260\u0026f\u00260\u00267\u00263У\u0026x\u00266\u00269\u0026f\u00260\u00265\u0026aс\u0026x\u00265\u00263\u0026f\u00261\u00264\u00261п\u0026x\u00263\u0026c\u0026f\u00261\u00262\u00268е\u0026x\u00262\u00266\u0026f\u00262\u00260\u0026fх \u0026x\u00266\u00263\u00266\u00263\u00266\u00263| \u0026fsamson\u00267: \u0026f\u0026faaaaa"}
     
  4. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    То есть ComponentSerializer.toString(TextComponent.fromLegacyText("string")) отлично из строки с hex цветами делает json для компонента, но второй способ просто устанавливает текст с цветами в json и получается каша
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Каждый цвет текста, это отдельный компонент, тебе нужно копировать в него ивенты, при разбивке на несколько компанентов.
     
  6. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Можно пожалуйста подробнее? Под словами "Каждый цвет текста, это отдельный компонент" ты подразумеваешь что то типо этого: {"extra":[{"color":"#80f073","text":"У"}? И как понимать "при разбивке на несколько компонентов"?
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Вот да, extra, это массив отдельных компонентов и тебе нужно вернуть для всех ивенты, что были в целом тексте до градиента(разбивки на части).
     
  8. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Понял, только как это сделать не знаю. Как вообще понять какой текст из нового компонента отвечает за текст из старого?
     
  9. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Весь этот компонент как по мне непредсказуемый, я не могу знать заранее что и где в нем искать и проверять
     
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну об этом ты сам должен позаботиться, до разбивки на новые компоненты.
     
  11. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Что значит не знаешь? У тебя либо есть данные об ивентах, либо нет. Ты их просто копируешь на свои новые компоненты.
     

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