init 12
This commit is contained in:
@@ -16,7 +16,8 @@ import org.bukkit.inventory.meta.CompassMeta
|
|||||||
import org.bukkit.scheduler.BukkitRunnable
|
import org.bukkit.scheduler.BukkitRunnable
|
||||||
import org.bukkit.scheduler.BukkitTask
|
import org.bukkit.scheduler.BukkitTask
|
||||||
import org.bukkit.scoreboard.Team
|
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.*
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
@@ -25,6 +26,11 @@ import java.util.concurrent.ConcurrentHashMap
|
|||||||
*/
|
*/
|
||||||
class Console {
|
class Console {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全部的游戏规则
|
||||||
|
*/
|
||||||
|
val gameRules = GameRules()
|
||||||
|
|
||||||
var stage: GameStage = GameStage.PREPARING
|
var stage: GameStage = GameStage.PREPARING
|
||||||
private set
|
private set
|
||||||
|
|
||||||
@@ -339,7 +345,7 @@ class Console {
|
|||||||
|
|
||||||
// 通知速通者
|
// 通知速通者
|
||||||
speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) }
|
speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) }
|
||||||
}, RuleItem.HUNTER_READY_CD.value * 20L)
|
}, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.bukkit.command.CommandSender
|
|||||||
import org.bukkit.command.TabExecutor
|
import org.bukkit.command.TabExecutor
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import xyz.fortern.minehunt.Console
|
import xyz.fortern.minehunt.Console
|
||||||
|
import xyz.fortern.minehunt.rule.RuleKey
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主命令 minehunt
|
* 主命令 minehunt
|
||||||
@@ -17,6 +18,10 @@ class MinehuntCommand(
|
|||||||
|
|
||||||
private val subCommand: List<String> = listOf("help", "join", "leave", "rule", "stat", "stop")
|
private val subCommand: List<String> = listOf("help", "join", "leave", "rule", "stat", "stop")
|
||||||
private val teams: List<String> = listOf("hunter", "speedrunner", "spectator")
|
private val teams: List<String> = listOf("hunter", "speedrunner", "spectator")
|
||||||
|
private val rules: List<String> = listOf("hunter_respawn_cd", "hunter_ready_cd", "friendly_fire")
|
||||||
|
|
||||||
|
private val ruleHelp: Component = Component.text("/minehunt rule <ruleItem>\n查看一项规则的详情\n")
|
||||||
|
.append(Component.text("/minehunt rule <ruleItem> <value>\n为一项规则设置新的值"))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行命令
|
* 执行命令
|
||||||
@@ -109,12 +114,15 @@ class MinehuntCommand(
|
|||||||
"hunter" -> {
|
"hunter" -> {
|
||||||
console.joinHunter(sender)
|
console.joinHunter(sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
"speedrunner" -> {
|
"speedrunner" -> {
|
||||||
console.joinSpeedrunner(sender)
|
console.joinSpeedrunner(sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
"spectator" -> {
|
"spectator" -> {
|
||||||
console.joinSpectator(sender)
|
console.joinSpectator(sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
sender.sendMessage(Component.text("输入正确的队伍名称", NamedTextColor.RED))
|
sender.sendMessage(Component.text("输入正确的队伍名称", NamedTextColor.RED))
|
||||||
}
|
}
|
||||||
@@ -147,7 +155,64 @@ class MinehuntCommand(
|
|||||||
* 查看或修改游戏规则
|
* 查看或修改游戏规则
|
||||||
*/
|
*/
|
||||||
private fun onRule(sender: CommandSender, args: List<String>, flag: Boolean): List<String>? {
|
private fun onRule(sender: CommandSender, args: List<String>, flag: Boolean): List<String>? {
|
||||||
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
|
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))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送帮助信息
|
* 发送帮助信息
|
||||||
*/
|
*/
|
||||||
|
|||||||
33
src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt
Normal file
33
src/main/kotlin/xyz/fortern/minehunt/rule/GameRules.kt
Normal file
@@ -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<RuleKey<*>, Any> = HashMap()
|
||||||
|
|
||||||
|
init {
|
||||||
|
setRuleValue(HUNTER_RESPAWN_CD, 30)
|
||||||
|
setRuleValue(HUNTER_READY_CD, 30)
|
||||||
|
setRuleValue(FRIENDLY_FIRE, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : Any> setGameRuleValueSafe(rule: RuleKey<T>, value: String): Boolean {
|
||||||
|
val okValue = rule.validate(value) ?: return false
|
||||||
|
setRuleValue(rule, okValue)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun <T : Any> setRuleValue(rule: RuleKey<T>, value: T) {
|
||||||
|
map[rule] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
fun <T> getRuleValue(rule: RuleKey<T>): T {
|
||||||
|
return map[rule] as T
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package xyz.fortern.minehunt.rule
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 描述一个规则项的类
|
|
||||||
*/
|
|
||||||
class RuleItem<T>(
|
|
||||||
/**
|
|
||||||
* 这项规则的名称
|
|
||||||
*/
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
62
src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt
Normal file
62
src/main/kotlin/xyz/fortern/minehunt/rule/RuleKey.kt
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
package xyz.fortern.minehunt.rule
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述每一个规则项的类
|
||||||
|
*/
|
||||||
|
class RuleKey<T> private constructor(
|
||||||
|
/**
|
||||||
|
* 这项规则的名称
|
||||||
|
*/
|
||||||
|
val name: String,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 这项规则的描述
|
||||||
|
*/
|
||||||
|
val info: String,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 这项规则值的类型
|
||||||
|
*/
|
||||||
|
val type: Class<T>,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 值类型的描述信息
|
||||||
|
*/
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user