Можно ли получить эффект символа новой строки в ServerListPingEvent `event.setMotd ()’?

#java #minecraft #bukkit

Вопрос:

Я узнал, что это можно использовать n в файле конфигурации server.properties.

К сожалению , это не соответствует моим потребностям, так как мне нужно динамически настраивать сообщение дня во время работы плагина, и я хочу его использовать event.setMotd() , а не пытаться играть с изменением самого файла server.propertiers.

В настоящее время я делаю это с хорошо подсчитанным пробелом:

     @EventHandler
    public void onPing(ServerListPingEvent e) {

        int rnd = r.nextInt(allMotds.size());
        String tps = new DecimalFormat("0.00").format(LagProcessor.getTPS());

        final String msg = "u00A73u00A7l        RVA-Survival 1.16.5 u00A7ru00A77 |  TPS: "   tps  
                "           u00A7ru00A76u00A7o"   allMotds.get(rnd);

        e.setMotd(msg);
    }
 

В будущем это не сработает, так как я хочу, чтобы первая строка также была настраиваемой.

Я знаю, что не могу использовать Юникод u2424 , так как он печатает только фактический графический символ. n к сожалению, здесь тоже не работает.

В своих исследованиях я не смог найти никаких решений, кроме использования server.properties для установки motd, который снова не работает здесь для меня.

Есть какие-нибудь идеи?

Ответ №1:

В случае, если лучшего ответа не будет найдено, я должен поделиться своим текущим обходным путем.

Я записал это в класс, который обрабатывает события ping:

     private static String center(String ln) {
        StringBuilder whiteSpace = new StringBuilder();

        // trim and truncate strings
        String trimmed = ln.trim();
        int charTotal = trimmed.length();

        final String trunc;
        if (charTotal >= 60) trunc = trimmed.substring(0, 60);
        else trunc = trimmed;

        // count missing whitespace
        int diff = 60 - charTotal;
        int half = diff / 2;

        int i = 1;
        while (i <= half) { i  ; whiteSpace.append(" "); }

        // add the whitespace and make the tail end a bit longer
        StringBuilder out = new StringBuilder(whiteSpace   trunc   whiteSpace);
        while (out.length() < 62) out.append(" ");

        return out.toString();
    }
 

Тогда я использую его вот так:

     @EventHandler
    public void onPing(ServerListPingEvent e) {

        int rnd = r.nextInt(allMotds.size());
        String tps = new DecimalFormat("0.00").format(LagProcessor.getTPS());

        final String msg1 = "u00A73u00A7lRVA-Survival 1.16.5 u00A7ru00A77 |  TPS: "   tps;
        final String msg2 = "u00A7ru00A76u00A7o"   allMotds.get(rnd);

        e.setMotd(center(msg1)   msg2);
    }
 

Результат:
введите описание изображения здесь

Примечание: Имейте в виду, что центрирование технически не имеет значения, и что важно, так это метод, который вы реализуете, добавляя правильное количество завершающего пробела.

Для вашего удобства это будет выглядеть так:

     private static String fillLine(String ln) {

        // trim and truncate string
        String trimmed = ln.trim();
        int charTotal = trimmed.length();

        final String trunc;
        if (charTotal >= 61) trunc = trimmed.substring(0, 61);
        else trunc = trimmed;

        // add the whitespace tail
        StringBuilder out = new StringBuilder(trunc);
        while (out.length() < 62) out.append(" ");

        return out.toString();
    }