ServerPlugin PlayerScoreboard - API

Dieses Thema im Forum "Programmierung" wurde erstellt von delta242, 16. Juni 2013.

  1. delta242
    Offline

    delta242

    Registriert seit:
    28. Mai 2012
    Beiträge:
    90
    Hey,

    um ein wenig Ordnung in meine Scoreboard Implementierungen zu stecken, habe ich eine Klasse mit dem Name PlayerScoreboard erstellt, mit der man recht einfach Scoreboards verwalten kann.
    In diesem Thema möchte ich sie einfach nur vorstellen, falls also die Kathegorie nicht passen sollte und das ganze in "Selbstgeschriebene Plugins" eingetraggen sein sollte, wär es nett wenn ein Mod/Admin das Thema einfach moven könnte, oder mir bescheid sagt, sodass ich es selber neu schreiben kann. Doch da es ja eigentlich kein eigenes Plugin, sondern nur eine Klasse ist, lass ich es erst mal in "Programmierung".

    So, jetzt zur Klasse:
    Um sie zu nutzen, einfach kurz die folgenden Schritte durchgehen:
    1. Neue Klasse erstellen mit dem Namen PlayerScoreboard
    2. Alles bis auf die Package Declaration löschen
    3. Folgenden Code darunter einfügen:
    Code (Text):
    1. import java.util.HashMap;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.entity.Player;
    5. import org.bukkit.scoreboard.DisplaySlot;
    6. import org.bukkit.scoreboard.Objective;
    7. import org.bukkit.scoreboard.Score;
    8. import org.bukkit.scoreboard.Scoreboard;
    9.  
    10. public class PlayerScoreboard {
    11.    
    12.     private static HashMap<Player, PlayerScoreboard> players = new HashMap<>();
    13.    
    14.     private Player     player;
    15.     private Scoreboard scoreboard;
    16.     private Objective  objective;
    17.     private String     displayname;
    18.    
    19.     public static void addPlayer(Player player) {
    20.         players.put(player, new PlayerScoreboard(player));
    21.     }
    22.     public static void removePlayer(Player player) {
    23.         if (players.containsKey(player))
    24.             players.remove(player);
    25.     }
    26.     public static PlayerScoreboard getPlayerScoreboard(Player player) {
    27.         if (players.containsKey(player)) return players.get(player);
    28.         return null;
    29.     }
    30.     private PlayerScoreboard(Player player) {
    31.         this.player = player;
    32.         this.displayname = "Scoreboard";
    33.        
    34.         this.resetScoreboard();
    35.     }
    36.    
    37.     public void setScore(String name, int points) {
    38.         Score score = objective.getScore(Bukkit.getOfflinePlayer(name));
    39.         score.setScore(points);
    40.     }
    41.    
    42.     public int getScore(String name) {
    43.         return objective.getScore(Bukkit.getOfflinePlayer(name)).getScore();
    44.     }
    45.    
    46.     public void sendScoreboard() {
    47.         player.setScoreboard(scoreboard);
    48.     }
    49.     public void setDisplayName(String displayname) {
    50.         if (displayname.length() > 32) displayname = displayname.substring(0, 32);
    51.         this.displayname = displayname;
    52.         objective.setDisplayName(this.displayname);
    53.     }
    54.     public void resetScoreboard() {
    55.         this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
    56.        
    57.         objective = scoreboard.registerNewObjective(this.displayname, "dummy");
    58.         objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    59.         objective.setDisplayName(this.displayname);
    60.     }
    61. }
    4. Jetzt kann man die Klasse nutzen, hier ein kleines Beispiel:
    Der Spieler soll bei jedem Tod im Scoreboard 1 Tod mehr angezeigt bekommen. Dazu ins PlayerJoinEvent folgendes einfügen:

    Code (Text):
    1. PlayerScoreboard.addPlayer(event.getPlayer()); //Ein Scoreboard für den Spieler hinzufügen
    2. PlayerScoreboard.getPlayerScoreboard(event.getPlayer()).setDisplayName("Stats"); //Den Display-Name des Scoreboard festlegen, kann natürlich auch was anderes sein
    3. PlayerScoreboard.getPlayerScoreboard(event.getPlayer()).setScore("Tode:", 0); //Die Score heißt hier einfach Tode
    4. PlayerScoreboard.getPlayerScoreboard(event.getPlayer()).sendScoreboard(); //Scoreboard senden
    Der Spieler bekommt ein Scoreboard mit dem Titel "Stats" und der Score "Tode" welche 0 ist.
    Jetzt in das PlayerDeathEvent folgedes implementieren:

    Code (Text):
    1. PlayerScoreboard.getPlayerScoreboard(event.getPlayer()).setScore("Tode", PlayerScoreboard.getPlayerScoreboard(event.getPlayer()).getScore("Tode") + 1);
    Und damit ist ein sehr einfaches Scoreboard schon fertig. Das zählt jetzt natürlich nur solange der Spieler online ist und beim neu joinen wird das ganze neu gesetzt. Das müsste man dann eben mit einem externen Stats-Plugin regeln, aber das ist euch überlassen.

    Scoreboard entfernen:
    Code (Text):
    1. PlayerScoreboard.getPlayerScoreboard(player).resetScoreboard(); //Resettet das Scoreboard
    2. PlayerScoreboard.getPlayerScoreboard(player).sendScoreboard(); //Sendet ein leeres Scoreboard
    Hoffe ich kann damit manchen weiterhelfen
    Grüße
    delta242
     
    #1
  2. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Danke, sieht gut aus :)

    Werde mal schauen ob sich da nicht irg.eine Idee findet die genau sowas benötigt ^^
     
    #2