init 2
This commit is contained in:
@@ -5,9 +5,13 @@ import net.kyori.adventure.text.format.NamedTextColor
|
||||
import net.kyori.adventure.title.Title
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Difficulty
|
||||
import org.bukkit.GameMode
|
||||
import org.bukkit.GameRule
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.scheduler.BukkitTask
|
||||
import org.bukkit.scoreboard.Team
|
||||
import xyz.fortern.minehunt.rule.RuleItem
|
||||
|
||||
/**
|
||||
* 游戏控制台
|
||||
@@ -31,17 +35,28 @@ class Console {
|
||||
*/
|
||||
private val spectatorTeam: Team
|
||||
|
||||
/**
|
||||
* 用于遍历的速通者列表
|
||||
*/
|
||||
val speedrunnerList: MutableList<Player> = ArrayList()
|
||||
|
||||
/**
|
||||
* 插件维护的猎人玩家集合
|
||||
*/
|
||||
val hunterSet: MutableSet<Player> = HashSet()
|
||||
|
||||
/**
|
||||
* 插件维护的旁观者玩家集合
|
||||
*/
|
||||
val spectatorSet: MutableSet<Player> = HashSet()
|
||||
|
||||
/**
|
||||
* 猎人持有的指南针指向的速通者在speedrunnerList中的index
|
||||
*/
|
||||
val trackRunnerMap: Map<String, Int> = HashMap()
|
||||
|
||||
/**
|
||||
* 用于遍历的速通者列表
|
||||
*/
|
||||
val speedrunnerList: MutableList<String> = ArrayList()
|
||||
|
||||
private var countdownTask: BukkitTask? = null
|
||||
var countdownTask: BukkitTask? = null
|
||||
private set
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
@@ -79,15 +94,17 @@ class Console {
|
||||
fun tryStart(): Boolean {
|
||||
if (speedrunnerTeam.size == 0) return false
|
||||
if (Bukkit.getOnlinePlayers().count { it.isDead } > 0) return false
|
||||
|
||||
countdownToStart()
|
||||
return true
|
||||
}
|
||||
|
||||
fun countdownToStart() {
|
||||
// 进行开始前的倒计时
|
||||
countdownTask = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), object : Runnable {
|
||||
private var countdown = 6
|
||||
override fun run() {
|
||||
if (--countdown > 0) {
|
||||
// 倒计时期间,每秒显示一次标题
|
||||
Bukkit.getOnlinePlayers().forEach {
|
||||
val title = Title.title(
|
||||
Component.text(countdown.toString(), NamedTextColor.DARK_PURPLE),
|
||||
@@ -96,6 +113,7 @@ class Console {
|
||||
it.showTitle(title)
|
||||
}
|
||||
} else {
|
||||
// 倒计时结束后开始游戏
|
||||
countdownTask = null
|
||||
start()
|
||||
}
|
||||
@@ -103,8 +121,49 @@ class Console {
|
||||
}, 0, 20)
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始游戏
|
||||
*/
|
||||
fun start() {
|
||||
|
||||
// 修改游戏规则
|
||||
val world = Bukkit.getWorld("world")!!
|
||||
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
|
||||
world.setGameRule(GameRule.DO_WEATHER_CYCLE, true)
|
||||
world.setGameRule(GameRule.DO_MOB_SPAWNING, true)
|
||||
world.setGameRule(GameRule.KEEP_INVENTORY, false)
|
||||
world.setGameRule(GameRule.SPAWN_RADIUS, 10)
|
||||
world.difficulty = Difficulty.HARD
|
||||
|
||||
val spawnLocation = world.spawnLocation
|
||||
|
||||
// 重置所有玩家状态
|
||||
Bukkit.getOnlinePlayers().forEach {
|
||||
it.gameMode = GameMode.SPECTATOR
|
||||
it.health = 20.0
|
||||
it.inventory.clear()
|
||||
it.saturation = 20.0f
|
||||
it.foodLevel = 20
|
||||
it.level = 0
|
||||
it.teleport(spawnLocation)
|
||||
}
|
||||
|
||||
// 通过Team遍历玩家很麻烦
|
||||
|
||||
// 速通者更改为生存模式
|
||||
speedrunnerList.forEach { it.gameMode = GameMode.SURVIVAL }
|
||||
// 将猎人传送到世界底部
|
||||
hunterSet.forEach { it.teleport(Location(world, 0.0, -64.0, 0.0)) }
|
||||
|
||||
val scheduler = Bukkit.getScheduler()
|
||||
val task = scheduler.runTaskTimerAsynchronously(Minehunt.instance(), Runnable {
|
||||
hunterSet.forEach {
|
||||
it.sendMessage(Component.text("你已到达出生点", NamedTextColor.RED))
|
||||
it.gameMode = GameMode.SURVIVAL
|
||||
it.teleport(spawnLocation)
|
||||
}
|
||||
}, 0, RuleItem.HUNTER_READY_CD.value * 20L)
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user