Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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"))

Большое спасибо за ответ.
 
Последнее редактирование:
Приветствую! Я слежу за каждым сообщением которое получает игрок через пакет
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"))

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

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"}
 
То есть ComponentSerializer.toString(TextComponent.fromLegacyText("string")) отлично из строки с hex цветами делает json для компонента, но второй способ просто устанавливает текст с цветами в json и получается каша
 
Каждый цвет текста, это отдельный компонент, тебе нужно копировать в него ивенты, при разбивке на несколько компанентов.
 
Каждый цвет текста, это отдельный компонент, тебе нужно копировать в него ивенты, при разбивке на несколько компанентов.
Можно пожалуйста подробнее? Под словами "Каждый цвет текста, это отдельный компонент" ты подразумеваешь что то типо этого: {"extra":[{"color":"#80f073","text":"У"}? И как понимать "при разбивке на несколько компонентов"?
 
Вот да, extra, это массив отдельных компонентов и тебе нужно вернуть для всех ивенты, что были в целом тексте до градиента(разбивки на части).
Понял, только как это сделать не знаю. Как вообще понять какой текст из нового компонента отвечает за текст из старого?
 
Весь этот компонент как по мне непредсказуемый, я не могу знать заранее что и где в нем искать и проверять
 
Понял, только как это сделать не знаю. Как вообще понять какой текст из нового компонента отвечает за текст из старого?
Ну об этом ты сам должен позаботиться, до разбивки на новые компоненты.
 
Весь этот компонент как по мне непредсказуемый, я не могу знать заранее что и где в нем искать и проверять
Что значит не знаешь? У тебя либо есть данные об ивентах, либо нет. Ты их просто копируешь на свои новые компоненты.
 

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

Назад
Верх