diff --git a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt index 04c19af..deb4b3f 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt @@ -164,55 +164,64 @@ class MinehuntCommand( } val rule = args[1] - when (rule) { + return 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 - } - } + getOrChangeRule(args, flag, sender, RuleKey.HUNTER_RESPAWN_CD) } "hunter_ready_cd" -> { - if (args.size == 2) { - - } + getOrChangeRule(args, flag, sender, RuleKey.HUNTER_READY_CD) } "friendly_fire" -> { - if (args.size == 2) { - - } + getOrChangeRule(args, flag, sender, RuleKey.FRIENDLY_FIRE) } else -> { - return if (flag) { + if (flag) { sender.sendMessage(Component.text("不存在的规则项")) null } else { - if (args.size == 2) subCommand.filter { it.startsWith(args[0]) } else null + if (args.size == 2) rules.filter { it.startsWith(args[0]) } else null } } } - return null + } + + /** + * 读取或改变游戏规则 + */ + private fun getOrChangeRule( + args: List, + flag: Boolean, + sender: CommandSender, + ruleKey: RuleKey<*> + ): List? { + return if (args.size == 2) { + // 获取规则详情 + if (flag) { + sendRuleInfo(sender, ruleKey) + } + null + } else if (args.size == 3) { + // 给规则赋值 + if (flag) { + if (console.gameRules.setGameRuleValueSafe(ruleKey, args[2])) { + sender.sendMessage(Component.text("规则修改成功", NamedTextColor.GREEN)) + } else { + sender.sendMessage(Component.text("不合适的值", NamedTextColor.RED)) + } + null + } else { + ruleKey.recommendedValues + } + } else { + // 参数过多 + if (flag) { + sender.sendMessage(Component.text("参数过多")) + } + null + } } /** diff --git a/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt b/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt index 3a9e08e..692063a 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt @@ -16,14 +16,14 @@ class GameRules internal constructor() { setRuleValue(FRIENDLY_FIRE, true) } - fun setGameRuleValueSafe(rule: RuleKey, value: String): Boolean { - val okValue = rule.validate(value) ?: return false + fun setGameRuleValueSafe(rule: RuleKey, value: String): Boolean { + val okValue: T = rule.validate(value) ?: return false setRuleValue(rule, okValue) return true } - private fun setRuleValue(rule: RuleKey, value: T) { - map[rule] = value + private fun setRuleValue(rule: RuleKey, value: T) { + map[rule] = value!! } @Suppress("UNCHECKED_CAST") diff --git a/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt b/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt index 527dd3d..f5a3e0b 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt @@ -24,10 +24,15 @@ class RuleKey private constructor( */ val typeInfo: String, + /** + * 命令补全时的推荐值 + */ + val recommendedValues: List, + /** * 对输入的String进行校验,成功则返回转换后的值,失败则返回null */ - val validate: (String) -> T? + val validate: (String) -> T?, ) { /** * 这里存放每一个规则的Key @@ -41,22 +46,31 @@ class RuleKey private constructor( } } - 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_READY_CD = + RuleKey("hunter_ready_cd", "猎人出生倒计时(秒)", Int::class.java, "Integer", listOf("0", "15", "30")) { + 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 HUNTER_RESPAWN_CD = + RuleKey("hunter_respawn_cd", "猎人重生倒计时(秒)", Int::class.java, "Integer", listOf("0, 15, 30")) { + 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) + val FRIENDLY_FIRE = RuleKey( + "friendly_fire", + "队友之间是否有伤害", + Boolean::class.java, + "Boolean", + listOf("true", "false"), + boolValidate + ) } }