Scoreboard Problem

Dieses Thema im Forum "Programmierung" wurde erstellt von Sn0wBlizz4rd, 1. April 2013.

  1. Sn0wBlizz4rd
    Offline

    Sn0wBlizz4rd

    Registriert seit:
    26. September 2012
    Beiträge:
    424
    Minecraft:
    Sn0wBlizz4rd
    Hey, ich code grade ein Scoreboard plugin.
    Jedoch habe ich ein Problem; Es funktioniert zwar alles,
    und der Score etc. wird rechts angezeigt, aber ich versuche
    nun die Werte rechts zu updaten. Mein Code ist folgender:

    Code (Text):
    1.     public void showScoreboard(final Player player) {
    2.         getServer().getScheduler().runTask(this, new Runnable() {
    3.         @Override
    4.         public void run() {
    5.         int k = getConfig().getInt(player.getName() + ".Kills");
    6.         int d = getConfig().getInt(player.getName() + ".Deaths");
    7.            
    8.         String name = "§c§lScore";
    9.          
    10.         Scoreboard sb = new Scoreboard();
    11.         sb.registerObjective(name, new ScoreboardBaseCriteria(name));
    12.          
    13.         Packet206SetScoreboardObjective packet = new Packet206SetScoreboardObjective(sb.getObjective(name), 0);
    14.         Packet208SetScoreboardDisplayObjective display = new Packet208SetScoreboardDisplayObjective(1, sb.getObjective(name));
    15.          
    16.         sendPacket(player, packet);
    17.         sendPacket(player, display);
    18.          
    19.         ScoreboardScore scoreItem1 = sb.getPlayerScoreForObjective("§7Kills§r", sb.getObjective(name));
    20.         ScoreboardScore scoreItem2 = sb.getPlayerScoreForObjective("§7Deaths§r", sb.getObjective(name));
    21.         scoreItem1.setScore(k);
    22.         scoreItem2.setScore(d);
    23.          
    24.         Packet207SetScoreboardScore pScoreItem1 = new Packet207SetScoreboardScore(scoreItem1, 0);
    25.         Packet207SetScoreboardScore pScoreItem2 = new Packet207SetScoreboardScore(scoreItem2, 0);
    26.         sendPacket(player, pScoreItem1);
    27.         sendPacket(player, pScoreItem2);
    28.          
    29.         }
    30.          
    31.         });
    32.         }
    33.    
    34.     public static void sendPacket(Player player, Packet packet) {
    35.         ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
    36.     }
    Wenn ich einfach versuche, die Packets neu zu senden, erhalte ich eine NullPointerException.
    Deswegen bitte ich um eure Hilfe.

    PS: Mir ist aufgefallen, wenn man vom Server geht, wird das Scoreboard von diesem
    Spieler entfernt, also wäre es warscheinlich die beste Lösung dies ausnutzen(Scoreboard
    löschen, dann neu erstellen) - nur wie das geht, weiß ich nicht so recht.

    Danke im Voraus, Cubos.
     
    #1
  2. games6471
    Online

    games6471

    Das Scoreboard entfernt sich automatisch, da es nirgends speicherst sondern nur mit Packeten arbeitest.

    Außerdem wäre es hilfreich die Exception ebenfalls zu posten, um damit eine schnelle Fehlerfindung zu profitieren.
     
    #2
  3. Sn0wBlizz4rd
    Offline

    Sn0wBlizz4rd

    Registriert seit:
    26. September 2012
    Beiträge:
    424
    Minecraft:
    Sn0wBlizz4rd
    Sorry, aber ich versteh dich nicht. Kannst du deinen Satz noch mal auf Rechtschreibung prüfen? Danke ;)
     
    #3
  4. games6471
    Online

    games6471

    Entschuldigung, ich war mobile online und dort ist das Schreiben nicht wirklich leicht. Ich ändere diesen mal ab.
     
    #4
  5. Sn0wBlizz4rd
    Offline

    Sn0wBlizz4rd

    Registriert seit:
    26. September 2012
    Beiträge:
    424
    Minecraft:
    Sn0wBlizz4rd
    Wie gesagt kriege ich eine Java-NullPointerException, falls du den Fehlercode willst, oder den Code den ich versucht habe um die Packets zu updaten (Ich habe den gleichen Code genommen wie oben!), sag bescheid :) Ich poste ihn dann gleich hier.
     
    #5
  6. games6471
    Online

    games6471

    Ja genau zeig mal Beides.
     
    #6
  7. Sn0wBlizz4rd
    Offline

    Sn0wBlizz4rd

    Registriert seit:
    26. September 2012
    Beiträge:
    424
    Minecraft:
    Sn0wBlizz4rd
    Also:
    Code zum Updaten:

    Code (Text):
    1. public void updateScoreboard(Player player) {
    2.         int k = getConfig().getInt(player.getName() + ".Kills");
    3.         int d = getConfig().getInt(player.getName() + ".Deaths");
    4.         String name = "§c§lStats";
    5.         Scoreboard sb = new Scoreboard();
    6.         ScoreboardScore scoreItem1 = sb.getPlayerScoreForObjective("§7Kills§r", sb.getObjective(name));
    7.         ScoreboardScore scoreItem2 = sb.getPlayerScoreForObjective("§7Tode§r", sb.getObjective(name));
    8.         scoreItem1.setScore(k);
    9.         scoreItem2.setScore(d);
    10.         Packet207SetScoreboardScore pScoreItem1 = new Packet207SetScoreboardScore(scoreItem1, 0);
    11.         Packet207SetScoreboardScore pScoreItem2 = new Packet207SetScoreboardScore(scoreItem2, 0);
    12.         sendPacket(player, pScoreItem1);
    13.         sendPacket(player, pScoreItem2);
    14.     }


    Und das ist die Fehlermeldung wenn geupdatet wird:
    Code (Text):
    1.  
    2. 2013-04-01 16:57:43 [SEVERE] Could not pass event PlayerDeathEvent to SkelsisKills v1.0
    3. org.bukkit.event.EventException
    4.     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
    5.     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    6.     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
    7.     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
    8.     at org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:335)
    9.     at net.minecraft.server.v1_5_R2.EntityPlayer.die(EntityPlayer.java:285)
    10.     at org.bukkit.craftbukkit.v1_5_R2.entity.CraftLivingEntity.setHealth(CraftLivingEntity.java:77)
    11.     at org.bukkit.command.defaults.KillCommand.execute(KillCommand.java:33)
    12.     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:188)
    13.     at org.bukkit.craftbukkit.v1_5_R2.CraftServer.dispatchCommand(CraftServer.java:523)
    14.     at net.minecraft.server.v1_5_R2.PlayerConnection.handleCommand(PlayerConnection.java:966)
    15.     at net.minecraft.server.v1_5_R2.PlayerConnection.chat(PlayerConnection.java:884)
    16.     at net.minecraft.server.v1_5_R2.PlayerConnection.a(PlayerConnection.java:841)
    17.     at net.minecraft.server.v1_5_R2.Packet3Chat.handle(Packet3Chat.java:44)
    18.     at net.minecraft.server.v1_5_R2.NetworkManager.b(NetworkManager.java:292)
    19.     at net.minecraft.server.v1_5_R2.PlayerConnection.d(PlayerConnection.java:110)
    20.     at net.minecraft.server.v1_5_R2.ServerConnection.b(SourceFile:35)
    21.     at net.minecraft.server.v1_5_R2.DedicatedServerConnection.b(SourceFile:30)
    22.     at net.minecraft.server.v1_5_R2.MinecraftServer.r(MinecraftServer.java:578)
    23.     at net.minecraft.server.v1_5_R2.DedicatedServer.r(DedicatedServer.java:225)
    24.     at net.minecraft.server.v1_5_R2.MinecraftServer.q(MinecraftServer.java:474)
    25.     at net.minecraft.server.v1_5_R2.MinecraftServer.run(MinecraftServer.java:407)
    26.     at net.minecraft.server.v1_5_R2.ThreadServerApplication.run(SourceFile:573)
    27. Caused by: java.lang.NullPointerException
    28.     at net.minecraft.server.v1_5_R2.Packet207SetScoreboardScore.<init>(SourceFile:25)
    29.     at de.Sn0wBlizz4rd.SkelsisKills.SkelsisKills.updateScoreboard(SkelsisKills.java:77)
    30.     at de.Sn0wBlizz4rd.SkelsisKills.SkelsisKills.onDeath(SkelsisKills.java:64)
    31.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    32.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    33.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    34.     at java.lang.reflect.Method.invoke(Unknown Source)
    35.     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
    36.     ... 22 more
    37.  

    PS: Die void updateScoreboard() wird beim PlayerDeathEvent aufgerufen.
    PPS: Wenn ich den gleichen Code aufrufe den ich beim JoinEvent Aufrufe(Der Code der oben steht, beim ersten Kommentar!),
    schmiert Minecraft ab. Da gibt's dann nur ne Error Meldung von wegen Fehler in Welten Ticks.
    Siehe hier:
    Code (Text):
    1. Minecraft has stopped running because it encountered a problem; Exception in world tick
    2.  
    Und nochmal die Minecraft-Error Log:
    http://pastebin.com/NmLWbcMQ
     
    #7
  8. games6471
    Online

    games6471

    Dein Fehler lag daran, dass du ein komplett neues Scoreboard Objekt instanziert hast. Dort gibt es noch nicht die Komponenten, die du vorher wahrscheinlich beim Joinen registriert hast.
     
    #8
  9. Sn0wBlizz4rd
    Offline

    Sn0wBlizz4rd

    Registriert seit:
    26. September 2012
    Beiträge:
    424
    Minecraft:
    Sn0wBlizz4rd
    Jop, das wars! Danke für deine Hilfe, habs hinbekommen! ;)
     
    #9