mirror of
				https://e.coding.net/circlecloud/MiaoBoard.git
				synced 2025-11-03 17:56:30 +00:00 
			
		
		
		
	@@ -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配置重载完毕!");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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<String> DisableWorld = new ArrayList<>();
 | 
			
		||||
    public transient static MiaoBoardConfig instance = new MiaoBoardConfig();;
 | 
			
		||||
    public transient static MiaoBoardConfig instance = new MiaoBoardConfig();
 | 
			
		||||
    private Integer UpdateTime;
 | 
			
		||||
    private List<String> DisableWorld;
 | 
			
		||||
 | 
			
		||||
    public static MiaoBoardConfig i() {
 | 
			
		||||
        return instance;
 | 
			
		||||
@@ -23,4 +23,15 @@ public class MiaoBoardConfig extends InjectConfig {
 | 
			
		||||
    public static void reInject() {
 | 
			
		||||
        instance.reload();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<String> getDisableWorld() {
 | 
			
		||||
        if (DisableWorld == null) {
 | 
			
		||||
            DisableWorld = Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        return DisableWorld;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Integer getUpdateTime() {
 | 
			
		||||
        return UpdateTime;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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<String> $(final Player p, final List<String> 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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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<BoardModel> 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<BoardModel> bms = new LinkedList<>();
 | 
			
		||||
 | 
			
		||||
    public static List<BoardModel> getModels() {
 | 
			
		||||
    public ScoreBoardManager() {
 | 
			
		||||
        load();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addTarget(final Player player) {
 | 
			
		||||
        if (!MiaoBoardConfig.i().getDisableWorld().contains(player.getWorld().getName())) {
 | 
			
		||||
            getSidebarBoard().addTarget(player);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<BoardModel> 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<BoardModel> {
 | 
			
		||||
    private class BoardComparator implements Comparator<BoardModel> {
 | 
			
		||||
        @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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										122
									
								
								src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Board.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Board.java
									
									
									
									
									
										Normal file
									
								
							@@ -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<Player> {
 | 
			
		||||
 | 
			
		||||
    private final Plugin plugin;
 | 
			
		||||
    private int taskId;
 | 
			
		||||
 | 
			
		||||
    private final HashMap<Player, BoardPage> targets = new HashMap<>();
 | 
			
		||||
    private final Set<Player> 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<Player> 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<Player> 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<Player> 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -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<Player, String> titleFunction;
 | 
			
		||||
    private CallBackReturn.One<Player, List<String>> bodyFunction;
 | 
			
		||||
 | 
			
		||||
    public BoardUpdateFunction(final CallBackReturn.One<Player, String> titleFunction, final CallBackReturn.One<Player, List<String>> bodyFunction) {
 | 
			
		||||
        this.titleFunction = titleFunction;
 | 
			
		||||
        this.bodyFunction = bodyFunction;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CallBackReturn.One<Player, List<String>> getBodyFunction() {
 | 
			
		||||
        return bodyFunction;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CallBackReturn.One<Player, String> getTitleFunction() {
 | 
			
		||||
        return titleFunction;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBodyFunction(final CallBackReturn.One<Player, List<String>> bodyFunction) {
 | 
			
		||||
        this.bodyFunction = bodyFunction;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTitleFunction(final CallBackReturn.One<Player, String> titleFunction) {
 | 
			
		||||
        this.titleFunction = titleFunction;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
package pw.yumc.MiaoBoard.scoreboard.core;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月4日 下午4:40:21
 | 
			
		||||
 * @author 尘曲
 | 
			
		||||
 */
 | 
			
		||||
public interface Condition {
 | 
			
		||||
 | 
			
		||||
    boolean get();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Entry.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/main/java/pw/yumc/MiaoBoard/scoreboard/core/Entry.java
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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<Integer, String> 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<String> 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<Entry>());
 | 
			
		||||
        }
 | 
			
		||||
        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<String> texts) {
 | 
			
		||||
        for (int i = 0; i < texts.size(); i++) {
 | 
			
		||||
            final String line = texts.get(i);
 | 
			
		||||
            texts.set(i, line + coloursById.get(i));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -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<Entry> lastEntries;
 | 
			
		||||
 | 
			
		||||
    public SiderbarBoardPage() {
 | 
			
		||||
        super();
 | 
			
		||||
        objective = getBoard().registerNewObjective("default", "dummy");
 | 
			
		||||
        objective.setDisplaySlot(DisplaySlot.SIDEBAR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<Entry> getLastEntries() {
 | 
			
		||||
        return lastEntries;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Objective getObjective() {
 | 
			
		||||
        return objective;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setLastEntries(final List<Entry> lastEntries) {
 | 
			
		||||
        this.lastEntries = lastEntries;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -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<Player, List<String>> {
 | 
			
		||||
    MiaoBoard plugin = P.getPlugin();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<String> run(final Player param) {
 | 
			
		||||
        final Iterator<BoardModel> iterator = ScoreBoardManager.getModels().iterator();
 | 
			
		||||
        final Iterator<BoardModel> iterator = plugin.getScoreBoardManager().getModels().iterator();
 | 
			
		||||
        while (iterator.hasNext()) {
 | 
			
		||||
            final BoardModel bmodel = iterator.next();
 | 
			
		||||
            if (Checker.$(param, bmodel)) {
 | 
			
		||||
                final List<String> temp = new LinkedList<>();
 | 
			
		||||
                for (final String line : bmodel.lines) {
 | 
			
		||||
                    temp.add(Replace.$(param, line));
 | 
			
		||||
                }
 | 
			
		||||
                return temp;
 | 
			
		||||
                return Replace.$(param, bmodel.lines);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return Collections.emptyList();
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Player, String> {
 | 
			
		||||
    MiaoBoard plugin = P.getPlugin();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String run(final Player param) {
 | 
			
		||||
        final Iterator<BoardModel> iterator = ScoreBoardManager.getModels().iterator();
 | 
			
		||||
        final Iterator<BoardModel> 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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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%秒'
 | 
			
		||||
    - '&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%'
 | 
			
		||||
@@ -12,7 +12,6 @@ commands:
 | 
			
		||||
    aliases:
 | 
			
		||||
    - mb
 | 
			
		||||
    usage: §b使用/${project.artifactId} help 查看帮助!
 | 
			
		||||
    permission: mb.reload
 | 
			
		||||
    permission-message: §c你没有 <permission> 的权限来执行此命令!
 | 
			
		||||
permissions:
 | 
			
		||||
  mb.reload:
 | 
			
		||||
@@ -20,4 +19,7 @@ permissions:
 | 
			
		||||
    default: op
 | 
			
		||||
  mb.default:
 | 
			
		||||
    description: 默认记分板权限!
 | 
			
		||||
    default: true
 | 
			
		||||
  mb.toggle:
 | 
			
		||||
    description: 开启关闭记分板!
 | 
			
		||||
    default: true
 | 
			
		||||
		Reference in New Issue
	
	Block a user