diff --git a/pom.xml b/pom.xml index ecb0f40..34f708b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,8 +3,9 @@ 4.0.0 pw.yumc MiaoBoard - 1.4.6 + 2.0 MiaoBoard + 喵式记分板 ${project.name} diff --git a/src/main/java/pw/yumc/MiaoBoard/MiaoBoard.java b/src/main/java/pw/yumc/MiaoBoard/MiaoBoard.java index 9122531..bc27450 100644 --- a/src/main/java/pw/yumc/MiaoBoard/MiaoBoard.java +++ b/src/main/java/pw/yumc/MiaoBoard/MiaoBoard.java @@ -5,14 +5,13 @@ import org.bukkit.plugin.java.JavaPlugin; import pw.yumc.MiaoBoard.listener.PlayerListener; import pw.yumc.MiaoBoard.misc.Checker; import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; +import pw.yumc.YumCore.bukkit.Log; import pw.yumc.YumCore.commands.CommandArgument; import pw.yumc.YumCore.commands.CommandExecutor; import pw.yumc.YumCore.commands.CommandManager; import pw.yumc.YumCore.commands.annotation.Cmd; import pw.yumc.YumCore.commands.annotation.Help; import pw.yumc.YumCore.commands.annotation.Sort; -import pw.yumc.YumCore.statistic.Statistics; -import pw.yumc.YumCore.update.SubscribeTask; /** * 喵式记分板主类 @@ -21,46 +20,49 @@ import pw.yumc.YumCore.update.SubscribeTask; * @author 喵♂呜 */ public class MiaoBoard extends JavaPlugin implements CommandExecutor { + private ScoreBoardManager scoreBoardManager; - @Cmd() + public ScoreBoardManager getScoreBoardManager() { + return scoreBoardManager; + } + + @Cmd(permission = "mb.toggle") @Help("关闭记分板") @Sort(2) public void off(final CommandArgument e) { Checker.offList.add(e.getSender().getName()); - e.getSender().sendMessage("§c记分板已关闭!"); + Log.toSender(e.getSender(), "§c记分板已关闭!"); } - @Cmd() + @Cmd(permission = "mb.toggle") @Help("打开记分板") @Sort(1) public void on(final CommandArgument e) { Checker.offList.remove(e.getSender().getName()); - e.getSender().sendMessage("§a记分板已打开!"); + Log.toSender(e.getSender(), "§a记分板已打开!"); } @Override public void onDisable() { - ScoreBoardManager.getSidebarBoard().cancel(); + scoreBoardManager.getSidebarBoard().cancel(); } @Override public void onEnable() { - ScoreBoardManager.start(); + scoreBoardManager.start(); new CommandManager("mb").register(this); new PlayerListener(); - new Statistics(); - new SubscribeTask(true, true); } @Override public void onLoad() { - ScoreBoardManager.load(); + scoreBoardManager = new ScoreBoardManager(); } @Cmd(permission = "mb.reload") @Help("重新载入配置文件") public void reload(final CommandArgument e) { - ScoreBoardManager.reload(); - e.getSender().sendMessage("§a配置重载完毕!"); + scoreBoardManager.reload(); + Log.toSender(e.getSender(), "§a配置重载完毕!"); } } diff --git a/src/main/java/pw/yumc/MiaoBoard/config/MiaoBoardConfig.java b/src/main/java/pw/yumc/MiaoBoard/config/MiaoBoardConfig.java index b677bbd..a5abf34 100644 --- a/src/main/java/pw/yumc/MiaoBoard/config/MiaoBoardConfig.java +++ b/src/main/java/pw/yumc/MiaoBoard/config/MiaoBoardConfig.java @@ -1,20 +1,20 @@ package pw.yumc.MiaoBoard.config; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import cn.citycraft.PluginHelper.config.InjectConfig; +import pw.yumc.YumCore.config.InjectConfig; /** * 记分板配置文件类 - * + * * @since 2016年7月21日 下午5:21:13 * @author 喵♂呜 */ public class MiaoBoardConfig extends InjectConfig { - public static Integer UpdateTime; - public static List DisableWorld = new ArrayList<>(); - public transient static MiaoBoardConfig instance = new MiaoBoardConfig();; + public transient static MiaoBoardConfig instance = new MiaoBoardConfig(); + private Integer UpdateTime; + private List DisableWorld; public static MiaoBoardConfig i() { return instance; @@ -23,4 +23,15 @@ public class MiaoBoardConfig extends InjectConfig { public static void reInject() { instance.reload(); } + + public List getDisableWorld() { + if (DisableWorld == null) { + DisableWorld = Collections.emptyList(); + } + return DisableWorld; + } + + public Integer getUpdateTime() { + return UpdateTime; + } } diff --git a/src/main/java/pw/yumc/MiaoBoard/listener/PlayerListener.java b/src/main/java/pw/yumc/MiaoBoard/listener/PlayerListener.java index 11cbc8b..31796f4 100644 --- a/src/main/java/pw/yumc/MiaoBoard/listener/PlayerListener.java +++ b/src/main/java/pw/yumc/MiaoBoard/listener/PlayerListener.java @@ -7,9 +7,11 @@ import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import pw.yumc.MiaoBoard.MiaoBoard; import pw.yumc.MiaoBoard.config.MiaoBoardConfig; -import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; import pw.yumc.YumCore.bukkit.P; +import pw.yumc.YumCore.statistic.Statistics; +import pw.yumc.YumCore.update.SubscribeTask; /** * 玩家监听 @@ -18,28 +20,30 @@ import pw.yumc.YumCore.bukkit.P; * @author 喵♂呜 */ public class PlayerListener implements Listener { + MiaoBoard plugin = P.getPlugin(); + public PlayerListener() { - Bukkit.getPluginManager().registerEvents(this, P.instance); + Bukkit.getPluginManager().registerEvents(this, plugin); + new Statistics(); + new SubscribeTask(true, true); } @EventHandler public void onPlayerChangeWorld(final PlayerChangedWorldEvent e) { - if (MiaoBoardConfig.DisableWorld.contains(e.getPlayer().getWorld().getName())) { - ScoreBoardManager.getSidebarBoard().removeTarget(e.getPlayer()); + if (MiaoBoardConfig.i().getDisableWorld().contains(e.getPlayer().getWorld().getName())) { + plugin.getScoreBoardManager().getSidebarBoard().removeTarget(e.getPlayer()); } else { - ScoreBoardManager.getSidebarBoard().addTarget(e.getPlayer()); + plugin.getScoreBoardManager().getSidebarBoard().addTarget(e.getPlayer()); } } @EventHandler public void onPlayerJoin(final PlayerJoinEvent e) { - if (!MiaoBoardConfig.DisableWorld.contains(e.getPlayer().getWorld().getName())) { - ScoreBoardManager.getSidebarBoard().addTarget(e.getPlayer()); - } + plugin.getScoreBoardManager().addTarget(e.getPlayer()); } @EventHandler public void onPlayerQuit(final PlayerQuitEvent e) { - ScoreBoardManager.getSidebarBoard().removeTarget(e.getPlayer()); + plugin.getScoreBoardManager().getSidebarBoard().removeTarget(e.getPlayer()); } } diff --git a/src/main/java/pw/yumc/MiaoBoard/misc/Checker.java b/src/main/java/pw/yumc/MiaoBoard/misc/Checker.java index ad21d0f..e542774 100644 --- a/src/main/java/pw/yumc/MiaoBoard/misc/Checker.java +++ b/src/main/java/pw/yumc/MiaoBoard/misc/Checker.java @@ -16,6 +16,6 @@ public class Checker { public static boolean dataCheck(final BoardModel model) { final long now = System.currentTimeMillis(); - return model.time_start != null && model.time_start.getTime() <= now && model.time_end != null && now <= model.time_end.getTime(); + return (model.time_start == null || model.time_start.getTime() <= now) && (model.time_end == null || now <= model.time_end.getTime()); } } diff --git a/src/main/java/pw/yumc/MiaoBoard/misc/Replace.java b/src/main/java/pw/yumc/MiaoBoard/misc/Replace.java index cdf5d3f..3c285e0 100644 --- a/src/main/java/pw/yumc/MiaoBoard/misc/Replace.java +++ b/src/main/java/pw/yumc/MiaoBoard/misc/Replace.java @@ -4,9 +4,11 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import cn.citycraft.PluginHelper.kit.StrKit; @@ -15,12 +17,19 @@ import pw.yumc.YumCore.bukkit.P; import pw.yumc.YumCore.bukkit.compatible.C; public class Replace { + public static List $(final Player p, final List text) { + for (int i = 0; i < text.size(); i++) { + text.set(i, $(p, text.get(i))); + } + return text; + } + public static String $(final Player p, final String text) { return s(p(p, text)); } private static String p(final Player p, final String text) { - return SimpleRelpace.$(p, PluginAPI.PlaceholderAPI(p, text)); + return PluginAPI.PlaceholderAPI(p, SimpleRelpace.$(p, text)); } private static String s(final String text) { @@ -30,7 +39,6 @@ public class Replace { static class SimpleRelpace { private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("[%]([^%]+)[%]"); private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - private static final String EMPTY = ""; public static String $(final Player player, String text) { final Matcher m = PLACEHOLDER_PATTERN.matcher(text); @@ -38,7 +46,7 @@ public class Replace { final String format = m.group(1); if (format.contains("_")) { final String[] ka = format.split("_", 2); - String value = format; + String value = null; switch (ka[0]) { case "player": value = player(player, ka[1]); @@ -53,7 +61,9 @@ public class Replace { value = time(player, ka[1]); break; } - text = text.replace("%" + format + "%", Matcher.quoteReplacement(value)); + if (value != null) { + text = text.replace("%" + format + "%", Matcher.quoteReplacement(value)); + } } } return text; @@ -82,20 +92,20 @@ public class Replace { case "max_health": return String.valueOf(player.getMaxHealth()); default: - return EMPTY; + return String.format("%%player_%s%%", key); } } private static String plugin(final Player player, final String key) { switch (key) { case "version": - return P.getDescription().getVersion(); + return P.getDescription().getVersion().split("-")[0]; case "name": return P.getName(); case "author": return Arrays.toString(P.getDescription().getAuthors().toArray()); default: - return EMPTY; + return String.format("%%plugin_%s%%", key); } } @@ -104,6 +114,10 @@ public class Replace { switch (key) { case "online": return String.valueOf(C.Player.getOnlinePlayers().size()); + case "max": + return String.valueOf(Bukkit.getMaxPlayers()); + case "unique_joins": + return String.valueOf(Bukkit.getOfflinePlayers().length); case "ram_used": return String.valueOf((runtime.totalMemory() - runtime.freeMemory()) / 1048576L); case "ram_free": @@ -113,14 +127,14 @@ public class Replace { case "ram_max": return String.valueOf(runtime.maxMemory() / 1048576L); default: - return EMPTY; + return String.format("%%server_%s%%", key); } } private static String time(final Player player, final String key) { final Date date = new Date(); if (key.startsWith("left") && key.contains("_")) { - final String time = key.split("_")[1].replace("`", " "); + final String time = key.split("_")[1]; String value = "解析错误"; try { final long left = df.parse(time).getTime() - System.currentTimeMillis(); @@ -145,7 +159,7 @@ public class Replace { case "second": return String.valueOf(date.getSeconds()); } - return EMPTY; + return String.format("%%time_%s%%", key); } } } diff --git a/src/main/java/pw/yumc/MiaoBoard/model/BoardModel.java b/src/main/java/pw/yumc/MiaoBoard/model/BoardModel.java index 99a51de..c6f68aa 100644 --- a/src/main/java/pw/yumc/MiaoBoard/model/BoardModel.java +++ b/src/main/java/pw/yumc/MiaoBoard/model/BoardModel.java @@ -5,7 +5,9 @@ import java.util.List; import org.bukkit.configuration.ConfigurationSection; -import cn.citycraft.PluginHelper.config.InjectConfigurationSection; +import pw.yumc.YumCore.config.ConfigNode; +import pw.yumc.YumCore.config.InjectConfigurationSection; +import pw.yumc.YumCore.config.Nullable; /** * 记分板数据模型类 @@ -16,7 +18,11 @@ import cn.citycraft.PluginHelper.config.InjectConfigurationSection; public class BoardModel extends InjectConfigurationSection { public transient String name; public Integer index; + @Nullable + @ConfigNode("time.start") public Date time_start; + @Nullable + @ConfigNode("time.end") public Date time_end; public String title; public String permission; diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/ScoreBoardManager.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/ScoreBoardManager.java index 6d1429c..07c9dc2 100644 --- a/src/main/java/pw/yumc/MiaoBoard/scoreboard/ScoreBoardManager.java +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/ScoreBoardManager.java @@ -7,16 +7,16 @@ import java.util.List; import org.bukkit.entity.Player; -import cn.citycraft.PluginHelper.config.FileConfig; -import cn.citycraft.PluginHelper.scoreboard.BoardUpdateFunction; -import cn.citycraft.PluginHelper.scoreboard.Condition; -import cn.citycraft.PluginHelper.scoreboard.SidebarBoard; import pw.yumc.MiaoBoard.config.MiaoBoardConfig; import pw.yumc.MiaoBoard.model.BoardModel; +import pw.yumc.MiaoBoard.scoreboard.core.BoardUpdateFunction; +import pw.yumc.MiaoBoard.scoreboard.core.Condition; +import pw.yumc.MiaoBoard.scoreboard.core.SidebarBoard; import pw.yumc.MiaoBoard.scoreboard.updater.BodyUpdater; import pw.yumc.MiaoBoard.scoreboard.updater.TitleUpdater; import pw.yumc.YumCore.bukkit.P; import pw.yumc.YumCore.bukkit.compatible.C; +import pw.yumc.YumCore.config.FileConfig; /** * 记分板管理类 @@ -25,20 +25,30 @@ import pw.yumc.YumCore.bukkit.compatible.C; * @author 喵♂呜 */ public class ScoreBoardManager { - public static Status cot = new Status(); - public static SidebarBoard sbd = new SidebarBoard(P.instance, new BoardUpdateFunction(new TitleUpdater(), new BodyUpdater())); - public static FileConfig config = MiaoBoardConfig.i().getConfig();; - public static List bms = new LinkedList<>(); + public Status cot = new Status(); + public SidebarBoard sbd = new SidebarBoard(P.instance, new BoardUpdateFunction(new TitleUpdater(), new BodyUpdater())); + public FileConfig config = MiaoBoardConfig.i().getConfig(); + public List bms = new LinkedList<>(); - public static List getModels() { + public ScoreBoardManager() { + load(); + } + + public void addTarget(final Player player) { + if (!MiaoBoardConfig.i().getDisableWorld().contains(player.getWorld().getName())) { + getSidebarBoard().addTarget(player); + } + } + + public List getModels() { return bms; } - public static SidebarBoard getSidebarBoard() { + public SidebarBoard getSidebarBoard() { return sbd; } - public static void load() { + public void load() { bms.clear(); for (final String bmn : config.getConfigurationSection("Boards").getKeys(false)) { bms.add(new BoardModel(config.getConfigurationSection("Boards." + bmn)).setName(bmn)); @@ -46,28 +56,28 @@ public class ScoreBoardManager { Collections.sort(bms, new BoardComparator()); } - public static void reload() { + public void reload() { sbd.cancel(); MiaoBoardConfig.reInject(); load(); start(); } - public static void start() { - sbd.update(cot.set(true), MiaoBoardConfig.UpdateTime); + public void start() { + sbd.update(cot.set(true), MiaoBoardConfig.i().getUpdateTime()); for (final Player player : C.Player.getOnlinePlayers()) { - sbd.addTarget(player); + addTarget(player); } } - private static class BoardComparator implements Comparator { + private class BoardComparator implements Comparator { @Override public int compare(final BoardModel o1, final BoardModel o2) { return o1.index.compareTo(o2.index); } } - private static class Status implements Condition { + private class Status implements Condition { private boolean status = true; @Override diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Board.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Board.java new file mode 100644 index 0000000..cbf7b36 --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Board.java @@ -0,0 +1,122 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +/** + * + * @since 2016年7月4日 下午4:40:21 + * @author 尘曲 + */ +public abstract class Board implements Iterable { + + private final Plugin plugin; + private int taskId; + + private final HashMap targets = new HashMap<>(); + private final Set removeQueue = new HashSet<>(); + + private final BoardUpdateFunction updateFunction; + + public Board(final Plugin plugin, final BoardUpdateFunction updateFunction) { + this.updateFunction = updateFunction; + this.plugin = plugin; + } + + public boolean addTarget(final Player player) { + if (!this.isTarget(player)) { + final BoardPage boardPage = this.newPage(); + this.targets.put(player, boardPage); + player.setScoreboard(boardPage.getBoard()); + this.update(player); + return true; + } + return false; + } + + public void cancel() { + if (taskId != 0) { + plugin.getServer().getScheduler().cancelTask(taskId); + taskId = 0; + for (final Player player : this.targets.keySet()) { + player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); + } + this.targets.clear(); + this.removeQueue.clear(); + } + } + + public BoardPage getBoardPage(final Player player) { + return this.targets.get(player); + } + + public Plugin getPlugin() { + return plugin; + } + + public Set getTargets() { + return targets.keySet(); + } + + public BoardUpdateFunction getUpdateFunction() { + return updateFunction; + } + + public boolean isRunning() { + return this.taskId != 0; + } + + public boolean isTarget(final Player player) { + return this.targets.containsKey(player); + } + + @Override + public Iterator iterator() { + return this.targets.keySet().iterator(); + } + + public abstract BoardPage newPage(); + + public boolean removeTarget(final Player player) { + if (this.isTarget(player)) { + player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); + return this.removeQueue.add(player); + } + return false; + } + + public void update(final Condition condition, final int interval) { + taskId = plugin.getServer().getScheduler().runTaskTimer(plugin, new Runnable() { + + @Override + public void run() { + if (condition.get()) { + final Iterator iterator = iterator(); + while (iterator.hasNext()) { + final Player next = iterator.next(); + if (shouldRemove(next)) { + iterator.remove(); + } else { + update(next); + } + } + } else { + cancel(); + } + } + }, 0, interval).getTaskId(); + } + + public abstract void update(Player p); + + private boolean shouldRemove(final Player player) { + return this.removeQueue.remove(player); + } + +} diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/BoardPage.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/BoardPage.java new file mode 100644 index 0000000..6e900a8 --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/BoardPage.java @@ -0,0 +1,23 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +import org.bukkit.Bukkit; +import org.bukkit.scoreboard.Scoreboard; + +/** + * + * @since 2016年7月4日 下午4:40:21 + * @author 尘曲 + */ +public abstract class BoardPage { + + private final Scoreboard board; + + public BoardPage() { + board = Bukkit.getServer().getScoreboardManager().getNewScoreboard(); + } + + public Scoreboard getBoard() { + return board; + } + +} diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/BoardUpdateFunction.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/BoardUpdateFunction.java new file mode 100644 index 0000000..cd04ebd --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/BoardUpdateFunction.java @@ -0,0 +1,39 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +import java.util.List; + +import org.bukkit.entity.Player; + +import cn.citycraft.PluginHelper.callback.CallBackReturn; + +/** + * + * @since 2016年7月4日 下午4:40:21 + * @author 尘曲 + */ +public class BoardUpdateFunction { + + private CallBackReturn.One titleFunction; + private CallBackReturn.One> bodyFunction; + + public BoardUpdateFunction(final CallBackReturn.One titleFunction, final CallBackReturn.One> bodyFunction) { + this.titleFunction = titleFunction; + this.bodyFunction = bodyFunction; + } + + public CallBackReturn.One> getBodyFunction() { + return bodyFunction; + } + + public CallBackReturn.One getTitleFunction() { + return titleFunction; + } + + public void setBodyFunction(final CallBackReturn.One> bodyFunction) { + this.bodyFunction = bodyFunction; + } + + public void setTitleFunction(final CallBackReturn.One titleFunction) { + this.titleFunction = titleFunction; + } +} diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Condition.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Condition.java new file mode 100644 index 0000000..b76fd71 --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Condition.java @@ -0,0 +1,12 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +/** + * + * @since 2016年7月4日 下午4:40:21 + * @author 尘曲 + */ +public interface Condition { + + boolean get(); + +} diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Entry.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Entry.java new file mode 100644 index 0000000..71826a7 --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Entry.java @@ -0,0 +1,45 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Team; + +public class Entry { + private final SiderbarBoardPage boardPage; + private Team team; + private final String id; + private String last; + private final int index; + + public Entry(final SiderbarBoardPage boardPage, final int index) { + this.boardPage = boardPage; + this.id = String.valueOf(index); + this.index = index; + } + + public String getId() { + return id; + } + + public int getIndex() { + return index; + } + + public Team getTeam() { + return team; + } + + public void unregister() { + if (this.last != null) { + this.boardPage.getBoard().resetScores(last); + } + } + + public void update(final String text, final int score) { + this.unregister(); + final Objective objective = boardPage.getObjective(); + final Score scoreObject = objective.getScore(text); + scoreObject.setScore(score); + this.last = text; + } +} \ No newline at end of file diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/SidebarBoard.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/SidebarBoard.java new file mode 100644 index 0000000..9bf6792 --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/SidebarBoard.java @@ -0,0 +1,90 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; + +/** + * + * @since 2016年7月4日 下午4:40:21 + * @author 尘曲 + */ +public class SidebarBoard extends Board { + private static final TreeMap coloursById = new TreeMap<>(); + + static { + int i = 0; + for (final ChatColor chatColor : ChatColor.values()) { + coloursById.put(i++, chatColor.toString()); + } + } + + public SidebarBoard(final Plugin plugin, final BoardUpdateFunction updateFunction) { + super(plugin, updateFunction); + } + + @Override + public SiderbarBoardPage getBoardPage(final Player player) { + return (SiderbarBoardPage) super.getBoardPage(player); + } + + @Override + public SiderbarBoardPage newPage() { + return new SiderbarBoardPage(); + } + + @Override + public void update(final Player player) { + final SiderbarBoardPage boardPage = this.getBoardPage(player); + if (boardPage == null) { + return; + } + String title = null; + if (this.getUpdateFunction().getTitleFunction() != null) { + title = this.getUpdateFunction().getTitleFunction().run(player); + } else { + this.removeTarget(player); + return; + } + final List newContents = this.getUpdateFunction().getBodyFunction().run(player); + this.formatBody(newContents); + final Objective objective = boardPage.getObjective(); + objective.setDisplayName(title); + for (int i = 0; i < newContents.size(); i++) { + objective.getScore(newContents.get(i)).setScore(newContents.size() - i); + } + int index = 0; + if (boardPage.getLastEntries() != null) { + for (; index < boardPage.getLastEntries().size() && index < newContents.size(); index++) { + final Entry entry = boardPage.getLastEntries().get(index); + entry.update(newContents.get(index), newContents.size() - index - 1); + } + while (index < boardPage.getLastEntries().size()) { + final Entry entry = boardPage.getLastEntries().remove(index); + entry.unregister(); + } + } + if (boardPage.getLastEntries() == null) { + boardPage.setLastEntries(new ArrayList()); + } + for (; index < newContents.size(); index++) { + final String line = newContents.get(index); + final Entry entry = new Entry(boardPage, index); + entry.update(line, newContents.size() - index - 1); + boardPage.getLastEntries().add(entry); + } + } + + private void formatBody(final List texts) { + for (int i = 0; i < texts.size(); i++) { + final String line = texts.get(i); + texts.set(i, line + coloursById.get(i)); + } + } + +} diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/SiderbarBoardPage.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/SiderbarBoardPage.java new file mode 100644 index 0000000..13b8b0c --- /dev/null +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/core/SiderbarBoardPage.java @@ -0,0 +1,36 @@ +package pw.yumc.MiaoBoard.scoreboard.core; + +import java.util.List; + +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; + +/** + * + * @since 2016年7月4日 下午4:40:21 + * @author 尘曲 + */ +public class SiderbarBoardPage extends BoardPage { + + private final Objective objective; + private List lastEntries; + + public SiderbarBoardPage() { + super(); + objective = getBoard().registerNewObjective("default", "dummy"); + objective.setDisplaySlot(DisplaySlot.SIDEBAR); + } + + public List getLastEntries() { + return lastEntries; + } + + public Objective getObjective() { + return objective; + } + + public void setLastEntries(final List lastEntries) { + this.lastEntries = lastEntries; + } + +} diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/BodyUpdater.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/BodyUpdater.java index ed9f985..70c1a7e 100644 --- a/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/BodyUpdater.java +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/BodyUpdater.java @@ -2,16 +2,16 @@ package pw.yumc.MiaoBoard.scoreboard.updater; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import org.bukkit.entity.Player; import cn.citycraft.PluginHelper.callback.CallBackReturn; +import pw.yumc.MiaoBoard.MiaoBoard; import pw.yumc.MiaoBoard.misc.Checker; import pw.yumc.MiaoBoard.misc.Replace; import pw.yumc.MiaoBoard.model.BoardModel; -import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; +import pw.yumc.YumCore.bukkit.P; /** * 记分板行更新类 @@ -20,18 +20,15 @@ import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; * @author 喵♂呜 */ public class BodyUpdater extends CallBackReturn.One> { + MiaoBoard plugin = P.getPlugin(); @Override public List run(final Player param) { - final Iterator iterator = ScoreBoardManager.getModels().iterator(); + final Iterator iterator = plugin.getScoreBoardManager().getModels().iterator(); while (iterator.hasNext()) { final BoardModel bmodel = iterator.next(); if (Checker.$(param, bmodel)) { - final List temp = new LinkedList<>(); - for (final String line : bmodel.lines) { - temp.add(Replace.$(param, line)); - } - return temp; + return Replace.$(param, bmodel.lines); } } return Collections.emptyList(); diff --git a/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/TitleUpdater.java b/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/TitleUpdater.java index c61a992..8096e3b 100644 --- a/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/TitleUpdater.java +++ b/src/main/java/pw/yumc/MiaoBoard/scoreboard/updater/TitleUpdater.java @@ -5,10 +5,11 @@ import java.util.Iterator; import org.bukkit.entity.Player; import cn.citycraft.PluginHelper.callback.CallBackReturn; +import pw.yumc.MiaoBoard.MiaoBoard; import pw.yumc.MiaoBoard.misc.Checker; import pw.yumc.MiaoBoard.misc.Replace; import pw.yumc.MiaoBoard.model.BoardModel; -import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; +import pw.yumc.YumCore.bukkit.P; /** * 记分板标题更新类 @@ -17,17 +18,18 @@ import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; * @author 喵♂呜 */ public class TitleUpdater extends CallBackReturn.One { + MiaoBoard plugin = P.getPlugin(); @Override public String run(final Player param) { - final Iterator iterator = ScoreBoardManager.getModels().iterator(); + final Iterator iterator = plugin.getScoreBoardManager().getModels().iterator(); while (iterator.hasNext()) { final BoardModel bmodel = iterator.next(); if (Checker.$(param, bmodel)) { return Replace.$(param, bmodel.title); } } - return ""; + return null; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index aaf16b6..4a2bd2a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ #配置文件版本号 -Version: 1.1 +Version: 2.0 #更新时间(单位: Tick) UpdateTime: 10 @@ -17,25 +17,30 @@ Boards: start: '2016-01-01 00:00:00' end: '2020-01-01 00:00:00' #记分板标题 - title: '喵式记分板简介' + title: '玩家信息' #记分板权限 permission: mb.default - #记分板内容 - #注意 不得超过38个字符 包括颜色字符 超过部分自动截取 - #注意 不得超过15行 超出部分 自动忽略 + #记分板内容(不得超过38个字符 包括颜色字符 超过部分自动截取) lines: - - '&6插件名称: &a%plugin_name%' - - '&7------------------------------' - - '&6插件版本: &b%plugin_version%' - - '&7------------------------------' - - '&6插件作者: &c%plugin_author%' - - '&7------------------------------' - - '&6玩家名称: &a%player_displayname%' - - '&7------------------------------' - - '&6您所在的位置: &b%player_world% &a%player_x%,%player_y%,%player_z%' - - '&7------------------------------' - - '&6您所在的角度: &bYaw &a%player_yaw% &bPitch &a%player_pitch%' - - '&7------------------------------' - - '&6服务器使用内存: &a%server_ram_used%/%server_ram_total%' - - '&7------------------------------' - - '&6离2017年还剩: &a%time_left_2017-01-01`00:00:00%秒' \ No newline at end of file + - '&6名 称: &a%player_displayname%' + - '&6世 界: &b%player_world%' + - '&6位 置: &3%player_x%,%player_y%,%player_z%' + - '&6等 级: &e%player_level%' + - '&6血 量: &c%player_health%' + - '&6饥 饿: &d%player_food_level%' + - '&6模 式: &4%player_gamemode%' + #默认记分板 + admin: + #记分板顺序(将按照从小到大依次检测 比如 1-50 优先检测 1 符合则显示 不符合 检测 2 ...) + index: 49 + #记分板标题 + title: '服务器信息' + #记分板权限 + permission: mb.reload + #记分板内容(不得超过38个字符 包括颜色字符 超过部分自动截取) + lines: + - '&6名 称: &a%plugin_name%' + - '&6版 本: &b%plugin_version%' + - '&6作 者: &c%plugin_author%' + - '&6人 数: &c%server_online%/%server_max%' + - '&6内 存: &a%server_ram_used%/%server_ram_total%/%server_ram_max%' \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 14849b6..60a3147 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -12,7 +12,6 @@ commands: aliases: - mb usage: §b使用/${project.artifactId} help 查看帮助! - permission: mb.reload permission-message: §c你没有 的权限来执行此命令! permissions: mb.reload: @@ -20,4 +19,7 @@ permissions: default: op mb.default: description: 默认记分板权限! + default: true + mb.toggle: + description: 开启关闭记分板! default: true \ No newline at end of file