init 21
This commit is contained in:
@@ -157,7 +157,7 @@ class Console {
|
|||||||
/**
|
/**
|
||||||
* 猎人重生Task,保留这些引用方便在游戏结束时取消这些任务
|
* 猎人重生Task,保留这些引用方便在游戏结束时取消这些任务
|
||||||
*/
|
*/
|
||||||
private val hunterRespawnTasks: MutableMap<Player, BukkitTask> = HashMap()
|
private val hunterRespawnTasks: MutableMap<UUID, BukkitTask> = HashMap()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 游戏开始前的倒计时任务
|
* 游戏开始前的倒计时任务
|
||||||
@@ -182,16 +182,7 @@ class Console {
|
|||||||
|
|
||||||
// bukkit task end
|
// bukkit task end
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
private lateinit var instance: Console
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun getInstance() = instance
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
instance = this
|
|
||||||
initScoreboard()
|
initScoreboard()
|
||||||
// 初始化 Minecraft 游戏规则
|
// 初始化 Minecraft 游戏规则
|
||||||
overworld.worldBorder.size = 32.0
|
overworld.worldBorder.size = 32.0
|
||||||
@@ -230,24 +221,24 @@ class Console {
|
|||||||
/**
|
/**
|
||||||
* 判断玩家是否为猎人
|
* 判断玩家是否为猎人
|
||||||
*/
|
*/
|
||||||
fun isHunter(player: Player): Boolean = hunterSet.contains(player.uniqueId)
|
fun isHunter(player: Player): Boolean = hunterTeam.hasPlayer(player)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否为观察者
|
* 判断是否为观察者
|
||||||
*/
|
*/
|
||||||
fun isSpectator(player: Player): Boolean = spectatorSet.contains(player.uniqueId)
|
fun isSpectator(player: Player): Boolean = spectatorTeam.hasPlayer(player)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否为速通者
|
* 判断是否为速通者
|
||||||
*/
|
*/
|
||||||
fun isSpeedrunner(player: Player): Boolean = speedrunnerSet.contains(player.uniqueId)
|
fun isSpeedrunner(player: Player): Boolean = speedrunnerTeam.hasPlayer(player)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加入猎人阵营
|
* 加入猎人阵营
|
||||||
*/
|
*/
|
||||||
fun joinHunter(player: Player) {
|
fun joinHunter(player: Player) {
|
||||||
if (stage == GameStage.PREPARING && beginningCountdown == null) {
|
if (stage == GameStage.PREPARING && beginningCountdown == null) {
|
||||||
hunterTeam.addEntry(player.name)
|
hunterTeam.addPlayer(player)
|
||||||
player.sendMessage(Component.text("你已加入[猎人]"))
|
player.sendMessage(Component.text("你已加入[猎人]"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,7 +248,7 @@ class Console {
|
|||||||
*/
|
*/
|
||||||
fun joinSpeedrunner(player: Player) {
|
fun joinSpeedrunner(player: Player) {
|
||||||
if (stage == GameStage.PREPARING && beginningCountdown == null) {
|
if (stage == GameStage.PREPARING && beginningCountdown == null) {
|
||||||
speedrunnerTeam.addEntry(player.name)
|
speedrunnerTeam.addPlayer(player)
|
||||||
player.sendMessage(Component.text("你已加入[速通者]"))
|
player.sendMessage(Component.text("你已加入[速通者]"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -267,7 +258,7 @@ class Console {
|
|||||||
*/
|
*/
|
||||||
fun joinSpectator(player: Player) {
|
fun joinSpectator(player: Player) {
|
||||||
if (stage == GameStage.PREPARING && beginningCountdown == null) {
|
if (stage == GameStage.PREPARING && beginningCountdown == null) {
|
||||||
spectatorTeam.addEntry(player.name)
|
spectatorTeam.addPlayer(player)
|
||||||
player.sendMessage(Component.text("你已加入[观众]"))
|
player.sendMessage(Component.text("你已加入[观众]"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -329,16 +320,15 @@ class Console {
|
|||||||
if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner")
|
if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner")
|
||||||
|
|
||||||
// 修改游戏规则
|
// 修改游戏规则
|
||||||
val world = Bukkit.getWorld("world")!!
|
overworld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
|
||||||
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
|
overworld.setGameRule(GameRule.DO_WEATHER_CYCLE, true)
|
||||||
world.setGameRule(GameRule.DO_WEATHER_CYCLE, true)
|
overworld.setGameRule(GameRule.DO_MOB_SPAWNING, true)
|
||||||
world.setGameRule(GameRule.DO_MOB_SPAWNING, true)
|
overworld.setGameRule(GameRule.KEEP_INVENTORY, false)
|
||||||
world.setGameRule(GameRule.KEEP_INVENTORY, false)
|
overworld.setGameRule(GameRule.SPAWN_RADIUS, 10)
|
||||||
world.setGameRule(GameRule.SPAWN_RADIUS, 10)
|
overworld.difficulty = Difficulty.HARD
|
||||||
world.difficulty = Difficulty.HARD
|
this.overworld.worldBorder.size = 9999999.0
|
||||||
overworld.worldBorder.size = 9999999.0
|
|
||||||
|
|
||||||
val spawnLocation = world.spawnLocation
|
val spawnLocation = overworld.spawnLocation
|
||||||
|
|
||||||
// 重置所有玩家状态
|
// 重置所有玩家状态
|
||||||
Bukkit.getOnlinePlayers().forEach {
|
Bukkit.getOnlinePlayers().forEach {
|
||||||
@@ -361,11 +351,15 @@ class Console {
|
|||||||
hunterTeam.entries.forEach { entry ->
|
hunterTeam.entries.forEach { entry ->
|
||||||
Bukkit.getPlayer(entry)?.let {
|
Bukkit.getPlayer(entry)?.let {
|
||||||
hunterSet.add(it.uniqueId)
|
hunterSet.add(it.uniqueId)
|
||||||
it.teleport(Location(world, 0.0, -64.0, 0.0))
|
it.teleport(Location(overworld, 0.0, -64.0, 0.0))
|
||||||
trackRunnerMap[it.uniqueId] = 0
|
trackRunnerMap[it.uniqueId] = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val pvp = gameRules.getRuleValue(RuleKey.FRIENDLY_FIRE)
|
||||||
|
speedrunnerTeam.setAllowFriendlyFire(pvp)
|
||||||
|
hunterTeam.setAllowFriendlyFire(pvp)
|
||||||
|
|
||||||
// 创建指南针更新任务
|
// 创建指南针更新任务
|
||||||
val compassTask = object : BukkitRunnable() {
|
val compassTask = object : BukkitRunnable() {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
@@ -398,8 +392,10 @@ class Console {
|
|||||||
speedrunnerSet.forEach {
|
speedrunnerSet.forEach {
|
||||||
Bukkit.getPlayer(it)?.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED))
|
Bukkit.getPlayer(it)?.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED))
|
||||||
}
|
}
|
||||||
|
hunterSpawnCD = null
|
||||||
}, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L)
|
}, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L)
|
||||||
|
|
||||||
|
scoreboard.getObjective("rule-list")!!.displaySlot = null
|
||||||
stage = GameStage.PROCESSING
|
stage = GameStage.PROCESSING
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,7 +456,13 @@ class Console {
|
|||||||
* 结束处理
|
* 结束处理
|
||||||
*/
|
*/
|
||||||
fun end(winner: String?) {
|
fun end(winner: String?) {
|
||||||
|
if (stage != GameStage.PROCESSING) return
|
||||||
|
|
||||||
stage = GameStage.OVER
|
stage = GameStage.OVER
|
||||||
|
hunterSpawnCD?.cancel()
|
||||||
|
hunterSpawnCD = null
|
||||||
|
compassRefreshTask?.cancel()
|
||||||
|
compassRefreshTask = null
|
||||||
// 所有人设为生存模式
|
// 所有人设为生存模式
|
||||||
Bukkit.getOnlinePlayers().forEach {
|
Bukkit.getOnlinePlayers().forEach {
|
||||||
it.sendMessage(Component.text("--------游戏结束--------", NamedTextColor.GREEN))
|
it.sendMessage(Component.text("--------游戏结束--------", NamedTextColor.GREEN))
|
||||||
@@ -476,6 +478,9 @@ class Console {
|
|||||||
it.value.cancel()
|
it.value.cancel()
|
||||||
}
|
}
|
||||||
hunterRespawnTasks.clear()
|
hunterRespawnTasks.clear()
|
||||||
|
// 有仇的报仇
|
||||||
|
speedrunnerTeam.setAllowFriendlyFire(true)
|
||||||
|
hunterTeam.setAllowFriendlyFire(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -540,27 +545,26 @@ class Console {
|
|||||||
fun handlePlayerDeath(player: Player) {
|
fun handlePlayerDeath(player: Player) {
|
||||||
if (stage != GameStage.PROCESSING) return
|
if (stage != GameStage.PROCESSING) return
|
||||||
|
|
||||||
Bukkit.getPlayer(player.uniqueId)
|
val uuid = player.uniqueId
|
||||||
if (isSpeedrunner(player)) {
|
if (isSpeedrunner(player)) {
|
||||||
// 速通者置为旁观者模式,加入淘汰名单
|
// 速通者置为旁观者模式,加入淘汰名单
|
||||||
player.gameMode = GameMode.SPECTATOR
|
player.gameMode = GameMode.SPECTATOR
|
||||||
outPlayers.add(player.uniqueId)
|
outPlayers.add(uuid)
|
||||||
// 给淘汰的玩家名字上加删除线
|
// 给淘汰的玩家名字上加删除线
|
||||||
val playerListName = player.playerListName()
|
val playerListName = player.playerListName()
|
||||||
playerListName.style(Style.style(TextDecoration.STRIKETHROUGH))
|
playerListName.style(Style.style(TextDecoration.STRIKETHROUGH))
|
||||||
player.playerListName(playerListName)
|
player.playerListName(playerListName)
|
||||||
// 如给所有hunter都淘汰,则游戏结束
|
// 如给所有hunter都淘汰,则游戏结束
|
||||||
if (outPlayers.size == speedrunnerSet.size) {
|
if (outPlayers.size == speedrunnerSet.size) {
|
||||||
end("hunter")
|
Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { end("Hunter") }, 0)
|
||||||
}
|
}
|
||||||
} else if (isHunter(player)) {
|
} else if (isHunter(player)) {
|
||||||
// 猎人置为旁观者模式,稍后复活
|
// 猎人置为旁观者模式,稍后复活
|
||||||
player.gameMode = GameMode.SPECTATOR
|
player.gameMode = GameMode.SPECTATOR
|
||||||
val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
|
hunterRespawnTasks[uuid] = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
|
||||||
player.gameMode = GameMode.SURVIVAL
|
player.gameMode = GameMode.SURVIVAL
|
||||||
hunterRespawnTasks.remove(player)
|
hunterRespawnTasks.remove(uuid)
|
||||||
}, 20)
|
}, gameRules.getRuleValue(RuleKey.HUNTER_RESPAWN_CD) * 20L)
|
||||||
hunterRespawnTasks[player] = task
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class PlayerListener(
|
|||||||
// 在准备阶段,玩家设为冒险模式
|
// 在准备阶段,玩家设为冒险模式
|
||||||
player.gameMode = GameMode.ADVENTURE
|
player.gameMode = GameMode.ADVENTURE
|
||||||
// 自动加入观察者队伍
|
// 自动加入观察者队伍
|
||||||
console.spectatorTeam.addEntry(player.name)
|
console.spectatorTeam.addPlayer(player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,11 +42,11 @@ class PlayerListener(
|
|||||||
val player = event.player
|
val player = event.player
|
||||||
val stage = console.stage
|
val stage = console.stage
|
||||||
if (stage == GameStage.PREPARING) {
|
if (stage == GameStage.PREPARING) {
|
||||||
// 重置队伍信息
|
|
||||||
player.scoreboard.teams.forEach { it.removeEntry(player.name) }
|
|
||||||
if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) {
|
if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) {
|
||||||
console.interruptCountdownToStart()
|
console.interruptCountdownToStart()
|
||||||
}
|
}
|
||||||
|
// 将离开的玩家从team中移除
|
||||||
|
player.scoreboard.teams.forEach { it.removePlayer(player) }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -92,8 +92,7 @@ class PlayerListener(
|
|||||||
*/
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
fun onPlayerDeath(event: PlayerDeathEvent) {
|
fun onPlayerDeath(event: PlayerDeathEvent) {
|
||||||
val player = event.entity
|
console.handlePlayerDeath(event.entity)
|
||||||
console.handlePlayerDeath(player)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user