- Сообщения
- 573
- Решения
- 27
Есть конфигурирумый чат с форматом
Задача - при нажатии на ник игрока сделать что-то
Я бы добавил ClickEvent так:
Сейчас так и есть, но поскольку TextComponent всего один и берет за основу все форматирование чата целиком, то и ClickComponent действует на всю строку целиком, а не только на ник игрока
По хорошему надо сделать TextComponent с ником игрока, добавить к нему ClickEvent, затем создать TextComponent с сообщением и к первому добавить второе, но проблема в том что заранее порядок не известен, т.е. что идет первое, сообщение или ник
Сейчас у меня зародился костыль - я преобразую строку чата в TextComponent, затем этот компонент преобразую в обычную строку, заменяю %player% на json ClickEvent'а и ник отправителя, а потом рассылаю всем циклом через sendRawMessage, таким образом независимо от порядка вместо %player% будет ник с ClickEvent'ом
я пораскинул остатками мозга и понял что это может не сработать
короче я разобью строку на части и пройдусь циклом, и
если строка равна %player% то добавлю ей ClickEvent
Решение
%player% %message%
, где вместо %player% подставляется ник игрока, а где вместо %message% сообщениеЗадача - при нажатии на ник игрока сделать что-то
Я бы добавил ClickEvent так:
Код:
компонент = new TextComponent(Конфиг.ЧАТ
.replaceAll("%player%", ник)
.replaceAll("%text%", сообщение))
компонент.setClickEvent(new ClickEvent(...))
По хорошему надо сделать TextComponent с ником игрока, добавить к нему ClickEvent, затем создать TextComponent с сообщением и к первому добавить второе, но проблема в том что заранее порядок не известен, т.е. что идет первое, сообщение или ник
Сейчас у меня зародился костыль - я преобразую строку чата в TextComponent, затем этот компонент преобразую в обычную строку, заменяю %player% на json ClickEvent'а и ник отправителя, а потом рассылаю всем циклом через sendRawMessage, таким образом независимо от порядка вместо %player% будет ник с ClickEvent'ом
Объединено
я пораскинул остатками мозга и понял что это может не сработать
Сейчас у меня зародился костыль - я преобразую строку чата в TextComponent, затем этот компонент преобразую в обычную строку, заменяю %player% на json ClickEvent'а и ник отправителя, а потом рассылаю всем циклом через sendRawMessage, таким образом независимо от порядка вместо %player% будет ник с ClickEvent'ом
Объединено
короче я разобью строку на части и пройдусь циклом, и
если строка равна %player% то добавлю ей ClickEvent
Объединено

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);
}
}
Последнее редактирование: