Oh, think twice. Cause it’s another day for you and me in.... https://stackoverflow.com/questions...-variables-need-final-instance-variables-dont
Okay: Code (Java): public void sendTablist(final String header, final String footer, Player p) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss"); Date date = new Date(); header = header.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())).replace("%player%", p.getName()).replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())); footer = footer.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())).replace("%player%", p.getName()).replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())); Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new BukkitRunnable() { @Override public void run() { header = header.replace("%time%", time.format(date)); footer = footer.replace("%time%", time.format(date)); } }, 20, 20);
Maybe ur whole code? I think this is the whole code (taked from ur other post), so try this: Code (Java): public void sendTablist(String header, String footer, Player p) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss"); Date date = new Date(); Bukkit.getScheduler().scheduleSyncRepeatingTask(main.main, new BukkitRunnable() { @Override public void run() { String head = header.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())).replace("%player%", p.getName()).replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())).replace("%time%", time.format(date)); String foot = footer.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())).replace("%player%", p.getName()).replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())).replace("%time%", time.format(date)); PlayerConnection con = ((CraftPlayer)p).getHandle().playerConnection; IChatBaseComponent tfooter = IChatBaseComponent.ChatSerializer.a(("{\"text\": \"" + foot + "\"}")); IChatBaseComponent theader = IChatBaseComponent.ChatSerializer.a(("{\"text\": \"" + head + "\"}")); PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(theader); try{ try{ Field f = packet.getClass().getDeclaredField("b"); f.setAccessible(true); f.set(packet, tfooter); }catch(Exception e){ e.printStackTrace(); con.sendPacket(packet); } }finally{ con.sendPacket(packet); } } }, 0, 20); }
Ehm: Code (Java): public void sendTablist(final String header, final String footer, Player p) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss"); Date date = new Date(); header = header.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())).replace("%player%", p.getName()).replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())); footer = footer.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())).replace("%player%", p.getName()).replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())); Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new BukkitRunnable() { @Override public void run() { header = header.replace("%time%", time.format(date)); footer = footer.replace("%time%", time.format(date)); } }, 20, 20); PlayerConnection con = ((CraftPlayer)p).getHandle().playerConnection; IChatBaseComponent tfooter = IChatBaseComponent.ChatSerializer.a(("{\"text\": \"" + footer + "\"}")); IChatBaseComponent theader = IChatBaseComponent.ChatSerializer.a(("{\"text\": \"" + header + "\"}")); PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(theader); try{ try{ Field f = packet.getClass().getDeclaredField("b"); f.setAccessible(true); f.set(packet, tfooter); }catch(Exception e){ e.printStackTrace(); con.sendPacket(packet); } }finally{ con.sendPacket(packet); } }
Another basic Java 101 question. :/ Code (Java): public class HeaderFooterUpdater extends BukkitRunnable { private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); private static SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss"); private String header; private String footer; private Player player; public HeaderFooterUpdater(String header, String footer, Player player) { this.header = header.replace("%player%", player.getName()); this.footer = footer.replace("%player%", player.getName()); this.player = player; } @Override public void run() { Date date = new Date(); String formattedHeader = header.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())) .replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())) .replace("%time%", time.format(date)); String formattedFooter = footer.replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().size())) .replace("%date%", sdf.format(date)) .replace("%max%", String.valueOf(Bukkit.getMaxPlayers())) .replace("%time%", time.format(date)); player.setPlayerListHeaderFooter(TextComponent.fromLegacyText(formattedHeader), TextComponent.fromLegacyText(formattedFooter)); } } Code (Java): public class MyPlugin extends JavaPlugin implements Listener { @Override public void onEnable() { getServer().getPluginManager().registerEvents(this, this); } @EventHandler public void onJoin(PlayerJoinEvent event) { String header = "Welcome, %player%!"; String footer = "%online%\\%max% players online!\n%date% %time%"; new HeaderFooterUpdater(header, footer, event.getPlayer()) .runTaskTimer(plugin, 20, 20); } } That should give you the idea. It's real simple. Dont just copy and paste this either. Learn from it. It might not even compile, I wrote it on my phone..