[Stelle diese Frage nochmals hier, da es empfohlen wurde!]
Hallo!Ich beschäftige mich gerade mit Java und programmiere nebenbei an meinem Plugin herum…
Zur Frage aber: (Sicherlich) kennt ihr diese Standartmeldung: Wenn ihr auf einem Vanilla-Server gebannt werdet, steht dort geschrieben: "Du wurdest vom Server gebannt…" (Bilder gibt's ja im Internet, wie Sand am Meer).
Ich habe aber nun vor, diese Meldung umzuschreiben, dennoch fehlt mir bei diesem Problem das Know-How, wie ich so etwas angehen sollte!
Am Ende sollte es aussehen wie die Bannachicht auf Gomme (siehe Internet!), evtl. auch verknüpft mit dem Befehl /ban (keine Ahnung ob das Zusammenhängt)
Vielleicht könnt ihr mir ja weiterhelfen, wie man sowas mit Eclipse selbst codet, denn auf YouTube existiert nur ein Review des Essentials(-ban) Plugin!
Dankeschön!
~Kl3xx
@Override
public boolean onCommand(CommandSender sender, Command cmd, String al, String[] args) {
Player cs = (Player) sender;
if (cmd.getName().equalsIgnoreCase("1vs1")) {
if(!(cs instanceof Player)) {
return false;
}
final Player p = (Player) cs;
if (args.length != 1) {
return false;
}
if (args[0].equalsIgnoreCase("join")) {
if (ingame.size() == 0 || ingame.size() == 1) {
if(!ingame.contains(p.getName())) {
ingame.add(p.getName());
p.sendMessage("§f[§a1vs1§f] §bDu bist jetzt in der Warteliste.");
return true;
} else {
return false;
}
} else if(ingame.size() == 1) {
Player q = Bukkit.getPlayer(ingame.get(2));
if (q != null) {
World w = Bukkit.getServer().getWorld(getConfig().getString("loc.world"));
double x = getConfig().getDouble("loc.x");
double y = getConfig().getDouble("loc.y");
double z = getConfig().getDouble("loc.z");
q.teleport(new Location(w, x, y, z));
World w2 = Bukkit.getServer().getWorld(getConfig().getString("loc.world2"));
double x2 = getConfig().getDouble("loc.x2");
double y2 = getConfig().getDouble("loc.y2");
double z2 = getConfig().getDouble("loc.z2");
p.teleport(new Location(w2, x2, y2, z2));
ingame.remove(1);
ingame.remove(2);
// Player q Items
q.getInventory().addItem(new ItemStack(Material.DIAMOND_SWORD));
q.getInventory().setHelmet(new ItemStack(Material.DIAMOND_HELMET));
q.getInventory().setBoots(new ItemStack(Material.DIAMOND_BOOTS));
q.getInventory().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS));
q.getInventory().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE));
// Player p Items
p.getInventory().addItem(new ItemStack(Material.DIAMOND_SWORD));
p.getInventory().setHelmet(new ItemStack(Material.DIAMOND_HELMET));
p.getInventory().setBoots(new ItemStack(Material.DIAMOND_BOOTS));
p.getInventory().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS));
p.getInventory().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE));
}
} else {
p.sendMessage("Warten ..");
}
}
}
Du schreibst, dass ingame eine ArrayList<Spieler> ist: Listen fangen (wie auch Arrays) mit 0 an zu zählen. D.h. anfangs hast du die beiden Spieler p und q an den Indices 0 und 1 in der Liste. Sobald du dann den Spieler an der "1." Stelle (also eigentlich an der zweiten) entfernst, hast du noch eine Liste, welche einen Spieler enthält - an der Position "0". Nun kannst du ganz offensichtlich nicht den Spieler an Stelle 2 entfernen - eine ArrayIndexOutOfBoundsException wird geworfen. Das gleiche gilt auch für ingame.get(2).Player q = Bukkit.getPlayer(ingame.get(2));
[...]
ingame.remove(1);
ingame.remove(2);
public static void restore() {
int blocks = 0;
for (String b : changes) {
String[] blockdata = b.split(":");
int id = Integer.parseInt(blockdata[0]);
byte data = Byte.parseByte(blockdata[1]);
World world = Bukkit.getWorld(blockdata[2]);
int x = Integer.parseInt(blockdata[3]);
int y = Integer.parseInt(blockdata[4]);
int z = Integer.parseInt(blockdata[5]);
world.getBlockAt(x, y, z).setTypeId(id);
world.getBlockAt(x, y, z).setData(data);
blocks--;
}
System.out.println("MapReset: " + blocks + "Blöcke wurden gelöscht!");
}
HeyHou Leute
Ich habe nochmals eine Frage: Ich habe ein System gefunden das alle Blöcke die weg gebaut wurden nach einer Zeit wieder kommen, ich möchte aber, dass die Blöcke die gebaut wurden nach dieser Zeit verschwinden. So sieht der Code aus:
PHP:public static void restore() { int blocks = 0; for (String b : changes) { String[] blockdata = b.split(":"); int id = Integer.parseInt(blockdata[0]); byte data = Byte.parseByte(blockdata[1]); World world = Bukkit.getWorld(blockdata[2]); int x = Integer.parseInt(blockdata[3]); int y = Integer.parseInt(blockdata[4]); int z = Integer.parseInt(blockdata[5]); world.getBlockAt(x, y, z).setTypeId(id); world.getBlockAt(x, y, z).setData(data); blocks--; } System.out.println("MapReset: " + blocks + "Blöcke wurden gelöscht!"); }
Freundliche Grüsse
Pecho
package main;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class main extends JavaPlugin implements Listener {
configaccessor config;
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
System.out.println("[Event] ONLINE");
config = new configaccessor(this, "config.yml", "config");
config.saveDefaultConfig();
config.saveConfig();
}
public void onDisable() {
System.out.println("[Event] OFFLINE");
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
Player p = (Player)sender;
if (cmd.getName().equalsIgnoreCase("event")) {
if (!p.isOp()) {
String nopexmsg = config.getConfig().getString("config.nopex");
p.sendMessage(ChatColor.translateAlternateColorCodes('&', nopexmsg));
return true;
}
if (args.length == 0) {
} else {
if ((args.length == 1) && (args[0].equalsIgnoreCase("on"))) {
sendGet("example.de");
Bukkit.getServer().setWhitelist(false);
String disablemsg = config.getConfig().getString("config.disablemsg");
p.sendMessage(ChatColor.translateAlternateColorCodes('&', disablemsg));
String eventenablemsg = config.getConfig().getString("config.eventenablemsg");
Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', eventenablemsg));
}
if (args[0].equalsIgnoreCase("off")) {
String eventdisablemsg = config.getConfig().getString("config.eventdisablemsg");
Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', eventdisablemsg));
for (Player all : Bukkit.getOnlinePlayers()) {
if ((!all.isOp()) && (!p.isWhitelisted())) {
String kickmsg = config.getConfig().getString("config.kickmsg");
all.kickPlayer(ChatColor.translateAlternateColorCodes('&', kickmsg));
}
}
Bukkit.getServer().setWhitelist(true);
String enablemsg = config.getConfig().getString("config.enablemsg");
p.sendMessage(ChatColor.translateAlternateColorCodes('&', enablemsg));
}
}
}
return false;
}
package main;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
public class configaccessor {
private final String fileName;
private final JavaPlugin plugin;
private File configFile;
private FileConfiguration fileConfiguration;
@SuppressWarnings("deprecation")
public configaccessor(JavaPlugin plugin, String fileName, String path) {
if (plugin == null)
throw new IllegalArgumentException("plugin cannot be null");
if (!plugin.isInitialized())
throw new IllegalArgumentException("plugin must be initialized");
this.plugin = plugin;
this.fileName = fileName;
File dataFolder = plugin.getDataFolder();
if (dataFolder == null)
throw new IllegalStateException();
this.configFile = new File(path, fileName);
}
public void reloadConfig() {
fileConfiguration = YamlConfiguration.loadConfiguration(configFile);
// Look for defaults in the jar
InputStream defConfigStream = plugin.getResource(fileName);
if (defConfigStream != null) {
@SuppressWarnings("deprecation")
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
fileConfiguration.setDefaults(defConfig);
}
}
public FileConfiguration getConfig() {
if (fileConfiguration == null) {
this.reloadConfig();
}
return fileConfiguration;
}
public void saveConfig() {
if (fileConfiguration == null || configFile == null) {
return;
} else {
try {
getConfig().save(configFile);
} catch (IOException ex) {
plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex);
}
}
}
public void saveDefaultConfig() {
if (!configFile.exists()) {
this.plugin.saveResource(fileName, false);
}
}
}
du nensst deine klasse main das bereited probleme denn wenn du alle Mains main nennstBeim ConfigAccessor ist alles richtig, denke ich. Bei der main-Klasse ist meines Wissens etwas falsch.
package de.Finnthehorrible.Conquest.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import javax.xml.stream.Location;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class Conquest extends JavaPlugin implements Listener, Runnable {
@Override
public void onEnable() {
HashMap<String, Location> Stats = new HashMap<>();
HashMap<String, Location> Towerlocation = new HashMap<>();
Towerlocation.put(new String("Du hast den Tower" + Towerlocation + "eingenommen!"), (Location) this);
ArrayList<String> Tankstelle = new ArrayList<String>();
ArrayList<String> Bahnhof = new ArrayList<String>();
ArrayList<String> Berg = new ArrayList<String>();
ArrayList<String> Strasse = new ArrayList<String>();
ArrayList<String> Wald = new ArrayList<String>();
String KillMessage = "Du hast" + getName() + "getötet!";
String DeathMessage = "Du wurdest von" + getName() + "getötet1";
Towerlocation.put(new String(), (Location) this);
Stats.put(new String(), (Location) this);
String DeEinnehmMessage1 = "Die Location" + Towerlocation + Tankstelle + "wurde erobert!";
String EinnehmMessage1 = "Die Location" + Towerlocation + Tankstelle + "wurde eingenommen!";
String DeEinnehmMessage2 = "Die Location" + Towerlocation + Bahnhof + "wurde erobert!";
String EinnehmMessage2 = "Die Location" + Towerlocation + Bahnhof + "wurde eingenommen!";
String DeEinnehmMessage3 = "Die Location" + Towerlocation + Berg + "wurde erobert!";
String EinnehmMessage3 = "Die Location" + Towerlocation + Berg + "wurde eingenommen!";
String DeEinnehmMessage4 = "Die Location" + Towerlocation + Strasse + "wurde erobert!";
String EinnehmMessage4 = "Die Location" + Towerlocation + Strasse + "wurde eingenommen!";
String DeEinnehmMessage5 = "Die Location" + Towerlocation + Wald + "wurde erobert!";
String EinnehmMessage5 = "Die Location" + Towerlocation + Wald + "wurde eingenommen!";
Stats.put(new String(), (Location) this);
Towerlocation.put(new String(), (Location) this);
System.out.println(KillMessage);
System.out.println(DeathMessage);
System.out.println(DeEinnehmMessage1);
System.out.println(EinnehmMessage1);
System.out.println(DeEinnehmMessage2);
System.out.println(EinnehmMessage2);
System.out.println(DeEinnehmMessage3);
System.out.println(EinnehmMessage3);
System.out.println(DeEinnehmMessage4);
System.out.println(EinnehmMessage4);
System.out.println(DeEinnehmMessage5);
System.out.println(EinnehmMessage5);
}
@SuppressWarnings("unused")
private void register() {
PluginManager pm = Bukkit.getPluginManager();
}
private final AtomicInteger countdown;
private BukkitTask bukkitTask;
public Conquest( int seconds ) {
countdown = new AtomicInteger( seconds + 1 );
}
@Override
public void run() {
int counter = countdown.decrementAndGet();
if (counter > 0) {
Bukkit.broadcastMessage(ChatColor.GREEN + "Das Spiel startet in " + ChatColor.GOLD + counter + ChatColor.GREEN + " sekunden!");
} else {
Bukkit.broadcastMessage(ChatColor.RED+"Durch ein Fehler startet das Spiel nicht!");
stop();
}
}
public void start() {
}
public void stop() {
bukkitTask.cancel();
}
@EventHandler
public void onQuit(PlayerQuitEvent e){
Player p = e.getPlayer();
if(p.getName().equalsIgnoreCase("")) {
e.setQuitMessage("§4Admin §7|§4 " + p.getName() + "§3hat das Spiel betreten!");
} else {
e.setQuitMessage("§a" + p.getName() + "§3hat das Spiel betreten!");
}
}
@EventHandler
public void onJoin(PlayerJoinEvent e){
Player p = e.getPlayer();
if(p.getName().equalsIgnoreCase("")) {
e.setJoinMessage("§4Admin §7|§4 " + p.getName() + "§3hat das Spiel betreten!");
} else {
e.setJoinMessage("§a"+p.getName()+"§3hat das Spiel betreten!");
}
this.getConfig().options().header("Du hast das Spiel gestartet!");
this.getConfig().addDefault("Conquest.commands.START.message.You are Startet the Game!", "Du hast das Spiel gestartet!");
this.getConfig().options().header("Du wurdest zurück zur Lobby Teleportiert!");
this.getConfig().addDefault("Conquest.commands.HUB.message.You are Teleported back to the Lobby!", "Du wurdest zur Lobby zurück Teleportiert!");
getConfig().addDefault("Conquest.commands.LEAVE.message.You are Teleported back to the Lobby!", "Du wurdest zur Lobby zurück Teleportiert!");
getConfig().addDefault("Conquest.commands.L.message.You are Teleported back to the Lobby!", "Du wurdest zur Lobby zurück Teleportiert!");
this.getConfig().addDefault("", "");
}
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
e.setCancelled(true);
Player p = e.getPlayer();
String name = p.getDisplayName();
String msg = e.getMessage();
for (Player a : Bukkit.getOnlinePlayers()) {
if (p.hasPermission("lobby.admin") || p.isOp()) {
a.sendMessage("§4Admin | " + name + "§4: §f" + msg);
} else if (p.hasPermission("lobby.blue") || p.isOp()) {
a.sendMessage("§1" + name + "§1: §f" + msg);
} else if (p.hasPermission("lobby.red") || p.isOp()) {
a.sendMessage("§4" + name + "§4: §f" + msg);
} else {
a.sendMessage("§f" + name + "§a: §f" + msg);
}
}
}
@EventHandler
public void onMove(PlayerMoveEvent event){
Player p = event.getPlayer();
p.setGameMode(GameMode.SURVIVAL);
if(event != null){
} else {
p.setGameMode(GameMode.SPECTATOR);
}
}
public void onDisable(){
}
}
Evtl. so wie bei mir
meine Main heißt Conquest
Code:package de.Finnthehorrible.Conquest.Main; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; import javax.xml.stream.Location; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; public class Conquest extends JavaPlugin implements Listener, Runnable { @Override public void onEnable() { HashMap<String, Location> Stats = new HashMap<>(); HashMap<String, Location> Towerlocation = new HashMap<>(); Towerlocation.put(new String("Du hast den Tower" + Towerlocation + "eingenommen!"), (Location) this); ArrayList<String> Tankstelle = new ArrayList<String>(); ArrayList<String> Bahnhof = new ArrayList<String>(); ArrayList<String> Berg = new ArrayList<String>(); ArrayList<String> Strasse = new ArrayList<String>(); ArrayList<String> Wald = new ArrayList<String>(); String KillMessage = "Du hast" + getName() + "getötet!"; String DeathMessage = "Du wurdest von" + getName() + "getötet1"; Towerlocation.put(new String(), (Location) this); Stats.put(new String(), (Location) this); String DeEinnehmMessage1 = "Die Location" + Towerlocation + Tankstelle + "wurde erobert!"; String EinnehmMessage1 = "Die Location" + Towerlocation + Tankstelle + "wurde eingenommen!"; String DeEinnehmMessage2 = "Die Location" + Towerlocation + Bahnhof + "wurde erobert!"; String EinnehmMessage2 = "Die Location" + Towerlocation + Bahnhof + "wurde eingenommen!"; String DeEinnehmMessage3 = "Die Location" + Towerlocation + Berg + "wurde erobert!"; String EinnehmMessage3 = "Die Location" + Towerlocation + Berg + "wurde eingenommen!"; String DeEinnehmMessage4 = "Die Location" + Towerlocation + Strasse + "wurde erobert!"; String EinnehmMessage4 = "Die Location" + Towerlocation + Strasse + "wurde eingenommen!"; String DeEinnehmMessage5 = "Die Location" + Towerlocation + Wald + "wurde erobert!"; String EinnehmMessage5 = "Die Location" + Towerlocation + Wald + "wurde eingenommen!"; Stats.put(new String(), (Location) this); Towerlocation.put(new String(), (Location) this); System.out.println(KillMessage); System.out.println(DeathMessage); System.out.println(DeEinnehmMessage1); System.out.println(EinnehmMessage1); System.out.println(DeEinnehmMessage2); System.out.println(EinnehmMessage2); System.out.println(DeEinnehmMessage3); System.out.println(EinnehmMessage3); System.out.println(DeEinnehmMessage4); System.out.println(EinnehmMessage4); System.out.println(DeEinnehmMessage5); System.out.println(EinnehmMessage5); } @SuppressWarnings("unused") private void register() { PluginManager pm = Bukkit.getPluginManager(); } private final AtomicInteger countdown; private BukkitTask bukkitTask; public Conquest( int seconds ) { countdown = new AtomicInteger( seconds + 1 ); } @Override public void run() { int counter = countdown.decrementAndGet(); if (counter > 0) { Bukkit.broadcastMessage(ChatColor.GREEN + "Das Spiel startet in " + ChatColor.GOLD + counter + ChatColor.GREEN + " sekunden!"); } else { Bukkit.broadcastMessage(ChatColor.RED+"Durch ein Fehler startet das Spiel nicht!"); stop(); } } public void start() { } public void stop() { bukkitTask.cancel(); } @EventHandler public void onQuit(PlayerQuitEvent e){ Player p = e.getPlayer(); if(p.getName().equalsIgnoreCase("")) { e.setQuitMessage("§4Admin §7|§4 " + p.getName() + "§3hat das Spiel betreten!"); } else { e.setQuitMessage("§a" + p.getName() + "§3hat das Spiel betreten!"); } } @EventHandler public void onJoin(PlayerJoinEvent e){ Player p = e.getPlayer(); if(p.getName().equalsIgnoreCase("")) { e.setJoinMessage("§4Admin §7|§4 " + p.getName() + "§3hat das Spiel betreten!"); } else { e.setJoinMessage("§a"+p.getName()+"§3hat das Spiel betreten!"); } this.getConfig().options().header("Du hast das Spiel gestartet!"); this.getConfig().addDefault("Conquest.commands.START.message.You are Startet the Game!", "Du hast das Spiel gestartet!"); this.getConfig().options().header("Du wurdest zurück zur Lobby Teleportiert!"); this.getConfig().addDefault("Conquest.commands.HUB.message.You are Teleported back to the Lobby!", "Du wurdest zur Lobby zurück Teleportiert!"); getConfig().addDefault("Conquest.commands.LEAVE.message.You are Teleported back to the Lobby!", "Du wurdest zur Lobby zurück Teleportiert!"); getConfig().addDefault("Conquest.commands.L.message.You are Teleported back to the Lobby!", "Du wurdest zur Lobby zurück Teleportiert!"); this.getConfig().addDefault("", ""); } @EventHandler public void onChat(AsyncPlayerChatEvent e) { e.setCancelled(true); Player p = e.getPlayer(); String name = p.getDisplayName(); String msg = e.getMessage(); for (Player a : Bukkit.getOnlinePlayers()) { if (p.hasPermission("lobby.admin") || p.isOp()) { a.sendMessage("§4Admin | " + name + "§4: §f" + msg); } else if (p.hasPermission("lobby.blue") || p.isOp()) { a.sendMessage("§1" + name + "§1: §f" + msg); } else if (p.hasPermission("lobby.red") || p.isOp()) { a.sendMessage("§4" + name + "§4: §f" + msg); } else { a.sendMessage("§f" + name + "§a: §f" + msg); } } } @EventHandler public void onMove(PlayerMoveEvent event){ Player p = event.getPlayer(); p.setGameMode(GameMode.SURVIVAL); if(event != null){ } else { p.setGameMode(GameMode.SPECTATOR); } } public void onDisable(){ } }
ich berede das ganze schon mit @Schimon in einer unterhaltungSolltest dir mal Java Conventions angucken. Dringendst. Die Lesbarkeit deines Codes ist definitiv noch verbesserungswürdig.
wie meinst du das?Hey, kann mir vlt. jemand helfen wie bekomme ich vom AsyncPlayerChatEvent mehrere Argumente also die vom Spieler?
sprich args1.sendmessage("Test");
Wären das dann nicht nur 9 Sekunden bis der countdown zu ende ist? Oder bin ich da komplett dumm.Countdown:
Code:try { int countDown = 10; for(;;) { if ( countDown == 0 ) { break; } try { Thread.sleep(1000); } catch ( InterruptedException e ) { } // Always returns true if (true) { Bukkit.broadcastMessage( countDown ); } countDown--; } } catch ( OutOfMemoryException e ) { } // Memory problems ?! NOPE
So machen wir das immer![]()
Google Übersetzer regeltJa die Plugins die wir machen sind Multilanguage kompatibel. Da wir aber ein rein deutsches Netzwerk sind und dies auch so bleiben wird werden wir (Zeitpunkt jetzt) keine weiteren Sprachen hinzufügen. Wenn dies mal notwendig sein sollte brauchen wir dann eh Leute die die Sprache in die wir übersetzen möchten ein wenig mehr beherrschen als wir
Wenn ihr wollt kann ich euch ein paar Fragen zum programmieren und so beantworten wenn ihr mir versprecht das das nicht komplett ausartet![]()
Probier's mal damit: e.getMessage.split(“ “)Hey, kann mir vlt. jemand helfen wie bekomme ich vom AsyncPlayerChatEvent mehrere Argumente also die vom Spieler?
sprich args1.sendmessage("Test");
public static void addTabHeader(Player p, String headerTxt){
CraftPlayer cp = (CraftPlayer) p;
PlayerConnection connection = cp.getHandle().playerConnection;
IChatBaseComponent header = ChatSerializer.a("{text:'" + headerTxt + "'}");
PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter();
Field headerField;
try {
headerField = packet.getClass().getDeclaredField("a");
headerField.setAccessible(true);
headerField.set(packet, header);
headerField.setAccessible(!headerField.isAccessible());
} catch (Exception e) {
e.printStackTrace();
}
connection.sendPacket(packet);
}