This commit is contained in:
2025-02-19 04:55:45 +08:00
parent 0aaa5f7977
commit 33d01988ee
3 changed files with 76 additions and 53 deletions

View File

@@ -164,55 +164,64 @@ class MinehuntCommand(
} }
val rule = args[1] val rule = args[1]
when (rule) { return when (rule) {
"hunter_respawn_cd" -> { "hunter_respawn_cd" -> {
if (args.size == 2) { getOrChangeRule(args, flag, sender, RuleKey.HUNTER_RESPAWN_CD)
// 获取命令详情
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" -> { "hunter_ready_cd" -> {
if (args.size == 2) { getOrChangeRule(args, flag, sender, RuleKey.HUNTER_READY_CD)
}
} }
"friendly_fire" -> { "friendly_fire" -> {
if (args.size == 2) { getOrChangeRule(args, flag, sender, RuleKey.FRIENDLY_FIRE)
}
} }
else -> { else -> {
return if (flag) { if (flag) {
sender.sendMessage(Component.text("不存在的规则项")) sender.sendMessage(Component.text("不存在的规则项"))
null null
} else { } 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<String>,
flag: Boolean,
sender: CommandSender,
ruleKey: RuleKey<*>
): List<String>? {
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
}
} }
/** /**

View File

@@ -16,14 +16,14 @@ class GameRules internal constructor() {
setRuleValue(FRIENDLY_FIRE, true) setRuleValue(FRIENDLY_FIRE, true)
} }
fun <T : Any> setGameRuleValueSafe(rule: RuleKey<T>, value: String): Boolean { fun <T> setGameRuleValueSafe(rule: RuleKey<T>, value: String): Boolean {
val okValue = rule.validate(value) ?: return false val okValue: T = rule.validate(value) ?: return false
setRuleValue(rule, okValue) setRuleValue(rule, okValue)
return true return true
} }
private fun <T : Any> setRuleValue(rule: RuleKey<T>, value: T) { private fun <T> setRuleValue(rule: RuleKey<T>, value: T) {
map[rule] = value map[rule] = value!!
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")

View File

@@ -24,10 +24,15 @@ class RuleKey<T> private constructor(
*/ */
val typeInfo: String, val typeInfo: String,
/**
* 命令补全时的推荐值
*/
val recommendedValues: List<String>,
/** /**
* 对输入的String进行校验成功则返回转换后的值失败则返回null * 对输入的String进行校验成功则返回转换后的值失败则返回null
*/ */
val validate: (String) -> T? val validate: (String) -> T?,
) { ) {
/** /**
* 这里存放每一个规则的Key * 这里存放每一个规则的Key
@@ -41,7 +46,8 @@ class RuleKey<T> private constructor(
} }
} }
val HUNTER_READY_CD = RuleKey("hunter_ready_cd", "猎人出生倒计时(秒)", Int::class.java, "Integer") { val HUNTER_READY_CD =
RuleKey("hunter_ready_cd", "猎人出生倒计时(秒)", Int::class.java, "Integer", listOf("0", "15", "30")) {
try { try {
val i = it.toInt() val i = it.toInt()
if (i in 0..120) i else null if (i in 0..120) i else null
@@ -49,7 +55,8 @@ class RuleKey<T> private constructor(
null null
} }
} }
val HUNTER_RESPAWN_CD = RuleKey("hunter_respawn_cd", "猎人重生倒计时(秒)", Int::class.java, "Integer") { val HUNTER_RESPAWN_CD =
RuleKey("hunter_respawn_cd", "猎人重生倒计时(秒)", Int::class.java, "Integer", listOf("0, 15, 30")) {
try { try {
val i = it.toInt() val i = it.toInt()
if (i in 0..120) i else null if (i in 0..120) i else null
@@ -57,6 +64,13 @@ class RuleKey<T> private constructor(
null 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
)
} }
} }