From 0aaa5f7977306e7d6436706c4b6c095ad8275a62 Mon Sep 17 00:00:00 2001 From: Fortern Date: Wed, 19 Feb 2025 03:54:04 +0800 Subject: [PATCH] init 12 --- .../kotlin/xyz/fortern/minehunt/Console.kt | 10 ++- .../minehunt/command/MinehuntCommand.kt | 77 ++++++++++++++++++- .../xyz/fortern/minehunt/rule/GameRules.kt | 33 ++++++++ .../xyz/fortern/minehunt/rule/RuleItem.kt | 32 -------- .../xyz/fortern/minehunt/rule/RuleKey.kt | 62 +++++++++++++++ 5 files changed, 179 insertions(+), 35 deletions(-) create mode 100644 src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt delete mode 100644 src/main/kotlin/xyz/fortern/minehunt/rule/RuleItem.kt create mode 100644 src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index 4916fe9..a4d9032 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -16,7 +16,8 @@ import org.bukkit.inventory.meta.CompassMeta import org.bukkit.scheduler.BukkitRunnable import org.bukkit.scheduler.BukkitTask import org.bukkit.scoreboard.Team -import xyz.fortern.minehunt.rule.RuleItem +import xyz.fortern.minehunt.rule.GameRules +import xyz.fortern.minehunt.rule.RuleKey import java.util.* import java.util.concurrent.ConcurrentHashMap @@ -25,6 +26,11 @@ import java.util.concurrent.ConcurrentHashMap */ class Console { + /** + * 全部的游戏规则 + */ + val gameRules = GameRules() + var stage: GameStage = GameStage.PREPARING private set @@ -339,7 +345,7 @@ class Console { // 通知速通者 speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) } - }, RuleItem.HUNTER_READY_CD.value * 20L) + }, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L) } diff --git a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt index 4e9d454..04c19af 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.rule.RuleKey /** * 主命令 minehunt @@ -17,6 +18,10 @@ class MinehuntCommand( private val subCommand: 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为一项规则设置新的值")) /** * 执行命令 @@ -109,12 +114,15 @@ class MinehuntCommand( "hunter" -> { console.joinHunter(sender) } + "speedrunner" -> { console.joinSpeedrunner(sender) } + "spectator" -> { console.joinSpectator(sender) } + else -> { sender.sendMessage(Component.text("输入正确的队伍名称", NamedTextColor.RED)) } @@ -147,7 +155,64 @@ class MinehuntCommand( * 查看或修改游戏规则 */ private fun onRule(sender: CommandSender, args: List, flag: Boolean): List? { - TODO("Not yet implemented") + // args[0] == rule + if (args.size == 1) { + if (flag) { + sender.sendMessage(ruleHelp) + } + return null + } + + val rule = args[1] + when (rule) { + "hunter_respawn_cd" -> { + if (args.size == 2) { + // 获取命令详情 + if (flag) { + sendRuleInfo(sender, RuleKey.HUNTER_READY_CD) + } + return null + } else if (args.size == 3) { + if (flag) { + if (console.gameRules.setGameRuleValueSafe(RuleKey.HUNTER_READY_CD, args[2])) { + + } else { + + } + } else { + + } + } else { + if (flag) { + sender.sendMessage(Component.text("参数过多")) + } else { + return null + } + } + } + + "hunter_ready_cd" -> { + if (args.size == 2) { + + } + } + + "friendly_fire" -> { + if (args.size == 2) { + + } + } + + else -> { + return if (flag) { + sender.sendMessage(Component.text("不存在的规则项")) + null + } else { + if (args.size == 2) subCommand.filter { it.startsWith(args[0]) } else null + } + } + } + return null } /** @@ -179,6 +244,16 @@ class MinehuntCommand( return null } + /** + * 发送规则详情 + */ + private fun sendRuleInfo(sender: CommandSender, ruleKey: RuleKey<*>) { + sender.sendMessage("游戏规则: " + ruleKey.name) + sender.sendMessage("描述: " + ruleKey.info) + sender.sendMessage("值类型: " + ruleKey.typeInfo) + sender.sendMessage("数值: " + console.gameRules.getRuleValue(ruleKey)) + } + /** * 发送帮助信息 */ diff --git a/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt b/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt new file mode 100644 index 0000000..3a9e08e --- /dev/null +++ b/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt @@ -0,0 +1,33 @@ +package xyz.fortern.minehunt.rule + +import xyz.fortern.minehunt.rule.RuleKey.Companion.FRIENDLY_FIRE +import xyz.fortern.minehunt.rule.RuleKey.Companion.HUNTER_READY_CD +import xyz.fortern.minehunt.rule.RuleKey.Companion.HUNTER_RESPAWN_CD + +/** + * 描述所有游戏规则的类 + */ +class GameRules internal constructor() { + private val map: MutableMap, Any> = HashMap() + + init { + setRuleValue(HUNTER_RESPAWN_CD, 30) + setRuleValue(HUNTER_READY_CD, 30) + setRuleValue(FRIENDLY_FIRE, true) + } + + fun setGameRuleValueSafe(rule: RuleKey, value: String): Boolean { + val okValue = rule.validate(value) ?: return false + setRuleValue(rule, okValue) + return true + } + + private fun setRuleValue(rule: RuleKey, value: T) { + map[rule] = value + } + + @Suppress("UNCHECKED_CAST") + fun getRuleValue(rule: RuleKey): T { + return map[rule] as T + } +} diff --git a/src/main/kotlin/xyz/fortern/minehunt/rule/RuleItem.kt b/src/main/kotlin/xyz/fortern/minehunt/rule/RuleItem.kt deleted file mode 100644 index 5d797de..0000000 --- a/src/main/kotlin/xyz/fortern/minehunt/rule/RuleItem.kt +++ /dev/null @@ -1,32 +0,0 @@ -package xyz.fortern.minehunt.rule - -/** - * 描述一个规则项的类 - */ -class RuleItem( - /** - * 这项规则的名称 - */ - val name: String, - - /** - * 这项规则的描述 - */ - val info: String, - - /** - * 这项规则的具体值 - */ - val value: T -) { - /** - * 此伴生对象存放当前的游戏配置 - * - * 这些配置是可以修改的 - */ - companion object { - var HUNTER_RESPAWN_CD = RuleItem("hunter_respawn_cd", "猎人重生倒计时(秒)", 30) - var HUNTER_READY_CD = RuleItem("hunter_ready_cd", "猎人出生倒计时(秒)", 30) - var FRIENDLY_FIRE = RuleItem("friendly_fire", "队友之间是否有伤害", true) - } -} diff --git a/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt b/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt new file mode 100644 index 0000000..527dd3d --- /dev/null +++ b/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt @@ -0,0 +1,62 @@ +package xyz.fortern.minehunt.rule + +/** + * 描述每一个规则项的类 + */ +class RuleKey private constructor( + /** + * 这项规则的名称 + */ + val name: String, + + /** + * 这项规则的描述 + */ + val info: String, + + /** + * 这项规则值的类型 + */ + val type: Class, + + /** + * 值类型的描述信息 + */ + val typeInfo: String, + + /** + * 对输入的String进行校验,成功则返回转换后的值,失败则返回null + */ + val validate: (String) -> T? +) { + /** + * 这里存放每一个规则的Key + */ + companion object { + private val boolValidate: (String) -> Boolean? = { + when { + "true".equals(it, true) -> true + "false".equals(it, true) -> false + else -> null + } + } + + val HUNTER_READY_CD = RuleKey("hunter_ready_cd", "猎人出生倒计时(秒)", Int::class.java, "Integer") { + try { + val i = it.toInt() + if (i in 0..120) i else null + } catch (ex: NumberFormatException) { + null + } + } + val HUNTER_RESPAWN_CD = RuleKey("hunter_respawn_cd", "猎人重生倒计时(秒)", Int::class.java, "Integer") { + try { + val i = it.toInt() + if (i in 0..120) i else null + } catch (ex: NumberFormatException) { + null + } + } + val FRIENDLY_FIRE = RuleKey("friendly_fire", "队友之间是否有伤害", Boolean::class.java, "Boolean", boolValidate) + } +}