TabList bearbeiten - Minecraft 1.8

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

TabList bearbeiten - Minecraft 1.8

Beitragvon ilouHD » Mo 16. Feb 2015, 02:11

Hallo zusammen,

diese Lösung habe ich schon in einem alten Thread gepostet, möchte sie jedoch einfach mal hier komplett öffentlich machen, damit jeder was davon hat und um so ein bisschen die Übersicht zu behalten. Abgesehen davon, kann ich nicht genau sagen, ob die Methode funktioniert. Theoretisch ja, Praktisch nicht getestet auf Grund von mangelnden Spielern. Also fangen wir an:

In meinem Fall, haben wir einen Spectator -> Player p (übergeben im Konstruktor der Methode)
Nun möchten wir den Spieler von allen, die nicht Spectator sind, aus der Tablist löschen:
Zuerst erstelle ich mir ein ScoreboardTeam (habe ich in diesem Fall):
Code: Alles auswählen
  1.       ScoreboardManager manager = Bukkit.getScoreboardManager();
  2.       Scoreboard main = manager.getMainScoreboard();
  3.       
  4.       Team spec = main.getTeam("spec");
  5.       
  6.       if(spec == null) {
  7.          spec = main.registerNewTeam("spec");
  8.          spec.setPrefix("§7");
  9.       }
  10.       
  11.       spec.setPrefix("§7");
  12.       spec.addPlayer(p);

Das aber nur nebensächlich. Das wird später jedoch noch gebraucht.
Nun gehen wir auf dem Server ALLE Spieler durch - Das machen wir mit einer for(-each)-Schleife:
Code: Alles auswählen
  1.       for(Player all : Bukkit.getOnlinePlayers()) {
  2.          //.... Hier gehts weiter
  3.       }

Wo bei mir nun der Kommentar ist, werde ich folgendes machen:
Zuerst gucke ich, ob der Spieler nicht im ScoreboardTeam "spec" ist:
Code: Alles auswählen
  1.          if(!Bukkit.getScoreboardManager().getMainScoreboard().getPlayerTeam(all).getName().equalsIgnoreCase("spec")) {

Haben wir das, erstellen wir uns EINEN Spieler aus den allen Spielern:
Code: Alles auswählen
  1. Player player = Bukkit.getPlayer(all.getName());

Wie vorher auch, brauchen wir als nächstes, das PacketPlayOutPlayerInfo. Hier müssen wir nun keinen "String", boolean, int(weis gar nicht, wofür der war) mehr übergeben, sondern übergeben als erstes ein EnumPlayerInfoAction. Da wird den Spieler entfernen wollen, empfiehlt es sich, das dafür vorgesehene enum REMOVE_PLAYER zu verwenden. Als 2. Argument müssen wir unseren Spieler als NMS-Player übergeben (korrigiert mich, wenn ich falsch liege - Es ist 2 Uhr nachts :D).
Sind wir soweit, sieht das ganze so aus:
Code: Alles auswählen
  1.             PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, ((CraftPlayer)p).getHandle());


Zu guter letzt - wer hätt's gedacht - müssen wir das Packet noch an den einzelnen Player senden, der nicht Spectator ist. Gemacht, wird das so wie immer:
Code: Alles auswählen
  1.             ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet);


Abschließen kann euer Code so aussehen (gesamte setSpectator-Methode) :
Code: Alles auswählen
  1.    @SuppressWarnings("deprecation")
  2.    public static void setSpectator(Player p) {
  3.       
  4.       ScoreboardManager manager = Bukkit.getScoreboardManager();
  5.       Scoreboard main = manager.getMainScoreboard();
  6.       
  7.       Team spec = main.getTeam("spec");
  8.       
  9.       if(spec == null) {
  10.          spec = main.registerNewTeam("spec");
  11.          spec.setPrefix("§7");
  12.       }
  13.       
  14.       spec.setPrefix("§7");
  15.       spec.addPlayer(p);
  16.       spec.setCanSeeFriendlyInvisibles(true);
  17.       
  18.       p.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1));
  19.       
  20.       for(Player all : Bukkit.getOnlinePlayers()) {
  21.          if(!Bukkit.getScoreboardManager().getMainScoreboard().getPlayerTeam(all).getName().equalsIgnoreCase("spec")) {
  22.             Player player = Bukkit.getPlayer(all.getName());
  23.             PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, ((CraftPlayer)p).getHandle());
  24.             
  25.             ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet);
  26.          }
  27.       }
  28.    }


Wenn es nicht funktioniert, bitte Bescheid geben. Theoretisch sollte es jedoch funktionieren, praktisch wurde es noch nicht getestet, da keine 2 Accounts zur Verfügung stehen :(

Hoffe, die Anleitung für die 1.8 funktionstüchtig gemacht zu haben.

Mit freundlichen Grüßen,
ilouHD
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste