Explorar el Código

rebuild scoreboard manager, add scoreboard style configuration options

RedstoneFuture hace 3 años
padre
commit
d1f805cb85

+ 50 - 63
missilewars-plugin/src/main/java/de/butzlabben/missilewars/Config.java

@@ -28,7 +28,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
+import java.util.List;
 
 import static org.bukkit.Material.JUKEBOX;
 import static org.bukkit.Material.valueOf;
@@ -128,6 +128,10 @@ public class Config {
         cfg.addDefault("mysql.fightmember_table", "mw_fightmember");
 
         cfg.addDefault("sidebar.title", "§eInfo ●§6•");
+        cfg.addDefault("sidebar.member_list_style", "%team_color%%playername%");
+        cfg.addDefault("sidebar.member_list_max", "4");
+
+        //TODO generate list
         if (configNew) {
             cfg.addDefault("sidebar.entries.6", "§7Time left:");
             cfg.addDefault("sidebar.entries.5", "§e» %time%m");
@@ -149,13 +153,9 @@ public class Config {
         }
     }
 
-    public static HashMap<String, Integer> getScoreboardEntries() {
-        HashMap<String, Integer> ret = new HashMap<>();
-        ConfigurationSection section = cfg.getConfigurationSection("sidebar.entries");
-        for (String s : section.getKeys(false)) {
-            ret.put(section.getString(s), Integer.valueOf(s));
-        }
-        return ret;
+    public static List<String> getScoreboardEntries() {
+        List<String> scoreboardLines = cfg.getStringList("sidebar.entries");
+        return scoreboardLines;
     }
 
     /**
@@ -195,103 +195,90 @@ public class Config {
         return cfg;
     }
 
-    public static String motdEnded() {
-        return cfg.getString("motd.ended");
+    static boolean debug() {
+        return cfg.getBoolean("debug");
     }
 
-    public static String motdGame() {
-        return cfg.getString("motd.ingame");
+    public static boolean isSetup() {
+        return cfg.getBoolean("setup_mode");
     }
 
-    public static String motdLobby() {
-        return cfg.getString("motd.lobby");
+    public static boolean isContactAuth() {
+        return cfg.getBoolean("contact_auth_server");
+    }
+    public static boolean isPrefetchPlayers() {
+        return cfg.getBoolean("prefetch_players");
     }
 
-    public static boolean motdEnabled() {
-        return cfg.getBoolean("motd.enable");
+    public static int getFightRestart() {
+        return cfg.getInt("restart_after_fights");
+    }
+
+    public static String getArenaFolder() {
+        return cfg.getString("arena_folder") + "/";
+    }
+
+    public static boolean isMultipleLobbies() {
+        return cfg.getBoolean("lobbies.multiple_lobbies");
+    }
+    public static String getLobbiesFolder() {
+        return cfg.getString("lobbies.folder") + "/";
+    }
+    public static String getDefaultLobby() {
+        return cfg.getString("lobbies.default_lobby");
     }
 
     public static int getReplaceTicks() {
         return cfg.getInt("replace.after_ticks");
     }
-
     public static int getReplaceRadius() {
         return cfg.getInt("replace.radius");
     }
 
-    static boolean debug() {
-        return cfg.getBoolean("debug");
+    public static String motdEnded() {
+        return cfg.getString("motd.ended");
     }
-
-    public static boolean isSetup() {
-        return cfg.getBoolean("setup_mode");
+    public static String motdGame() {
+        return cfg.getString("motd.ingame");
     }
-
-    public static int getFightRestart() {
-        return cfg.getInt("restart_after_fights");
+    public static String motdLobby() {
+        return cfg.getString("motd.lobby");
+    }
+    public static boolean motdEnabled() {
+        return cfg.getBoolean("motd.enable");
     }
 
-    public static String getScoreboardTitle() {
-        return cfg.getString("sidebar.title");
+    public static boolean isFightStatsEnabled() {
+        return cfg.getBoolean("fightstats.enable");
+    }
+    public static boolean isShowRealSkins() {
+        return cfg.getBoolean("fightstats.show_real_skins");
     }
 
     public static String getHost() {
         return cfg.getString("mysql.host");
     }
-
     public static String getDatabase() {
         return cfg.getString("mysql.database");
     }
-
     public static String getPort() {
         return cfg.getString("mysql.port");
     }
-
     public static String getUser() {
         return cfg.getString("mysql.user");
     }
-
     public static String getPassword() {
         return cfg.getString("mysql.password");
     }
-
     public static String getFightsTable() {
         return cfg.getString("mysql.fights_table");
     }
-
     public static String getFightMembersTable() {
         return cfg.getString("mysql.fightmember_table");
     }
 
-    public static String getArenaFolder() {
-        return cfg.getString("arena_folder") + "/";
-    }
-
-    public static boolean isContactAuth() {
-        return cfg.getBoolean("contact_auth_server");
-    }
+    public static String getScoreboardTitle() {return cfg.getString("sidebar.title");}
+    public static String getScoreboardMembersStyle() {return cfg.getString("sidebar.member_list_style");}
+    public static int getScoreboardMembersMax() {return cfg.getInt("sidebar.member_list_max");}
 
-    public static boolean isPrefetchPlayers() {
-        return cfg.getBoolean("prefetch_players");
-    }
-
-    public static boolean isShowRealSkins() {
-        return cfg.getBoolean("fightstats.show_real_skins");
-    }
-
-    public static boolean isMultipleLobbies() {
-        return cfg.getBoolean("lobbies.multiple_lobbies");
-    }
-
-    public static String getLobbiesFolder() {
-        return cfg.getString("lobbies.folder") + "/";
-    }
-
-    public static String getDefaultLobby() {
-        return cfg.getString("lobbies.default_lobby");
-    }
-
-    public static boolean isFightStatsEnabled() {
-        return cfg.getBoolean("fightstats.enable");
-    }
 }

+ 1 - 3
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -135,7 +135,7 @@ public class Game {
         team1 = new Team(lobby.getTeam1Name(), lobby.getTeam1Color(), this);
         team2 = new Team(lobby.getTeam2Name(), lobby.getTeam2Color(), this);
 
-        scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
+        scoreboardManager = new ScoreboardManager(team1, team2, arena.getDisplayName(), getTimer());
 
         org.bukkit.scoreboard.Team t = scoreboard.getTeam("0" + team1.getFullname());
         if (t != null)
@@ -161,8 +161,6 @@ public class Game {
 
         VersionUtil.setScoreboardTeamColor(t, ChatColor.GRAY);
 
-        scoreboardManager = new ScoreboardManager(this, scoreboard);
-
         Logger.DEBUG.log("Registering, teleporting, etc. all players");
 
         for (Player all : Bukkit.getOnlinePlayers()) {

+ 92 - 23
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/ScoreboardManager.java

@@ -19,9 +19,11 @@
 package de.butzlabben.missilewars.util;
 
 import de.butzlabben.missilewars.Config;
-import de.butzlabben.missilewars.game.Game;
-import java.util.HashMap;
+import de.butzlabben.missilewars.game.timer.Timer;
+import de.butzlabben.missilewars.wrapper.game.Team;
+import de.butzlabben.missilewars.wrapper.player.MWPlayer;
 import lombok.RequiredArgsConstructor;
+import org.bukkit.Bukkit;
 import org.bukkit.scoreboard.DisplaySlot;
 import org.bukkit.scoreboard.Objective;
 import org.bukkit.scoreboard.Scoreboard;
@@ -29,21 +31,69 @@ import org.bukkit.scoreboard.Scoreboard;
 @RequiredArgsConstructor
 public class ScoreboardManager {
 
-    private final Game game;
-    private final Scoreboard board;
+    private Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard();
+
+    private final Team team1;
+    private final Team team2;
+    private final String arenaDisplayName;
+    private final Timer gameTimer;
+
+    // get config options
+    String scoreBoardTitle = Config.getScoreboardTitle();
+    String memberListStyle = Config.getScoreboardMembersStyle();
+    int memberListMaxSize = Config.getScoreboardMembersMax();
 
     public void updateInGameScoreboard() {
         removeScoreboard();
 
         Objective obj = board.registerNewObjective("Info", "dummy");
         obj.setDisplaySlot(DisplaySlot.SIDEBAR);
-        obj.setDisplayName(Config.getScoreboardTitle());
+        obj.setDisplayName(scoreBoardTitle);
+
+        for (String cleanLine : Config.getScoreboardEntries()) {
+            int i = 1;
+            String replacedLine;
+
+            if (cleanLine.contains("%team1_members%") || cleanLine.contains("%team2_members%")) {
+
+                // team member list
+                Team placeholderTeam;
+
+                // set the current placeholder team
+                if (cleanLine.contains("%team1_members%")) {
+                    placeholderTeam = team1;
+                } else {
+                    placeholderTeam = team2;
+                }
+
+                int players = 0;
+
+                for (MWPlayer player : placeholderTeam.getMembers()) {
+
+                    // limit check
+                    if (players >= memberListMaxSize) {
+                        break;
+                    }
+
+                    String playerName = player.getPlayer().getName();
+                    String teamColor = placeholderTeam.getColor();
+
+                    replacedLine = memberListStyle.replace("%playername%", playerName)
+                            .replace("%team_color%", teamColor);
+                    setScoreBoardLine(obj, replacedLine, i);
 
-        HashMap<String, Integer> entries = Config.getScoreboardEntries();
+                    players++;
+                    i++;
+                }
 
-        for (String entry : entries.keySet()) {
-            String s = rep(entry);
-            obj.getScore(s).setScore(entries.get(entry));
+            } else {
+
+                // normal placeholders
+                replacedLine = replaceScoreboardPlaceholders(cleanLine);
+                setScoreBoardLine(obj, replacedLine, i);
+
+                i++;
+            }
         }
     }
 
@@ -53,24 +103,43 @@ public class ScoreboardManager {
             old.unregister();
     }
 
-    private String rep(String entry) {
-        return replaceTeam1(replaceTeam2(replaceTime(entry)));
-    }
+    /**
+     * This method replaces the placeholders with the current value.
+     * @param text (String) the original config String
+     * @return the replaced text as String
+     */
+    private String replaceScoreboardPlaceholders(String text) {
 
+        String time = "" + Integer.toString(gameTimer.getSeconds() / 60);
 
-    private String replaceTeam2(String str) {
-        return str.replace("%team2%", game.getTeam2().getFullname())
-                .replace("%team2_amount%", "" + game.getTeam2().getMembers().size())
-                .replace("%team2_color%", game.getTeam2().getColorCode());
-    }
 
-    private String replaceTeam1(String str) {
-        return str.replace("%team1%", game.getTeam1().getFullname())
-                .replace("%team1_amount%", "" + game.getTeam1().getMembers().size())
-                .replace("%team1_color%", game.getTeam1().getColorCode());
+        text.replace("%team1%", team1.getFullname());
+        text.replace("%team2%", team2.getFullname());
+
+        text.replace("%team1_color%", team1.getColor());
+        text.replace("%team2_color%", team2.getColor());
+
+        text.replace("%team1_amount%", Integer.toString(team1.getMembers().size()));
+        text.replace("%team2_amount%", Integer.toString(team2.getMembers().size()));
+
+        text.replace("%arena_name%", arenaDisplayName);
+
+        text.replace("%time%", time);
+
+        return text;
     }
 
-    private String replaceTime(String str) {
-        return str.replace("%time%", "" + game.getTimer().getSeconds() / 60);
+    /**
+     * This methode set the scoreboard line.
+     *
+     * @param scoreBoardObject the vanilla scoreboard object
+     * @param message the text line
+     * @param lineNr the target line number (= object "score")
+     */
+    private static void setScoreBoardLine(Objective scoreBoardObject, String message, int lineNr) {
+        // Get the "score object" (instead of a player with a text line)
+        // and set the scoreboard line number with the definition of his score.
+        scoreBoardObject.getScore(message).setScore(lineNr);
     }
+
 }