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

Работа с TextComponent

ilya50

Активный участник
Пользователь
Баллы
76
Как можно заменить в строке определённые слова на TextComponent ?
Например у меня в конфиге есть такая строчка "Привет {PLAYER}, ты находишься в {WORLD}".
Как можно заменить {PLAYER} и {WORLD} на кликабельные TextComponent, те остальной текст должен остаться некликабельным.
 
тебе в массив компонентов просто надо собрать, у тебя будет что-то типа [..., {player}, ... {world}, ...]
То есть какие-то части массива это обычные TextComponent без ClickEvent-ов, а player и world - кликабельные.
 
тебе в массив компонентов просто надо собрать, у тебя будет что-то типа [..., {player}, ... {world}, ...]
То есть какие-то части массива это обычные TextComponent без ClickEvent-ов, а player и world - кликабельные.
Да, но как заменять какой либо текст на TextComponent, при условии что может быть что то типо "Привет &a{PLAYER}" ?
 
Я для такого сначала перевожу сообщение в JSON формат и потом добавляю его отдельным готовым файлом/строкой в конфиге (файл удобнее, на мой взгляд :D) Так сразу можно будет интегрировать с отправкой сообщения через ProtocolLib - переносимость между версиями

P.S. пример кода:
PHP:
{
  "text": "",
  "extra": [
    {
      "text": "{inviter}",
      "color": "red",
      "hoverEvent": {
        "action": "show_text",
        "value": [
          "",
          {
            "text": "",
            "extra": [
              {\
// мнооого-много JSON\
    {
      "text": "»",
      "color": "gold"
    },
    {
      "text": " to decline.",
      "color": "yellow"
    }
  ]
}

// Загрузить можно с помощью:
private String getMessage(final File inviteMessageFile) {
    StringBuffer buffer = new StringBuffer();

    try {
        Files.lines(inviteMessageFile.toPath(), Charset.forName("UTF-8"))
            .map(str -> str.trim())
            .forEach(buffer::append);
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return buffer.toString();
}
Чем удобен этот метод - пользователь может изменять сообщение как ему угодно и Вы можете добавлять туда какие-нибудь плэйсхолдеры

PHP:
getMessage(file)
  .replace("{placeholder}", value1)
  // ...
  ;
Если лень писать много JSON самостоятельно, то можно воспользоваться этой либой: JSONMessage

UPD:
PHP:
/**
 * Default ProtocolLib message sending method.
 * <p>
 * Sends JSON message to player via ProtocolLib.
 *
 * @param   receiver        Player, that will receive the message.
 * @param   jsonMessage     JSON message to send.
 * @return <tt>true</tt> if message sent successfully.
 */
private boolean sendMessage(final Player receiver, final String jsonMessage) {
    PacketType chat = PacketType.Play.Server.CHAT;
    PacketContainer packetMessage = new PacketContainer(chat);
    packetMessage.getChatTypes().write(0, ChatType.CHAT);
    packetMessage.getChatComponents().write(0, fromJson(jsonMessage));

     try {
        getProtocolManager().sendServerPacket(receiver, packetMessage);
    } catch (InvocationTargetException ex) {
        ex.printStackTrace();
        return false;
    }
 
    return true;
}
 
Код:
        String text = "Привет {PLAYER}, ты находишься в {WORLD}";
        BaseComponent bc = new TextComponent();
        for (String str : text.split(" ")) {
            if (str.equals("{PLAYER}")) {
                BaseComponent player = new TextComponent("playername");
                HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("playername"));
                player.setHoverEvent(hoverEvent);
                bc.addExtra(player);
            } else if (str.equals("{WORLD}")) {
                BaseComponent world = new TextComponent("worldname");
                HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("worldname"));
                world.setHoverEvent(hoverEvent);
                bc.addExtra(world);
            } else {
                //Для сохранения цветов собираем массив компанентов.
                BaseComponent[] tmp = TextComponent.fromLegacyText(str);
                for(BaseComponent bc2 : tmp) {
                    bc.addExtra(bc2);
                }
            }
        }
Пруфит.
 
Последнее редактирование:
Код:
        String text = "Привет {PLAYER}, ты находишься в {WORLD}";
        BaseComponent bc = new TextComponent();
        for (String str : text.split(" ")) {
            if (str.equals("{PLAYER}")) {
                BaseComponent player = new TextComponent("playername");
                HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("playername"));
                player.setHoverEvent(hoverEvent);
                bc.addExtra(player);
            } else if (str.equals("{WORLD}")) {
                BaseComponent world = new TextComponent("worldname");
                HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("worldname"));
                world.setHoverEvent(hoverEvent);
                bc.addExtra(world);
            } else {
                //Для сохранения цветов собираем массив компанентов.
                BaseComponent[] tmp = TextComponent.fromLegacyText(str);
                for(BaseComponent bc2 : tmp) {
                    bc.addExtra(bc2);
                }
            }
        }
Пруфит.
В данном случае я согласен с alexandrage. На мой взгляд, это лучшее и простейшее решение проблемы.
 
Тык в любом случае по новому писать, нужно же плейслохдер обработать.
Ну для одноразового юзкейса сойдет, а так лучше сделать более удобную многоразовую систему.
 
можете подсказать как выводить длинный цветной текст.

У меня при переносе строки из-за длины текста слетают цвета.
Есть возможность реализовать без костылей ?
 
можете подсказать как выводить длинный цветной текст.

У меня при переносе строки из-за длины текста слетают цвета.
Есть возможность реализовать без костылей ?
c 1.12.2 перейди, динозавр
 

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

Назад
Верх