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

Работа с TextComponent

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

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

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

    Баллы:
    76
    Как можно заменить в строке определённые слова на TextComponent ?
    Например у меня в конфиге есть такая строчка "Привет {PLAYER}, ты находишься в {WORLD}".
    Как можно заменить {PLAYER} и {WORLD} на кликабельные TextComponent, те остальной текст должен остаться некликабельным.
     
  2. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    тебе в массив компонентов просто надо собрать, у тебя будет что-то типа [..., {player}, ... {world}, ...]
    То есть какие-то части массива это обычные TextComponent без ClickEvent-ов, а player и world - кликабельные.
     
  3. Автор темы
    ilya50

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

    Баллы:
    76
    Да, но как заменять какой либо текст на TextComponent, при условии что может быть что то типо "Привет &a{PLAYER}" ?
     
  4. NyanGuyMF

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

    Баллы:
    76
    Я для такого сначала перевожу сообщение в 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(0ChatType.CHAT);
        
    packetMessage.getChatComponents().write(0fromJson(jsonMessage));

         try {
            
    getProtocolManager().sendServerPacket(receiverpacketMessage);
        } catch (
    InvocationTargetException ex) {
            
    ex.printStackTrace();
            return 
    false;
        }
     
        return 
    true;
    }
     
  5. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ну так разбей на 2 компонента в массиве.
     
  6. alexandrage

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

    Баллы:
    173
    Код:
            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);
                    }
                }
            }
    Пруфит.
     
    Последнее редактирование: 3 апр 2019
  7. Namer_PRO

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

    Баллы:
    76
    Имя в Minecraft:
    Namer_PRO
    В данном случае я согласен с alexandrage. На мой взгляд, это лучшее и простейшее решение проблемы.
     
  8. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Жёсткие костыли, для каждого сообщения писать по новому
     
  9. alexandrage

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

    Баллы:
    173
    Тык в любом случае по новому писать, нужно же плейслохдер обработать.
     
  10. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ну для одноразового юзкейса сойдет, а так лучше сделать более удобную многоразовую систему.
     
  11. erger

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

    Баллы:
    66
    Имя в Minecraft:
    FeatureTeam
    можете подсказать как выводить длинный цветной текст.

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

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    c 1.12.2 перейди, динозавр
     
  13. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Чем тебе не понравился 1.12.2,
     
  14. TheYto4kA

    TheYto4kA Участник

    Баллы:
    31
    Имя в Minecraft:
    68ytka68
    Отсутствие поддержки HEX-Цветов)
     

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