• 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!

Scoreboard zeigt nicht den richtigen Rang an

LegitCoreYT

Kuhfänger
Registriert
20 August 2016
Beiträge
56
Alter
23
Diamanten
250
Minecraft
NochNichtGebannt
Hallo liebe Minecraft-Server.eu Community,
Ich habe aktuell ein Problem mit meinem Scoreboard. Dieses zeigt den falschen Rang des Spielers an. Wenn ein Moderator zum Beispiel auf den LobbyServer joint sollte im Scoreboard logischweise bei Rang "Moderator" stehen. Allerdings steht dort immer "Spieler".

Mein Code:
Code:
public static HashMap<org.bukkit.scoreboard.Scoreboard, Player> boards = new HashMap<>();

public static void createScoreboard(Player p) {
        if(p.getScoreboard().getObjectives() == null) {
            org.bukkit.scoreboard.Scoreboard board = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
            boards.put(board, p);
        }
     
        org.bukkit.scoreboard.Scoreboard board = p.getScoreboard();

        Objective obj = p.getScoreboard().getObjective("aaa");

        obj.setDisplaySlot(DisplaySlot.SIDEBAR);
        obj.setDisplayName("§a§l" + p.getName());

        obj.getScore(" ").setScore(11);
        obj.getScore("§7Coins").setScore(10);
        Team coins = board.registerNewTeam("coins");
        coins.setPrefix("§8» §e");
        coins.setSuffix("§e" + de.Teilzeitarbeit.commands.coins.coins.get(p.getUniqueId()));
        coins.addEntry(ChatColor.AQUA.toString());
        obj.getScore(ChatColor.AQUA.toString()).setScore(9);
        obj.getScore("  ").setScore(8);
        obj.getScore("§3Rang").setScore(7);
        if (Permission***.getUser(p).inGroup("Owner")) {
            Score score5 = obj.getScore("§8» §4Owner");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Admin")) {
            Score score5 = obj.getScore("§8» §cAdmin");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Developer")) {
            Score score5 = obj.getScore("§8» §bDeveloper");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Builder")) {
            Score score5 = obj.getScore("§8» §eBuilder");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Supporter")) {
            Score score5 = obj.getScore("§8» §aSupporter");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Moderator")) {
            Score score5 = obj.getScore("§8» §9Moderator");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Moderator")) {
            Score score5 = obj.getScore("§8» §9JrMod");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Freund")) {
            Score score5 = obj.getScore("§8» §6Freund");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Azubi")) {
            Score score5 = obj.getScore("§8» §aAzubi");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("YouTuber")) {
            Score score5 = obj.getScore("§8» §5YouTuber");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("Premium")) {
            Score score5 = obj.getScore("§8» §6Premium");
            score5.setScore(6);
        } else if (Permission***.getUser(p).inGroup("JrYouTuber")) {
            Score score5 = obj.getScore("§8» §5JrYouTuber");
            score5.setScore(6);
        } else {
            Score score5 = obj.getScore("§8» §7Spieler");
            score5.setScore(6);
        }
        obj.getScore("   ").setScore(5);
        obj.getScore("§7TeamSpeak").setScore(4);
        obj.getScore("§8» §6TakPvP.de").setScore(3);
        obj.getScore("     ").setScore(2);
        obj.getScore("§7Website").setScore(1);
        obj.getScore("§8» §aTakPvP.de").setScore(0);

        boards.put(board, p);

        p.setScoreboard(board);

    }

Ich hoffe mit kann jemand weiterhelfen.
MfG LegitCore
 
F

Figz

Guest
Ich würde mal behaupten, dein Fehler liegt in den ersten Zeilen:

Code:
public static HashMap<org.bukkit.scoreboard.Scoreboard, Player> boards = new HashMap<>();

