ServerPlugin Scoreboard im Tab

Dieses Thema im Forum "Programmierung" wurde erstellt von Lapura, 19. August 2016.

  1. Lapura
    Offline

    Lapura

    Registriert seit:
    28. Dezember 2014
    Beiträge:
    59
    Heeey liebe Minecraft-Server.eu Community, ich melde mich nach langer Zeit wieder zurück mit einigen Fragen.
    Ich Programmiere seit fast 1 Woche an einem SkyPvP-System mit allem drum und dran, jetzt sitze ich seit fast 10 Stunden nur an der Tablist!
    Da ich keine andere Lösung mehr finde außer hier ein Beitrag zu machen, aber jetzt erstmal zu meinem Problem, und zwar
    ich habe mal etwas herum geschaut wie es andere machen mit dem Tab, und es ist raus gekommen das es 90% alle Programmierer es mit einen Scoreboard, sprich Scoreboard Teams machen.
    Ich hab es selbst mal versucht und es hat auch alles geklappt, nur wenn ich das SkyPvP-System und das TabPlugin auf ein Server lege klappt der Tab nicht mehr!
    Ich bin mir sicher das es an dem SkyPvP-System Scoreboard an der seite liegt, und wollte jetzt mal fragen was ich jetzt machen kann..



    SkyPvP-System => Scoreoard rechts an der Seite:
    Code (Javascript):
    1.     public static void SetScoreboard(Player p) {
    2.         ScoreboardManager sm = Bukkit.getServer().getScoreboardManager();
    3.         Scoreboard board = sm.getNewScoreboard();
    4.         Objective score = board.registerNewObjective("aaa", "bbb");
    5.         score.setDisplayName("§6§lServer-name");  
    6.         score.setDisplaySlot(DisplaySlot.SIDEBAR);
    7.        
    8.         int kills = MySQlStats.getKills(p.getUniqueId().toString());
    9.         int deaths = MySQlStats.getDeaths(p.getUniqueId().toString());
    10.         int coins = MySQlStats.getCoins(p.getUniqueId().toString());
    11.        
    12.         Score Leer1 = score.getScore(Bukkit.getOfflinePlayer("§a "));
    13.         Score Kills = score.getScore(Bukkit.getOfflinePlayer("§7Kills: §a" + kills));
    14.         Score Deaths = score.getScore(Bukkit.getOfflinePlayer("§7Deaths: §c" + deaths));
    15.         Score Coins = score.getScore(Bukkit.getOfflinePlayer("§7Coins: §e" + coins));
    16.         Score Leer2 = score.getScore(Bukkit.getOfflinePlayer("§a "));
    17.         Score Website = score.getScore(Bukkit.getOfflinePlayer("§7Website:"));
    18.         Score URL = score.getScore(Bukkit.getOfflinePlayer("§6§lServer-name"));
    19.        
    20.         Leer1.setScore(7);
    21.         Kills.setScore(6);
    22.         Deaths.setScore(5);
    23.         Coins.setScore(4);
    24.         Leer2.setScore(3);
    25.         Website.setScore(2);
    26.         URL.setScore(1);
    27.        
    28.         p.setScoreboard(board);
    29.     }

    Tab Plugin:

    Code (Javascript):
    1. package tabmanager;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.entity.Player;
    5. import org.bukkit.event.EventHandler;
    6. import org.bukkit.event.Listener;
    7. import org.bukkit.event.player.PlayerJoinEvent;
    8. import org.bukkit.plugin.java.JavaPlugin;
    9. import org.bukkit.scoreboard.Scoreboard;
    10.  
    11. public class Main extends JavaPlugin implements Listener {
    12.    
    13.     Scoreboard sb;
    14.     @Override
    15.     public void onEnable() {
    16.         sb = Bukkit.getScoreboardManager().getNewScoreboard();
    17.         sb.registerNewObjective("ccc", "ddd");
    18.         sb.registerNewTeam("00000Admin");
    19.         sb.registerNewTeam("00001Spieler");
    20.         sb.getTeam("00000Admin").setPrefix("§4A §7| ");
    21.         sb.getTeam("00001Spieler").setPrefix("§9");
    22.        
    23.        
    24.         Bukkit.getServer().getPluginManager().registerEvents(this, this);
    25.     }
    26.    
    27.  
    28.    @EventHandler
    29.    public void onJoin(PlayerJoinEvent e){
    30.            Player p = e.getPlayer();
    31.           setPrefix(p);
    32.          
    33.    }
    34.  
    35.  
    36.    private void setPrefix(Player p) {
    37.        String team = "";
    38.        if(p.isOp()) {
    39.            team = "00000Admin";
    40.        } else {
    41.            team = "00001Spieler";
    42.        }
    43.        sb.getTeam(team).addPlayer(p);
    44.        p.setDisplayName(sb.getTeam(team).getPrefix() + p.getName());
    45.        for(Player all : Bukkit.getOnlinePlayers()) {
    46.            all.setScoreboard(sb);
    47.        }
    48.    }
    49. }
    50.            

    Danke für jede Hilfe!
     
    #1
  2. Verschraubt
    Offline

    Verschraubt

    Das Problem kenne ich allzu gut.
    Vorab: bei ScoreboardTeams am besten das MainScoreboard nehmen.

    Also die meisten Server lösen das, indem sie eins von beidem mit Packets senden. Einfacher ist es, hierbei die ScoreboardTeams ganz normal und dann das normale Scoreboard über Packets zu senden.

    Dazu hab ich mir hier eine Klasse geschrieben:
    Code (Text):
    1. public class ScoreboardManager extends Reflections {
    2.  
    3.     private String scoreboardName;
    4.     private Player player;
    5.     private Scoreboard scoreboard;
    6.     private ScoreboardObjective objective;
    7.     private HashMap<Integer, String> scores = new HashMap<>();
    8.  
    9.     public ScoreboardManager(Player p, String scoreboardname) {
    10.         this.player = p;
    11.         this.scoreboardName = (scoreboardname.length() <= 32 ? scoreboardname : scoreboardname.substring(0, 32));
    12.         this.scoreboard = new Scoreboard();
    13.         this.objective = new ScoreboardObjective(scoreboard, "a", new ScoreboardBaseCriteria("abc"));
    14.     }
    15.  
    16.     public void setScores(HashMap<Integer, String> map) {
    17.         this.scores = map;
    18.     }
    19.  
    20.     public void create() {
    21.         PacketPlayOutScoreboardObjective create = new PacketPlayOutScoreboardObjective(objective, 0);
    22.         set(create, "b", scoreboardName);
    23.         PacketPlayOutScoreboardDisplayObjective display = new PacketPlayOutScoreboardDisplayObjective(1, objective);
    24.         PacketPlayOutScoreboardObjective removePacket = new PacketPlayOutScoreboardObjective(objective, 1);
    25.  
    26.         sendPacket(player, removePacket);
    27.         sendPacket(player, create);
    28.         sendPacket(player, display);
    29.  
    30.         if ((scores.keySet() != null) && (!scores.isEmpty())) {
    31.             scores.entrySet().forEach(entry -> {
    32.                 ScoreboardScore b = new ScoreboardScore(scoreboard, objective, entry.getValue());
    33.                 b.setScore(entry.getKey());
    34.                 sendPacket(player, new PacketPlayOutScoreboardScore(b));
    35.             });
    36.         }
    37.     }
    38.  
    39. }
    Die Klasse erbt von Reflections:

    Code (Text):
    1. public class Reflections {
    2.    
    3.     public static void set(Object object, String fieldname, Object value) {
    4.         try {
    5.             Field field = object.getClass().getDeclaredField(fieldname);
    6.             field.setAccessible(true);
    7.             field.set(object, value);
    8.             field.setAccessible(false);
    9.         } catch (Exception ex) {
    10.             ex.printStackTrace();
    11.         }
    12.     }
    13.    
    14.     public static Object get(Object object, String fieldname) {
    15.         try {
    16.             Field field = object.getClass().getDeclaredField(fieldname);
    17.             field.setAccessible(true);
    18.             return field.get(object);
    19.         } catch (Exception ex) {
    20.             ex.printStackTrace();
    21.             return null;
    22.         }
    23.     }
    24.  
    25.     public static void sendPacket(Player player, Object packet) {
    26.         try {
    27.             Object handle = player.getClass().getMethod("getHandle").invoke(player);
    28.             Object playerConnection = handle.getClass().getField("playerConnection").get(handle);
    29.             playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet);
    30.         }
    31.  
    32.         catch (Exception e) {
    33.             e.printStackTrace();
    34.         }
    35.     }
    36.  
    37.     public static Class<?> getNMSClass(String name) {
    38.         String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
    39.         try {
    40.             return Class.forName("net.minecraft.server." + version + "." + name);
    41.         }
    42.  
    43.         catch (ClassNotFoundException e) {
    44.             e.printStackTrace();
    45.             return null;
    46.         }
    47.     }
    48.  
    49. }
    Zur Anwendung:

    Erstelle ein neues ScoreboardManager Objekt mit den vorgeschriebenen Parametern. Dann füllst du eine HashMap mit deinen Informationen und übergibst diese. Danach muss du nur noch das Scoreboard erstellen.
    (create() ist vielleicht etwas falsch gewählt, da du das Scoreboard auch damit updaten kannst.)
    Code (Text):
    1. ScoreboardManager sm = new ScoreboardManager(p, "§4Ich bin ein SB");
    2.        
    3.         HashMap<Integer, String> liste = new HashMap<>();
    4.         liste.put(4, "Kills");
    5.         liste.put(8, "Tode");
    6.         sm.setScores(liste);
    7.        
    8.         sm.create();
    PS: Schau dir bitte die Klasse genau an und versuch sie zu verstehen. Wenn du Fragen hast kannst du gerne fragen.
     
    #2
  3. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    #3
    Verschraubt gefällt das.
  4. Verschraubt
    Offline

    Verschraubt

    #4
  5. Lapura
    Offline

    Lapura

    Registriert seit:
    28. Dezember 2014
    Beiträge:
    59

    Ich brauche Tab, und NameTags...
    Aber gibt es da auch eine einfachere Methoden die ein Anfänger verstehet?
     
    #5
  6. Verschraubt
    Offline

    Verschraubt

    Du hast ja im Prinzip deine Methode mit den Scoreboardteams selber zusammengestellt.
     
    #6