• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Nur ein Spieler kriegt Displayname

Addy4ever

Minecrafter
Registriert
13 August 2016
Beiträge
7
Diamanten
301
Du kannst mithilfe der Methoden für jeden Spieler alle anderen Spieler ein Team innerhalb seines Scoreboards zuweisen.
Führe die Methoden am besten außerhalb eines Schedulers aus, damit du Leistung sparst.

Führe die update(...) Methode im PlayerJoinEvent und die updateAll() Methode in der Main aus.
Beachte, dass Du den jeweiligen Spieler vorher den Scoreboard setzt.

Java:
    private String getTeam(Player player) {
        String team = "";
        if(player.hasPermission("server.owner") | player.isOp()) {
            team = "000Owner";
        } else if(player.hasPermission("server.coowner")) {
            team = "001CoOwner";
        } else if(player.hasPermission("server.admin")) {
            team = "002Admin";
        } else if(player.hasPermission("server.dev")) {
            team = "003Dev";
        } else if(player.hasPermission("server.mod")) {
            team = "004Mod";
        } else if(player.hasPermission("server.sup")) {
            team = "005Sup";
        } else if(player.hasPermission("server.builder")) {
            team = "006Builder";
        } else if(player.hasPermission("server.supreme")) {
            team = "007Supreme";
        } else if(player.hasPermission("server.legende")) {
            team = "008Legende";
        } else if(player.hasPermission("server.titan")) {
            team = "009Titan";
        } else if(player.hasPermission("server.king")) {
            team = "0010King";
        } else if(player.hasPermission("server.ultra")) {
            team = "0011Ultra";
        } else if(player.hasPermission("server.premium")) {
            team = "0012Premium";
        } else {
            team = "0013Spieler";
        }
        return team;
    }
 
    public void updateAll() {
        for(Player player : Bukkit.getOnlinePlayers()) {
            update(player);
        }
    }
 
    @SuppressWarnings("deprecation")
    public void update(Player player) {
        String group = getTeam(player);
        for(Player player_ : Bukkit.getOnlinePlayers()) {
            try { player_.getScoreboard().getTeam(group).addPlayer(player); } catch(Exception ex) { }
        }
    }
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Ich empfehle nicht, die Lösung von @Addy4ever so umzusetzen:
  • Ein leerer Catch-Block ist eine böse Sache. Exceptions werden nicht ohne Grund geworfen und sollten auch irgendwie behandelt werden. Ohne Fehlerbehandlung läuft man Gefahr, nicht zu wissen, warum bestimmte Sachen nicht funktionieren.
  • Wenn in einem Lösungsvorschlag `@SupressWarnings("deprecation")` steht, stimmt schon etwas nicht. Deprecation-Warnings gibt es nicht umsonst, für gewöhnlich werden dann einzelne Methoden in der Zukunft entfernt.
  • Ich kenn mich mit den Bukkit-Scoreboards nicht so richtig aus, aber irgendwie scheint mir die for-Schleife in der update-Methode ein falscher Ansatz zu sein. Logisch wäre: Es wird einmal ein Scoreboard/Team angelegt, die Spieler werden dem hinzugefügt.
  • `player.hasPermission("server.owner") | player.isOp()` -> Warum nutzt du hier ein bitwise or, auch wenn es im Endeffekt das gleiche bewirkt, wäre hier ein logical or der richtige Operand.
 

Addy4ever

Minecrafter
Registriert
13 August 2016
Beiträge
7
Diamanten
301
Der Catch Block wird normalerweise nur dann ausgeführt, wenn der Scoreboard des Spielers nicht gesetzt wurde.
Davor habe ich ihn im Beitrag gewarnt.

Wenn im Lösungsvorschlag '@SupressWarnings("deprecation")' steht, heißt es nicht, dass dort was nicht stimmt. Wie Du schon sagst, heißt es nur, dass es in zukünftigen Versionen nicht mehr vorhanden sein könnte (Die gibt es immer noch). Ich könnte jetzt Alternativen nennen, aber dafür müsste er seinen vorhandenen Code komplett umschreiben.

Das Problem in der ,,for" Schleife ist mir bewusst. Aber Du musst leider für jeden Spieler einzelnt den Scoreboard updaten (Weil er so sein Scoreboard programmiert hat). Deshalb habe ich ihn auch geraten mit dieser Methode sparsam umzugehen.

Die ganzen if(..) Abfragen waren von seiner Klasse. Ich habe diese lediglich kopiert und einen String Output draus gemacht.
 
Zuletzt bearbeitet:

Addy4ever

Minecrafter
Registriert
13 August 2016
Beiträge
7
Diamanten
301
Meine Intention hinter dem Try-Catch Block ist, dass dieser Spieler, falls er keinen Scoreboard hat oder dieses Team nicht existiert übersprungen wird und die Konsole nicht unnötig mit Nachrichten geflutet wird.
Sollte dies geschehen, dann wird der Name des Spielers nicht verändert und wird ggf. einfach weiß oder außer Reihenfolge angezeigt, was bereits auf einen Fehler im Scoreboard hinweißt.
Dein Ansatz mit der if-Abfrage würde auf das Selbe hinausgehen, weil Du auch nur ausschließt ob eines der Parameter null ist.

Ob man nun dort einen 'ex.printStackTrace();' in den Block einbaut ist jedem selbst überlassen.
Wenn man den Fehler offensichtlich erkennen kann, braucht man das meiner Meinung nach nicht.

Aber es ist auch nur ein Lösungsvorschlag, den ich gepostet habe.
MrKienSpan kann den Code jederzeit seinen Standards anpassen.
 
Oben