public static void createScoreboard(Player p) {
        if(p.getScoreboard().getObjectives() == null) {
            org.bukkit.scoreboard.Scoreboard board = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
            boards.put(board, p);
        }
     
        org.bukkit.scoreboard.Scoreboard board = p.getScoreboard();

Du erstellst zwar ein neues Scoreboard, jedoch weist du es dem Spieler nicht zu.
Stattdessen holst du dir das Scoreboard vom Spieler (Was standardmäßg das MainScoreboard ist) und packst dort die Objectives rein.
Deswegen hat jeder Spieler das gleiche Scoreboard.
 

LegitCoreYT

Kuhfänger
Registriert
20 August 2016
Beiträge
56
Alter
23
Diamanten
250
Minecraft
NochNichtGebannt
Ich würde mal behaupten, dein Fehler liegt in den ersten Zeilen:

Code:
public static HashMap<org.bukkit.scoreboard.Scoreboard, Player> boards = new HashMap<>();

public static void createScoreboard(Player p) {
        if(p.getScoreboard().getObjectives() == null) {
            org.bukkit.scoreboard.Scoreboard board = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
            boards.put(board, p);
        }
    
        org.bukkit.scoreboard.Scoreboard board = p.getScoreboard();

Du erstellst zwar ein neues Scoreboard, jedoch weist du es dem Spieler nicht zu.
Stattdessen holst du dir das Scoreboard vom Spieler (Was standardmäßg das MainScoreboard ist) und packst dort die Objectives rein.
Deswegen hat jeder Spieler das gleiche Scoreboard.

Hm... Mein Hauptproblem an der Änderung ist halt, dass ich, bevor diese Sidebar gesetzt wird auch noch die Tablist erstelle. Da diese ja auch ein Scoreboard ist kam ich auf die Idee eben das Scoreboard vom Spieler als "board" herzunehmen. Seitdem ich allerdings das Problem mit den Rängen auch auf Tab. Also: Überall, wo Pex verwendet wird, um eine Gruppe zu bekommen geht es nicht mehr.
 

Dkrieger

Minecrafter
Registriert
11 August 2016
Beiträge
7
Alter
23
Diamanten
250
Minecraft
Dkrieger
PHP:
package Ch.Dkrieger.Lobby.API;

import java.sql.SQLException;

import net.minecraft.server.v1_8_R3.IScoreboardCriteria;
import net.minecraft.server.v1_8_R3.Packet;
import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardDisplayObjective;
import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardObjective;
import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardScore;
import net.minecraft.server.v1_8_R3.Scoreboard;
import net.minecraft.server.v1_8_R3.ScoreboardObjective;
import net.minecraft.server.v1_8_R3.ScoreboardScore;

import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;

import Ch.Dkrieger.Coins.API.Economy;
import at.TimoCraft.TimoCloud.api.TimoCloudAPI;

public class ScoreBoardManager {
   
    public static void sendScore(Player p){
        //erstellt den Scoreboard
        Scoreboard board = new Scoreboard();
        ScoreboardObjective obj = board.registerObjective("Name", IScoreboardCriteria.b);
       
        //Erstellt den Scoreboard im Packet removed den alten und setzt ihn als Display
        PacketPlayOutScoreboardObjective removepacket = new PacketPlayOutScoreboardObjective(obj,1);
        PacketPlayOutScoreboardObjective createPacket = new PacketPlayOutScoreboardObjective(obj,0);
        PacketPlayOutScoreboardDisplayObjective display = new PacketPlayOutScoreboardDisplayObjective(1, obj);
       
        //Set sehn Display Namen, bei den Packt wird meistens der ScoreBoard Namen verwendet, ich habe keine Anung warum das so ist
        obj.setDisplayName("Name");
       
        //Setzt die einzelnen Objectives, es können beliebig viele erstellt werden, müssen aber alle im Spieler gesendet werden(unten).
        ScoreboardScore s1 = new ScoreboardScore(board, obj, "§7Server§8: ");
        ScoreboardScore s2 = new ScoreboardScore(board, obj, "§e"+TimoCloudAPI.getBukkitInstance().getServerName());
        ScoreboardScore s3 = new ScoreboardScore(board, obj, "§7-------------");
        ScoreboardScore s8 = new ScoreboardScore(board, obj, "§3Clan§8: §e"+PlayerManager.getClanTag(p.getUniqueId()));
        ScoreboardScore s9 = new ScoreboardScore(board, obj, "§3Rang§8: "+PlayerManager.getRang(p));
        ScoreboardScore s4 = new ScoreboardScore(board, obj, "§3Coins§8: §e"+Economy.getCoins(p.getName()));
       
        //setzt den Score
        s1.setScore(5);
        s2.setScore(4);
        s3.setScore(3);
        s8.setScore(2);
        s9.setScore(1);
        s4.setScore(0);
       
        //erstellt die Packts
        PacketPlayOutScoreboardScore ps1 = new PacketPlayOutScoreboardScore(s1);
        PacketPlayOutScoreboardScore ps2 = new PacketPlayOutScoreboardScore(s2);
        PacketPlayOutScoreboardScore ps3 = new PacketPlayOutScoreboardScore(s3);
        PacketPlayOutScoreboardScore ps4 = new PacketPlayOutScoreboardScore(s4);
        PacketPlayOutScoreboardScore ps8 = new PacketPlayOutScoreboardScore(s8);
        PacketPlayOutScoreboardScore ps9 = new PacketPlayOutScoreboardScore(s9);
       
        //sendet die Packts
        sendpacket(p, removepacket);
        sendpacket(p, createPacket);
        sendpacket(p, display);
       
        sendpacket(p, ps1);
        sendpacket(p, ps2);
        sendpacket(p, ps3);
        sendpacket(p, ps4);
        sendpacket(p, ps8);
        sendpacket(p, ps9);
    }
    //Packets senden
    public static void sendpacket(Player p,Packet<?> packet){
        ((CraftPlayer)p).getHandle().playerConnection.sendPacket(packet);   
    }

Ich hoffe es ist für dich verständlich, ich habe den Code jetzt aus meinem Projekt raus kopiert und ein bisschen beschrieben. die Methode kannst du nachher beim Join Event senden.
 

LegitCoreYT

Kuhfänger
Registriert
20 August 2016
Beiträge
56
Alter
23
Diamanten
250
Minecraft
NochNichtGebannt
Wen du es ohne Packets machen willst guck dir meine Kurze Erklärung dort an:
https://minecraft-server.eu/forum/threads/scoreboard-erstellen-spigot-1-8-8.42914/#post-253618
Dort fügst du jeden Spieler sein eigenes Scoreboard hinzu und ermöglichst somit das Anzeigen des Ranges.
Ich habe es schon mal so ausprobiert, wie du es hier hast. Das Problem hierbei war allerdings, dass zwar auf Tab z.B. "Developer" stand, allerdings im Scoreboard "Spieler".

PHP:
package Ch.Dkrieger.Lobby.API;

import java.sql.SQLException;

import net.minecraft.server.v1_8_R3.IScoreboardCriteria;
import net.minecraft.server.v1_8_R3.Packet;
import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardDisplayObjective;
import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardObjective;
import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardScore;
import net.minecraft.server.v1_8_R3.Scoreboard;
import net.minecraft.server.v1_8_R3.ScoreboardObjective;
import net.minecraft.server.v1_8_R3.ScoreboardScore;

import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;

import Ch.Dkrieger.Coins.API.Economy;
import at.TimoCraft.TimoCloud.api.TimoCloudAPI;

public class ScoreBoardManager {
  
    public static void sendScore(Player p){
        //erstellt den Scoreboard
        Scoreboard board = new Scoreboard();
        ScoreboardObjective obj = board.registerObjective("Name", IScoreboardCriteria.b);
      
        //Erstellt den Scoreboard im Packet removed den alten und setzt ihn als Display
        PacketPlayOutScoreboardObjective removepacket = new PacketPlayOutScoreboardObjective(obj,1);
        PacketPlayOutScoreboardObjective createPacket = new PacketPlayOutScoreboardObjective(obj,0);
        PacketPlayOutScoreboardDisplayObjective display = new PacketPlayOutScoreboardDisplayObjective(1, obj);
      
        //Set sehn Display Namen, bei den Packt wird meistens der ScoreBoard Namen verwendet, ich habe keine Anung warum das so ist
        obj.setDisplayName("Name");
      
        //Setzt die einzelnen Objectives, es können beliebig viele erstellt werden, müssen aber alle im Spieler gesendet werden(unten).
        ScoreboardScore s1 = new ScoreboardScore(board, obj, "§7Server§8: ");
        ScoreboardScore s2 = new ScoreboardScore(board, obj, "§e"+TimoCloudAPI.getBukkitInstance().getServerName());
        ScoreboardScore s3 = new ScoreboardScore(board, obj, "§7-------------");
        ScoreboardScore s8 = new ScoreboardScore(board, obj, "§3Clan§8: §e"+PlayerManager.getClanTag(p.getUniqueId()));
        ScoreboardScore s9 = new ScoreboardScore(board, obj, "§3Rang§8: "+PlayerManager.getRang(p));
        ScoreboardScore s4 = new ScoreboardScore(board, obj, "§3Coins§8: §e"+Economy.getCoins(p.getName()));
      
        //setzt den Score
        s1.setScore(5);
        s2.setScore(4);
        s3.setScore(3);
        s8.setScore(2);
        s9.setScore(1);
        s4.setScore(0);
      
        //erstellt die Packts
        PacketPlayOutScoreboardScore ps1 = new PacketPlayOutScoreboardScore(s1);
        PacketPlayOutScoreboardScore ps2 = new PacketPlayOutScoreboardScore(s2);
        PacketPlayOutScoreboardScore ps3 = new PacketPlayOutScoreboardScore(s3);
        PacketPlayOutScoreboardScore ps4 = new PacketPlayOutScoreboardScore(s4);
        PacketPlayOutScoreboardScore ps8 = new PacketPlayOutScoreboardScore(s8);
        PacketPlayOutScoreboardScore ps9 = new PacketPlayOutScoreboardScore(s9);
      
        //sendet die Packts
        sendpacket(p, removepacket);
        sendpacket(p, createPacket);
        sendpacket(p, display);
      
        sendpacket(p, ps1);
        sendpacket(p, ps2);
        sendpacket(p, ps3);
        sendpacket(p, ps4);
        sendpacket(p, ps8);
        sendpacket(p, ps9);
    }
    //Packets senden
    public static void sendpacket(Player p,Packet<?> packet){
        ((CraftPlayer)p).getHandle().playerConnection.sendPacket(packet);  
    }

Ich hoffe es ist für dich verständlich, ich habe den Code jetzt aus meinem Projekt raus kopiert und ein bisschen beschrieben. die Methode kannst du nachher beim Join Event senden.

Das mit den Packets geht super. Danke für die schnelle Hilfe! :)

MfG Teilzeitarbeit

//Gelöst
 
Oben