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

Wegen Scoreboard nur ein Spieler auf Server möglich

GabiKleebi02

Minecrafter
Registriert
10 Februar 2018
Beiträge
5
Diamanten
300
Minecraft
GabiKleebi02
Ich habe ein Plugin geschrieben, das für jeden Spieler ein Scoreboard erstellt und ihm das in der Sidebar anzeigt. Jedoch habe ich jetzt das Problem, das immer nur ein Spieler auf dem Server spielen kann und der Fehler scheint durch dieses Plugin zu kommen.

[13:18:51] [Server thread/WARN]: Failed to handle packet for /91.48.22.92:53500
java.lang.NegativeArraySizeException
at java.util.AbstractCollection.toArray(AbstractCollection.java:136) ~[?:1.8.0_162]
at java.util.ArrayList.addAll(ArrayList.java:581) ~[?:1.8.0_162]
at net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardTeam.<init>(SourceFile:48) ~[spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.PlayerList.sendScoreboard(PlayerList.java:197) ~[spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.PlayerList.a(PlayerList.java:141) ~[spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.LoginListener.b(LoginListener.java:144) ~[spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.LoginListener.c(LoginListener.java:54) ~[spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.NetworkManager.a(NetworkManager.java:231) ~[spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.ServerConnection.c(ServerConnection.java:148) [spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:813) [spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:653) [spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:556) [spigot-1.8.8.jar:git-Spigot-76236cb-9cd1111]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_162]
[13:18:51] [Server thread/INFO]: GabiKleebi02 lost connection: Internal server error

Code:
package gabikleebi02.cts.main;

import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;

public class ScoreBoardClass implements Listener {

    public static HashMap<Player, Scoreboard> scoreboards = new HashMap<Player, Scoreboard>();

    public static void setScoreboard(Player p) {
        Scoreboard sb = Bukkit.getScoreboardManager().getNewScoreboard();
        Objective obj = sb.registerNewObjective("Gameserver", "dummy");

        obj.setDisplaySlot(DisplaySlot.SIDEBAR);
        obj.setDisplayName("§6§lGameserver");

        Team name = sb.registerNewTeam("name");
        Team online = sb.registerNewTeam("online");
        Team coins = sb.registerNewTeam("coins");
        Team welt = sb.registerNewTeam("welt");

        obj.getScore("§1").setScore(11);
        obj.getScore("§fWillkommen,       ").setScore(10);
        obj.getScore("§a").setScore(9);
        obj.getScore("§2").setScore(8);

        obj.getScore("§fOnline:").setScore(7);
        obj.getScore("§b").setScore(6);
        obj.getScore("§3").setScore(5);

        obj.getScore("§fDein Geld:").setScore(4);
        obj.getScore("§c").setScore(3);
        obj.getScore("§4").setScore(2);

        obj.getScore("§fDeine Welt:").setScore(1);
        obj.getScore("§d").setScore(0);

        name.addEntry("§a");
        online.addEntry("§b");
        coins.addEntry("§c");
        welt.addEntry("§d");

         if(p.getName().length() > 12) {
         name.setPrefix("§6§l" + p.getName().substring(0, 11));
         } else {
         name.setPrefix("§6§l" + p.getName());
         }

         name.setPrefix("§6§l" + p.getName());

        online.setPrefix("§6§l" + p.getServer().getOnlinePlayers().size() + "§f/");
        online.setSuffix("§6§l" + p.getServer().getMaxPlayers());

        String coinAmount = "" + BankClass.getMoney(p);
        if(coinAmount.length() > 12) {
            coins.setPrefix("§6§l" + coinAmount.substring(0, 11));
        } else {
            coins.setPrefix("§6§l" + coinAmount);
        }

        coins.setSuffix("§6§l Taler");

        welt.setPrefix("§6§l" + p.getWorld().getName());

        Team Owner, Admin, Mod, Builder, YouTube, Spieler;
        if (sb.getTeam("0Owner") == null) {
            Owner = sb.registerNewTeam("0Owner");
            Admin = sb.registerNewTeam("1Admin");
            Mod = sb.registerNewTeam("2Mod");
            Builder = sb.registerNewTeam("3Builder");
            YouTube = sb.registerNewTeam("4YouTube");
            Spieler = sb.registerNewTeam("5Spieler");

            Owner.setPrefix("§7[§6Owner§7] §f");
            Admin.setPrefix("§7[§2Admin§7] §f");
            Mod.setPrefix("§7[§eMod§7] §f");
            Builder.setPrefix("§7[§3Bau§7] §f");
            YouTube.setPrefix("§7[§5YT§7] §f");
            Spieler.setPrefix("§7[§aUser§7] §f");
        }

        Owner = sb.getTeam("0Owner");
        Admin = sb.getTeam("1Admin");
        Mod = sb.getTeam("2Mod");
        Builder = sb.getTeam("3Builder");
        YouTube = sb.getTeam("4YouTube");
        Spieler = sb.getTeam("5Spieler");

        for (Player all : Bukkit.getOnlinePlayers()) {
            if ((all.isOp()) || (all.hasPermission("rang.Owner"))) {
                Owner.addEntry(all.getName());
            } else if (all.hasPermission("rang.Admin")) {
                Admin.addEntry(all.getName());
            } else if (all.hasPermission("rang.Mod")) {
                Mod.addEntry(all.getName());
            } else if (all.hasPermission("rang.Builder")) {
                Builder.addEntry(all.getName());
            } else if (all.hasPermission("rang.YouTube")) {
                YouTube.addEntry(all.getName());
            } else {
                Spieler.addEntry(all.getName());
            }
        }

        p.setScoreboard(sb);

        scoreboards.put(p, sb);
    }

    @SuppressWarnings("deprecation")
    public static void updateScoreboard(Player p) {
        Bukkit.getScheduler().scheduleAsyncRepeatingTask(Main.getInstance(), new Runnable() {

            @Override
            public void run() {
                if (!scoreboards.containsKey(p)) {
                    setScoreboard(p);
                }

                for (Player all : Bukkit.getOnlinePlayers()) {
                    if (scoreboards.get(all).getTeam("0Owner") == null) {
                        setScoreboard(all);
                    }

                    if (all.hasPermission("rang.owner")) {
                        p.getScoreboard().getTeam("0Owner").addEntry(all.getName());
                    } else if (all.hasPermission("rang.admin")) {
                        p.getScoreboard().getTeam("1Admin").addEntry(all.getName());
                    } else if (all.hasPermission("rang.mod")) {
                        p.getScoreboard().getTeam("2Mod").addEntry(all.getName());
                    } else if (all.hasPermission("rang.builder")) {
                        p.getScoreboard().getTeam("3Builder").addEntry(all.getName());
                    } else if (all.hasPermission("rang.youtube")) {
                        p.getScoreboard().getTeam("4YouTube").addEntry(all.getName());
                    } else {
                        p.getScoreboard().getTeam("5Spieler").addEntry(all.getName());
                    }
                }

                Team name = scoreboards.get(p).getTeam("name");
                Team online = scoreboards.get(p).getTeam("online");
                Team coins = scoreboards.get(p).getTeam("coins");
                Team welt = scoreboards.get(p).getTeam("welt");

                if (p.getName().length() > 12) {
                    name.setPrefix("§6§l" + p.getName().substring(0, 11));
                } else {
                    name.setPrefix("§6§l" + p.getName());
                }

                name.setPrefix("§6§l" + p.getName());

                online.setPrefix("§6§l" + p.getServer().getOnlinePlayers().size() + "§f/");
                online.setSuffix("§6§l" + p.getServer().getMaxPlayers());
               
                String coinAmount = "" + BankClass.getMoney(p);
                if(coinAmount.length() > 12) {
                    coins.setPrefix("§6§l" + coinAmount.substring(0, 11));
                } else {
                    coins.setPrefix("§6§l" + coinAmount);
                }

                coins.setSuffix("§6§l Taler");

                welt.setPrefix("§6§l" + p.getWorld().getName());
            }
        }, 0L, 10L);

    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        setScoreboard(e.getPlayer());
        updateScoreboard(e.getPlayer());
    }
}
 

combo

Miner
Registriert
16 Juli 2012
Beiträge
175
Diamanten
0
Minecraft
combo5
Erstmal wäre es vielleicht sinnvoll deine update Methode zu ändern.
Ich glaube nicht, dass es besonders performant ist, wenn es für jeden User eine Runnable gibt die das Scoreboard updated.
Und warum fügst du bei jedem Update alle User neu in die Teams ein, das ergibt für mich gerade wenig sinn, oder wie hast du dir das gedacht?
 

GabiKleebi02

Minecrafter
Registriert
10 Februar 2018
Beiträge
5
Diamanten
300
Minecraft
GabiKleebi02
Das es die Serverperformance verschlechtert, wenn es für jeden Spieler einen Runnable gibt, ist noch nicht bemerkbar, da bisher nur wenige Spieler auf dem Server waren. Trotzdem werde ich es ändern, danke für den Hinweis.
Ich füge bei jedem Update alle Spieler neu hinzu, damit sich der Prefix ändert, wenn man eine andere Permission hat. Auch dies könnte man weniger Serverbelastend gestalten.
 

combo

Miner
Registriert
16 Juli 2012
Beiträge
175
Diamanten
0
Minecraft
combo5
Das klingt nach dem richtigen Ansatz.
Was deinen Fehler angeht, ich denke der liegt an dem ständigen hinzufügen aller Spieler in die Teams, irgendwas geht da schief, weil ja dann schließlich die Spieler mehrfach in einem Team sind.

Die NegativeArraySizeException kommt normalerweise wenn du versuchst ein Array mit einer negativen Größe zu erstellen.
 
Oben