- Баллы
- 96
- Имя в Minecraft
- Xezard
Всем доброго времени суток, уважаемые форумчане.
Во время написания плагина для заказчика столкнулся с некоторой проблемой.
Так как у SpigotAPI ещё нет метода взаимодействия с "таб-листом" приходится немного костылить.
После прочтения некоторой документации и декомпиляции парочки плагинов на "таб-лист", я таки написал свой плагин.
Но возникла небольшая проблема.
Дело в том, что и Header и Footer плагин успешно устанавливает игрокам. Но как только я пытаюсь выставить в "таб-лист" несколько строк - он выводит только первые.
Вопрос:
Каким образом можно выставить в "таб-лист" несколько строк с текстом?
И в footer, и header.
Код методов, которые я использую:
Utils.class
Listeners.class
Что я делал:
Создавал HashMap, брал из конфига лист строк, с помощью цикла помещал в хэшмап. Также циклом проходился по хешмапу и выставлял всем игрокам tablist. Но получалось так, что, зайдя на сервер первый раз, у меня и в Header, и в Footer были первые строки. Зайдя во второй - вторые. Каким образом я могу выставить их обе сразу?
P.S на данный момент, в качестве костыля, просто беру строку, в которой для переноса строк используется \n.
Во время написания плагина для заказчика столкнулся с некоторой проблемой.
Так как у SpigotAPI ещё нет метода взаимодействия с "таб-листом" приходится немного костылить.
После прочтения некоторой документации и декомпиляции парочки плагинов на "таб-лист", я таки написал свой плагин.
Но возникла небольшая проблема.
Дело в том, что и Header и Footer плагин успешно устанавливает игрокам. Но как только я пытаюсь выставить в "таб-лист" несколько строк - он выводит только первые.
Вопрос:
Каким образом можно выставить в "таб-лист" несколько строк с текстом?
И в footer, и header.
Код методов, которые я использую:
Utils.class
Java:
public static void sendTablist(Player player, String string, String string_2, Main plugin)
{
try
{
if (Utils.getServerVersion().equalsIgnoreCase("v1_9_R1") || Utils.getServerVersion().equalsIgnoreCase("v1_9_R2"))
{
Object header = Utils.getNmsClass("ChatComponentText").getConstructor(String.class).newInstance(string);
Object footer = Utils.getNmsClass("ChatComponentText").getConstructor(String.class).newInstance(string_2);
Object util = Utils.getNmsClass("PacketPlayOutPlayerListHeaderFooter").getConstructor(Utils.getNmsClass("IChatBaseComponent")).newInstance(header);
Field field = util.getClass().getDeclaredField("b");
field.setAccessible(true);
field.set(util, footer);
Object nmsp = player.getClass().getMethod("getHandle", new Class[0]).invoke(player, new Object[0]);
Object pcon = nmsp.getClass().getField("playerConnection").get(nmsp);
pcon.getClass().getMethod("sendPacket", Utils.getNmsClass("Packet")).invoke(pcon, util);
}
} catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException |
InstantiationException | NoSuchFieldException | NoSuchMethodException |
SecurityException | InvocationTargetException exception)
{
exception.printStackTrace();
}
}
}
private static String getServerVersion()
{
return Bukkit.getServer().getClass().getPackage().getName().substring(23);
}
private static Class<?> getNmsClass(String string) throws ClassNotFoundException
{
return Class.forName("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + "." + string);
}
Java:
@EventHandler
public void onJoin(PlayerJoinEvent event)
{
for (Player players : Bukkit.getOnlinePlayers())
{
Utils.sendTablist(players, Utils.colorMessage(header), Utils.colorMessage(footer), this.plugin);
}
}
Что я делал:
Создавал HashMap, брал из конфига лист строк, с помощью цикла помещал в хэшмап. Также циклом проходился по хешмапу и выставлял всем игрокам tablist. Но получалось так, что, зайдя на сервер первый раз, у меня и в Header, и в Footer были первые строки. Зайдя во второй - вторые. Каким образом я могу выставить их обе сразу?
P.S на данный момент, в качестве костыля, просто беру строку, в которой для переноса строк используется \n.
Последнее редактирование:


