package me.thezombiepl.tzp_tab; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import net.minecraft.server.v1_16_R2.ChatComponentText; import net.minecraft.server.v1_16_R2.PacketPlayOutPlayerListHeaderFooter; public class TabManager { private List headers = new ArrayList<>(); private List footers = new ArrayList<>(); private AnimatedTab plugin; public TabManager(AnimatedTab plugin) { this.plugin = plugin; } public void showTab() { if (headers.isEmpty() && footers.isEmpty()) return; Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(); int count1 = 0; //header int count2 = 0; //footers @Override public void run() { if (Bukkit.getOnlinePlayers().size() == 0) return; for (Player player : Bukkit.getOnlinePlayers()) { try { Field a = packet.getClass().getDeclaredField("header"); a.setAccessible(true); Field b = packet.getClass().getDeclaredField("footer"); b.setAccessible(true); if (count1 >= headers.size()) count1 = 0; if (count2 >= footers.size()) count2 = 0; a.set(packet, new ChatComponentText(format(headers.get(count1)).replaceAll("\\{PLAYER\\}", player.getDisplayName()))); b.set(packet, new ChatComponentText(format(footers.get(count2)).replaceAll("\\{PLAYER\\}", player.getDisplayName()))); count1++; count2++; } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } } }, 10, 40); } public void addHeader(String header) { headers.add(header); } public void addFooter(String footer) { footers.add(footer); } private String format(String msg) { msg = msg.replaceAll("\\{ONLINE\\}", String.valueOf(Bukkit.getOnlinePlayers().size())); return ChatColor.translateAlternateColorCodes('&', msg); } }