Как установить ClickEvent для определенной подстроки?

q20w26a

Разработчик
Инструктор
Пользователь
Сообщения
573
Решения
27
Есть конфигурирумый чат с форматом %player% %message%, где вместо %player% подставляется ник игрока, а где вместо %message% сообщение

Задача - при нажатии на ник игрока сделать что-то

Я бы добавил ClickEvent так:
Код:
компонент = new TextComponent(Конфиг.ЧАТ
                .replaceAll("%player%", ник)
                .replaceAll("%text%", сообщение))
компонент.setClickEvent(new ClickEvent(...))
Сейчас так и есть, но поскольку TextComponent всего один и берет за основу все форматирование чата целиком, то и ClickComponent действует на всю строку целиком, а не только на ник игрока

По хорошему надо сделать TextComponent с ником игрока, добавить к нему ClickEvent, затем создать TextComponent с сообщением и к первому добавить второе, но проблема в том что заранее порядок не известен, т.е. что идет первое, сообщение или ник

Сейчас у меня зародился костыль - я преобразую строку чата в TextComponent, затем этот компонент преобразую в обычную строку, заменяю %player% на json ClickEvent'а и ник отправителя, а потом рассылаю всем циклом через sendRawMessage, таким образом независимо от порядка вместо %player% будет ник с ClickEvent'ом
Объединено

я пораскинул остатками мозга и понял что это может не сработать
Сейчас у меня зародился костыль - я преобразую строку чата в TextComponent, затем этот компонент преобразую в обычную строку, заменяю %player% на json ClickEvent'а и ник отправителя, а потом рассылаю всем циклом через sendRawMessage, таким образом независимо от порядка вместо %player% будет ник с ClickEvent'ом
Объединено

короче я разобью строку на части и пройдусь циклом, и
если строка равна %player% то добавлю ей ClickEvent
Объединено

:mc_264-0: Решение
Java:
TextComponent component = new TextComponent();
for (String text: message.split(" ")) {
    if (text.contains(pSender.getName())) {
        TextComponent component1 = new TextComponent(text);
        component1.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://example.com/"));
        if (component.getExtra() != null && !component.getExtra().isEmpty()) //эту проверку можно было бы вынести в отдельный метод
            component.addExtra(" ");
        component.addExtra(component1);
    } else {
        if (component.getExtra() != null && !component.getExtra().isEmpty()) //чтобы код не дублировался, но мне лень
            component.addExtra(" ");
        component.addExtra(text);
    }       
}
 
Последнее редактирование:
Назад
Сверху Снизу