diff --git a/.gitignore b/.gitignore index c4899a7..3edb4da 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ # IntelliJ out/ - +.kotlin/ # Compiled class file *.class diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index 13250cc..7f581d8 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -11,11 +11,12 @@ import org.bukkit.Location import org.bukkit.Material import org.bukkit.enchantments.Enchantment import org.bukkit.entity.Player -import org.bukkit.event.inventory.InventoryType import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.CompassMeta import org.bukkit.scheduler.BukkitRunnable import org.bukkit.scheduler.BukkitTask +import org.bukkit.scoreboard.Criteria +import org.bukkit.scoreboard.DisplaySlot import org.bukkit.scoreboard.Team import xyz.fortern.minehunt.rule.GameRules import xyz.fortern.minehunt.rule.RuleKey @@ -32,11 +33,20 @@ class Console { */ val gameRules = GameRules() - val ruleBook = Bukkit.createInventory(null, InventoryType.HOPPER, Component.text("Game Rules")) - + /** + * 游戏阶段 + */ var stage: GameStage = GameStage.PREPARING private set + /** + * 计分板 + */ + private val scoreboard = Bukkit.getScoreboardManager().mainScoreboard + + /** + * 主世界 + */ private var overworld = Bukkit.getWorld("world")!! /** @@ -164,7 +174,8 @@ class Console { init { instance = this - // 初始化游戏规则 + setRuleScoreboard() + // 初始化 Minecraft 游戏规则 overworld.worldBorder.size = 32.0 overworld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false) overworld.setGameRule(GameRule.DO_WEATHER_CYCLE, false) @@ -475,6 +486,43 @@ class Console { } } + private fun setRuleScoreboard() { + //清除旧的计分板信息 + scoreboard.teams.forEach { it.unregister() } + val objective = scoreboard.getObjective("rule-list") + objective?.unregister() + + //设置新的计分板信息 + val ruleListObjective = scoreboard.registerNewObjective( + "rule-list", + Criteria.DUMMY, + Component.text("游戏规则", NamedTextColor.DARK_AQUA) + ) + val rules = gameRules.getAllRules() + rules.onEachIndexed { i, entry -> + val entryId = entry.key.name + val score = ruleListObjective.getScore(entryId) + .apply { customName(Component.text(entry.key.info, NamedTextColor.GOLD)) } + score.score = rules.size - i + val teamForOneRule = scoreboard.registerNewTeam(entryId) + teamForOneRule.addEntry(entryId) + teamForOneRule.suffix( + Component.text(": ").append(Component.text(entry.value.toString(), NamedTextColor.GREEN)) + ) + } + + ruleListObjective.displaySlot = DisplaySlot.SIDEBAR + } + + fun refreshEntry(ruleKey: RuleKey<*>) { + val teamForOneRule = scoreboard.getTeam(ruleKey.name) ?: return + teamForOneRule.suffix( + Component.text(": ").append( + Component.text(gameRules.getRuleValue(ruleKey).toString(), NamedTextColor.GREEN) + ) + ) + } + /** * 游戏阶段 */ diff --git a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt index deb4b3f..613b2b2 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt @@ -7,6 +7,7 @@ import org.bukkit.command.CommandSender import org.bukkit.command.TabExecutor import org.bukkit.entity.Player import xyz.fortern.minehunt.Console +import xyz.fortern.minehunt.Minehunt import xyz.fortern.minehunt.rule.RuleKey /** @@ -16,12 +17,31 @@ class MinehuntCommand( private val console: Console ) : TabExecutor { - private val subCommand: List = listOf("help", "join", "leave", "rule", "stat", "stop") + private val subCommands: List = listOf("help", "join", "leave", "rule", "stat", "stop") private val teams: List = listOf("hunter", "speedrunner", "spectator") private val rules: List = listOf("hunter_respawn_cd", "hunter_ready_cd", "friendly_fire") - private val ruleHelp: Component = Component.text("/minehunt rule \n查看一项规则的详情\n") - .append(Component.text("/minehunt rule \n为一项规则设置新的值")) + private val helpMessages = listOf( + Component.text("Minehunt v${Minehunt.instance().pluginMeta.version}", NamedTextColor.GREEN), + Component.text("/minehunt help ", NamedTextColor.GOLD) + .append(Component.text("帮助信息", NamedTextColor.WHITE)), + Component.text("/minehunt join (hunter|speedrunner|spectator) ", NamedTextColor.GOLD) + .append(Component.text("加入一个阵营", NamedTextColor.WHITE)), + Component.text("/minehunt leave ", NamedTextColor.GOLD) + .append(Component.text("加入观察者阵营", NamedTextColor.WHITE)), + Component.text("/minehunt rule ", NamedTextColor.GOLD) + .append(Component.text("查看或修改游戏规则", NamedTextColor.WHITE)), + Component.text("/minehunt start ", NamedTextColor.GOLD) + .append(Component.text("开始游戏", NamedTextColor.WHITE)), + Component.text("/minehunt stop ", NamedTextColor.GOLD) + .append(Component.text("进行中止游戏的投票", NamedTextColor.WHITE)) + ) + private val ruleHelpMessages = listOf( + Component.text("/minehunt rule ", NamedTextColor.GREEN) + .append(Component.text("查看一项规则的详情", NamedTextColor.WHITE)), + Component.text("/minehunt rule ", NamedTextColor.GREEN) + .append(Component.text("为一项规则设置新的值", NamedTextColor.WHITE)) + ) /** * 执行命令 @@ -60,9 +80,18 @@ class MinehuntCommand( */ private fun handlerCommand(sender: CommandSender, args: List, flag: Boolean): List? { if (args.isEmpty() || args[0] == "" || args[0] == "help" || args[0] == "?") - return if (flag) sendHelp(sender) else subCommand + return if (flag) { + sendHelp(sender) + null + } else { + subCommands + } return when (args[0]) { + "help" -> { + onHelp(sender, flag) + } + "join" -> { onJoin(sender, args, flag) } @@ -88,12 +117,17 @@ class MinehuntCommand( sender.sendMessage(Component.text("错误的子命令")) null } else { - if (args.size == 1) subCommand.filter { it.startsWith(args[0]) } else null + if (args.size == 1) subCommands.filter { it.startsWith(args[0]) } else null } } } } + private fun onHelp(sender: CommandSender, flag: Boolean): List? { + if (flag) sendHelp(sender) + return null + } + /** * 玩家加入队伍 */ @@ -130,7 +164,7 @@ class MinehuntCommand( return null } else { if (args.size == 2) { - return teams.filter { it.startsWith(args[0]) } + return teams.filter { it.startsWith(teamName) } } } @@ -158,13 +192,12 @@ class MinehuntCommand( // args[0] == rule if (args.size == 1) { if (flag) { - sender.sendMessage(ruleHelp) + sendHelpRule(sender) } return null } - val rule = args[1] - return when (rule) { + return when (val rule = args[1]) { "hunter_respawn_cd" -> { getOrChangeRule(args, flag, sender, RuleKey.HUNTER_RESPAWN_CD) } @@ -182,7 +215,7 @@ class MinehuntCommand( sender.sendMessage(Component.text("不存在的规则项")) null } else { - if (args.size == 2) rules.filter { it.startsWith(args[0]) } else null + if (args.size == 2) rules.filter { it.startsWith(rule) } else null } } } @@ -207,7 +240,14 @@ class MinehuntCommand( // 给规则赋值 if (flag) { if (console.gameRules.setGameRuleValueSafe(ruleKey, args[2])) { - sender.sendMessage(Component.text("规则修改成功", NamedTextColor.GREEN)) + sender.sendMessage( + Component.text(sender.name, NamedTextColor.YELLOW) + .append(Component.text("修改规则项", NamedTextColor.WHITE)) + .append(Component.text(ruleKey.name, NamedTextColor.GOLD)) + .append(Component.text("值为", NamedTextColor.WHITE)) + .append(Component.text(args[2], NamedTextColor.GREEN)) + ) + console.refreshEntry(ruleKey) } else { sender.sendMessage(Component.text("不合适的值", NamedTextColor.RED)) } @@ -229,7 +269,6 @@ class MinehuntCommand( */ private fun onStart(sender: CommandSender, flag: Boolean): List? { if (flag) { - // TODO 正在编辑规则时,也不能开始 if (console.stage == Console.GameStage.PREPARING) { console.tryStart() } else { @@ -266,12 +305,14 @@ class MinehuntCommand( /** * 发送帮助信息 */ - private fun sendHelp(sender: CommandSender): List? { - sender.sendMessage("§aMinehunt v1.0.0") - sender.sendMessage("§a/minehunt help") - sender.sendMessage("§a/minehunt start") - sender.sendMessage("§a/minehunt stop") - sender.sendMessage("§a/minehunt set