Scoreboard (Kopf&Seite)

Dieses Thema im Forum "Programmierung" wurde erstellt von Plugin00, 25. Juni 2013.

  1. Plugin00
    Offline

    Plugin00

    Registriert seit:
    3. Februar 2013
    Beiträge:
    71
    Hallo,

    Ich habe "2" Fragen,

    Zum Scoreboard,

    Einmal das Scoreboard an der Seite,

    Ich wollte es gerne so machen: String name = "§aStats §6 | §8PvP"; | Aber dann kommt 18-16 oder so. Nur wie kann ich machen das es mehr als 16 Sind?

    Und dann noch mal das Scoreboard übern Kopf,

    Code:
    Code (Text):
    1.  
    2.     Bukkit.getServer().getScheduler()
    3.             .scheduleSyncRepeatingTask(this, new Runnable() {
    4.                 public void run() {
    5.                     for (Player p : Bukkit.getOnlinePlayers()) {
    6.                         ScoreboardManager manager = Bukkit.getScoreboardManager();
    7.                         Scoreboard board = manager.getNewScoreboard();
    8.                         Objective objective = board.registerNewObjective("showhealth", "health");
    9.                         objective.setDisplaySlot(DisplaySlot.BELOW_NAME);
    10.                        
    11.                         objective.setDisplayName("/20");
    12.                                                 p.setScoreboard(board);    
    13.                     }
    14.                 }
    15.             }, 0L, 20 * 2);
    Nur über Kopf kommt, nur 0/20.. Auch wenn man ein "haut",
     
    #1
  2. games6471
    Online

    games6471

    Der Objective name darf nur weniger als 16 Zeichen lang sein. Der Displayname darf bis zu 32 Zeichen lang sein.
    Einfach über setDisplayName() abändern.

    Du musst einmal das Leben mit p.setHealth(p.getHealth) setzen. Danach funktionierts einwandfrei.
     
    #2
  3. Plugin00
    Offline

    Plugin00

    Registriert seit:
    3. Februar 2013
    Beiträge:
    71
    Code Update:
    Code (Text):
    1.     Bukkit.getServer().getScheduler()
    2.             .scheduleSyncRepeatingTask(this, new Runnable() {
    3.                 public void run() {
    4.                     for (Player p : Bukkit.getOnlinePlayers()) {
    5.                         ScoreboardManager manager = Bukkit.getScoreboardManager();
    6.                         Scoreboard board = manager.getNewScoreboard();
    7.                         Objective objective = board.registerNewObjective("showhealth", "health");
    8.                         objective.setDisplaySlot(DisplaySlot.BELOW_NAME);
    9.                        
    10.                         objective.setDisplayName("/20");
    11.                                                 p.setHealth(p.getHealth());
    12.                                                 p.setScoreboard(board);    
    13.                     }
    14.                 }
    15.             }, 0L, 20 * 2);
    Habe es gemacht, geht immer noch nicht ^^
     
    #3
  4. games6471
    Online

    games6471

    Es muss nach setScoreboard() gesetzt werden.
     
    #4
  5. Plugin00
    Offline

    Plugin00

    Registriert seit:
    3. Februar 2013
    Beiträge:
    71
    So ok es geht, ^^
    Nur ein Fehler kommt noch, Wenn man ein "haut" und er hatt dann wieder 20 Herzen, Hat er dann da stehen "0 / 20"..
     
    #5
  6. games6471
    Online

    games6471

    Also zwei Sachen. Erstens flackert das Scoreboard. Das lässt sich aber lösen indem du das Scoreboard nur setzt, wenn es nicht existiert. (Updaten macht es schon von alleine). Dies würde auch dein Problem lösen. Jedoch gäbe es dann noch ein weiteres Problem, nämlich habe ich auch herausgefunden, dass 0 / 20 beim neu Joinen auftritt, wenn nicht setHealth() bei den anderen Spielern ausgeführt wird.

    Lass aber diese Aufgabe möglichst nicht asychron laufen.
     
    #6
  7. Plugin00
    Offline

    Plugin00

    Registriert seit:
    3. Februar 2013
    Beiträge:
    71
    Erst mal Danke, Habe es übern Kopf bissen besser hin bekommen,

    Aber ich bekomme es nicht hin mit den Namen das er Länger ist als 16 Zeichen.. :/

    Code (Text):
    1.     public static void erstellen(Player pl, int kill, int death, int bal) {
    2.         String name = "§a"+pl.getName()+" §2Fight!";
    3.        
    4.         Scoreboard sb = new Scoreboard();
    5.         sb.registerObjective(name, new ScoreboardBaseCriteria(name));
    6.        
    7.         Packet206SetScoreboardObjective packet = new Packet206SetScoreboardObjective(sb.getObjective(name), 0);
    8.         Packet208SetScoreboardDisplayObjective display = new Packet208SetScoreboardDisplayObjective(1, sb.getObjective(name));
    9.        
    10.         ((CraftPlayer)pl).getHandle().playerConnection.sendPacket(packet);
    11.         ((CraftPlayer)pl).getHandle().playerConnection.sendPacket(display);
    12.        
    13.         ScoreboardScore balances = sb.getPlayerScoreForObjective("§7Geld", sb.getObjective(name));
    14.         balances.setScore(bal);
    15.        
    16.         Packet207SetScoreboardScore balance = new Packet207SetScoreboardScore(balances, 0);
    17.        
    18.         ((CraftPlayer)pl).getHandle().playerConnection.sendPacket(balance);
    19.       }
    Ich teste und Test ich bekomme es nicht so hin, ;/
    Und mit der API. bekomme ich es auch nicht so richtig hin..
     
    #7
  8. games6471
    Online

    games6471

    Du registrierst auch schon wieder ein Objective, wo der Objektname länger als 16 Zeichen ist. Es darf aber nur der Displayname länger als 16 Zeichen lang sein.
     
    #8